/ Hex Artifact Content
Login

Artifact 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79:


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 64 65 66 20 48 41 56 45 5f 45 44 49 54 4c 49  fdef HAVE_EDITLI
0410: 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 65 64  NE.# include <ed
0420: 69 74 6c 69 6e 65 2f 65 64 69 74 6c 69 6e 65 2e  itline/editline.
0430: 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  h>.#endif.#if de
0440: 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
0450: 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45 41  INE) && HAVE_REA
0460: 44 4c 49 4e 45 3d 3d 31 0a 23 20 69 6e 63 6c 75  DLINE==1.# inclu
0470: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61  de <readline/rea
0480: 64 6c 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  dline.h>.# inclu
0490: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73  de <readline/his
04a0: 74 6f 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  tory.h>.#endif.#
04b0: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
04c0: 5f 45 44 49 54 4c 49 4e 45 29 20 26 26 20 28 21  _EDITLINE) && (!
04d0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
04e0: 44 4c 49 4e 45 29 20 7c 7c 20 48 41 56 45 5f 52  DLINE) || HAVE_R
04f0: 45 41 44 4c 49 4e 45 21 3d 31 29 0a 23 20 64 65  EADLINE!=1).# de
0500: 66 69 6e 65 20 72 65 61 64 6c 69 6e 65 28 70 29  fine readline(p)
0510: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 70   local_getline(p
0520: 2c 73 74 64 69 6e 29 0a 23 20 64 65 66 69 6e 65  ,stdin).# define
0530: 20 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a   add_history(X).
0540: 23 20 64 65 66 69 6e 65 20 72 65 61 64 5f 68 69  # define read_hi
0550: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0560: 65 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  e write_history(
0570: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 74 69 66  X).# define stif
0580: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 65  le_history(X).#e
0590: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
05a0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
05b0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e  ined(WIN32).# in
05c0: 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 64 65  clude <io.h>.#de
05d0: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
05e0: 69 73 61 74 74 79 28 68 29 0a 23 64 65 66 69 6e  isatty(h).#defin
05f0: 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61  e access(f,m) _a
0600: 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23  ccess((f),(m)).#
0610: 65 6c 73 65 0a 2f 2a 20 4d 61 6b 65 20 73 75 72  else./* Make sur
0620: 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20 61  e isatty() has a
0630: 20 70 72 6f 74 6f 74 79 70 65 2e 0a 2a 2f 0a 65   prototype..*/.e
0640: 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79  xtern int isatty
0650: 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ();.#endif..#if 
0660: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0670: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0680: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0690: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
06a0: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
06b0: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
06c0: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
06d0: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
06e0: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
06f0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0700: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0710: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0720: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0730: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0740: 6e 64 69 66 0a 0a 2f 2a 20 54 72 75 65 20 69 66  ndif../* True if
0750: 20 74 68 65 20 74 69 6d 65 72 20 69 73 20 65 6e   the timer is en
0760: 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  abled */.static 
0770: 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  int enableTimer 
0780: 3d 20 30 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  = 0;..#if !defin
0790: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
07a0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
07b0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f   !defined(__OS2_
07c0: 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
07d0: 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
07e0: 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
07f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0800: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0810: 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
0820: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
0830: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
0840: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
0850: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
0860: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
0870: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
0880: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  ;../*.** Begin t
0890: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
08a0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
08b0: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
08c0: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
08d0: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74  Timer ){.    get
08e0: 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
08f0: 4c 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20  LF, &sBegin);.  
0900: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
0910: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
0920: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
0930: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
0940: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
0950: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
0960: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
0970: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
0980: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
0990: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
09a0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
09b0: 2a 30 2e 30 30 30 30 30 31 20 2b 20 0a 20 20 20  *0.000001 + .   
09c0: 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70        (double)(p
09d0: 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53  End->tv_sec - pS
09e0: 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d  tart->tv_sec);.}
09f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
0a00: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
0a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a20: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
0a30: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
0a40: 65 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  er ){.    struct
0a50: 20 72 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20   rusage sEnd;.  
0a60: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
0a70: 47 45 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b  GE_SELF, &sEnd);
0a80: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 50 55  .    printf("CPU
0a90: 20 54 69 6d 65 3a 20 75 73 65 72 20 25 66 20 73   Time: user %f s
0aa0: 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20  ys %f\n",.      
0ab0: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
0ac0: 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e  n.ru_utime, &sEn
0ad0: 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20  d.ru_utime),.   
0ae0: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42      timeDiff(&sB
0af0: 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26  egin.ru_stime, &
0b00: 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b  sEnd.ru_stime));
0b10: 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  .  }.}..#define 
0b20: 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69  BEGIN_TIMER begi
0b30: 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  nTimer().#define
0b40: 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69   END_TIMER endTi
0b50: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41  mer().#define HA
0b60: 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66  S_TIMER 1..#elif
0b70: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
0b80: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
0b90: 33 32 29 29 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  32))..#include <
0ba0: 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 53  windows.h>../* S
0bb0: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
0bc0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
0bd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
0be0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
0bf0: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72  tatic HANDLE hPr
0c00: 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49  ocess;.static FI
0c10: 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42  LETIME ftKernelB
0c20: 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c  egin;.static FIL
0c30: 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69  ETIME ftUserBegi
0c40: 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20  n;.typedef BOOL 
0c50: 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43  (WINAPI *GETPROC
0c60: 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c  TIMES)(HANDLE, L
0c70: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
0c80: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
0c90: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a  E, LPFILETIME);.
0ca0: 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49  static GETPROCTI
0cb0: 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69  MES getProcessTi
0cc0: 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a  mesAddr = NULL;.
0cd0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
0ce0: 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74  see if we have t
0cf0: 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52  imer support.  R
0d00: 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73  eturn 1 if neces
0d10: 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20  sary.** support 
0d20: 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20  found (or found 
0d30: 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a  previously)..*/.
0d40: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69  static int hasTi
0d50: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
0d60: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0d70: 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75  Addr ){.    retu
0d80: 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 1;.  } else {
0d90: 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65  .    /* GetProce
0da0: 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20  ssTimes() isn't 
0db0: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e  supported in WIN
0dc0: 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65  95 and some othe
0dd0: 72 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f  r Windows versio
0de0: 6e 73 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 69  ns..    ** See i
0df0: 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65  f the version we
0e00: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
0e10: 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69  has it, and if i
0e20: 74 20 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66  t does, save off
0e30: 0a 20 20 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65  .    ** a pointe
0e40: 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20  r to it and the 
0e50: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
0e60: 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  handle..    */. 
0e70: 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65     hProcess = Ge
0e80: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28  tCurrentProcess(
0e90: 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63  );.    if( hProc
0ea0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e  ess ){.      HIN
0eb0: 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20  STANCE hinstLib 
0ec0: 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45  = LoadLibrary(TE
0ed0: 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c  XT("Kernel32.dll
0ee0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e  "));.      if( N
0ef0: 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20  ULL != hinstLib 
0f00: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72  ){.        getPr
0f10: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
0f20: 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20   (GETPROCTIMES) 
0f30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68  GetProcAddress(h
0f40: 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f  instLib, "GetPro
0f50: 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20  cessTimes");.   
0f60: 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d       if( NULL !=
0f70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0f80: 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Addr ){.        
0f90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72      }.        Fr
0fb0: 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c  eeLibrary(hinstL
0fc0: 69 62 29 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  ib); .      }.  
0fd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0fe0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
0ff0: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
1000: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
1010: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
1020: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1030: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
1040: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1050: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
1060: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
1070: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
1080: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
1090: 6f 63 65 73 73 2c 20 26 66 74 43 72 65 61 74 69  ocess, &ftCreati
10a0: 6f 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66 74  on, &ftExit, &ft
10b0: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74  KernelBegin, &ft
10c0: 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  UserBegin);.  }.
10d0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
10e0: 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74   difference of t
10f0: 77 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  wo FILETIME stru
1100: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
1110: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
1120: 74 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d  timeDiff(FILETIM
1130: 45 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54  E *pStart, FILET
1140: 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71  IME *pEnd){.  sq
1150: 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74  lite_int64 i64St
1160: 61 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  art = *((sqlite_
1170: 69 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29  int64 *) pStart)
1180: 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ;.  sqlite_int64
1190: 20 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c   i64End = *((sql
11a0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e  ite_int64 *) pEn
11b0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f  d);.  return (do
11c0: 75 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d  uble) ((i64End -
11d0: 20 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30   i64Start) / 100
11e0: 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  00000.0);.}../*.
11f0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d  ** Print the tim
1200: 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  ing results..*/.
1210: 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54  static void endT
1220: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1230: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
1240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1250: 41 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54  Addr){.    FILET
1260: 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20  IME ftCreation, 
1270: 66 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c  ftExit, ftKernel
1280: 45 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a  End, ftUserEnd;.
1290: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
12a0: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
12b0: 2c 20 26 66 74 43 72 65 61 74 69 6f 6e 2c 20 26  , &ftCreation, &
12c0: 66 74 45 78 69 74 2c 20 26 66 74 4b 65 72 6e 65  ftExit, &ftKerne
12d0: 6c 45 6e 64 2c 20 26 66 74 55 73 65 72 45 6e 64  lEnd, &ftUserEnd
12e0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  );.    printf("C
12f0: 50 55 20 54 69 6d 65 3a 20 75 73 65 72 20 25 66  PU Time: user %f
1300: 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20   sys %f\n",.    
1310: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55     timeDiff(&ftU
1320: 73 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65  serBegin, &ftUse
1330: 72 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69  rEnd),.       ti
1340: 6d 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c  meDiff(&ftKernel
1350: 42 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c  Begin, &ftKernel
1360: 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  End));.  }.}..#d
1370: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1380: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1390: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
13a0: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
13b0: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61  ine HAS_TIMER ha
13c0: 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a  sTimer()..#else.
13d0: 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49  #define BEGIN_TI
13e0: 4d 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44  MER .#define END
13f0: 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48  _TIMER.#define H
1400: 41 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69  AS_TIMER 0.#endi
1410: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f  f../*.** Used to
1420: 20 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67   prevent warning
1430: 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
1440: 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65  arameters.*/.#de
1450: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
1460: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
1470: 78 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  x)../*.** If the
1480: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
1490: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
14a0: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
14b0: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
14c0: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
14d0: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
14e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
14f0: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
1500: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
1510: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
1520: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
1530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1540: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
1550: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
1560: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
1570: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
1580: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
1590: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
15a0: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
15b0: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  1;../*.** The fo
15c0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f  llowing is the o
15d0: 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62  pen SQLite datab
15e0: 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ase.  We make a 
15f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1600: 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74  is database a st
1610: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f  atic variable so
1620: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
1630: 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74  accessed.** by t
1640: 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65  he SIGINT handle
1650: 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64  r to interrupt d
1660: 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69  atabase processi
1670: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ng..*/.static sq
1680: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a  lite3 *db = 0;..
1690: 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e  /*.** True if an
16a0: 20 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74   interrupt (Cont
16b0: 72 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20  rol-C) has been 
16c0: 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61  received..*/.sta
16d0: 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  tic volatile int
16e0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
16f0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   0;../*.** This 
1700: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f  is the name of o
1710: 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69  ur program. It i
1720: 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c  s set in main(),
1730: 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75   used.** in a nu
1740: 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c  mber of other pl
1750: 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72  aces, mostly for
1760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
1770: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1780: 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *Argv0;../*.** P
1790: 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49  rompt strings. I
17a0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61  nitialized in ma
17b0: 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74  in. Settable wit
17c0: 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d  h.**   .prompt m
17d0: 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a  ain continue.*/.
17e0: 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e  static char main
17f0: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20  Prompt[20];     
1800: 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72  /* First line pr
1810: 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22  ompt. default: "
1820: 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74  sqlite> "*/.stat
1830: 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65  ic char continue
1840: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43  Prompt[20]; /* C
1850: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d  ontinuation prom
1860: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20  pt. default: "  
1870: 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a   ...> " */../*.*
1880: 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63  * Write I/O trac
1890: 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  es to the follow
18a0: 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23  ing stream..*/.#
18b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18c0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
18d0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
18e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
18f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1900: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e   works like prin
1910: 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66  tf in that its f
1920: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1930: 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72   a.** format str
1940: 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65  ing and subseque
1950: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  nt arguments are
1960: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75   values to be su
1970: 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20  bstituted.** in 
1980: 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64  place of % field
1990: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
19a0: 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69  f formatting thi
19b0: 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77  s string.** is w
19c0: 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63  ritten to iotrac
19d0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
19e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
19f0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  CE.static void i
1a00: 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e  otracePrintf(con
1a10: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1a20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1a30: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
1a40: 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d  .  if( iotrace==
1a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  0 ) return;.  va
1a60: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1a70: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
1a80: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
1a90: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1aa0: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
1ab0: 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22 2c  f(iotrace, "%s",
1ac0: 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   z);.  sqlite3_f
1ad0: 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  ree(z);.}.#endif
1ae0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  .../*.** Determi
1af0: 6e 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20  nes if a string 
1b00: 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e  is a number of n
1b10: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1b20: 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74  t isNumber(const
1b30: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72   char *z, int *r
1b40: 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a  ealnum){.  if( *
1b50: 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b  z=='-' || *z=='+
1b60: 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21  ' ) z++;.  if( !
1b70: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20  isdigit(*z) ){. 
1b80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b90: 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65  .  z++;.  if( re
1ba0: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
1bb0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1bc0: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sdigit(*z) ){ z+
1bd0: 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  +; }.  if( *z=='
1be0: 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  .' ){.    z++;. 
1bf0: 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28     if( !isdigit(
1c00: 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
1c10: 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67      while( isdig
1c20: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
1c30: 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  .    if( realnum
1c40: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b   ) *realnum = 1;
1c50: 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  .  }.  if( *z=='
1c60: 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b  e' || *z=='E' ){
1c70: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
1c80: 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d  ( *z=='+' || *z=
1c90: 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
1ca0: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29  if( !isdigit(*z)
1cb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1cc0: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
1cd0: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
1ce0: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
1cf0: 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
1d00: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
1d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  ;.}../*.** A glo
1d20: 62 61 6c 20 63 68 61 72 2a 20 61 6e 64 20 61 6e  bal char* and an
1d30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
1d40: 20 61 63 63 65 73 73 20 69 74 73 20 63 75 72 72   access its curr
1d50: 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20 66 72  ent value .** fr
1d60: 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 53 51 4c  om within an SQL
1d70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
1d80: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 74 6f   program used to
1d90: 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 73 71 6c   use the .** sql
1da0: 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  ite_exec_printf(
1db0: 29 20 41 50 49 20 74 6f 20 73 75 62 73 74 69 74  ) API to substit
1dc0: 75 65 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  ue a string into
1dd0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
1de0: 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63  t..** The correc
1df0: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69 73  t way to do this
1e00: 20 77 69 74 68 20 73 71 6c 69 74 65 33 20 69 73   with sqlite3 is
1e10: 20 74 6f 20 75 73 65 20 74 68 65 20 62 69 6e 64   to use the bind
1e20: 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73 69 6e   API, but.** sin
1e30: 63 65 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  ce the shell is 
1e40: 62 75 69 6c 74 20 61 72 6f 75 6e 64 20 74 68 65  built around the
1e50: 20 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 64 69   callback paradi
1e60: 67 6d 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61  gm it would be a
1e70: 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72 6b 2e   lot.** of work.
1e80: 20 49 6e 73 74 65 61 64 20 6a 75 73 74 20 75 73   Instead just us
1e90: 65 20 74 68 69 73 20 68 61 63 6b 2c 20 77 68 69  e this hack, whi
1ea0: 63 68 20 69 73 20 71 75 69 74 65 20 68 61 72 6d  ch is quite harm
1eb0: 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
1ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 68 65  const char *zShe
1ed0: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 73 74  llStatic = 0;.st
1ee0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 73  atic void shells
1ef0: 74 61 74 69 63 46 75 6e 63 28 0a 20 20 73 71 6c  taticFunc(.  sql
1f00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1f10: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1f20: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1f30: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61  ue **argv.){.  a
1f40: 73 73 65 72 74 28 20 30 3d 3d 61 72 67 63 20 29  ssert( 0==argc )
1f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 68 65  ;.  assert( zShe
1f60: 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20 20 55 4e  llStatic );.  UN
1f70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
1f80: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
1f90: 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
1fa0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1fb0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1fc0: 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31 2c  ShellStatic, -1,
1fd0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1fe0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1ff0: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
2000: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
2010: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
2020: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
2030: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2040: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
2050: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
2060: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
2070: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
2080: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
2090: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
20a0: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
20b0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
20c0: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
20d0: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
20e0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
20f0: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
2100: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
2110: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
2120: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
2130: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
2140: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
2150: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
2160: 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20 7a 50  t eol;..  if( zP
2170: 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f 6d 70  rompt && *zPromp
2180: 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  t ){.    printf(
2190: 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b 0a 20  "%s",zPrompt);. 
21a0: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
21b0: 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65 20 3d  );.  }.  nLine =
21c0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
21d0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
21e0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
21f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
2200: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
2210: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
2220: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
2230: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
2240: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
2250: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
2260: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
2270: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
2280: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
2290: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
22a0: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
22b0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
22c0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
22d0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
22e0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
22f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2300: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
2310: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
2320: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
2330: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2340: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
2350: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
2360: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
2370: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
2380: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
2390: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
23a0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
23b0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
23c0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
23d0: 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20     eol = 1;.    
23e0: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
23f0: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
2400: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
2410: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zLine;.}../*.** 
2420: 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c  Retrieve a singl
2430: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
2440: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 72 69  text..**.** zPri
2450: 6f 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f  or is a string o
2460: 66 20 70 72 69 6f 72 20 74 65 78 74 20 72 65 74  f prior text ret
2470: 72 69 65 76 65 64 2e 20 20 49 66 20 6e 6f 74 20  rieved.  If not 
2480: 74 68 65 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72  the empty.** str
2490: 69 6e 67 2c 20 74 68 65 6e 20 69 73 73 75 65 20  ing, then issue 
24a0: 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  a continuation p
24b0: 72 6f 6d 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rompt..*/.static
24c0: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
24d0: 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61 72  _line(const char
24e0: 20 2a 7a 50 72 69 6f 72 2c 20 46 49 4c 45 20 2a   *zPrior, FILE *
24f0: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72  in){.  char *zPr
2500: 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ompt;.  char *zR
2510: 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21  esult;.  if( in!
2520: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2530: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
2540: 2c 20 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  , in);.  }.  if(
2550: 20 7a 50 72 69 6f 72 20 26 26 20 7a 50 72 69 6f   zPrior && zPrio
2560: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 50 72 6f  r[0] ){.    zPro
2570: 6d 70 74 20 3d 20 63 6f 6e 74 69 6e 75 65 50 72  mpt = continuePr
2580: 6f 6d 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ompt;.  }else{. 
2590: 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 6d 61 69     zPrompt = mai
25a0: 6e 50 72 6f 6d 70 74 3b 0a 20 20 7d 0a 20 20 7a  nPrompt;.  }.  z
25b0: 52 65 73 75 6c 74 20 3d 20 72 65 61 64 6c 69 6e  Result = readlin
25c0: 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 23 69 66 20  e(zPrompt);.#if 
25d0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
25e0: 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52  DLINE) && HAVE_R
25f0: 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 69 66 28  EADLINE==1.  if(
2600: 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65   zResult && *zRe
2610: 73 75 6c 74 20 29 20 61 64 64 5f 68 69 73 74 6f  sult ) add_histo
2620: 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e  ry(zResult);.#en
2630: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  dif.  return zRe
2640: 73 75 6c 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20  sult;.}..struct 
2650: 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61  previous_mode_da
2660: 74 61 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64  ta {.  int valid
2670: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74  ;        /* Is t
2680: 68 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20  here legit data 
2690: 69 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e  in here? */.  in
26a0: 74 20 6d 6f 64 65 3b 0a 20 20 69 6e 74 20 73 68  t mode;.  int sh
26b0: 6f 77 48 65 61 64 65 72 3b 0a 20 20 69 6e 74 20  owHeader;.  int 
26c0: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 0a 7d  colWidth[100];.}
26d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 70 6f 69 6e  ;../*.** An poin
26e0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
26f0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
2700: 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20 66  ture is passed f
2710: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  rom.** the main 
2720: 70 72 6f 67 72 61 6d 20 74 6f 20 74 68 65 20 63  program to the c
2730: 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 69  allback.  This i
2740: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e  s used to commun
2750: 69 63 61 74 65 0a 2a 2a 20 73 74 61 74 65 20 61  icate.** state a
2760: 6e 64 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  nd mode informat
2770: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63  ion..*/.struct c
2780: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 7b 0a 20  allback_data {. 
2790: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
27a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
27b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
27c0: 20 65 63 68 6f 4f 6e 3b 20 20 20 20 20 20 20 20   echoOn;        
27d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
27e0: 63 68 6f 20 69 6e 70 75 74 20 63 6f 6d 6d 61 6e  cho input comman
27f0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74  ds */.  int stat
2800: 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sOn;           /
2810: 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61  * True to displa
2820: 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62  y memory stats b
2830: 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c  efore each final
2840: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ize */.  int cnt
2850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2870: 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20 73  ords displayed s
2880: 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20  o far */.  FILE 
2890: 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  *out;           
28a0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
28b0: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
28c0: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
28d0: 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74      /* An output
28e0: 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f   mode setting */
28f0: 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53  .  int writableS
2900: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75  chema;    /* Tru
2910: 65 20 69 66 20 50 52 41 47 4d 41 20 77 72 69 74  e if PRAGMA writ
2920: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a  able_schema=ON *
2930: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
2940: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  er;        /* Tr
2950: 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d  ue to show colum
2960: 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20  n names in List 
2970: 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a  or Column mode *
2980: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
2990: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
29a0: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
29b0: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
29c0: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
29d0: 61 72 20 73 65 70 61 72 61 74 6f 72 5b 32 30 5d  ar separator[20]
29e0: 3b 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f  ;    /* Separato
29f0: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
2a00: 4d 4f 44 45 5f 4c 69 73 74 20 2a 2f 0a 20 20 69  MODE_List */.  i
2a10: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
2a20: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
2a30: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
2a40: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
2a50: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
2a60: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
2a70: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
2a80: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
2a90: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
2aa0: 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b 20 20  nullvalue[20];  
2ab0: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
2ac0: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
2ad0: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
2ae0: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2b00: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2b10: 20 73 74 72 75 63 74 20 70 72 65 76 69 6f 75 73   struct previous
2b20: 5f 6d 6f 64 65 5f 64 61 74 61 20 65 78 70 6c 61  _mode_data expla
2b30: 69 6e 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  inPrev;.        
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20 6d 6f   /* Holds the mo
2b60: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6a  de information j
2b70: 75 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  ust before.     
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 2a 2a 20 2e 65 78 70 6c 61 69 6e 20      ** .explain 
2ba0: 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74  ON */.  char out
2bb0: 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41  file[FILENAME_MA
2bc0: 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  X]; /* Filename 
2bd0: 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f  for *out */.  co
2be0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c  nst char *zDbFil
2bf0: 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d  ename;    /* nam
2c00: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2c10: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  e file */.  cons
2c20: 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20  t char *zVfs;   
2c30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c40: 6f 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  of VFS to use */
2c50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2c60: 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72  *pStmt;   /* Cur
2c70: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69  rent statement i
2c80: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45  f any. */.  FILE
2c90: 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20   *pLog;         
2ca0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20     /* Write log 
2cb0: 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 7d  output here */.}
2cc0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
2cd0: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
2ce0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
2cf0: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
2d00: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
2d10: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
2d20: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
2d30: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
2d40: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
2d50: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
2d60: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
2d70: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
2d80: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
2d90: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
2da0: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
2db0: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
2dc0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
2dd0: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
2de0: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
2df0: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
2e00: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
2e10: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
2e20: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
2e30: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
2e40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
2e50: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
2e60: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
2e70: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
2e80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
2e90: 5f 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20  _Tcl      6  /* 
2ea0: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
2eb0: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
2ec0: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
2ed0: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
2ee0: 37 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  7  /* Quote stri
2ef0: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
2f00: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
2f10: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
2f20: 38 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  8  /* Like MODE_
2f30: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
2f40: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
2f50: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
2f60: 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63  t char *modeDesc
2f70: 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22  r[] = {.  "line"
2f80: 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20  ,.  "column",.  
2f90: 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22  "list",.  "semi"
2fa0: 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69  ,.  "html",.  "i
2fb0: 6e 73 65 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c  nsert",.  "tcl",
2fc0: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
2fd0: 6c 61 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lain",.};../*.**
2fe0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2ff0: 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  nts in an array.
3000: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79  */.#define Array
3010: 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73  Size(X)  (int)(s
3020: 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28  izeof(X)/sizeof(
3030: 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  X[0]))../*.** Co
3040: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c  mpute a string l
3050: 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69  ength that is li
3060: 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61  mited to what ca
3070: 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  n be stored in.*
3080: 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20  * lower 30 bits 
3090: 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e  of a 32-bit sign
30a0: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  ed integer..*/.s
30b0: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
30c0: 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  30(const char *z
30d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
30e0: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65  *z2 = z;.  while
30f0: 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d  ( *z2 ){ z2++; }
3100: 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66  .  return 0x3fff
3110: 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20  ffff & (int)(z2 
3120: 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  - z);.}../*.** A
3130: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
3140: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
3150: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
3160: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
3170: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
3180: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
3190: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
31a0: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
31b0: 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72  k_data *p = (str
31c0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
31d0: 61 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  a*)pArg;.  if( p
31e0: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
31f0: 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d  rn;.  fprintf(p-
3200: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
3210: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
3220: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
3230: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
3240: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
3250: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
3260: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
3270: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
3280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
3290: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
32a0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
32b0: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
32c0: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
32d0: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
32e0: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
32f0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27   fprintf(out,"X'
3300: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
3310: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70  <nBlob; i++){ fp
3320: 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22  rintf(out,"%02x"
3330: 2c 7a 42 6c 6f 62 5b 69 5d 29 3b 20 7d 0a 20 20  ,zBlob[i]); }.  
3340: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
3350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
3360: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
3370: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
3380: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
3390: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
33a0: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
33b0: 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  oid output_quote
33c0: 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  d_string(FILE *o
33d0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
33e0: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z){.  int i;.  i
33f0: 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a  nt nSingle = 0;.
3400: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
3410: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3420: 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e  [i]=='\'' ) nSin
3430: 67 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  gle++;.  }.  if(
3440: 20 6e 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20   nSingle==0 ){. 
3450: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3460: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
3470: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
3480: 75 74 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69  ut,"'");.    whi
3490: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
34a0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26  for(i=0; z[i] &&
34b0: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b   z[i]!='\''; i++
34c0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d  ){}.      if( i=
34d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
34e0: 72 69 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b  rintf(out,"''");
34f0: 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  .        z++;.  
3500: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
3510: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
3520: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3530: 22 25 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20  "%.*s''",i,z);. 
3540: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b         z += i+1;
3550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3560: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
3570: 74 2c 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20  t,"%s",z);.     
3580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3590: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
35a0: 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20  ntf(out,"'");.  
35b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  }.}../*.** Outpu
35c0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
35d0: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 61  ng as a quoted a
35e0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72  ccording to C or
35f0: 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c   TCL quoting rul
3600: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3610: 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69  id output_c_stri
3620: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
3630: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
3640: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a  unsigned int c;.
3650: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
3660: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  );.  while( (c =
3670: 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20   *(z++))!=0 ){. 
3680: 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29     if( c=='\\' )
3690: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
36a0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
36b0: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
36c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
36d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
36e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
36f0: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
3700: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
3710: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
3720: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
3730: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
3740: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
3750: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
3760: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
3770: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
3780: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
3790: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
37a0: 28 20 21 69 73 70 72 69 6e 74 28 63 29 20 29 7b  ( !isprint(c) ){
37b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
37c0: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
37d0: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
37e0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
37f0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
3800: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
3810: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
3820: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
3830: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
3840: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
3850: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
3860: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
3870: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
3880: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
3890: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
38a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
38b0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
38c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b     for(i=0;   z[
38d0: 69 5d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  i] .            
38e0: 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20  && z[i]!='<' .  
38f0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
3900: 5d 21 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20  ]!='&' .        
3910: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27      && z[i]!='>'
3920: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
3930: 20 7a 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20   z[i]!='\"' .   
3940: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
3950: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
3960: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
3970: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  >0 ){.      fpri
3980: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
3990: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
39a0: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
39b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
39c0: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
39d0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
39e0: 26 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  &' ){.      fpri
39f0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
3a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3a10: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
3a20: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3a30: 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &gt;");.    }els
3a40: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27  e if( z[i]=='\"'
3a50: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3a60: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
3a70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
3a80: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
3a90: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3aa0: 26 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  &#39;");.    }el
3ab0: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
3ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
3ad0: 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  i + 1;.  }.}../*
3ae0: 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63  .** If a field c
3af0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72  ontains any char
3b00: 61 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64  acter identified
3b10: 20 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66   by a 1 in the f
3b20: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61  ollowing.** arra
3b30: 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  y, then the stri
3b40: 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65  ng must be quote
3b50: 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74  d for CSV..*/.st
3b60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3b70: 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d  needCsvQuote[] =
3b80: 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c   {.  1, 1, 1, 1,
3b90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
3ba0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3bb0: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
3bc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3bd0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
3be0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3bf0: 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30  .  1, 0, 1, 0, 0
3c00: 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20  , 0, 0, 1,   0, 
3c10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3c20: 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c  , 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: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
3c50: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 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 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
3c80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
3c90: 20 20 30 2c 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 20 20 30 2c 20 30   0, 0, 0,   0, 0
3cb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3cc0: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
3cd0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
3ce0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3cf0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
3d00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3d10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
3d20: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20  , 0, 0, 0, 1, . 
3d30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d40: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
3d50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d60: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
3d70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d80: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
3d90: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31   1, 1, 1,   .  1
3da0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3db0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
3dc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3dd0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
3de0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3df0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3e00: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
3e10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3e20: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
3e30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
3e40: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
3e50: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
3e60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e70: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
3e80: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e90: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
3ea0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
3eb0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
3ec0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
3ed0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3ee0: 20 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   1,   .};../*.**
3ef0: 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65   Output a single
3f00: 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41   term of CSV.  A
3f10: 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61  ctually, p->sepa
3f20: 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  rator is used fo
3f30: 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  r.** the separat
3f40: 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  or, which may or
3f50: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
3f60: 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c  mma.  p->nullval
3f70: 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c  ue is.** the nul
3f80: 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67  l value.  String
3f90: 73 20 61 72 65 20 71 75 6f 74 65 64 20 75 73 69  s are quoted usi
3fa0: 6e 67 20 41 4e 53 49 2d 43 20 72 75 6c 65 73 2e  ng ANSI-C rules.
3fb0: 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 70 70    Numbers.** app
3fc0: 65 61 72 20 6f 75 74 73 69 64 65 20 6f 66 20 71  ear outside of q
3fd0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
3fe0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
3ff0: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
4000: 5f 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20  _data *p, const 
4010: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65  char *z, int bSe
4020: 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20  p){.  FILE *out 
4030: 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20  = p->out;.  if( 
4040: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
4050: 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e  ntf(out,"%s",p->
4060: 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65  nullvalue);.  }e
4070: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
4080: 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73      int nSep = s
4090: 74 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72  trlen30(p->separ
40a0: 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ator);.    for(i
40b0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
40c0: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73        if( needCs
40d0: 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65  vQuote[((unsigne
40e0: 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a  d char*)z)[i]] .
40f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69           || (z[i
4100: 5d 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b  ]==p->separator[
4110: 30 5d 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  0] && .         
4120: 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20      (nSep==1 || 
4130: 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 73 65 70  memcmp(z, p->sep
4140: 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30  arator, nSep)==0
4150: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  )) ){.        i 
4160: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
4170: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4180: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  }.    if( i==0 )
4190: 7b 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27  {.      putc('"'
41a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f  , out);.      fo
41b0: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
41c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
41d0: 5b 69 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28  [i]=='"' ) putc(
41e0: 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  '"', out);.     
41f0: 20 20 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75     putc(z[i], ou
4200: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
4210: 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29    putc('"', out)
4220: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4230: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
4240: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  "%s", z);.    }.
4250: 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29    }.  if( bSep )
4260: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
4270: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
4280: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
4290: 0a 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  ..#ifdef SIGINT.
42a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
42b0: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
42c0: 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74   user presses Ct
42d0: 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rl-C.*/.static v
42e0: 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61  oid interrupt_ha
42f0: 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65  ndler(int NotUse
4300: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
4310: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
4320: 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  .  seenInterrupt
4330: 20 3d 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29   = 1;.  if( db )
4340: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
4350: 70 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  pt(db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4370: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
4380: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
4390: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
43a0: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
43b0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
43c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
43d0: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ll_callback(void
43e0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
43f0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
4400: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 69 6e  char **azCol, in
4410: 74 20 2a 61 69 54 79 70 65 29 7b 0a 20 20 69 6e  t *aiType){.  in
4420: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
4430: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
4440: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
4450: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 0a 20  k_data*)pArg;.. 
4460: 20 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65   switch( p->mode
4470: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
4480: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
4490: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
44a0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
44b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
44c0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
44d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
44e0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
44f0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
4500: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
4510: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
4520: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
4530: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
4540: 2b 3e 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d  +>0 ) fprintf(p-
4550: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
4560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4570: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
4580: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4590: 22 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c  "%*s = %s\n", w,
45a0: 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20   azCol[i],.     
45b0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
45c0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
45d0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
45e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
45f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4600: 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ase MODE_Explain
4610: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
4620: 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20  Column: {.      
4630: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
4640: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
4650: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4660: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
4670: 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  w, n;.          
4680: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
4690: 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a  p->colWidth) ){.
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
46b0: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a  p->colWidth[i];.
46c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
46d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
46e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
46f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
4700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4710: 20 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    w = strlen30(a
4720: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
4730: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
4740: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
4750: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
4760: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
4770: 30 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  0(azArg && azArg
4780: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
4790: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
47b0: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
47c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47d0: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
47e0: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
47f0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
4800: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
4810: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
4820: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
4830: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
4840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4850: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4860: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a  %-*.*s%s",w,w,az
4870: 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d  Col[i], i==nArg-
4880: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
4890: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
48a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
48b0: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
48c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
48d0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
48e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
48f0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
4900: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
4910: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
4920: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
4930: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
4940: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
4950: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
4970: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
4980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4990: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
49a0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22  "%-*.*s%s",w,w,"
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20  ---".           
49e0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ---",.          
4a30: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
4a40: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
4a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
4a60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4a70: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
4a80: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4a90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
4aa0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
4ab0: 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20    int w;.       
4ac0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
4ad0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
4ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77   ){.           w
4af0: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
4b00: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  h[i];.        }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
4b20: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
4b30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
4b40: 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
4b50: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
4b60: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  && .           s
4b70: 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d  trlen30(azArg[i]
4b80: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
4b90: 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   w = strlen30(az
4ba0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
4bb0: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
4bc0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
4bd0: 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20  s%s",w,w,.      
4be0: 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f        azArg[i] ?
4bf0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
4c00: 75 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72  ullvalue, i==nAr
4c10: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
4c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4c40: 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69    case MODE_Semi
4c50: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
4c60: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
4c70: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
4c80: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
4c90: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
4ca0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
4cb0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
4cc0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
4cd0: 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41  ,azCol[i], i==nA
4ce0: 72 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d  rg-1 ? "\n" : p-
4cf0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
4d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4d10: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
4d20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
4d40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4d50: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
4d60: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
4d70: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
4d80: 6c 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llvalue;.       
4d90: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4da0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
4db0: 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20     if( i<nArg-1 
4dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
4dd0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
4de0: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
4e00: 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
4e10: 45 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20  E_Semi ){.      
4e20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
4e30: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
4e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e50: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
4e60: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
4e70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4e80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e90: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
4ea0: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
4eb0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
4ec0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
4ed0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4ee0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
4ef0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4f00: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
4f10: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
4f20: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
4f30: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
4f40: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
4f50: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
4f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
4f70: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
4f80: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
4f90: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4fa0: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
4fb0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
4fc0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
4fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70   break;.      fp
4fe0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
4ff0: 52 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  R>");.      for(
5000: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5010: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
5020: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
5030: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
5040: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
5050: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
5060: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
5070: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullvalue);.     
5080: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5090: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
50a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
50b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
50c0: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
50d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
50e0: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
50f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
5100: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
5110: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
5120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5140: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
5150: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
5160: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
5170: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ");.          fp
5180: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
5190: 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  s", p->separator
51a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
51b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
51c0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
51d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
51e0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
51f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5200: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5210: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
5220: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
5230: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
5240: 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b  : p->nullvalue);
5250: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5260: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
5270: 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  ->separator);.  
5280: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
5290: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
52a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
52b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
52c0: 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20  DE_Csv: {.      
52d0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
52e0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
52f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
5300: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
5320: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c  put_csv(p, azCol
5330: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
5340: 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a   "", i<nArg-1);.
5350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5360: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5370: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ,"\n");.      }.
5380: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
5390: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
53a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
53b0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
53c0: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
53d0: 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d  zArg[i], i<nArg-
53e0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
53f0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5400: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
5410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5420: 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a  ase MODE_Insert:
5430: 20 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b   {.      p->cnt+
5440: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  +;.      if( azA
5450: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
5460: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5470: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
5480: 20 25 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e   %s VALUES(",p->
5490: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
54a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
54b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
54c0: 20 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69    char *zSep = i
54d0: 3e 30 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20  >0 ? ",": "";.  
54e0: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
54f0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
5500: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
5510: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
5520: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5530: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c  tf(p->out,"%sNUL
5540: 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  L",zSep);.      
5550: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
5560: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
5570: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
5580: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
5590: 65 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28  ep[0] ) fprintf(
55a0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70  p->out,"%s",zSep
55b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
55c0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
55d0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
55e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
55f0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
5600: 20 28 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c   (aiType[i]==SQL
5610: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  ITE_INTEGER || a
5620: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
5630: 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 20  _FLOAT) ){.     
5640: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5650: 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c  out,"%s%s",zSep,
5660: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
5670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
5680: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
5690: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
56a0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
56b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
56c0: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
56d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
56e0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
56f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
5700: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
5710: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
5720: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
5730: 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66   if( zSep[0] ) f
5740: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5750: 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  s",zSep);.      
5760: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
5770: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
5780: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
5790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
57a0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
57b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
57c0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
57d0: 25 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72  %s%s",zSep, azAr
57e0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
57f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5800: 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70  if( zSep[0] ) fp
5810: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
5820: 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20  ",zSep);.       
5830: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
5840: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
5850: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
5860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5870: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5880: 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t,");\n");.     
5890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
58b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
58c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
58d0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
58e0: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
58f0: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
5900: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
5910: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
5920: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
5930: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
5940: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
5950: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
5960: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
5970: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
5980: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
5990: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
59a0: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
59b0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
59c0: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
59d0: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
59e0: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
59f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
5a00: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69  ination table fi
5a10: 65 6c 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62  eld of the callb
5a20: 61 63 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75  ack_data structu
5a30: 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  re to.** the nam
5a40: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67  e of the table g
5a50: 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e  iven.  Escape an
5a60: 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  y quote characte
5a70: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62  rs in the.** tab
5a80: 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
5a90: 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c  ic void set_tabl
5aa0: 65 5f 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61  e_name(struct ca
5ab0: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20  llback_data *p, 
5ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5ad0: 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
5ae0: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b    int needQuote;
5af0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69  .  char *z;..  i
5b00: 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  f( p->zDestTable
5b10: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e   ){.    free(p->
5b20: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
5b30: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
5b40: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e   0;.  }.  if( zN
5b50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
5b60: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21  .  needQuote = !
5b70: 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65  isalpha((unsigne
5b80: 64 20 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26  d char)*zName) &
5b90: 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20  & *zName!='_';. 
5ba0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d   for(i=n=0; zNam
5bb0: 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b  e[i]; i++, n++){
5bc0: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
5bd0: 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  m((unsigned char
5be0: 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e  )zName[i]) && zN
5bf0: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20  ame[i]!='_' ){. 
5c00: 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d       needQuote =
5c10: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   1;.      if( zN
5c20: 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  ame[i]=='\'' ) n
5c30: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
5c40: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
5c50: 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d  n += 2;.  z = p-
5c60: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61  >zDestTable = ma
5c70: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69  lloc( n+1 );.  i
5c80: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( z==0 ){.    f
5c90: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
5ca0: 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
5cb0: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
5cc0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  t(1);.  }.  n = 
5cd0: 30 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  0;.  if( needQuo
5ce0: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c  te ) z[n++] = '\
5cf0: 27 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  '';.  for(i=0; z
5d00: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Name[i]; i++){. 
5d10: 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d     z[n++] = zNam
5d20: 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e  e[i];.    if( zN
5d30: 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a  ame[i]=='\'' ) z
5d40: 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [n++] = '\'';.  
5d50: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
5d60: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27  e ) z[n++] = '\'
5d70: 27 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d  ';.  z[n] = 0;.}
5d80: 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68  ../* zIn is eith
5d90: 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  er a pointer to 
5da0: 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65  a NULL-terminate
5db0: 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  d string in memo
5dc0: 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  ry obtained.** f
5dd0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72  rom malloc(), or
5de0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
5df0: 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e   The string poin
5e00: 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e  ted to by zAppen
5e10: 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f  d is.** added to
5e20: 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65   zIn, and the re
5e30: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e  sult returned in
5e40: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5e50: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
5e60: 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61  ** zIn, if it wa
5e70: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66  s not NULL, is f
5e80: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  reed..**.** If t
5e90: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
5ea0: 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74  t, quote, is not
5eb0: 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69   '\0', then it i
5ec0: 73 20 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20  s used as a .** 
5ed0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
5ee0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
5ef0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 70 70  static char *app
5f00: 65 6e 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49  endText(char *zI
5f10: 6e 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  n, char const *z
5f20: 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f  Append, char quo
5f30: 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  te){.  int len;.
5f40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
5f50: 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33  Append = strlen3
5f60: 30 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e  0(zAppend);.  in
5f70: 74 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72  t nIn = (zIn?str
5f80: 6c 65 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a  len30(zIn):0);..
5f90: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
5fa0: 6e 49 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  nIn+1;.  if( quo
5fb0: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
5fc0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
5fd0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
5fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
5ff0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
6000: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
6010: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20  ..  zIn = (char 
6020: 2a 29 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c  *)realloc(zIn, l
6030: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20  en);.  if( !zIn 
6040: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6050: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74  .  }..  if( quot
6060: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  e ){.    char *z
6070: 43 73 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b  Csr = &zIn[nIn];
6080: 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  .    *zCsr++ = q
6090: 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  uote;.    for(i=
60a0: 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b  0; i<nAppend; i+
60b0: 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b  +){.      *zCsr+
60c0: 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a  + = zAppend[i];.
60d0: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
60e0: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a  d[i]==quote ) *z
60f0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
6100: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b     }.    *zCsr++
6110: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a   = quote;.    *z
6120: 43 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20  Csr++ = '\0';.  
6130: 20 20 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d    assert( (zCsr-
6140: 7a 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d  zIn)==len );.  }
6150: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79  else{.    memcpy
6160: 28 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70  (&zIn[nIn], zApp
6170: 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20  end, nAppend);. 
6180: 20 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20     zIn[len-1] = 
6190: 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  '\0';.  }..  ret
61a0: 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn zIn;.}.../*.
61b0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
61c0: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
61d0: 74 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72  t has a single r
61e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50  esult column.  P
61f0: 72 69 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73  rint.** that res
6200: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20  ult column on a 
6210: 6c 69 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77  line by itself w
6220: 69 74 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20  ith a semicolon 
6230: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
6240: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 2c 20  * This is used, 
6250: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
6260: 73 68 6f 77 20 74 68 65 20 73 63 68 65 6d 61 20  show the schema 
6270: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6280: 62 79 0a 2a 2a 20 71 75 65 72 79 69 6e 67 20 74  by.** querying t
6290: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
62a0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
62b0: 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f  c int run_table_
62c0: 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 46 49  dump_query(.  FI
62d0: 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20  LE *out,        
62e0: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 6f 75        /* Send ou
62f0: 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 73  tput here */.  s
6300: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6320: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
6330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
6340: 6c 65 63 74 2c 20 20 20 20 2f 2a 20 53 45 4c 45  lect,    /* SELE
6350: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
6360: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
6370: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6380: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 2f 2a 20  *zFirstRow   /* 
6390: 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72  Print before fir
63a0: 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e  st row, if not N
63b0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
63c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
63d0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  t;.  int rc;.  r
63e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
63f0: 61 72 65 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c  are(db, zSelect,
6400: 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30   -1, &pSelect, 0
6410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6420: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65  ITE_OK || !pSele
6430: 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
6440: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
6450: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
6460: 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  lect);.  while( 
6470: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
6480: 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74  {.    if( zFirst
6490: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 66 70 72  Row ){.      fpr
64a0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
64b0: 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
64c0: 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
64e0: 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  tf(out, "%s;\n",
64f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6500: 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29  text(pSelect, 0)
6510: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
6520: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
6530: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6540: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6550: 28 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pSelect);.}../*
6560: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
6570: 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20  ce and save off 
6580: 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74  current error st
6590: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
65a0: 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d  char *save_err_m
65b0: 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sg(.  sqlite3 *d
65c0: 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b            /* 
65d0: 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
65e0: 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  y */.){.  int nE
65f0: 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e  rrMsg = 1+strlen
6600: 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  30(sqlite3_errms
6610: 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a  g(db));.  char *
6620: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
6630: 33 5f 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d 73 67  3_malloc(nErrMsg
6640: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
6650: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
6660: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
6670: 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
6680: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
6690: 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f  rn zErrMsg;.}../
66a0: 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d  *.** Display mem
66b0: 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  ory stats..*/.st
66c0: 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
66d0: 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  _stats(.  sqlite
66e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
66f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6700: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
6710: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
6720: 64 61 74 61 20 2a 70 41 72 67 2c 20 2f 2a 20 50  data *pArg, /* P
6730: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
6740: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
6750: 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
6780: 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
6790: 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
67a0: 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69 66  nt iHiwtr;..  if
67b0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
67c0: 6f 75 74 20 29 7b 0a 20 20 20 20 0a 20 20 20 20  out ){.    .    
67d0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
67e0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
67f0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6800: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
6810: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
6820: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
6830: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
6840: 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 20  , "Memory Used: 
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
6870: 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43  %d) bytes\n", iC
6880: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
6890: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
68a0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
68b0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
68c0: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
68d0: 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  NT, &iCur, &iHiw
68e0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
68f0: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
6900: 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  ut, "Number of O
6910: 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
6920: 61 74 69 6f 6e 73 3a 20 20 20 25 64 20 28 6d 61  ations:   %d (ma
6930: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20  x %d)\n", iCur, 
6940: 69 48 69 77 74 72 29 3b 0a 2f 2a 0a 2a 2a 20 4e  iHiwtr);./*.** N
6950: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  ot currently use
6960: 64 20 62 79 20 74 68 65 20 43 4c 49 2e 0a 2a 2a  d by the CLI..**
6970: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
6980: 72 20 3d 20 2d 31 3b 0a 2a 2a 20 20 20 20 73 71  r = -1;.**    sq
6990: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
69a0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
69b0: 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72  ACHE_USED, &iCur
69c0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
69d0: 74 29 3b 0a 2a 2a 20 20 20 20 66 70 72 69 6e 74  t);.**    fprint
69e0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
69f0: 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
6a00: 61 67 65 73 20 55 73 65 64 3a 20 20 20 20 20 20  ages Used:      
6a10: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 70     %d (max %d) p
6a20: 61 67 65 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69  ages\n", iCur, i
6a30: 48 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20 20 69  Hiwtr);.*/.    i
6a40: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
6a50: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
6a60: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
6a70: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
6a80: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
6a90: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
6aa0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
6ab0: 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
6ac0: 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
6ad0: 6f 77 20 42 79 74 65 73 3a 20 20 20 20 20 25 64  ow Bytes:     %d
6ae0: 20 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c   (max %d) bytes\
6af0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
6b00: 29 3b 0a 2f 2a 0a 2a 2a 20 4e 6f 74 20 63 75 72  );./*.** Not cur
6b10: 72 65 6e 74 6c 79 20 75 73 65 64 20 62 79 20 74  rently used by t
6b20: 68 65 20 43 4c 49 2e 0a 2a 2a 20 20 20 20 69 48  he CLI..**    iH
6b30: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
6b40: 3b 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.**    sqlite3_
6b50: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6b60: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45  ATUS_SCRATCH_USE
6b70: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
6b80: 72 2c 20 62 52 65 73 65 74 29 3b 0a 2a 2a 20 20  r, bReset);.**  
6b90: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
6ba0: 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
6bb0: 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74 69  Scratch Allocati
6bc0: 6f 6e 73 20 55 73 65 64 3a 20 20 25 64 20 28 6d  ons Used:  %d (m
6bd0: 61 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c  ax %d)\n", iCur,
6be0: 20 69 48 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20   iHiwtr);.*/.   
6bf0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
6c00: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
6c10: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
6c20: 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56  TATUS_SCRATCH_OV
6c30: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
6c40: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
6c50: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
6c60: 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
6c70: 6f 66 20 53 63 72 61 74 63 68 20 4f 76 65 72 66  of Scratch Overf
6c80: 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20 25 64  low Bytes:    %d
6c90: 20 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c   (max %d) bytes\
6ca0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
6cb0: 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
6cc0: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
6cd0: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
6ce0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
6cf0: 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  OC_SIZE, &iCur, 
6d00: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
6d10: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
6d20: 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73  rg->out, "Larges
6d30: 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20  t Allocation:   
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
6d50: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77  d bytes\n", iHiw
6d60: 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  tr);.    iHiwtr 
6d70: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
6d80: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
6d90: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
6da0: 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 26 69  GECACHE_SIZE, &i
6db0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
6dc0: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
6dd0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
6de0: 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c  argest Pcache Al
6df0: 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20  location:       
6e00: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
6e10: 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69 48   iHiwtr);.    iH
6e20: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
6e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
6e40: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
6e50: 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c  US_SCRATCH_SIZE,
6e60: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
6e70: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
6e80: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
6e90: 20 22 4c 61 72 67 65 73 74 20 53 63 72 61 74 63   "Largest Scratc
6ea0: 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20  h Allocation:   
6eb0: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
6ec0: 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 23 69 66  n", iHiwtr);.#if
6ed0: 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54  def YYTRACKMAXST
6ee0: 41 43 4b 44 45 50 54 48 0a 20 20 20 20 69 48 69  ACKDEPTH.    iHi
6ef0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
6f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61  .    sqlite3_sta
6f10: 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55  tus(SQLITE_STATU
6f20: 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20  S_PARSER_STACK, 
6f30: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
6f40: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
6f50: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
6f60: 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20  "Deepest Parser 
6f70: 53 74 61 63 6b 3a 20 20 20 20 20 20 20 20 20 20  Stack:          
6f80: 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64        %d (max %d
6f90: 29 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77  )\n", iCur, iHiw
6fa0: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  tr);.#endif.  }.
6fb0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
6fc0: 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29  Arg->out && db )
6fd0: 7b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  {.    iHiwtr = i
6fe0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
6ff0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
7000: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
7010: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
7020: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
7030: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
7040: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
7050: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53  ut, "Lookaside S
7060: 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20 20  lots Used:      
7070: 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61            %d (ma
7080: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20  x %d)\n", iCur, 
7090: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c  iHiwtr);.    sql
70a0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
70b0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
70c0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54  US_LOOKASIDE_HIT
70d0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
70e0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
70f0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7100: 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
7110: 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
7120: 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  :       %d\n", i
7130: 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  Hiwtr);.    sqli
7140: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
7150: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
7160: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
7170: 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69  _SIZE, &iCur, &i
7180: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
7190: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
71a0: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
71b0: 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
71c0: 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c  o size:      %d\
71d0: 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  n", iHiwtr);.   
71e0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
71f0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
7200: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
7210: 5f 4d 49 53 53 5f 46 55 4c 4c 2c 20 26 69 43 75  _MISS_FULL, &iCu
7220: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
7230: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
7240: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
7250: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
7260: 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
7270: 20 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29    %d\n", iHiwtr)
7280: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
7290: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
72a0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
72b0: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
72c0: 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
72d0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
72e0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
72f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
7300: 22 50 61 67 65 72 20 48 65 61 70 20 55 73 61 67  "Pager Heap Usag
7310: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
7320: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
7330: 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69  ", iCur); .    i
7340: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
7350: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
7360: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
7370: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48  ITE_DBSTATUS_SCH
7380: 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  EMA_USED, &iCur,
7390: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
73a0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
73b0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d  Arg->out, "Schem
73c0: 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  a Heap Usage:   
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75  %d bytes\n", iCu
73f0: 72 29 3b 20 0a 20 20 20 20 69 48 69 77 74 72 20  r); .    iHiwtr 
7400: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
7410: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
7420: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
7430: 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44  STATUS_STMT_USED
7440: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
7450: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
7460: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7470: 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61  , "Statement Hea
7480: 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67  p/Lookaside Usag
7490: 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73  e:      %d bytes
74a0: 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 7d  \n", iCur); .  }
74b0: 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ..  if( pArg && 
74c0: 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20  pArg->out && db 
74d0: 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  && pArg->pStmt )
74e0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
74f0: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
7500: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
7510: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
7520: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 62  FULLSCAN_STEP, b
7530: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
7540: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
7550: 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
7580: 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
7590: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
75a0: 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
75b0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
75c0: 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
75d0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
75e0: 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65  ->out, "Sort Ope
75f0: 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20  rations:        
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
7610: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
7620: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
7630: 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
7640: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
7650: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7660: 45 58 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EX, bReset);.   
7670: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
7680: 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49  ut, "Autoindex I
7690: 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20  nserts:         
76a0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
76b0: 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 72   iCur);.  }..  r
76c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
76d0: 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74  * Execute a stat
76e0: 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20  ement or set of 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69  statements.  Pri
7700: 6e 74 20 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c  nt .** any resul
7710: 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64  t rows/columns d
7720: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
7730: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 0a 2a 2a  current mode .**
7740: 20 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70   set via the sup
7750: 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a  plied callback..
7760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65  **.** This is ve
7770: 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51  ry similar to SQ
7780: 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20  Lite's built-in 
7790: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 0a  sqlite3_exec() .
77a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65  ** function exce
77b0: 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c  pt it takes a sl
77c0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
77d0: 20 63 61 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 6e   callback .** an
77e0: 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 20  d callback data 
77f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
7800: 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78  tic int shell_ex
7810: 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ec(.  sqlite3 *d
7820: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
7850: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
7860: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
7890: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f   be evaluated */
78a0: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
78b0: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
78c0: 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a  ar**,char**,int*
78d0: 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  ),   /* Callback
78e0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e             /* (n
7920: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ot the same as s
7930: 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a  qlite3_exec) */.
7940: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
7950: 6b 5f 64 61 74 61 20 2a 70 41 72 67 2c 20 20 20  k_data *pArg,   
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7970: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75   Pointer to stru
7980: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
7990: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
79a0: 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
79d0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
79e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
79f0: 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
7a00: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
7a10: 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
7a20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7a30: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7a40: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
7a50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7a60: 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20   *zLeftover;    
7a70: 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
7a80: 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
7a90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72   */..  if( pzErr
7aa0: 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Msg ){.    *pzEr
7ab0: 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  rMsg = NULL;.  }
7ac0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ..  while( zSql[
7ad0: 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b  0] && (SQLITE_OK
7ae0: 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 72   == rc) ){.    r
7af0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
7b00: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
7b10: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
7b20: 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66  eftover);.    if
7b30: 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72  ( SQLITE_OK != r
7b40: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
7b50: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
7b60: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
7b70: 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b  ave_err_msg(db);
7b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7b90: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  se{.      if( !p
7ba0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
7bb0: 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  /* this happens 
7bc0: 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72  for a comment or
7bd0: 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a   white-space */.
7be0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
7bf0: 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
7c00: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
7c10: 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
7c20: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
7c30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
7c40: 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
7c50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
7c60: 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  atment handle an
7c70: 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e  d reset row coun
7c80: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
7c90: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
7ca0: 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
7cb0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67  mt;.        pArg
7cc0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
7cd0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68   }..      /* ech
7ce0: 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  o the sql statem
7cf0: 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a  ent if echo on *
7d00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
7d10: 20 26 26 20 70 41 72 67 2d 3e 65 63 68 6f 4f 6e   && pArg->echoOn
7d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
7d30: 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c  t char *zStmtSql
7d40: 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
7d50: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 66  Stmt);.        f
7d60: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7d70: 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53  , "%s\n", zStmtS
7d80: 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20  ql ? zStmtSql : 
7d90: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
7da0: 20 20 20 20 20 20 2f 2a 20 70 65 72 66 6f 72 6d        /* perform
7db0: 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e   the first step.
7dc0: 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c    this will tell
7dd0: 20 75 73 20 69 66 20 77 65 0a 20 20 20 20 20 20   us if we.      
7de0: 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  ** have a result
7df0: 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20   set or not and 
7e00: 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a  how wide it is..
7e10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
7e20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
7e30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 2f  (pStmt);.      /
7e40: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72  * if we have a r
7e50: 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a  esult set... */.
7e60: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
7e70: 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
7e80: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68        /* if we h
7e90: 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e  ave a callback..
7ea0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
7eb0: 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20   xCallback ){.  
7ec0: 20 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63          /* alloc
7ed0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f  ate space for co
7ee0: 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75  l name ptr, valu
7ef0: 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20  e ptr, and type 
7f00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
7f10: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
7f20: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
7f30: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 76  mt);.          v
7f40: 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c  oid *pData = sql
7f50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a 6e 43  ite3_malloc(3*nC
7f60: 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20  ol*sizeof(const 
7f70: 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20  char*) + 1);.   
7f80: 20 20 20 20 20 20 20 69 66 28 20 21 70 44 61 74         if( !pDat
7f90: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
7fa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7fb0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  EM;.          }e
7fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7fd0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d   char **azCols =
7fe0: 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b   (char **)pData;
7ff0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f        /* Names o
8000: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
8010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8020: 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20  char **azVals = 
8030: 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20  &azCols[nCol];  
8040: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
8050: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
8060: 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69  nt *aiTypes = (i
8070: 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f  nt *)&azVals[nCo
8080: 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79  l]; /* Result ty
8090: 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
80a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
80b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
80c0: 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
80d0: 6f 66 28 63 68 61 72 20 2a 29 29 3b 20 0a 20 20  of(char *)); .  
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76            /* sav
80f0: 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f  e off ptrs to co
8100: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
8110: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
8120: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
8130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
8140: 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zCols[i] = (char
8150: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
8160: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  n_name(pStmt, i)
8170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8180: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a              do{.
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81a0: 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74   extract the dat
81b0: 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73  a and data types
81c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
81d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
81e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
81f0: 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
8200: 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
8210: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
8220: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79              aiTy
8240: 70 65 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  pes[i] = sqlite3
8250: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
8260: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
8270: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56          if( !azV
8280: 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70  als[i] && (aiTyp
8290: 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55  es[i]!=SQLITE_NU
82a0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
82b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
82c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
82e0: 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72  eak; /* from for
82f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8310: 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72      } /* end for
8320: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
8330: 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e     /* if data an
8340: 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65  d types extracte
8350: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e  d successfully..
8360: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
8370: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
8380: 57 20 3d 3d 20 72 63 20 29 7b 20 0a 20 20 20 20  W == rc ){ .    
8390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
83a0: 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
83b0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
83c0: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
83d0: 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
83e0: 20 20 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62        if( xCallb
83f0: 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20  ack(pArg, nCol, 
8400: 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20  azVals, azCols, 
8410: 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20  aiTypes) ){.    
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
8430: 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
8440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8460: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
8470: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
8480: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
8490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
84a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
84b0: 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54    } while( SQLIT
84c0: 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20  E_ROW == rc );. 
84d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
84e0: 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
84f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8510: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
8520: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8530: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
8540: 20 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65           } while
8550: 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52  ( rc == SQLITE_R
8560: 4f 57 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OW );.        }.
8570: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8580: 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
8590: 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
85a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
85b0: 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
85c0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
85d0: 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
85e0: 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
85f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  }..      /* Fina
8600: 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
8610: 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nt just executed
8620: 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  . If this fails,
8630: 20 73 61 76 65 20 61 20 0a 20 20 20 20 20 20 2a   save a .      *
8640: 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
8650: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
8660: 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
8670: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8680: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
8690: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
86a0: 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
86b0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
86c0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
86d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
86e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
86f0: 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
8700: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
8710: 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  isspace(zSql[0])
8720: 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
8730: 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
8740: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
8750: 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
8760: 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
8770: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
8780: 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
8790: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
87a0: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
87b0: 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
87c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
87d0: 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
87e0: 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
87f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
8800: 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66  * This is a diff
8810: 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72  erent callback r
8820: 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20  outine used for 
8830: 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61  dumping the data
8840: 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f  base..** Each ro
8850: 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  w received by th
8860: 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73  is callback cons
8870: 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ists of a table 
8880: 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62  name,.** the tab
8890: 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22  le type ("index"
88a0: 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64   or "table") and
88b0: 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74   SQL to create t
88c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  he table..** Thi
88d0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
88e0: 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66   print text suff
88f0: 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61  icient to recrea
8900: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  te the table..*/
8910: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70  .static int dump
8920: 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _callback(void *
8930: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
8940: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
8950: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69  ar **azCol){.  i
8960: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
8970: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
8980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8990: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
89a0: 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zSql;.  const ch
89b0: 61 72 20 2a 7a 50 72 65 70 53 74 6d 74 20 3d 20  ar *zPrepStmt = 
89c0: 30 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  0;.  struct call
89d0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28  back_data *p = (
89e0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
89f0: 64 61 74 61 20 2a 29 70 41 72 67 3b 0a 0a 20 20  data *)pArg;..  
8a00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8a10: 28 61 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 6e  (azCol);.  if( n
8a20: 41 72 67 21 3d 33 20 29 20 72 65 74 75 72 6e 20  Arg!=3 ) return 
8a30: 31 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  1;.  zTable = az
8a40: 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20  Arg[0];.  zType 
8a50: 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53  = azArg[1];.  zS
8a60: 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  ql = azArg[2];. 
8a70: 20 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a   .  if( strcmp(z
8a80: 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73  Table, "sqlite_s
8a90: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
8aa0: 20 20 20 20 7a 50 72 65 70 53 74 6d 74 20 3d 20      zPrepStmt = 
8ab0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
8ac0: 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
8ad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
8ae0: 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
8af0: 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20  lite_stat1")==0 
8b00: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
8b10: 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
8b20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
8b30: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
8b40: 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
8b50: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
8b60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8b70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
8b80: 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
8b90: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
8ba0: 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
8bb0: 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
8bc0: 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
8bd0: 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
8be0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
8bf0: 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
8c00: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
8c10: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
8c20: 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
8c30: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
8c40: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8c50: 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
8c60: 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
8c70: 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
8c80: 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
8c90: 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
8ca0: 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
8cb0: 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
8cc0: 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
8cd0: 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
8ce0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
8cf0: 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
8d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8d10: 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
8d20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
8d30: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
8d40: 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  >out, "%s;\n", z
8d50: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Sql);.  }..  if(
8d60: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22   strcmp(zType, "
8d70: 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
8d80: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8d90: 70 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a  pTableInfo = 0;.
8da0: 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63      char *zSelec
8db0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  t = 0;.    char 
8dc0: 2a 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b  *zTableInfo = 0;
8dd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20  .    char *zTmp 
8de0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f  = 0;.    int nRo
8df0: 77 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a  w = 0;.   .    z
8e00: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
8e10: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
8e20: 6f 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  o, "PRAGMA table
8e30: 5f 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20  _info(", 0);.   
8e40: 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70   zTableInfo = ap
8e50: 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49  pendText(zTableI
8e60: 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  nfo, zTable, '"'
8e70: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
8e80: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
8e90: 54 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c  TableInfo, ");",
8ea0: 20 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73   0);..    rc = s
8eb0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8ec0: 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f  ->db, zTableInfo
8ed0: 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e 66  , -1, &pTableInf
8ee0: 6f 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  o, 0);.    free(
8ef0: 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20  zTableInfo);.   
8f00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8f10: 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e 66  OK || !pTableInf
8f20: 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  o ){.      retur
8f30: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
8f40: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
8f50: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 53  Text(zSelect, "S
8f60: 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49 4e  ELECT 'INSERT IN
8f70: 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20  TO ' || ", 0);. 
8f80: 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64     zTmp = append
8f90: 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c  Text(zTmp, zTabl
8fa0: 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66 28  e, '"');.    if(
8fb0: 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a   zTmp ){.      z
8fc0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
8fd0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d  ext(zSelect, zTm
8fe0: 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 7d 0a  p, '\'');.    }.
8ff0: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
9000: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
9010: 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45 53 28  , " || ' VALUES(
9020: 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20  ' || ", 0);.    
9030: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
9040: 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  p(pTableInfo);. 
9050: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
9060: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9080: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
9090: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
90a0: 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65 49 6e  mn_text(pTableIn
90b0: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 53  fo, 1);.      zS
90c0: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
90d0: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71 75 6f  xt(zSelect, "quo
90e0: 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  te(", 0);.      
90f0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
9100: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
9110: 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  ext, '"');.     
9120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
9130: 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a  ep(pTableInfo);.
9140: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9150: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9160: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
9170: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
9180: 2c 20 22 29 20 7c 7c 20 27 2c 27 20 7c 7c 20 22  , ") || ',' || "
9190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
91a0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65  e{.        zSele
91b0: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
91c0: 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c 20 30  zSelect, ") ", 0
91d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
91e0: 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRow++;.    }. 
91f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9200: 66 69 6e 61 6c 69 7a 65 28 70 54 61 62 6c 65 49  finalize(pTableI
9210: 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
9220: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  !=SQLITE_OK || n
9230: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Row==0 ){.      
9240: 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20  free(zSelect);. 
9250: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9260: 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65 63 74     }.    zSelect
9270: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
9280: 65 6c 65 63 74 2c 20 22 7c 7c 20 27 29 27 20 46  elect, "|| ')' F
9290: 52 4f 4d 20 20 22 2c 20 30 29 3b 0a 20 20 20 20  ROM  ", 0);.    
92a0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
92b0: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
92c0: 61 62 6c 65 2c 20 27 22 27 29 3b 0a 0a 20 20 20  able, '"');..   
92d0: 20 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f   rc = run_table_
92e0: 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75  dump_query(p->ou
92f0: 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63  t, p->db, zSelec
9300: 74 2c 20 7a 50 72 65 70 53 74 6d 74 29 3b 0a 20  t, zPrepStmt);. 
9310: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9320: 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
9330: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
9340: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
9350: 20 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69   " ORDER BY rowi
9360: 64 20 44 45 53 43 22 2c 20 30 29 3b 0a 20 20 20  d DESC", 0);.   
9370: 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c     rc = run_tabl
9380: 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e  e_dump_query(p->
9390: 6f 75 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65 6c  out, p->db, zSel
93a0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ect, 0);.    }. 
93b0: 20 20 20 69 66 28 20 7a 53 65 6c 65 63 74 20 29     if( zSelect )
93c0: 20 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a   free(zSelect);.
93d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
93e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75  }../*.** Run zQu
93f0: 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63  ery.  Use dump_c
9400: 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65  allback() as the
9410: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
9420: 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  e so that.** the
9430: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
9440: 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70 75   query are outpu
9450: 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65  t as SQL stateme
9460: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nts..**.** If we
9470: 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f   get a SQLITE_CO
9480: 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72  RRUPT error, rer
9490: 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66 74  un the query aft
94a0: 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20  er appending.** 
94b0: 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
94c0: 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64  DESC" to the end
94d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
94e0: 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
94f0: 71 75 65 72 79 28 0a 20 20 73 74 72 75 63 74 20  query(.  struct 
9500: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
9510: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
9520: 2a 7a 51 75 65 72 79 2c 0a 20 20 63 68 61 72 20  *zQuery,.  char 
9530: 2a 2a 70 7a 45 72 72 4d 73 67 0a 29 7b 0a 20 20  **pzErrMsg.){.  
9540: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
9550: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
9560: 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f  b, zQuery, dump_
9570: 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 70 7a 45  callback, p, pzE
9580: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
9590: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
95a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51   ){.    char *zQ
95b0: 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  2;.    int len =
95c0: 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79   strlen30(zQuery
95d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72  );.    if( pzErr
95e0: 4d 73 67 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Msg ) sqlite3_fr
95f0: 65 65 28 2a 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ee(*pzErrMsg);. 
9600: 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28     zQ2 = malloc(
9610: 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20   len+100 );.    
9620: 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74  if( zQ2==0 ) ret
9630: 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
9640: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
9650: 65 6f 66 28 7a 51 32 29 2c 20 7a 51 32 2c 20 22  eof(zQ2), zQ2, "
9660: 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
9670: 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
9680: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
9690: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
96a0: 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
96b0: 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b  k, p, pzErrMsg);
96c0: 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
96d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
96f0: 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
9700: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9710: 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 62 61  zHelp[] =.  ".ba
9720: 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
9730: 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
9740: 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
9750: 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e   to FILE\n".  ".
9760: 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20 20  bail ON|OFF     
9770: 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
9780: 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
9790: 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
97a0: 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  n".  ".databases
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
97c0: 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
97d0: 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
97e0: 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64  tabases\n".  ".d
97f0: 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
9800: 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
9810: 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
9820: 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
9830: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
9840: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
9850: 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
9860: 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
9870: 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
98a0: 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
98b0: 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46 20    ".echo ON|OFF 
98c0: 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
98d0: 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
98e0: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78 69  r off\n".  ".exi
98f0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
9900: 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
9910: 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c  gram\n".  ".expl
9920: 61 69 6e 20 3f 4f 4e 7c 4f 46 46 3f 20 20 20 20  ain ?ON|OFF?    
9930: 20 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f    Turn output mo
9940: 64 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  de suitable for 
9950: 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66  EXPLAIN on or of
9960: 66 2e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  f.\n".  "       
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 57 69 74 68 20 6e 6f 20 61 72 67 73 2c 20    With no args, 
9990: 69 74 20 74 75 72 6e 73 20 45 58 50 4c 41 49 4e  it turns EXPLAIN
99a0: 20 6f 6e 2e 5c 6e 22 0a 20 20 22 2e 68 65 61 64   on.\n".  ".head
99b0: 65 72 28 73 29 20 4f 4e 7c 4f 46 46 20 20 20 20  er(s) ON|OFF    
99c0: 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f    Turn display o
99d0: 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20  f headers on or 
99e0: 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20  off\n".  ".help 
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61   Show this messa
9a10: 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74  ge\n".  ".import
9a20: 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20   FILE TABLE     
9a30: 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
9a40: 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
9a50: 5c 6e 22 0a 20 20 22 2e 69 6e 64 69 63 65 73 20  \n".  ".indices 
9a60: 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68  ?TABLE?       Sh
9a70: 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  ow names of all 
9a80: 69 6e 64 69 63 65 73 5c 6e 22 0a 20 20 22 20 20  indices\n".  "  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
9ab0: 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
9ac0: 73 68 6f 77 20 69 6e 64 69 63 65 73 20 66 6f 72  show indices for
9ad0: 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\n".  "  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20         matching 
9b00: 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
9b10: 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  LE.\n".#ifdef SQ
9b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9b30: 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20  ACE.  ".iotrace 
9b40: 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e  FILE          En
9b50: 61 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73  able I/O diagnos
9b60: 74 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46  tic logging to F
9b70: 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69  ILE\n".#endif.#i
9b80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9b90: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
9ba0: 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  .  ".load FILE ?
9bb0: 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20  ENTRY?     Load 
9bc0: 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62  an extension lib
9bd0: 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  rary\n".#endif. 
9be0: 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20   ".log FILE|off 
9bf0: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f           Turn lo
9c00: 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e  gging on or off.
9c10: 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74    FILE can be st
9c20: 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20  derr/stdout\n". 
9c30: 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41   ".mode MODE ?TA
9c40: 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74  BLE?     Set out
9c50: 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d  put mode where M
9c60: 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e  ODE is one of:\n
9c70: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73                cs
9c90: 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70  v      Comma-sep
9ca0: 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22  arated values\n"
9cb0: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
9cd0: 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e  umn   Left-align
9ce0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65  ed columns.  (Se
9cf0: 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22  e .width)\n".  "
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20           html   
9d20: 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63    HTML <table> c
9d30: 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ode\n".  "      
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20     insert   SQL 
9d60: 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  insert statement
9d70: 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20  s for TABLE\n". 
9d80: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9d90: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20             line 
9da0: 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65      One value pe
9db0: 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20  r line\n".  "   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56        list     V
9de0: 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20  alues delimited 
9df0: 62 79 20 2e 73 65 70 61 72 61 74 6f 72 20 73 74  by .separator st
9e00: 72 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  ring\n".  "     
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
9e30: 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
9e40: 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69   tcl      TCL li
9e70: 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20  st elements\n". 
9e80: 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
9e90: 49 4e 47 20 20 20 20 20 20 50 72 69 6e 74 20 53  ING      Print S
9ea0: 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
9eb0: 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22  f NULL values\n"
9ec0: 0a 20 20 22 2e 6f 75 74 70 75 74 20 46 49 4c 45  .  ".output FILE
9ed0: 4e 41 4d 45 20 20 20 20 20 20 20 53 65 6e 64 20  NAME       Send 
9ee0: 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 4e 41  output to FILENA
9ef0: 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74  ME\n".  ".output
9f00: 20 73 74 64 6f 75 74 20 20 20 20 20 20 20 20 20   stdout         
9f10: 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 74  Send output to t
9f20: 68 65 20 73 63 72 65 65 6e 5c 6e 22 0a 20 20 22  he screen\n".  "
9f30: 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e  .prompt MAIN CON
9f40: 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74  TINUE  Replace t
9f50: 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d  he standard prom
9f60: 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20  pts\n".  ".quit 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
9f90: 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46  am\n".  ".read F
9fa0: 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20  ILENAME         
9fb0: 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46  Execute SQL in F
9fc0: 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72  ILENAME\n".  ".r
9fd0: 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
9fe0: 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e       Restore con
9ff0: 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61  tent of DB (defa
a000: 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72  ult \"main\") fr
a010: 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73  om FILE\n".  ".s
a020: 63 68 65 6d 61 20 3f 54 41 42 4c 45 3f 20 20 20  chema ?TABLE?   
a030: 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52       Show the CR
a040: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 5c  EATE statements\
a050: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
a070: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
a080: 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 74 61 62  d, only show tab
a090: 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
a0a0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
a0c0: 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
a0d0: 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72  n".  ".separator
a0e0: 20 53 54 52 49 4e 47 20 20 20 20 20 20 43 68 61   STRING      Cha
a0f0: 6e 67 65 20 73 65 70 61 72 61 74 6f 72 20 75 73  nge separator us
a100: 65 64 20 62 79 20 6f 75 74 70 75 74 20 6d 6f 64  ed by output mod
a110: 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22  e and .import\n"
a120: 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
a130: 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
a140: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
a150: 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73  es for various s
a160: 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 73  ettings\n".  ".s
a170: 74 61 74 73 20 4f 4e 7c 4f 46 46 20 20 20 20 20  tats ON|OFF     
a180: 20 20 20 20 20 54 75 72 6e 20 73 74 61 74 73 20       Turn stats 
a190: 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
a1a0: 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20  .tables ?TABLE? 
a1b0: 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
a1c0: 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20  s of tables\n". 
a1d0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a1e0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
a1f0: 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
a200: 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20  nly list tables 
a210: 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
a240: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
a250: 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20   ".timeout MS   
a260: 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
a270: 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
a280: 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
a290: 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 77 69  econds\n".  ".wi
a2a0: 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e  dth NUM1 NUM2 ..
a2b0: 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77  .   Set column w
a2c0: 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75  idths for \"colu
a2d0: 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a  mn\" mode\n".;..
a2e0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 54 69 6d  static char zTim
a2f0: 65 72 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 74  erHelp[] =.  ".t
a300: 69 6d 65 72 20 4f 4e 7c 4f 46 46 20 20 20 20 20  imer ON|OFF     
a310: 20 20 20 20 20 54 75 72 6e 20 74 68 65 20 43 50       Turn the CP
a320: 55 20 74 69 6d 65 72 20 6d 65 61 73 75 72 65 6d  U timer measurem
a330: 65 6e 74 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ent on or off\n"
a340: 0a 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .;../* Forward r
a350: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
a360: 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
a370: 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
a380: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
a390: 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
a3a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
a3b0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
a3c0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
a3d0: 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
a3e0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
a3f0: 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
a400: 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
a410: 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a430: 6f 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63  open_db(struct c
a440: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
a450: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
a460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a470: 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
a480: 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
a490: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a4a0: 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
a4b0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3d  te3_errcode(db)=
a4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a4d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
a4e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
a4f0: 22 73 68 65 6c 6c 73 74 61 74 69 63 22 2c 20 30  "shellstatic", 0
a500: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
a510: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 68 65 6c  ,.          shel
a520: 6c 73 74 61 74 69 63 46 75 6e 63 2c 20 30 2c 20  lstaticFunc, 0, 
a530: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
a540: 28 20 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  ( db==0 || SQLIT
a550: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
a560: 72 63 6f 64 65 28 64 62 29 20 29 7b 0a 20 20 20  rcode(db) ){.   
a570: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a580: 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65  r,"Error: unable
a590: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
a5a0: 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c  e \"%s\": %s\n",
a5b0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a   .          p->z
a5c0: 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
a5d0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
a5e0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
a5f0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a600: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
a610: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c  XTENSION.    sql
a620: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
a630: 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
a640: 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
a650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  .}../*.** Do C-l
a660: 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
a670: 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
a680: 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
a690: 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
a6a0: 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 72 20 20  wline.**    \r  
a6b0: 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65    -> carriage re
a6c0: 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20  turn.**    \NNN 
a6d0: 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63   -> ascii charac
a6e0: 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c  ter NNN in octal
a6f0: 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
a700: 62 61 63 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74 61  backslash.*/.sta
a710: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
a720: 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61  _backslashes(cha
a730: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  r *z){.  int i, 
a740: 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66  j;.  char c;.  f
a750: 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a  or(i=j=0; (c = z
a760: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b  [i])!=0; i++, j+
a770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +){.    if( c=='
a780: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  \\' ){.      c =
a790: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
a7a0: 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20  f( c=='n' ){.   
a7b0: 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20       c = '\n';. 
a7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a7d0: 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
a7e0: 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
a7f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
a800: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
a810: 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
a820: 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  se if( c>='0' &&
a830: 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20   c<='7' ){.     
a840: 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20     c -= '0';.   
a850: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e       if( z[i+1]>
a860: 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d  ='0' && z[i+1]<=
a870: 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '7' ){.         
a880: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
a890: 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
a8a0: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
a8b0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
a8c0: 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
a8e0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
a8f0: 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a    c = (c<<3) + z
a900: 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [i] - '0';.     
a910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a930: 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d     z[j] = c;.  }
a940: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[j] = 0;.}..
a950: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
a960: 7a 41 72 67 20 61 73 20 61 20 62 6f 6f 6c 65 61  zArg as a boolea
a970: 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
a980: 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
a990: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
a9a0: 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68 61 72 20  oleanValue(char 
a9b0: 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 76 61  *zArg){.  int va
a9c0: 6c 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a  l = atoi(zArg);.
a9d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
a9e0: 3d 30 3b 20 7a 41 72 67 5b 6a 5d 3b 20 6a 2b 2b  =0; zArg[j]; j++
a9f0: 29 7b 0a 20 20 20 20 7a 41 72 67 5b 6a 5d 20 3d  ){.    zArg[j] =
aa00: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 7a   (char)tolower(z
aa10: 41 72 67 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 69  Arg[j]);.  }.  i
aa20: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
aa30: 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76  on")==0 ){.    v
aa40: 61 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  al = 1;.  }else 
aa50: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
aa60: 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "yes")==0 ){.   
aa70: 20 76 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20   val = 1;.  }.  
aa80: 72 65 74 75 72 6e 20 76 61 6c 3b 0a 7d 0a 0a 2f  return val;.}../
aa90: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
aaa0: 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
aab0: 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
aac0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
aad0: 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
aae0: 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
aaf0: 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
ab00: 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
ab10: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
ab20: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
ab30: 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
ab40: 2a 7a 4c 69 6e 65 2c 20 73 74 72 75 63 74 20 63  *zLine, struct c
ab50: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
ab60: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20  {.  int i = 1;. 
ab70: 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
ab80: 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74   int n, c;.  int
ab90: 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20   rc = 0;.  char 
aba0: 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f  *azArg[50];..  /
abb0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
abc0: 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65  t line into toke
abd0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ns..  */.  while
abe0: 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41  ( zLine[i] && nA
abf0: 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41  rg<ArraySize(azA
ac00: 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  rg) ){.    while
ac10: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
ac20: 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69  ned char)zLine[i
ac30: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
ac40: 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30   if( zLine[i]==0
ac50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
ac60: 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27  ( zLine[i]=='\''
ac70: 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22   || zLine[i]=='"
ac80: 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
ac90: 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b  elim = zLine[i++
aca0: 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
acb0: 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
acc0: 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
acd0: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69   zLine[i] && zLi
ace0: 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20  ne[i]!=delim ){ 
acf0: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  i++; }.      if(
ad00: 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d   zLine[i]==delim
ad10: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
ad20: 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[i++] = 0;.    
ad30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
ad40: 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c  lim=='"' ) resol
ad50: 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
ad60: 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
ad70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ad80: 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
ad90: 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20  &zLine[i];.     
ada0: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d   while( zLine[i]
adb0: 20 26 26 20 21 69 73 73 70 61 63 65 28 28 75 6e   && !isspace((un
adc0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e  signed char)zLin
add0: 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  e[i]) ){ i++; }.
ade0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
adf0: 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20  i] ) zLine[i++] 
ae00: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
ae10: 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
ae20: 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
ae30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
ae40: 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
ae50: 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
ae60: 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
ae70: 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
ae80: 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
ae90: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
aea0: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
aeb0: 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69  azArg[0][0];.  i
aec0: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
aed0: 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
aee0: 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c  rg[0], "backup",
aef0: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
af00: 20 26 26 20 6e 41 72 67 3c 34 29 7b 0a 20 20 20   && nArg<4){.   
af10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
af20: 73 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  stFile;.    cons
af30: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
af40: 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
af60: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
af70: 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
af80: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
af90: 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
afa0: 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b     zDb = "main";
afb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
afc0: 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
afd0: 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[2];.      zD
afe0: 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  b = azArg[1];.  
aff0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
b000: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
b010: 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
b020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72  _OK ){.      fpr
b040: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
b050: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
b060: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73   \"%s\"\n", zDes
b070: 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  tFile);.      sq
b080: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
b090: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
b0a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
b0b0: 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 70 42  en_db(p);.    pB
b0c0: 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
b0d0: 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
b0e0: 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
b0f0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
b100: 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
b110: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b120: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
b130: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
b140: 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
b150: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
b160: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
b170: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
b180: 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73   while(  (rc = s
b190: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
b1a0: 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
b1b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a  ==SQLITE_OK ){}.
b1c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
b1d0: 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
b1e0: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
b1f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
b200: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
b210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
b220: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
b230: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
b240: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
b250: 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
b260: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
b270: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
b280: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
b290: 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
b2a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
b2b0: 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29  g[0], "bail", n)
b2c0: 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26  ==0 && nArg>1 &&
b2d0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 62   nArg<3 ){.    b
b2e0: 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62  ail_on_error = b
b2f0: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
b300: 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
b310: 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
b320: 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
b330: 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
b340: 73 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ses", n)==0 && n
b350: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74  Arg==1 ){.    st
b360: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
b370: 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
b380: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
b390: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
b3a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b3b0: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
b3c0: 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
b3d0: 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
b3e0: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
b3f0: 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61  E_Column;.    da
b400: 74 61 2e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d  ta.colWidth[0] =
b410: 20 33 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c   3;.    data.col
b420: 57 69 64 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20  Width[1] = 15;. 
b430: 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
b440: 5b 32 5d 20 3d 20 35 38 3b 0a 20 20 20 20 64 61  [2] = 58;.    da
b450: 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
b460: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
b470: 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61  db, "PRAGMA data
b480: 62 61 73 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61  base_list; ", ca
b490: 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
b4a0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
b4b0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
b4c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b4d0: 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
b4e0: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
b4f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
b500: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
b510: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
b520: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
b530: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
b540: 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
b550: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29  )==0 && nArg<3 )
b560: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
b570: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65  Msg = 0;.    ope
b580: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 2f 2a 20  n_db(p);.    /* 
b590: 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
b5a0: 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20  k a "dump", the 
b5b0: 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70  content might ap
b5c0: 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72  pear in an order
b5d0: 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61  .    ** which ca
b5e0: 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66  uses immediate f
b5f0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
b600: 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
b610: 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f  lated..    ** So
b620: 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
b630: 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  -key constraint 
b640: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
b650: 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e  revent problems.
b660: 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
b670: 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
b680: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
b690: 3b 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  ;\n");.    fprin
b6a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
b6b0: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
b6c0: 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
b6d0: 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
b6e0: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
b6f0: 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
b700: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
b710: 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
b720: 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
b730: 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
b740: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20  a_dump_query(p, 
b750: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
b760: 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
b770: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
b780: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
b790: 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
b7a0: 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  L AND type=='tab
b7b0: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73  le' AND name!='s
b7c0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
b7d0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
b7e0: 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
b7f0: 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20  mp_query(p, .   
b800: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
b810: 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
b820: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
b830: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
b840: 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
b850: 65 71 75 65 6e 63 65 27 22 2c 20 30 0a 20 20 20  equence'", 0.   
b860: 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
b870: 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
b880: 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a  (p->out, p->db,.
b890: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
b8a0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
b8b0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
b8c0: 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
b8d0: 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e  NULL AND type IN
b8e0: 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
b8f0: 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a  er','view')", 0.
b900: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
b910: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
b920: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
b930: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b940: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
b950: 69 63 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ic = azArg[i];. 
b960: 20 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d         run_schem
b970: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
b980: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
b990: 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
b9a0: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
b9b0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
b9c0: 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
b9d0: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
b9e0: 63 28 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  c() AND type=='t
b9f0: 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20  able'".         
ba00: 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
ba10: 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20  NULL", 0);.     
ba20: 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
ba30: 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20  p_query(p->out, 
ba40: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
ba50: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
ba60: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
ba70: 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
ba80: 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
ba90: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
baa0: 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
bab0: 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
bac0: 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
bad0: 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20  "  AND tbl_name 
bae0: 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
baf0: 28 29 22 2c 20 30 0a 20 20 20 20 20 20 20 20 29  ()", 0.        )
bb00: 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
bb10: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
bb20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
bb30: 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68  ( p->writableSch
bb40: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ema ){.      fpr
bb50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
bb60: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
bb70: 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  hema=OFF;\n");. 
bb80: 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
bb90: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
bba0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
bbb0: 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
bbc0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
bbd0: 61 3d 4f 46 46 22 2c 20 30 2c 20 30 2c 20 30 29  a=OFF", 0, 0, 0)
bbe0: 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
bbf0: 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
bc00: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
bc10: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
bc20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc30: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
bc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc50: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
bc60: 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
bc70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
bc80: 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
bc90: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
bca0: 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 26 26  "echo", n)==0 &&
bcb0: 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c   nArg>1 && nArg<
bcc0: 33 20 29 7b 0a 20 20 20 20 70 2d 3e 65 63 68 6f  3 ){.    p->echo
bcd0: 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
bce0: 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
bcf0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
bd00: 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
bd10: 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20  Arg[0], "exit", 
bd20: 6e 29 3d 3d 30 20 20 26 26 20 6e 41 72 67 3d 3d  n)==0  && nArg==
bd30: 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b  1 ){.    rc = 2;
bd40: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
bd50: 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
bd60: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
bd70: 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20  lain", n)==0 && 
bd80: 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 69 6e  nArg<3 ){.    in
bd90: 74 20 76 61 6c 20 3d 20 6e 41 72 67 3e 3d 32 20  t val = nArg>=2 
bda0: 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ? booleanValue(a
bdb0: 7a 41 72 67 5b 31 5d 29 20 3a 20 31 3b 0a 20 20  zArg[1]) : 1;.  
bdc0: 20 20 69 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b    if(val == 1) {
bdd0: 0a 20 20 20 20 20 20 69 66 28 21 70 2d 3e 65 78  .      if(!p->ex
bde0: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29  plainPrev.valid)
bdf0: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78   {.        p->ex
be00: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
be10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
be20: 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65  explainPrev.mode
be30: 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
be40: 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72      p->explainPr
be50: 65 76 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ev.showHeader = 
be60: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
be70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d         memcpy(p-
be80: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c  >explainPrev.col
be90: 57 69 64 74 68 2c 70 2d 3e 63 6f 6c 57 69 64 74  Width,p->colWidt
bea0: 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57  h,sizeof(p->colW
beb0: 69 64 74 68 29 29 3b 0a 20 20 20 20 20 20 7d 0a  idth));.      }.
bec0: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 6f 75 6c        /* We coul
bed0: 64 20 70 75 74 20 74 68 69 73 20 63 6f 64 65 20  d put this code 
bee0: 75 6e 64 65 72 20 74 68 65 20 21 70 2d 3e 65 78  under the !p->ex
bef0: 70 6c 61 69 6e 56 61 6c 69 64 0a 20 20 20 20 20  plainValid.     
bf00: 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 73 6f   ** condition so
bf10: 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
bf20: 74 20 65 78 65 63 75 74 65 20 69 66 20 77 65 20  t execute if we 
bf30: 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
bf40: 20 20 20 20 20 2a 2a 20 65 78 70 6c 61 69 6e 20       ** explain 
bf50: 6d 6f 64 65 2e 20 48 6f 77 65 76 65 72 2c 20 61  mode. However, a
bf60: 6c 77 61 79 73 20 65 78 65 63 75 74 69 6e 67 20  lways executing 
bf70: 69 74 20 61 6c 6c 6f 77 73 20 75 73 20 61 6e 20  it allows us an 
bf80: 65 61 73 79 0a 20 20 20 20 20 20 2a 2a 20 77 61  easy.      ** wa
bf90: 73 20 74 6f 20 72 65 73 65 74 20 74 6f 20 65 78  s to reset to ex
bfa0: 70 6c 61 69 6e 20 6d 6f 64 65 20 69 6e 20 63 61  plain mode in ca
bfb0: 73 65 20 74 68 65 20 75 73 65 72 20 70 72 65 76  se the user prev
bfc0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 2a 2a 20  iously.      ** 
bfd0: 64 69 64 20 61 6e 20 2e 65 78 70 6c 61 69 6e 20  did an .explain 
bfe0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 2e 77  followed by a .w
bff0: 69 64 74 68 2c 20 2e 6d 6f 64 65 20 6f 72 20 2e  idth, .mode or .
c000: 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
c010: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 20 2a  command..      *
c020: 2f 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  /.      p->mode 
c030: 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
c040: 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61        p->showHea
c050: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  der = 1;.      m
c060: 65 6d 73 65 74 28 70 2d 3e 63 6f 6c 57 69 64 74  emset(p->colWidt
c070: 68 2c 30 2c 41 72 72 61 79 53 69 7a 65 28 70 2d  h,0,ArraySize(p-
c080: 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20  >colWidth));.   
c090: 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 30     p->colWidth[0
c0a0: 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20  ] = 4;          
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
c0c0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
c0d0: 69 64 74 68 5b 31 5d 20 3d 20 31 33 3b 20 20 20  idth[1] = 13;   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
c100: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20   p->colWidth[2] 
c110: 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 4;            
c120: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
c130: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
c140: 5b 33 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20  [3] = 4;        
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
c160: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
c170: 69 64 74 68 5b 34 5d 20 3d 20 34 3b 20 20 20 20  idth[4] = 4;    
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c190: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e   P3 */.      p->
c1a0: 63 6f 6c 57 69 64 74 68 5b 35 5d 20 3d 20 31 33  colWidth[5] = 13
c1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c1c0: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
c1d0: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 36 5d 20   p->colWidth[6] 
c1e0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 2;            
c1f0: 20 20 20 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20        /* P5 */. 
c200: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
c210: 5b 37 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20  [7] = 13;       
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c230: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 65 6c  mment */.    }el
c240: 73 65 20 69 66 20 28 70 2d 3e 65 78 70 6c 61 69  se if (p->explai
c250: 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20  nPrev.valid) {. 
c260: 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50       p->explainP
c270: 72 65 76 2e 76 61 6c 69 64 20 3d 20 30 3b 0a 20  rev.valid = 0;. 
c280: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70       p->mode = p
c290: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d 6f  ->explainPrev.mo
c2a0: 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f  de;.      p->sho
c2b0: 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 65 78 70  wHeader = p->exp
c2c0: 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61  lainPrev.showHea
c2d0: 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  der;.      memcp
c2e0: 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70 2d  y(p->colWidth,p-
c2f0: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c  >explainPrev.col
c300: 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e  Width,sizeof(p->
c310: 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20  colWidth));.    
c320: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
c330: 20 63 3d 3d 27 68 27 20 26 26 20 28 73 74 72 6e   c=='h' && (strn
c340: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
c350: 65 61 64 65 72 22 2c 20 6e 29 3d 3d 30 20 7c 7c  eader", n)==0 ||
c360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c370: 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b    strncmp(azArg[
c380: 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e  0], "headers", n
c390: 29 3d 3d 30 29 20 26 26 20 6e 41 72 67 3e 31 20  )==0) && nArg>1 
c3a0: 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  && nArg<3 ){.   
c3b0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
c3c0: 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
c3d0: 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  Arg[1]);.  }else
c3e0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
c3f0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
c400: 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
c410: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c420: 28 73 74 64 65 72 72 2c 22 25 73 22 2c 7a 48 65  (stderr,"%s",zHe
c430: 6c 70 29 3b 0a 20 20 20 20 69 66 28 20 48 41 53  lp);.    if( HAS
c440: 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20  _TIMER ){.      
c450: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c460: 25 73 22 2c 7a 54 69 6d 65 72 48 65 6c 70 29 3b  %s",zTimerHelp);
c470: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
c480: 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
c490: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
c4a0: 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
c4b0: 30 20 26 26 20 6e 41 72 67 3d 3d 33 20 29 7b 0a  0 && nArg==3 ){.
c4c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
c4d0: 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20   = azArg[2];    
c4e0: 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
c4f0: 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
c500: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
c510: 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 20 20 20  e = azArg[1];   
c520: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
c530: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
c540: 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
c550: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c560: 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41  tmt = NULL; /* A
c570: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c580: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
c5b0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
c5c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
c5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c5f0: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
c600: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
c610: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
c620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c630: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c640: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c660: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c670: 20 69 6e 20 70 2d 3e 73 65 70 61 72 61 74 6f 72   in p->separator
c680: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
c690: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
c6a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
c6b0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c6c0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6e0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
c6f0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
c700: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
c710: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
c720: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
c730: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
c740: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
c750: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c770: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
c780: 61 6e 67 65 73 20 2a 2f 20 20 20 0a 20 20 20 20  anges */   .    
c790: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c7b0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
c7c0: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
c7d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c7e0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
c7f0: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
c800: 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ..    open_db(p)
c810: 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
c820: 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72 61 74  len30(p->separat
c830: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
c840: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  p==0 ){.      fp
c850: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
c860: 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
c870: 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
c880: 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
c890: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
c8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
c8b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
c8c0: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
c8d0: 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29  M '%q'", zTable)
c8e0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
c8f0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
c900: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
c910: 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
c920: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
c930: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
c940: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
c950: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
c960: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
c970: 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
c980: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
c990: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c9a0: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
c9b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53   ){.      if (pS
c9c0: 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e  tmt) sqlite3_fin
c9d0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
c9e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
c9f0: 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
ca00: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
ca10: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (db));.      ret
ca20: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
ca30: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
ca40: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
ca50: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
ca60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ca70: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
ca80: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
ca90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
caa0: 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65  no columns, no e
cab0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  rror */.    zSql
cac0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
cad0: 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
cae0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
caf0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
cb00: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
cb10: 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
cb20: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
cb30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
cb40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
cb50: 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c  (nByte+20, zSql,
cb60: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25   "INSERT INTO '%
cb70: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54  q' VALUES(?", zT
cb80: 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73  able);.    j = s
cb90: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
cba0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
cbb0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cbc0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
cbd0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
cbe0: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
cbf0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
cc00: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
cc10: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
cc20: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
cc30: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
cc40: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
cc50: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
cc60: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70  ( rc ){.      fp
cc70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
cc80: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
cc90: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
cca0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  ;.      if (pStm
ccb0: 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
ccc0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
ccd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cce0: 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
ccf0: 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
cd00: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
cd10: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
cd20: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
cd30: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
cd40: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
cd50: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
cd60: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
cd70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cd80: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
cd90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
cda0: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
cdb0: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
cdc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
cdd0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
cde0: 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
cdf0: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 63  ry\n");.      fc
ce00: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
ce10: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
ce20: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
ce30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ce40: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
ce50: 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  p->db, "BEGIN", 
ce60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
ce70: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
ce80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
ce90: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
cea0: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
ceb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
cec0: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
ced0: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
cee0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
cef0: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
cf00: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
cf10: 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20   && *z!='\n' && 
cf20: 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b 29 7b 0a  *z!='\r'; z++){.
cf30: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
cf40: 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d 20  p->separator[0] 
cf50: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 70 2d  && strncmp(z, p-
cf60: 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70  >separator, nSep
cf70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cf80: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20    *z = 0;.      
cf90: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
cfa0: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b     if( i<nCol ){
cfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43  .            azC
cfc0: 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d  ol[i] = &z[nSep]
cfd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  ;.            z 
cfe0: 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20  += nSep-1;.     
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d000: 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
d010: 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 2a 7a 20  for */.      *z 
d020: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 0;.      if( i
d030: 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  +1!=nCol ){.    
d040: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d050: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
d060: 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
d070: 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
d080: 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
d090: 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
d0a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
d0b0: 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
d0c0: 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
d0d0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
d0e0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
d0f0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
d100: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
d110: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
d120: 3b 20 2f 2a 20 66 72 6f 6d 20 77 68 69 6c 65 20  ; /* from while 
d130: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
d140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d160: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
d170: 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
d180: 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
d190: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
d1a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d1b0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
d1c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d1d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
d1e0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
d1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d210: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
d220: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
d230: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
d240: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
d250: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
d260: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 72  BACK";.        r
d270: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  c = 1;.        b
d280: 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 77 68  reak; /* from wh
d290: 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ile */.      }. 
d2a0: 20 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c     } /* end whil
d2b0: 65 20 2a 2f 0a 20 20 20 20 66 72 65 65 28 61 7a  e */.    free(az
d2c0: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
d2d0: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
d2e0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
d2f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
d300: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 6f 6d 6d  xec(p->db, zComm
d310: 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  it, 0, 0, 0);.  
d320: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
d330: 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
d340: 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65  zArg[0], "indice
d350: 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  s", n)==0 && nAr
d360: 67 3c 33 20 29 7b 0a 20 20 20 20 73 74 72 75 63  g<3 ){.    struc
d370: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
d380: 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
d390: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
d3a0: 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20   open_db(p);.   
d3b0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
d3c0: 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
d3d0: 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
d3e0: 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
d3f0: 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
d400: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  ist;.    if( nAr
d410: 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  g==1 ){.      rc
d420: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
d430: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22  p->db,.        "
d440: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
d450: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
d460: 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
d470: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
d480: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
d490: 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20  sqlite_%' ".    
d4a0: 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
d4b0: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
d4c0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
d4d0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a  e_temp_master ".
d4e0: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
d4f0: 79 70 65 3d 27 69 6e 64 65 78 27 20 22 0a 20 20  ype='index' ".  
d500: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
d510: 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61 6c 6c  1",.        call
d520: 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
d530: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
d540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d550: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
d560: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72  zArg[1];.      r
d570: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
d580: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
d590: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
d5a0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
d5b0: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
d5c0: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
d5d0: 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
d5e0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
d5f0: 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
d600: 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
d610: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
d620: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
d630: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
d640: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
d650: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
d660: 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
d670: 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
d680: 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
d690: 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
d6a0: 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
d6b0: 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  );.      zShellS
d6c0: 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d  tatic = 0;.    }
d6d0: 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
d6e0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d6f0: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
d700: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
d710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d720: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
d730: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
d740: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d   }else if( rc !=
d750: 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
d760: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d770: 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79  rr,"Error: query
d780: 69 6e 67 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ing sqlite_maste
d790: 72 20 61 6e 64 20 73 71 6c 69 74 65 5f 74 65 6d  r and sqlite_tem
d7a0: 70 5f 6d 61 73 74 65 72 5c 6e 22 29 3b 0a 20 20  p_master\n");.  
d7b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d7c0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65  }.  }else..#ifde
d7d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d7e0: 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d  IOTRACE.  if( c=
d7f0: 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
d800: 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61  azArg[0], "iotra
d810: 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
d820: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 2a    extern void (*
d830: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28  sqlite3IoTrace)(
d840: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e  const char*, ...
d850: 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  );.    if( iotra
d860: 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73  ce && iotrace!=s
d870: 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69  tdout ) fclose(i
d880: 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74  otrace);.    iot
d890: 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  race = 0;.    if
d8a0: 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
d8b0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
d8c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
d8d0: 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
d8e0: 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a  [1], "-")==0 ){.
d8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
d900: 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
d910: 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72  intf;.      iotr
d920: 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ace = stdout;.  
d930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
d940: 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61  otrace = fopen(a
d950: 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20  zArg[1], "w");. 
d960: 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65       if( iotrace
d970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
d980: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
d990: 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
d9a0: 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
d9b0: 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
d9c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
d9d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
d9e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
d9f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
da00: 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
da10: 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
da20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
da30: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
da40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
da50: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28  _EXTENSION.  if(
da60: 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
da70: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
da80: 61 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ad", n)==0 && nA
da90: 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e  rg>=2 ){.    con
daa0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
dab0: 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72  *zProc;.    char
dac0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
dad0: 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
dae0: 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  [1];.    zProc =
daf0: 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
db00: 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65  [2] : 0;.    ope
db10: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 72 63 20  n_db(p);.    rc 
db20: 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
db30: 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
db40: 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a  zFile, zProc, &z
db50: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
db60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db70: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
db80: 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
db90: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
dba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
dbb0: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
dbc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
dbd0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
dbe0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
dbf0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
dc00: 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30  0], "log", n)==0
dc10: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
dc20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dc30: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
dc40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  .    if( p->pLog
dc50: 20 26 26 20 70 2d 3e 70 4c 6f 67 21 3d 73 74 64   && p->pLog!=std
dc60: 6f 75 74 20 26 26 20 70 2d 3e 70 4c 6f 67 21 3d  out && p->pLog!=
dc70: 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20 20  stderr ){.      
dc80: 66 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b  fclose(p->pLog);
dc90: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d  .      p->pLog =
dca0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
dcb0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
dcc0: 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
dcd0: 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 73       p->pLog = s
dce0: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
dcf0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
dd00: 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20  e, "stderr")==0 
dd10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67  ){.      p->pLog
dd20: 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20 7d   = stderr;.    }
dd30: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
dd40: 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30  zFile, "off")==0
dd50: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f   ){.      p->pLo
dd60: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
dd70: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  {.      p->pLog 
dd80: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
dd90: 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  w");.      if( p
dda0: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pLog==0 ){.   
ddb0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
ddc0: 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
ddd0: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
dde0: 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
ddf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
de00: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
de10: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
de20: 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
de30: 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b  =0 && nArg==2 ){
de40: 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74  .    int n2 = st
de50: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
de60: 3b 0a 20 20 20 20 69 66 28 20 28 6e 32 3d 3d 34  ;.    if( (n2==4
de70: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
de80: 67 5b 31 5d 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d  g[1],"line",n2)=
de90: 3d 30 29 0a 20 20 20 20 20 20 20 20 7c 7c 0a 20  =0).        ||. 
dea0: 20 20 20 20 20 20 20 28 6e 32 3d 3d 35 20 26 26         (n2==5 &&
deb0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
dec0: 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
ded0: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ) ){.      p->mo
dee0: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a  de = MODE_Line;.
def0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6e      }else if( (n
df00: 32 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28  2==6 && strncmp(
df10: 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
df20: 22 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  ",n2)==0).      
df30: 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20          ||.     
df40: 20 20 20 20 20 20 20 20 20 28 6e 32 3d 3d 37 20           (n2==7 
df50: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
df60: 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32  [1],"columns",n2
df70: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  )==0) ){.      p
df80: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f  ->mode = MODE_Co
df90: 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20  lumn;.    }else 
dfa0: 69 66 28 20 6e 32 3d 3d 34 20 26 26 20 73 74 72  if( n2==4 && str
dfb0: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
dfc0: 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ist",n2)==0 ){. 
dfd0: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
dfe0: 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65  ODE_List;.    }e
dff0: 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26  lse if( n2==4 &&
e000: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
e010: 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20  ],"html",n2)==0 
e020: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
e030: 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
e040: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d    }else if( n2==
e050: 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
e060: 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
e070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
e080: 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
e090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32      }else if( n2
e0a0: 3d 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==3 && strncmp(a
e0b0: 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32  zArg[1],"csv",n2
e0c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
e0d0: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76  >mode = MODE_Csv
e0e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e0f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e100: 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70  p->separator), p
e110: 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 2c 22  ->separator, ","
e120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e130: 20 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d   n2==4 && strncm
e140: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
e150: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
e160: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
e170: 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
e180: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
e190: 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
e1a0: 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  r), p->separator
e1b0: 2c 20 22 5c 74 22 29 3b 0a 20 20 20 20 7d 65 6c  , "\t");.    }el
e1c0: 73 65 20 69 66 28 20 6e 32 3d 3d 36 20 26 26 20  se if( n2==6 && 
e1d0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
e1e0: 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30  ,"insert",n2)==0
e1f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
e200: 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
e210: 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65  .      set_table
e220: 5f 6e 61 6d 65 28 70 2c 20 22 74 61 62 6c 65 22  _name(p, "table"
e230: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20  );.    }else {. 
e240: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
e250: 65 72 72 2c 22 45 72 72 6f 72 3a 20 6d 6f 64 65  err,"Error: mode
e260: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
e270: 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 63  f: ".         "c
e280: 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69  olumn csv html i
e290: 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20  nsert line list 
e2a0: 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20  tabs tcl\n");.  
e2b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e2c0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
e2d0: 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63   c=='m' && strnc
e2e0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f  mp(azArg[0], "mo
e2f0: 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  de", n)==0 && nA
e300: 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 69 6e 74  rg==3 ){.    int
e310: 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61   n2 = strlen30(a
e320: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66  zArg[1]);.    if
e330: 28 20 6e 32 3d 3d 36 20 26 26 20 73 74 72 6e 63  ( n2==6 && strnc
e340: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
e350: 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
e360: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
e370: 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
e380: 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
e390: 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  (p, azArg[2]);. 
e3a0: 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20     }else {.     
e3b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
e3c0: 20 22 45 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64   "Error: invalid
e3d0: 20 61 72 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20   arguments: ".  
e3e0: 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22 2e 20        " \"%s\". 
e3f0: 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20  Enter \".help\" 
e400: 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61 7a 41  for help\n", azA
e410: 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[2]);.      rc
e420: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e430: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e  lse..  if( c=='n
e440: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
e450: 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75  rg[0], "nullvalu
e460: 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  e", n)==0 && nAr
e470: 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20 73 71 6c  g==2 ) {.    sql
e480: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
e490: 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75  zeof(p->nullvalu
e4a0: 65 29 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  e), p->nullvalue
e4b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e4c0: 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
e4d0: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
e4e0: 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61  >nullvalue)-1, a
e4f0: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
e500: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20  e..  if( c=='o' 
e510: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
e520: 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e  [0], "output", n
e530: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
e540: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  ){.    if( p->ou
e550: 74 21 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20  t!=stdout ){.   
e560: 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74     fclose(p->out
e570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e580: 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
e590: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
e5a0: 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
e5b0: 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 73 71  stdout;.      sq
e5c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
e5d0: 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
e5e0: 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
e5f0: 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d 65  stdout");.    }e
e600: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
e610: 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b  t = fopen(azArg[
e620: 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20  1], "wb");.     
e630: 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
e640: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
e650: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
e660: 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
e670: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
e680: 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  g[1]);.        p
e690: 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
e6a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
e6b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e6d0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e6e0: 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
e6f0: 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 61  outfile, "%s", a
e700: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
e710: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
e720: 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
e730: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
e740: 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d  ], "prompt", n)=
e750: 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32 20 7c  =0 && (nArg==2 |
e760: 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20 20 20  | nArg==3)){.   
e770: 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20   if( nArg >= 2) 
e780: 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
e790: 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67  mainPrompt,azArg
e7a0: 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [1],(int)ArraySi
e7b0: 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31  ze(mainPrompt)-1
e7c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e7d0: 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20   nArg >= 3) {.  
e7e0: 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74      strncpy(cont
e7f0: 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67  inuePrompt,azArg
e800: 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [2],(int)ArraySi
e810: 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  ze(continuePromp
e820: 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t)-1);.    }.  }
e830: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
e840: 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
e850: 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20  Arg[0], "quit", 
e860: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 31  n)==0 && nArg==1
e870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a   ){.    rc = 2;.
e880: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
e890: 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='r' && n>=3 &&
e8a0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
e8b0: 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30  ], "read", n)==0
e8c0: 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20   && nArg==2 ){. 
e8d0: 20 20 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66     FILE *alt = f
e8e0: 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
e8f0: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c  rb");.    if( al
e900: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
e910: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
e920: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
e930: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
e940: 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
e950: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
e960: 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65        rc = proce
e970: 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29  ss_input(p, alt)
e980: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61  ;.      fclose(a
e990: 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lt);.    }.  }el
e9a0: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
e9b0: 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
e9c0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
e9d0: 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 26  estore", n)==0 &
e9e0: 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67  & nArg>1 && nArg
e9f0: 3c 34 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  <4){.    const c
ea00: 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
ea10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ea20: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
ea30: 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
ea40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
ea50: 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
ea60: 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
ea70: 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
ea80: 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
ea90: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a  zArg[1];.      z
eaa0: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
eab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
eac0: 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32  rcFile = azArg[2
ead0: 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61  ];.      zDb = a
eae0: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20  zArg[1];.    }. 
eaf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
eb00: 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26  open(zSrcFile, &
eb10: 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pSrc);.    if( r
eb20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
eb30: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
eb40: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
eb50: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
eb60: 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a  \n", zSrcFile);.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
eb80: 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
eb90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
eba0: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
ebb0: 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
ebc0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
ebd0: 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70  it(p->db, zDb, p
ebe0: 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
ebf0: 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
ec00: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ec10: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
ec20: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
ec30: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
ec40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
ec50: 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
ec60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ec70: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
ec80: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
ec90: 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
eca0: 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
ecb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d            || rc=
ecc0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b  =SQLITE_BUSY  ){
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ece0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
ecf0: 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
ed00: 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
ed10: 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
ed20: 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed40: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
ed50: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
ed60: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ed70: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
ed80: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
ed90: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
eda0: 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
edb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
edc0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
edd0: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f  derr, "Error: so
ede0: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
edf0: 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20   busy\n");.     
ee00: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
ee10: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
ee20: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
ee30: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
ee40: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
ee50: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
ee60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ee70: 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
ee80: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
ee90: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
eea0: 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
eeb0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
eec0: 3c 33 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  <3 ){.    struct
eed0: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64   callback_data d
eee0: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
eef0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
ef00: 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
ef10: 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
ef20: 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
ef30: 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
ef40: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
ef50: 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
ef60: 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  mi;.    if( nArg
ef70: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
ef80: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
ef90: 3b 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69  ; azArg[1][i]; i
efa0: 2b 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20  ++) azArg[1][i] 
efb0: 3d 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28  = (char)tolower(
efc0: 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20 20  azArg[1][i]);.  
efd0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
efe0: 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
eff0: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
f000: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
f010: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
f020: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
f030: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
f040: 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69  REATE TABLE sqli
f050: 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  te_master (\n". 
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
f080: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
f090: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
f0a0: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
f0d0: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
f0f0: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
f100: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
f110: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
f120: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
f150: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
f160: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
f170: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
f180: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
f190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
f1a0: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
f1b0: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
f1c0: 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  lv);.        rc 
f1d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f1e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f1f0: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71  cmp(azArg[1],"sq
f200: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
f210: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f220: 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
f230: 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
f240: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
f250: 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20  gv[0] = "CREATE 
f260: 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74  TEMP TABLE sqlit
f270: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 28 5c  e_temp_master (\
f280: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
f290: 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
f2a0: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2e0: 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
f2f0: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
f320: 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20       ")";.      
f370: 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20    new_argv[1] = 
f380: 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  0;.        new_c
f390: 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a  olv[0] = "sql";.
f3a0: 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
f3b0: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
f3c0: 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c   callback(&data,
f3d0: 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65   1, new_argv, ne
f3e0: 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20  w_colv);.       
f3f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f400: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f410: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
f420: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
f430: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f440: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
f450: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
f460: 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20  T sql FROM ".   
f470: 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
f480: 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
f490: 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
f4a0: 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
f4b0: 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  me".          " 
f4c0: 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
f4d0: 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
f4e0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
f4f0: 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65  SELECT sql, type
f500: 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
f510: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
f520: 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
f530: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
f540: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
f550: 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79 70  static() AND typ
f560: 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
f570: 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20  l NOTNULL ".    
f580: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
f590: 73 75 62 73 74 72 28 74 79 70 65 2c 32 2c 31 29  substr(type,2,1)
f5a0: 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20  , name",.       
f5b0: 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
f5c0: 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
f5d0: 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61         zShellSta
f5e0: 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tic = 0;.      }
f5f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f600: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
f610: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
f620: 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
f630: 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20  FROM ".         
f640: 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73  "  (SELECT sql s
f650: 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74  ql, type type, t
f660: 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65  bl_name tbl_name
f670: 2c 20 6e 61 6d 65 20 6e 61 6d 65 22 0a 20 20 20  , name name".   
f680: 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d        "     FROM
f690: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
f6a0: 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20  NION ALL".      
f6b0: 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71     "   SELECT sq
f6c0: 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
f6d0: 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  e, name FROM sql
f6e0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
f6f0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 57 48 45   ".         "WHE
f700: 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
f710: 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
f720: 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
f730: 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20  E 'sqlite_%'".  
f740: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
f750: 20 73 75 62 73 74 72 28 74 79 70 65 2c 32 2c 31   substr(type,2,1
f760: 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  ), name",.      
f770: 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
f780: 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
f790: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
f7a0: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
f7b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
f7c0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
f7d0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
f7e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f7f0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
f800: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
f810: 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49  e if( rc != SQLI
f820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
f830: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
f840: 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73  rror: querying s
f850: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
f860: 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  n\n");.      rc 
f870: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
f880: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
f890: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
f8a0: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
f8b0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
f8c0: 73 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d  separator", n)==
f8d0: 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f8f0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73  intf(sizeof(p->s
f900: 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65  eparator), p->se
f910: 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
f930: 2e 2a 73 22 2c 20 28 69 6e 74 29 73 69 7a 65 6f  .*s", (int)sizeo
f940: 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2d  f(p->separator)-
f950: 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  1, azArg[1]);.  
f960: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
f970: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
f980: 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c  zArg[0], "show",
f990: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
f9a0: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  1 ){.    int i;.
f9b0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
f9c0: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
f9d0: 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63 68 6f  ,"echo", p->echo
f9e0: 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66  On ? "on" : "off
f9f0: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
fa00: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
fa10: 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 20  s\n","explain", 
fa20: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76  p->explainPrev.v
fa30: 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a 22 6f 66  alid ? "on" :"of
fa40: 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  f");.    fprintf
fa50: 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
fa60: 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c  %s\n","headers",
fa70: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3f   p->showHeader ?
fa80: 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
fa90: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
faa0: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
fab0: 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73  ,"mode", modeDes
fac0: 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
fad0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
fae0: 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 6e 75 6c  ,"%9.9s: ", "nul
faf0: 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20  lvalue");.      
fb00: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
fb10: 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75 6c 6c 76  p->out, p->nullv
fb20: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 66 70 72  alue);.      fpr
fb30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
fb40: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
fb50: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
fb60: 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20  s\n","output",. 
fb70: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
fb80: 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20  n30(p->outfile) 
fb90: 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22  ? p->outfile : "
fba0: 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 66 70  stdout");.    fp
fbb0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
fbc0: 2e 39 73 3a 20 22 2c 20 22 73 65 70 61 72 61 74  .9s: ", "separat
fbd0: 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  or");.      outp
fbe0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
fbf0: 75 74 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  ut, p->separator
fc00: 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
fc10: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
fc20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
fc30: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
fc40: 2c 22 73 74 61 74 73 22 2c 20 70 2d 3e 73 74 61  ,"stats", p->sta
fc50: 74 73 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  tsOn ? "on" : "o
fc60: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
fc70: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
fc80: 20 22 2c 22 77 69 64 74 68 22 29 3b 0a 20 20 20   ","width");.   
fc90: 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74   for (i=0;i<(int
fca0: 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  )ArraySize(p->co
fcb0: 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f  lWidth) && p->co
fcc0: 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69  lWidth[i] != 0;i
fcd0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66 70 72 69  ++) {.      fpri
fce0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 64 20 22  ntf(p->out,"%d "
fcf0: 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29  ,p->colWidth[i])
fd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
fd10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
fd20: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
fd30: 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
fd40: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74  mp(azArg[0], "st
fd50: 61 74 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ats", n)==0 && n
fd60: 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20  Arg>1 && nArg<3 
fd70: 29 7b 0a 20 20 20 20 70 2d 3e 73 74 61 74 73 4f  ){.    p->statsO
fd80: 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
fd90: 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
fda0: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74  lse..  if( c=='t
fdb0: 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
fdc0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
fdd0: 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26  ables", n)==0 &&
fde0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 63   nArg<3 ){.    c
fdf0: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
fe00: 20 20 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20 20      int nRow;.  
fe10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
fe20: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
fe30: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
fe40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
fe50: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
fe60: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
fe70: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
fe80: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
fe90: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
fea0: 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65   type IN ('table
feb0: 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61  ','view') AND na
fec0: 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
fed0: 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20  ite_%' ".       
fee0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
fef0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
ff00: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  me FROM sqlite_t
ff10: 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  emp_master ".   
ff20: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
ff30: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
ff40: 65 77 27 29 20 22 0a 20 20 20 20 20 20 20 20 22  ew') ".        "
ff50: 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20  ORDER BY 1",.   
ff60: 20 20 20 20 20 26 61 7a 52 65 73 75 6c 74 2c 20       &azResult, 
ff70: 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45 72 72 4d  &nRow, 0, &zErrM
ff80: 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
ff90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 68  }else{.      zSh
ffa0: 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72  ellStatic = azAr
ffb0: 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  g[1];.      rc =
ffc0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
ffd0: 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  le(p->db,.      
ffe0: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
fff0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
10000 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
10010 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
10020 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20  le','view') AND 
10030 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
10040 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20  tatic() ".      
10050 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
10060 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
10070 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
10080 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20  temp_master ".  
10090 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
100a0 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76  e IN ('table','v
100b0 69 65 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c  iew') AND name L
100c0 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
100d0 29 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44  ) ".        "ORD
100e0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
100f0 20 20 26 61 7a 52 65 73 75 6c 74 2c 20 26 6e 52    &azResult, &nR
10100 6f 77 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 0a  ow, 0, &zErrMsg.
10110 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
10120 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
10130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
10140 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
10150 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
10160 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
10170 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
10180 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
10190 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
101a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
101b0 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
101c0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
101d0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
101e0 20 71 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65   querying sqlite
101f0 5f 6d 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69  _master and sqli
10200 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e  te_temp_master\n
10210 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
10220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10230 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c     int len, maxl
10240 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
10250 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e  t i, j;.      in
10260 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72  t nPrintCol, nPr
10270 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f  intRow;.      fo
10280 72 28 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20  r(i=1; i<=nRow; 
10290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
102a0 28 20 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30  ( azResult[i]==0
102b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
102c0 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
102d0 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29  n30(azResult[i])
102e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
102f0 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65  n>maxlen ) maxle
10300 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  n = len;.      }
10310 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c  .      nPrintCol
10320 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29   = 80/(maxlen+2)
10330 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69  ;.      if( nPri
10340 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74  ntCol<1 ) nPrint
10350 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  Col = 1;.      n
10360 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77  PrintRow = (nRow
10370 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31   + nPrintCol - 1
10380 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20  )/nPrintCol;.   
10390 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
103a0 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20  rintRow; i++){. 
103b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31         for(j=i+1
103c0 3b 20 6a 3c 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50  ; j<=nRow; j+=nP
103d0 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20  rintRow){.      
103e0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20      char *zSp = 
103f0 6a 3c 3d 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22  j<=nPrintRow ? "
10400 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20  " : "  ";.      
10410 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 2d      printf("%s%-
10420 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e  *s", zSp, maxlen
10430 2c 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20  , azResult[j] ? 
10440 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3a 20 22 22  azResult[j] : ""
10450 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10460 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
10470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10490 65 5f 74 61 62 6c 65 28 61 7a 52 65 73 75 6c 74  e_table(azResult
104a0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
104b0 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38  ( c=='t' && n>=8
104c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
104d0 67 5b 30 5d 2c 20 22 74 65 73 74 63 74 72 6c 22  g[0], "testctrl"
104e0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
104f0 3d 32 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =2 ){.    static
10500 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10510 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
10520 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20  r *zCtrlName;   
10530 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73  /* Name of a tes
10540 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e  t-control option
10550 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63   */.       int c
10560 74 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20  trlCode;        
10570 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63      /* Integer c
10580 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74  ode for that opt
10590 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 20 61 43 74  ion */.    } aCt
105a0 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  rl[] = {.      {
105b0 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20 20 20   "prng_save",   
105c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
105d0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
105e0 41 56 45 20 20 20 20 20 20 20 20 20 20 20 20 20  AVE             
105f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e   },.      { "prn
10600 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20  g_restore",     
10610 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
10620 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
10630 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  E           },. 
10640 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73       { "prng_res
10650 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
10660 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10670 50 52 4e 47 5f 52 45 53 45 54 20 20 20 20 20 20  PRNG_RESET      
10680 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
10690 7b 20 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c  { "bitvec_test",
106a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
106b0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
106c0 43 5f 54 45 53 54 20 20 20 20 20 20 20 20 20 20  C_TEST          
106d0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 61    },.      { "fa
106e0 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20  ult_install",   
106f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
10700 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
10710 41 4c 4c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ALL          },.
10720 20 20 20 20 20 20 7b 20 22 62 65 6e 69 67 6e 5f        { "benign_
10730 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73 22 2c 20 20  malloc_hooks",  
10740 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10750 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
10760 4f 4f 4b 53 20 20 20 20 7d 2c 0a 20 20 20 20 20  OOKS    },.     
10770 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79 74 65   { "pending_byte
10780 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
10790 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
107a0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
107b0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61     },.      { "a
107c0 73 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20  ssert",         
107d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
107e0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 20 20  STCTRL_ASSERT   
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
10800 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61 79 73  .      { "always
10810 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
10820 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
10830 4c 5f 41 4c 57 41 59 53 20 20 20 20 20 20 20 20  L_ALWAYS        
10840 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10850 20 20 7b 20 22 72 65 73 65 72 76 65 22 2c 20 20    { "reserve",  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
10870 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
10880 45 52 56 45 20 20 20 20 20 20 20 20 20 20 20 20  ERVE            
10890 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
108a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22 2c 20  optimizations", 
108b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
108c0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
108d0 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 7d  TIONS          }
108e0 2c 0a 20 20 20 20 20 20 7b 20 22 69 73 6b 65 79  ,.      { "iskey
108f0 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20 20 20  word",          
10900 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
10910 52 4c 5f 49 53 4b 45 59 57 4f 52 44 20 20 20 20  RL_ISKEYWORD    
10920 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10930 20 20 20 7b 20 22 70 67 68 64 72 73 7a 22 2c 20     { "pghdrsz", 
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10950 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 47  LITE_TESTCTRL_PG
10960 48 44 52 53 5a 20 20 20 20 20 20 20 20 20 20 20  HDRSZ           
10970 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
10980 22 73 63 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c  "scratchmalloc",
10990 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
109a0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
109b0 4d 41 4c 4c 4f 43 20 20 20 20 20 20 20 20 20 20  MALLOC          
109c0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
109d0 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b  t testctrl = -1;
109e0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
109f0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
10a00 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 0a     open_db(p);..
10a10 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74      /* convert t
10a20 65 73 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74  estctrl text opt
10a30 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c  ion to value. al
10a40 6c 6f 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70  low any unique p
10a50 72 65 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20  refix.    ** of 
10a60 74 68 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c  the option name,
10a70 20 6f 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20   or a numerical 
10a80 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 20  value. */.    n 
10a90 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
10aa0 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [1]);.    for(i=
10ab0 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  0; i<(int)(sizeo
10ac0 66 28 61 43 74 72 6c 29 2f 73 69 7a 65 6f 66 28  f(aCtrl)/sizeof(
10ad0 61 43 74 72 6c 5b 30 5d 29 29 3b 20 69 2b 2b 29  aCtrl[0])); i++)
10ae0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
10af0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43  cmp(azArg[1], aC
10b00 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
10b10 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
10b20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c     if( testctrl<
10b30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  0 ){.          t
10b40 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b  estctrl = aCtrl[
10b50 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20  i].ctrlCode;.   
10b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
10b80 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
10b90 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c 22   option name: \"
10ba0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  %s\"\n", azArg[i
10bb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ]);.          te
10bc0 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20  stctrl = -1;.   
10bd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
10c00 73 74 63 74 72 6c 3c 30 20 29 20 74 65 73 74 63  stctrl<0 ) testc
10c10 74 72 6c 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  trl = atoi(azArg
10c20 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 74  [1]);.    if( (t
10c30 65 73 74 63 74 72 6c 3c 53 51 4c 49 54 45 5f 54  estctrl<SQLITE_T
10c40 45 53 54 43 54 52 4c 5f 46 49 52 53 54 29 20 7c  ESTCTRL_FIRST) |
10c50 7c 20 28 74 65 73 74 63 74 72 6c 3e 53 51 4c 49  | (testctrl>SQLI
10c60 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 41 53 54  TE_TESTCTRL_LAST
10c70 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
10c80 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
10c90 3a 20 69 6e 76 61 6c 69 64 20 74 65 73 74 63 74  : invalid testct
10ca0 72 6c 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  rl option: %s\n"
10cb0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
10cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77   }else{.      sw
10cd0 69 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a  itch(testctrl){.
10ce0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
10cf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
10d00 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a  (int, db, int) *
10d10 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
10d20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
10d30 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20  PTIMIZATIONS:.  
10d40 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
10d50 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
10d60 56 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  VE:             
10d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
10d80 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
10d90 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
10da0 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72  (int)strtol(azAr
10db0 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 20 20 20 20  g[2], 0, 0);    
10dc0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
10dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
10de0 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
10df0 74 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29  trl, p->db, opt)
10e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
10e10 69 6e 74 66 28 22 25 64 20 28 30 78 25 30 38 78  intf("%d (0x%08x
10e20 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20  )\n", rc, rc);. 
10e30 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
10e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
10e50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
10e60 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
10e70 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
10e80 69 6e 74 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20  int option\n",. 
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20     azArg[1]);.  
10eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ec0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
10ed0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
10ee0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29  est_control(int)
10ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
10f00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10f10 5f 50 52 4e 47 5f 53 41 56 45 3a 20 20 20 20 20  _PRNG_SAVE:     
10f20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63        .        c
10f30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
10f40 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
10f50 3a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  :        .      
10f60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
10f70 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
10f80 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  T:.        case 
10f90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10fa0 50 47 48 44 52 53 5a 3a 20 20 20 20 20 20 20 20  PGHDRSZ:        
10fb0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
10fc0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
10fe0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10ff0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a  trol(testctrl);.
11000 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
11010 74 66 28 22 25 64 20 28 30 78 25 30 38 78 29 5c  tf("%d (0x%08x)\
11020 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20  n", rc, rc);.   
11030 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
11040 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
11050 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
11060 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74  r: testctrl %s t
11070 61 6b 65 73 20 6e 6f 20 6f 70 74 69 6f 6e 73 5c  akes no options\
11080 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
11090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
110a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
110b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
110c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
110d0 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  , uint) */.     
110e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
110f0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
11100 42 59 54 45 3a 20 20 20 20 20 20 20 20 0a 20 20  BYTE:        .  
11110 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
11120 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==3 ){.         
11130 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
11140 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  opt = (unsigned 
11150 69 6e 74 29 61 74 6f 69 28 61 7a 41 72 67 5b 32  int)atoi(azArg[2
11160 5d 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ]);        .    
11170 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11180 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
11190 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
111a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
111b0 69 6e 74 66 28 22 25 64 20 28 30 78 25 30 38 78  intf("%d (0x%08x
111c0 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20  )\n", rc, rc);. 
111d0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
111e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
111f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
11200 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
11210 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
11220 75 6e 73 69 67 6e 65 64 22 0a 20 20 20 20 20 20  unsigned".      
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 22 20 69 6e 74 20 6f 70 74 69 6f       " int optio
11250 6e 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  n\n", azArg[1]);
11260 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11270 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11280 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
11290 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
112a0 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e  _control(int, in
112b0 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
112c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
112d0 52 4c 5f 41 53 53 45 52 54 3a 20 20 20 20 20 20  RL_ASSERT:      
112e0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
112f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
11300 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 20 20  TCTRL_ALWAYS:   
11310 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
11320 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
11330 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
11340 20 69 6e 74 20 6f 70 74 20 3d 20 61 74 6f 69 28   int opt = atoi(
11350 61 7a 41 72 67 5b 32 5d 29 3b 20 20 20 20 20 20  azArg[2]);      
11360 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72    .            r
11370 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
11380 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
11390 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  l, opt);.       
113a0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20       printf("%d 
113b0 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c  (0x%08x)\n", rc,
113c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
113d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
113e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
113f0 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74  err,"Error: test
11400 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20  ctrl %s takes a 
11410 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f  single int optio
11420 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  n\n",.          
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
11450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11460 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
11470 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
11480 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
11490 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65  char *) */.#ifde
114a0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
114b0 52 44 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  RD.        case 
114c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
114d0 49 53 4b 45 59 57 4f 52 44 3a 20 20 20 20 20 20  ISKEYWORD:      
114e0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
114f0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
11500 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
11510 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41   char *opt = azA
11520 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 0a 20  rg[2];        . 
11530 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
11540 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
11550 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
11560 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
11570 20 70 72 69 6e 74 66 28 22 25 64 20 28 30 78 25   printf("%d (0x%
11580 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29  08x)\n", rc, rc)
11590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
115a0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
115b0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
115c0 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c  "Error: testctrl
115d0 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67   %s takes a sing
115e0 6c 65 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e  le char * option
115f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11630 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
11640 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
11650 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
11660 54 56 45 43 5f 54 45 53 54 3a 20 20 20 20 20 20  TVEC_TEST:      
11670 20 20 20 0a 20 20 20 20 20 20 20 20 63 61 73 65     .        case
11680 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
11690 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
116a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63        .        c
116b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
116c0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
116d0 43 5f 48 4f 4f 4b 53 3a 20 0a 20 20 20 20 20 20  C_HOOKS: .      
116e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
116f0 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
11700 4c 4c 4f 43 3a 20 20 20 20 20 20 20 0a 20 20 20  LLOC:       .   
11710 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
11720 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
11730 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 43  stderr,"Error: C
11740 4c 49 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  LI support for t
11750 65 73 74 63 74 72 6c 20 25 73 20 6e 6f 74 20 69  estctrl %s not i
11760 6d 70 6c 65 6d 65 6e 74 65 64 5c 6e 22 2c 0a 20  mplemented\n",. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
11790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
117a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
117b0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  se..  if( c=='t'
117c0 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63   && n>4 && strnc
117d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
117e0 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26  meout", n)==0 &&
117f0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
11800 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
11810 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
11820 65 6f 75 74 28 70 2d 3e 64 62 2c 20 61 74 6f 69  eout(p->db, atoi
11830 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d  (azArg[1]));.  }
11840 65 6c 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20  else.    .  if( 
11850 48 41 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d  HAS_TIMER && c==
11860 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73  't' && n>=5 && s
11870 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
11880 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 0a   "timer", n)==0.
11890 20 20 20 26 26 20 6e 41 72 67 3d 3d 32 0a 20 20     && nArg==2.  
118a0 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 54 69 6d  ){.    enableTim
118b0 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
118c0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
118d0 65 6c 73 65 0a 20 20 0a 20 20 69 66 28 20 63 3d  else.  .  if( c=
118e0 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='w' && strncmp(
118f0 61 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64 74 68  azArg[0], "width
11900 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
11910 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  >1 ){.    int j;
11920 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72  .    assert( nAr
11930 67 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 41  g<=ArraySize(azA
11940 72 67 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a  rg) );.    for(j
11950 3d 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a 3c  =1; j<nArg && j<
11960 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
11970 57 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20  Width); j++){.  
11980 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
11990 6a 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41 72  j-1] = atoi(azAr
119a0 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[j]);.    }.  }
119b0 65 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66 70  else..  {.    fp
119c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
119d0 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f  rror: unknown co
119e0 6d 6d 61 6e 64 20 6f 72 20 69 6e 76 61 6c 69 64  mmand or invalid
119f0 20 61 72 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20   arguments: ".  
11a00 20 20 20 20 22 20 5c 22 25 73 5c 22 2e 20 45 6e      " \"%s\". En
11a10 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f  ter \".help\" fo
11a20 72 20 68 65 6c 70 5c 6e 22 2c 20 61 7a 41 72 67  r help\n", azArg
11a30 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  [0]);.    rc = 1
11a40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11a60 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 73 65  urn TRUE if a se
11a70 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73 20 61  micolon occurs a
11a80 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 66  nywhere in the f
11a90 69 72 73 74 20 4e 20 63 68 61 72 61 63 74 65 72  irst N character
11aa0 73 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 20 7a  s.** of string z
11ab0 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  []..*/.static in
11ac0 74 20 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69  t _contains_semi
11ad0 63 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  colon(const char
11ae0 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *z, int N){.  i
11af0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
11b00 20 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20 69 66 28   i<N; i++){  if(
11b10 20 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20 72 65 74   z[i]==';' ) ret
11b20 75 72 6e 20 31 3b 20 7d 0a 20 20 72 65 74 75 72  urn 1; }.  retur
11b30 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  n 0;.}../*.** Te
11b40 73 74 20 74 6f 20 73 65 65 20 69 66 20 61 20 6c  st to see if a l
11b50 69 6e 65 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ine consists ent
11b60 69 72 65 6c 79 20 6f 66 20 77 68 69 74 65 73 70  irely of whitesp
11b70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
11b80 6e 74 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  nt _all_whitespa
11b90 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ce(const char *z
11ba0 29 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a 3b 20 7a  ){.  for(; *z; z
11bb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 73  ++){.    if( iss
11bc0 70 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64 20  pace(*(unsigned 
11bd0 63 68 61 72 2a 29 7a 29 20 29 20 63 6f 6e 74 69  char*)z) ) conti
11be0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  nue;.    if( *z=
11bf0 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a  ='/' && z[1]=='*
11c00 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  ' ){.      z += 
11c10 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
11c20 2a 7a 20 26 26 20 28 2a 7a 21 3d 27 2a 27 20 7c  *z && (*z!='*' |
11c30 7c 20 7a 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20  | z[1]!='/') ){ 
11c40 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  z++; }.      if(
11c50 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   *z==0 ) return 
11c60 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  0;.      z++;.  
11c70 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c80 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d    }.    if( *z==
11c90 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
11ca0 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32   ){.      z += 2
11cb0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
11cc0 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 29 7b  z && *z!='\n' ){
11cd0 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   z++; }.      if
11ce0 28 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( *z==0 ) return
11cf0 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
11d00 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ue;.    }.    re
11d10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
11d20 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
11d30 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
11d40 74 68 65 20 6c 69 6e 65 20 74 79 70 65 64 20 69  the line typed i
11d50 6e 20 69 73 20 61 6e 20 53 51 4c 20 63 6f 6d 6d  n is an SQL comm
11d60 61 6e 64 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f  and terminator o
11d70 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 73  ther.** than a s
11d80 65 6d 69 2d 63 6f 6c 6f 6e 2e 20 20 54 68 65 20  emi-colon.  The 
11d90 53 51 4c 20 53 65 72 76 65 72 20 73 74 79 6c 65  SQL Server style
11da0 20 22 67 6f 22 20 63 6f 6d 6d 61 6e 64 20 69 73   "go" command is
11db0 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 61   understood.** a
11dc0 73 20 69 73 20 74 68 65 20 4f 72 61 63 6c 65 20  s is the Oracle 
11dd0 22 2f 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "/"..*/.static i
11de0 6e 74 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74  nt _is_command_t
11df0 65 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20  erminator(const 
11e00 63 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20  char *zLine){.  
11e10 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
11e20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
11e30 7a 4c 69 6e 65 29 20 29 7b 20 7a 4c 69 6e 65 2b  zLine) ){ zLine+
11e40 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  +; };.  if( zLin
11e50 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c  e[0]=='/' && _al
11e60 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c  l_whitespace(&zL
11e70 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72  ine[1]) ){.    r
11e80 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
11e90 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  cle */.  }.  if(
11ea0 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30   tolower(zLine[0
11eb0 5d 29 3d 3d 27 67 27 20 26 26 20 74 6f 6c 6f 77  ])=='g' && tolow
11ec0 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f  er(zLine[1])=='o
11ed0 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f 61  '.         && _a
11ee0 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
11ef0 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20  Line[2]) ){.    
11f00 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51  return 1;  /* SQ
11f10 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a  L Server */.  }.
11f20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
11f40 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f   if zSql is a co
11f50 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
11f60 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61  ment.  Return fa
11f70 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64  lse if it.** end
11f80 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
11f90 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  of a string lite
11fa0 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63  ral or C-style c
11fb0 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  omment..*/.stati
11fc0 63 20 69 6e 74 20 5f 69 73 5f 63 6f 6d 70 6c 65  c int _is_comple
11fd0 74 65 28 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69  te(char *zSql, i
11fe0 6e 74 20 6e 53 71 6c 29 7b 0a 20 20 69 6e 74 20  nt nSql){.  int 
11ff0 72 63 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  rc;.  if( zSql==
12000 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
12010 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 27 3b 27  zSql[nSql] = ';'
12020 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 31 5d  ;.  zSql[nSql+1]
12030 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12040 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53  ite3_complete(zS
12050 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c  ql);.  zSql[nSql
12060 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
12070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
12080 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 69 6e  d input from *in
12090 20 61 6e 64 20 70 72 6f 63 65 73 73 20 69 74 2e   and process it.
120a0 20 20 49 66 20 2a 69 6e 3d 3d 30 20 74 68 65 6e    If *in==0 then
120b0 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 69 6e 74   input.** is int
120c0 65 72 61 63 74 69 76 65 20 2d 20 74 68 65 20 75  eractive - the u
120d0 73 65 72 20 69 73 20 74 79 70 69 6e 67 20 69 74  ser is typing it
120e0 20 69 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c   it.  Otherwise,
120f0 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 63 6f 6d   input.** is com
12100 69 6e 67 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ing from a file 
12110 6f 72 20 64 65 76 69 63 65 2e 20 20 41 20 70 72  or device.  A pr
12120 6f 6d 70 74 20 69 73 20 69 73 73 75 65 64 20 61  ompt is issued a
12130 6e 64 20 68 69 73 74 6f 72 79 0a 2a 2a 20 69 73  nd history.** is
12140 20 73 61 76 65 64 20 6f 6e 6c 79 20 69 66 20 69   saved only if i
12150 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61 63 74  nput is interact
12160 69 76 65 2e 20 20 41 6e 20 69 6e 74 65 72 72 75  ive.  An interru
12170 70 74 20 73 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a  pt signal will.*
12180 2a 20 63 61 75 73 65 20 74 68 69 73 20 72 6f 75  * cause this rou
12190 74 69 6e 65 20 74 6f 20 65 78 69 74 20 69 6d 6d  tine to exit imm
121a0 65 64 69 61 74 65 6c 79 2c 20 75 6e 6c 65 73 73  ediately, unless
121b0 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61   input is intera
121c0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ctive..**.** Ret
121d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
121e0 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
121f0 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
12200 69 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c  input(struct cal
12210 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46  lback_data *p, F
12220 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
12230 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63   *zLine = 0;.  c
12240 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
12250 20 69 6e 74 20 6e 53 71 6c 20 3d 20 30 3b 0a 20   int nSql = 0;. 
12260 20 69 6e 74 20 6e 53 71 6c 50 72 69 6f 72 20 3d   int nSqlPrior =
12270 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
12280 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
12290 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b   int errCnt = 0;
122a0 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20  .  int lineno = 
122b0 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  0;.  int startli
122c0 6e 65 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ne = 0;..  while
122d0 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21  ( errCnt==0 || !
122e0 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c  bail_on_error ||
122f0 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e   (in==0 && stdin
12300 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29  _is_interactive)
12310 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70   ){.    fflush(p
12320 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65  ->out);.    free
12330 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 4c 69  (zLine);.    zLi
12340 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c  ne = one_input_l
12350 69 6e 65 28 7a 53 71 6c 2c 20 69 6e 29 3b 0a 20  ine(zSql, in);. 
12360 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
12370 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  ){.      break; 
12380 20 2f 2a 20 57 65 20 68 61 76 65 20 72 65 61 63   /* We have reac
12390 68 65 64 20 45 4f 46 20 2a 2f 0a 20 20 20 20 7d  hed EOF */.    }
123a0 0a 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74  .    if( seenInt
123b0 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20  errupt ){.      
123c0 69 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61  if( in!=0 ) brea
123d0 6b 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74  k;.      seenInt
123e0 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20  errupt = 0;.    
123f0 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  }.    lineno++;.
12400 20 20 20 20 69 66 28 20 28 7a 53 71 6c 3d 3d 30      if( (zSql==0
12410 20 7c 7c 20 7a 53 71 6c 5b 30 5d 3d 3d 30 29 20   || zSql[0]==0) 
12420 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61  && _all_whitespa
12430 63 65 28 7a 4c 69 6e 65 29 20 29 20 63 6f 6e 74  ce(zLine) ) cont
12440 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 4c  inue;.    if( zL
12450 69 6e 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d  ine && zLine[0]=
12460 3d 27 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20  ='.' && nSql==0 
12470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
12480 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28  echoOn ) printf(
12490 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a  "%s\n", zLine);.
124a0 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65        rc = do_me
124b0 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65  ta_command(zLine
124c0 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
124d0 72 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74  rc==2 ){ /* exit
124e0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
124f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12500 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
12510 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e  ){.        errCn
12520 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
12530 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12540 20 7d 0a 20 20 20 20 69 66 28 20 5f 69 73 5f 63   }.    if( _is_c
12550 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f  ommand_terminato
12560 72 28 7a 4c 69 6e 65 29 20 26 26 20 5f 69 73 5f  r(zLine) && _is_
12570 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 2c 20 6e  complete(zSql, n
12580 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  Sql) ){.      me
12590 6d 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22 2c 32  mcpy(zLine,";",2
125a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 71  );.    }.    nSq
125b0 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20  lPrior = nSql;. 
125c0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
125d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
125e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c       for(i=0; zL
125f0 69 6e 65 5b 69 5d 20 26 26 20 69 73 73 70 61 63  ine[i] && isspac
12600 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
12610 29 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29  )zLine[i]); i++)
12620 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  {}.      if( zLi
12630 6e 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20  ne[i]!=0 ){.    
12640 20 20 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65      nSql = strle
12650 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n30(zLine);.    
12660 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
12670 63 28 20 6e 53 71 6c 2b 33 20 29 3b 0a 20 20 20  c( nSql+3 );.   
12680 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30       if( zSql==0
12690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
126a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
126b0 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
126c0 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
126d0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
126e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
126f0 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65  mcpy(zSql, zLine
12700 2c 20 6e 53 71 6c 2b 31 29 3b 0a 20 20 20 20 20  , nSql+1);.     
12710 20 20 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 6c     startline = l
12720 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  ineno;.      }. 
12730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12740 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
12750 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  30(zLine);.     
12760 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28   zSql = realloc(
12770 20 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20 6c 65   zSql, nSql + le
12780 6e 20 2b 20 34 20 29 3b 0a 20 20 20 20 20 20 69  n + 4 );.      i
12790 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
127a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
127b0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74  derr,"Error: out
127c0 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
127d0 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
127e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
127f0 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c  Sql[nSql++] = '\
12800 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  n';.      memcpy
12810 28 26 7a 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c  (&zSql[nSql], zL
12820 69 6e 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ine, len+1);.   
12830 20 20 20 6e 53 71 6c 20 2b 3d 20 6c 65 6e 3b 0a     nSql += len;.
12840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
12850 71 6c 20 26 26 20 5f 63 6f 6e 74 61 69 6e 73 5f  ql && _contains_
12860 73 65 6d 69 63 6f 6c 6f 6e 28 26 7a 53 71 6c 5b  semicolon(&zSql[
12870 6e 53 71 6c 50 72 69 6f 72 5d 2c 20 6e 53 71 6c  nSqlPrior], nSql
12880 2d 6e 53 71 6c 50 72 69 6f 72 29 0a 20 20 20 20  -nSqlPrior).    
12890 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
128a0 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
128b0 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 70  zSql) ){.      p
128c0 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
128d0 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20   open_db(p);.   
128e0 20 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a     BEGIN_TIMER;.
128f0 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
12900 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
12910 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  l, shell_callbac
12920 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b  k, p, &zErrMsg);
12930 0a 20 20 20 20 20 20 45 4e 44 5f 54 49 4d 45 52  .      END_TIMER
12940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 7c  ;.      if( rc |
12950 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
12960 20 20 20 20 20 63 68 61 72 20 7a 50 72 65 66 69       char zPrefi
12970 78 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  x[100];.        
12980 69 66 28 20 69 6e 21 3d 30 20 7c 7c 20 21 73 74  if( in!=0 || !st
12990 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
129a0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ve ){.          
129b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
129c0 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
129d0 2c 20 7a 50 72 65 66 69 78 2c 20 0a 20 20 20 20  , zPrefix, .    
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e         "Error: n
12a00 65 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73  ear line %d:", s
12a10 74 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20  tartline);.     
12a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12a40 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65  intf(sizeof(zPre
12a50 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22  fix), zPrefix, "
12a60 45 72 72 6f 72 3a 22 29 3b 0a 20 20 20 20 20 20  Error:");.      
12a70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12a80 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20  zErrMsg!=0 ){.  
12a90 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
12aa0 73 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e  stderr, "%s %s\n
12ab0 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72 72  ", zPrefix, zErr
12ac0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
12ad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
12ae0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
12af0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
12b00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12b10 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
12b20 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22  tderr, "%s %s\n"
12b30 2c 20 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74  , zPrefix, sqlit
12b40 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
12b50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12b60 20 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20       errCnt++;. 
12b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
12b80 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
12b90 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Sql = 0;.      n
12ba0 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Sql = 0;.    }. 
12bb0 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b   }.  if( zSql ){
12bc0 0a 20 20 20 20 69 66 28 20 21 5f 61 6c 6c 5f 77  .    if( !_all_w
12bd0 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c 29 20  hitespace(zSql) 
12be0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
12bf0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
12c00 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a   incomplete SQL:
12c10 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20   %s\n", zSql);. 
12c20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a 53     }.    free(zS
12c30 71 6c 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  ql);.  }.  free(
12c40 7a 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e  zLine);.  return
12c50 20 65 72 72 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errCnt;.}../*.*
12c60 2a 20 52 65 74 75 72 6e 20 61 20 70 61 74 68 6e  * Return a pathn
12c70 61 6d 65 20 77 68 69 63 68 20 69 73 20 74 68 65  ame which is the
12c80 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72   user's home dir
12c90 65 63 74 6f 72 79 2e 20 20 41 0a 2a 2a 20 30 20  ectory.  A.** 0 
12ca0 72 65 74 75 72 6e 20 69 6e 64 69 63 61 74 65 73  return indicates
12cb0 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d   an error of som
12cc0 65 20 6b 69 6e 64 2e 20 20 53 70 61 63 65 20 74  e kind.  Space t
12cd0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
12ce0 73 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 69  sulting string i
12cf0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
12d00 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  malloc().  The c
12d10 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
12d20 6f 6e 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  on should free t
12d30 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
12d40 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f  atic char *find_
12d50 68 6f 6d 65 5f 64 69 72 28 76 6f 69 64 29 7b 0a  home_dir(void){.
12d60 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72    char *home_dir
12d70 20 3d 20 4e 55 4c 4c 3b 0a 0a 23 69 66 20 21 64   = NULL;..#if !d
12d80 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26  efined(_WIN32) &
12d90 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32  & !defined(WIN32
12da0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
12db0 4f 53 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  OS2__) && !defin
12dc0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 26  ed(_WIN32_WCE) &
12dd0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  & !defined(__RTP
12de0 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
12df0 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 73  _WRS_KERNEL).  s
12e00 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77  truct passwd *pw
12e10 65 6e 74 3b 0a 20 20 75 69 64 5f 74 20 75 69 64  ent;.  uid_t uid
12e20 20 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 69   = getuid();.  i
12e30 66 28 20 28 70 77 65 6e 74 3d 67 65 74 70 77 75  f( (pwent=getpwu
12e40 69 64 28 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c  id(uid)) != NULL
12e50 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72  ) {.    home_dir
12e60 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72   = pwent->pw_dir
12e70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
12e80 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
12e90 5f 57 43 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f  _WCE).  /* Windo
12ea0 77 73 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65  ws CE (arm-wince
12eb0 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20  -mingw32ce-gcc) 
12ec0 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65  does not provide
12ed0 20 67 65 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a   getenv().   */.
12ee0 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 73 74 72    home_dir = str
12ef0 64 75 70 28 22 2f 22 29 3b 0a 23 65 6c 73 65 0a  dup("/");.#else.
12f00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
12f10 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
12f20 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
12f30 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20  d(__OS2__).  if 
12f40 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20  (!home_dir) {.  
12f50 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74    home_dir = get
12f60 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
12f70 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
12f80 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29    if (!home_dir)
12f90 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
12fa0 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29  = getenv("HOME")
12fb0 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e  ;.  }..#if defin
12fc0 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
12fd0 66 69 6e 65 64 28 57 49 4e 33 32 29 20 7c 7c 20  fined(WIN32) || 
12fe0 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29  defined(__OS2__)
12ff0 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72  .  if (!home_dir
13000 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  ) {.    char *zD
13010 72 69 76 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20  rive, *zPath;.  
13020 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72    int n;.    zDr
13030 69 76 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  ive = getenv("HO
13040 4d 45 44 52 49 56 45 22 29 3b 0a 20 20 20 20 7a  MEDRIVE");.    z
13050 50 61 74 68 20 3d 20 67 65 74 65 6e 76 28 22 48  Path = getenv("H
13060 4f 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20 69  OMEPATH");.    i
13070 66 28 20 7a 44 72 69 76 65 20 26 26 20 7a 50 61  f( zDrive && zPa
13080 74 68 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  th ){.      n = 
13090 73 74 72 6c 65 6e 33 30 28 7a 44 72 69 76 65 29  strlen30(zDrive)
130a0 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 50 61 74   + strlen30(zPat
130b0 68 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f  h) + 1;.      ho
130c0 6d 65 5f 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28  me_dir = malloc(
130d0 20 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20   n );.      if( 
130e0 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 20 72 65  home_dir==0 ) re
130f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71  turn 0;.      sq
13100 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
13110 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25  , home_dir, "%s%
13120 73 22 2c 20 7a 44 72 69 76 65 2c 20 7a 50 61 74  s", zDrive, zPat
13130 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  h);.      return
13140 20 68 6f 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d   home_dir;.    }
13150 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
13160 22 63 3a 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64  "c:\\";.  }.#end
13170 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f  if..#endif /* !_
13180 57 49 4e 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20  WIN32_WCE */..  
13190 69 66 28 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a  if( home_dir ){.
131a0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
131b0 65 6e 33 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b  en30(home_dir) +
131c0 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   1;.    char *z 
131d0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  = malloc( n );. 
131e0 20 20 20 69 66 28 20 7a 20 29 20 6d 65 6d 63 70     if( z ) memcp
131f0 79 28 7a 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e  y(z, home_dir, n
13200 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20  );.    home_dir 
13210 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = z;.  }..  retu
13220 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a  rn home_dir;.}..
13230 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
13240 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67   from the file g
13250 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63  iven by sqliterc
13260 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69  _override.  Or i
13270 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65  f that.** parame
13280 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b  ter is NULL, tak
13290 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e  e input from ~/.
132a0 73 71 6c 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52  sqliterc.**.** R
132b0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
132c0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
132d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
132e0 73 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20 73  ss_sqliterc(.  s
132f0 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
13300 61 74 61 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ata *p,        /
13310 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
13320 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  data */.  const 
13330 63 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f  char *sqliterc_o
13340 76 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d  verride   /* Nam
13350 65 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c 65  e of config file
13360 2e 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64 65  . NULL to use de
13370 66 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  fault */.){.  ch
13380 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e  ar *home_dir = N
13390 55 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ULL;.  const cha
133a0 72 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73 71  r *sqliterc = sq
133b0 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 3b  literc_override;
133c0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20  .  char *zBuf = 
133d0 30 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20  0;.  FILE *in = 
133e0 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 6e 42 75 66  NULL;.  int nBuf
133f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
13400 0a 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20  .  if (sqliterc 
13410 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68  == NULL) {.    h
13420 6f 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68  ome_dir = find_h
13430 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 69  ome_dir();.    i
13440 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29  f( home_dir==0 )
13450 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  {.#if !defined(_
13460 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
13470 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
13480 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
13490 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72  tderr,"%s: Error
134a0 3a 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20  : cannot locate 
134b0 79 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63 74  your home direct
134c0 6f 72 79 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ory\n", Argv0);.
134d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
134e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
134f0 20 6e 42 75 66 20 3d 20 73 74 72 6c 65 6e 33 30   nBuf = strlen30
13500 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 36 3b  (home_dir) + 16;
13510 0a 20 20 20 20 7a 42 75 66 20 3d 20 6d 61 6c 6c  .    zBuf = mall
13520 6f 63 28 20 6e 42 75 66 20 29 3b 0a 20 20 20 20  oc( nBuf );.    
13530 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  if( zBuf==0 ){. 
13540 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
13550 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20  err,"%s: Error: 
13560 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
13570 2c 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20 72  ,Argv0);.      r
13580 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
13590 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
135a0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 22  ntf(nBuf, zBuf,"
135b0 25 73 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f  %s/.sqliterc",ho
135c0 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 66 72 65  me_dir);.    fre
135d0 65 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20  e(home_dir);.   
135e0 20 73 71 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e   sqliterc = (con
135f0 73 74 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20  st char*)zBuf;. 
13600 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
13610 73 71 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a  sqliterc,"rb");.
13620 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
13630 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
13640 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20  eractive ){.    
13650 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13660 2c 22 2d 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73  ,"-- Loading res
13670 6f 75 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e  ources from %s\n
13680 22 2c 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20  ",sqliterc);.   
13690 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 63   }.    rc = proc
136a0 65 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b  ess_input(p,in);
136b0 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
136c0 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 42 75 66  .  }.  free(zBuf
136d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
136e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76  }../*.** Show av
136f0 61 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20  ailable command 
13700 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a  line options.*/.
13710 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13720 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a  r zOptions[] = .
13730 20 20 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20    "   -help     
13740 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20             show 
13750 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a  this message\n".
13760 20 20 22 20 20 20 2d 69 6e 69 74 20 66 69 6c 65    "   -init file
13770 6e 61 6d 65 20 20 20 20 20 20 20 72 65 61 64 2f  name       read/
13780 70 72 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69  process named fi
13790 6c 65 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63 68  le\n".  "   -ech
137a0 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
137b0 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20   print commands 
137c0 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f 6e  before execution
137d0 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68  \n".  "   -[no]h
137e0 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20 74  eader          t
137f0 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f  urn headers on o
13800 72 20 6f 66 66 5c 6e 22 0a 20 20 22 20 20 20 2d  r off\n".  "   -
13810 62 61 69 6c 20 20 20 20 20 20 20 20 20 20 20 20  bail            
13820 20 20 20 20 73 74 6f 70 20 61 66 74 65 72 20 68      stop after h
13830 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c  itting an error\
13840 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72 61  n".  "   -intera
13850 63 74 69 76 65 20 20 20 20 20 20 20 20 20 66 6f  ctive         fo
13860 72 63 65 20 69 6e 74 65 72 61 63 74 69 76 65 20  rce interactive 
13870 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61  I/O\n".  "   -ba
13880 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
13890 20 20 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f    force batch I/
138a0 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75  O\n".  "   -colu
138b0 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mn              
138c0 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
138d0 74 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20  to 'column'\n". 
138e0 20 22 20 20 20 2d 63 73 76 20 20 20 20 20 20 20   "   -csv       
138f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75            set ou
13900 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 73  tput mode to 'cs
13910 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d  v'\n".  "   -htm
13920 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
13930 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   set output mode
13940 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20   to HTML\n".  " 
13950 20 20 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20    -line         
13960 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
13970 74 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27  t mode to 'line'
13980 5c 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20  \n".  "   -list 
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
139a0 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74  et output mode t
139b0 6f 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20  o 'list'\n".  " 
139c0 20 20 2d 73 65 70 61 72 61 74 6f 72 20 27 78 27    -separator 'x'
139d0 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
139e0 74 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f  t field separato
139f0 72 20 28 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d  r (|)\n".  "   -
13a00 73 74 61 74 73 20 20 20 20 20 20 20 20 20 20 20  stats           
13a10 20 20 20 20 70 72 69 6e 74 20 6d 65 6d 6f 72 79      print memory
13a20 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61   stats before ea
13a30 63 68 20 66 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20  ch finalize\n". 
13a40 20 22 20 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20   "   -nullvalue 
13a50 27 74 65 78 74 27 20 20 20 20 73 65 74 20 74 65  'text'    set te
13a60 78 74 20 73 74 72 69 6e 67 20 66 6f 72 20 4e 55  xt string for NU
13a70 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  LL values\n".  "
13a80 20 20 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20     -version     
13a90 20 20 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c          show SQL
13aa0 69 74 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20  ite version\n". 
13ab0 20 22 20 20 20 2d 76 66 73 20 4e 41 4d 45 20 20   "   -vfs NAME  
13ac0 20 20 20 20 20 20 20 20 20 20 75 73 65 20 4e 41            use NA
13ad0 4d 45 20 61 73 20 74 68 65 20 64 65 66 61 75 6c  ME as the defaul
13ae0 74 20 56 46 53 5c 6e 22 0a 23 69 66 64 65 66 20  t VFS\n".#ifdef 
13af0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46  SQLITE_ENABLE_VF
13b00 53 54 52 41 43 45 0a 20 20 22 20 20 20 2d 76 66  STRACE.  "   -vf
13b10 73 74 72 61 63 65 20 20 20 20 20 20 20 20 20 20  strace          
13b20 20 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67    enable tracing
13b30 20 6f 66 20 61 6c 6c 20 56 46 53 20 63 61 6c 6c   of all VFS call
13b40 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 3b 0a 73 74  s\n".#endif.;.st
13b50 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28  atic void usage(
13b60 69 6e 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b  int showDetail){
13b70 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
13b80 72 2c 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a  r,.      "Usage:
13b90 20 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49   %s [OPTIONS] FI
13ba0 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20  LENAME [SQL]\n" 
13bb0 20 0a 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d   .      "FILENAM
13bc0 45 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  E is the name of
13bd0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
13be0 61 73 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62  ase. A new datab
13bf0 61 73 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e  ase is created\n
13c00 22 0a 20 20 20 20 20 20 22 69 66 20 74 68 65 20  ".      "if the 
13c10 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  file does not pr
13c20 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c  eviously exist.\
13c30 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66  n", Argv0);.  if
13c40 28 20 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a  ( showDetail ){.
13c50 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13c60 72 72 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63  rr, "OPTIONS inc
13c70 6c 75 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74  lude:\n%s", zOpt
13c80 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ions);.  }else{.
13c90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13ca0 72 72 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65  rr, "Use the -he
13cb0 6c 70 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64  lp option for ad
13cc0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
13cd0 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tion\n");.  }.  
13ce0 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
13cf0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13d00 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
13d10 6f 6e 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74  on in data.*/.st
13d20 61 74 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69  atic void main_i
13d30 6e 69 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62  nit(struct callb
13d40 61 63 6b 5f 64 61 74 61 20 2a 64 61 74 61 29 20  ack_data *data) 
13d50 7b 0a 20 20 6d 65 6d 73 65 74 28 64 61 74 61 2c  {.  memset(data,
13d60 20 30 2c 20 73 69 7a 65 6f 66 28 2a 64 61 74 61   0, sizeof(*data
13d70 29 29 3b 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65  ));.  data->mode
13d80 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
13d90 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e 73 65 70  memcpy(data->sep
13da0 61 72 61 74 6f 72 2c 22 7c 22 2c 20 32 29 3b 0a  arator,"|", 2);.
13db0 20 20 64 61 74 61 2d 3e 73 68 6f 77 48 65 61 64    data->showHead
13dc0 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
13dd0 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
13de0 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 73 68 65 6c  CONFIG_LOG, shel
13df0 6c 4c 6f 67 2c 20 64 61 74 61 29 3b 0a 20 20 73  lLog, data);.  s
13e00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
13e10 73 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d 70  sizeof(mainPromp
13e20 74 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c 22  t), mainPrompt,"
13e30 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73 71  sqlite> ");.  sq
13e40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
13e50 69 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50 72  izeof(continuePr
13e60 6f 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65 50  ompt), continueP
13e70 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20 22  rompt,"   ...> "
13e80 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
13e90 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
13ea0 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b  G_SINGLETHREAD);
13eb0 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .}..int main(int
13ec0 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
13ed0 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  gv){.  char *zEr
13ee0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 74 72 75  rMsg = 0;.  stru
13ef0 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
13f00 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63   data;.  const c
13f10 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c 65 20 3d  har *zInitFile =
13f20 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 72   0;.  char *zFir
13f30 73 74 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74  stCmd = 0;.  int
13f40 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   i;.  int rc = 0
13f50 3b 0a 0a 20 20 41 72 67 76 30 20 3d 20 61 72 67  ;..  Argv0 = arg
13f60 76 5b 30 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69  v[0];.  main_ini
13f70 74 28 26 64 61 74 61 29 3b 0a 20 20 73 74 64 69  t(&data);.  stdi
13f80 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
13f90 20 3d 20 69 73 61 74 74 79 28 30 29 3b 0a 0a 20   = isatty(0);.. 
13fa0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
13fb0 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 73 69   have a valid si
13fc0 67 6e 61 6c 20 68 61 6e 64 6c 65 72 20 65 61 72  gnal handler ear
13fd0 6c 79 2c 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ly, before anyth
13fe0 69 6e 67 0a 20 20 2a 2a 20 65 6c 73 65 20 69 73  ing.  ** else is
13ff0 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 64   done..  */.#ifd
14000 65 66 20 53 49 47 49 4e 54 0a 20 20 73 69 67 6e  ef SIGINT.  sign
14010 61 6c 28 53 49 47 49 4e 54 2c 20 69 6e 74 65 72  al(SIGINT, inter
14020 72 75 70 74 5f 68 61 6e 64 6c 65 72 29 3b 0a 23  rupt_handler);.#
14030 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61  endif..  /* Do a
14040 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74  n initial pass t
14050 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61  hrough the comma
14060 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
14070 20 74 6f 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20   to locate.  ** 
14080 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14090 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
140a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
140b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69  nitialization fi
140c0 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  le,.  ** the siz
140d0 65 20 6f 66 20 74 68 65 20 61 6c 74 65 72 6e 61  e of the alterna
140e0 74 69 76 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70  tive malloc heap
140f0 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 66  ,.  ** and the f
14100 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  irst command to 
14110 65 78 65 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20  execute..  */.  
14120 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 2d  for(i=1; i<argc-
14130 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  1; i++){.    cha
14140 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 61 72  r *z;.    if( ar
14150 67 76 5b 69 5d 5b 30 5d 21 3d 27 2d 27 20 29 20  gv[i][0]!='-' ) 
14160 62 72 65 61 6b 3b 0a 20 20 20 20 7a 20 3d 20 61  break;.    z = a
14170 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rgv[i];.    if( 
14180 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31  z[0]=='-' && z[1
14190 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
141a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
141b0 76 5b 69 5d 2c 22 2d 73 65 70 61 72 61 74 6f 72  v[i],"-separator
141c0 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
141d0 61 72 67 76 5b 69 5d 2c 22 2d 6e 75 6c 6c 76 61  argv[i],"-nullva
141e0 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lue")==0 ){.    
141f0 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65    i++;.    }else
14200 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
14210 5b 69 5d 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  [i],"-init")==0 
14220 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
14230 20 20 20 20 7a 49 6e 69 74 46 69 6c 65 20 3d 20      zInitFile = 
14240 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20  argv[i];.    /* 
14250 4e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  Need to check fo
14260 72 20 62 61 74 63 68 20 6d 6f 64 65 20 68 65 72  r batch mode her
14270 65 20 74 6f 20 73 6f 20 77 65 20 63 61 6e 20 61  e to so we can a
14280 76 6f 69 64 20 70 72 69 6e 74 69 6e 67 0a 20 20  void printing.  
14290 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
142a0 61 6c 20 6d 65 73 73 61 67 65 73 20 28 6c 69 6b  al messages (lik
142b0 65 20 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f 73  e from process_s
142c0 71 6c 69 74 65 72 63 29 20 62 65 66 6f 72 65 20  qliterc) before 
142d0 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 74 68  .    ** we do th
142e0 65 20 61 63 74 75 61 6c 20 70 72 6f 63 65 73 73  e actual process
142f0 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ing of arguments
14300 20 6c 61 74 65 72 20 69 6e 20 61 20 73 65 63 6f   later in a seco
14310 6e 64 20 70 61 73 73 2e 0a 20 20 20 20 2a 2f 0a  nd pass..    */.
14320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
14330 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 62  rcmp(argv[i],"-b
14340 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
14350 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
14360 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20  ractive = 0;.   
14370 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14380 70 28 61 72 67 76 5b 69 5d 2c 22 2d 68 65 61 70  p(argv[i],"-heap
14390 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
143a0 6e 74 20 6a 2c 20 63 3b 0a 20 20 20 20 20 20 63  nt j, c;.      c
143b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 69 7a 65  onst char *zSize
143c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
143d0 69 6e 74 36 34 20 73 7a 48 65 61 70 3b 0a 0a 20  int64 szHeap;.. 
143e0 20 20 20 20 20 7a 53 69 7a 65 20 3d 20 61 72 67       zSize = arg
143f0 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 73 7a  v[++i];.      sz
14400 48 65 61 70 20 3d 20 61 74 6f 69 28 7a 53 69 7a  Heap = atoi(zSiz
14410 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
14420 30 3b 20 28 63 20 3d 20 7a 53 69 7a 65 5b 6a 5d  0; (c = zSize[j]
14430 29 21 3d 30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  )!=0; j++){.    
14440 20 20 20 20 69 66 28 20 63 3d 3d 27 4d 27 20 29      if( c=='M' )
14450 7b 20 73 7a 48 65 61 70 20 2a 3d 20 31 30 30 30  { szHeap *= 1000
14460 30 30 30 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20  000; break; }.  
14470 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 4b 27        if( c=='K'
14480 20 29 7b 20 73 7a 48 65 61 70 20 2a 3d 20 31 30   ){ szHeap *= 10
14490 30 30 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  00; break; }.   
144a0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 47 27 20       if( c=='G' 
144b0 29 7b 20 73 7a 48 65 61 70 20 2a 3d 20 31 30 30  ){ szHeap *= 100
144c0 30 30 30 30 30 30 30 3b 20 62 72 65 61 6b 3b 20  0000000; break; 
144d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
144e0 69 66 28 20 73 7a 48 65 61 70 3e 30 78 37 66 66  if( szHeap>0x7ff
144f0 66 30 30 30 30 20 29 20 73 7a 48 65 61 70 20 3d  f0000 ) szHeap =
14500 20 30 78 37 66 66 66 30 30 30 30 3b 0a 23 69 66   0x7fff0000;.#if
14510 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14520 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
14530 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
14540 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
14550 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ).      sqlite3_
14560 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
14570 4e 46 49 47 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f  NFIG_HEAP, mallo
14580 63 28 28 69 6e 74 29 73 7a 48 65 61 70 29 2c 20  c((int)szHeap), 
14590 28 69 6e 74 29 73 7a 48 65 61 70 2c 20 36 34 29  (int)szHeap, 64)
145a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
145b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46  SQLITE_ENABLE_VF
145c0 53 54 52 41 43 45 0a 20 20 20 20 7d 65 6c 73 65  STRACE.    }else
145d0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
145e0 5b 69 5d 2c 22 2d 76 66 73 74 72 61 63 65 22 29  [i],"-vfstrace")
145f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78 74  ==0 ){.      ext
14600 65 72 6e 20 69 6e 74 20 76 66 73 74 72 61 63 65  ern int vfstrace
14610 5f 72 65 67 69 73 74 65 72 28 0a 20 20 20 20 20  _register(.     
14620 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14630 7a 54 72 61 63 65 4e 61 6d 65 2c 0a 20 20 20 20  zTraceName,.    
14640 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14650 2a 7a 4f 6c 64 56 66 73 4e 61 6d 65 2c 0a 20 20  *zOldVfsName,.  
14660 20 20 20 20 20 20 20 69 6e 74 20 28 2a 78 4f 75         int (*xOu
14670 74 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76  t)(const char*,v
14680 6f 69 64 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  oid*),.         
14690 76 6f 69 64 20 2a 70 4f 75 74 41 72 67 2c 0a 20  void *pOutArg,. 
146a0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 6b 65          int make
146b0 44 65 66 61 75 6c 74 0a 20 20 20 20 20 20 29 3b  Default.      );
146c0 0a 20 20 20 20 20 20 76 66 73 74 72 61 63 65 5f  .      vfstrace_
146d0 72 65 67 69 73 74 65 72 28 22 74 72 61 63 65 22  register("trace"
146e0 2c 30 2c 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74  ,0,(int(*)(const
146f0 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29 29 66 70   char*,void*))fp
14700 75 74 73 2c 73 74 64 65 72 72 2c 31 29 3b 0a 23  uts,stderr,1);.#
14710 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
14720 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
14730 69 5d 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b  i],"-vfs")==0 ){
14740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
14750 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74  fs *pVfs = sqlit
14760 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 72 67 76  e3_vfs_find(argv
14770 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  [++i]);.      if
14780 28 20 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ( pVfs ){.      
14790 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
147a0 67 69 73 74 65 72 28 70 56 66 73 2c 20 31 29 3b  gister(pVfs, 1);
147b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
147c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
147d0 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 56  derr, "no such V
147e0 46 53 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  FS: \"%s\"\n", a
147f0 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
14800 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
14810 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
14820 28 20 69 3c 61 72 67 63 20 29 7b 0a 23 69 66 20  ( i<argc ){.#if 
14830 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14840 53 5f 4f 53 32 29 20 26 26 20 53 51 4c 49 54 45  S_OS2) && SQLITE
14850 5f 4f 53 5f 4f 53 32 0a 20 20 20 20 64 61 74 61  _OS_OS2.    data
14860 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 28  .zDbFilename = (
14870 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 63 6f 6e  const char *)con
14880 76 65 72 74 43 70 50 61 74 68 54 6f 55 74 66 38  vertCpPathToUtf8
14890 28 20 61 72 67 76 5b 69 2b 2b 5d 20 29 3b 0a 23  ( argv[i++] );.#
148a0 65 6c 73 65 0a 20 20 20 20 64 61 74 61 2e 7a 44  else.    data.zD
148b0 62 46 69 6c 65 6e 61 6d 65 20 3d 20 61 72 67 76  bFilename = argv
148c0 5b 69 2b 2b 5d 3b 0a 23 65 6e 64 69 66 0a 20 20  [i++];.#endif.  
148d0 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
148e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
148f0 59 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  YDB.    data.zDb
14900 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
14910 6f 72 79 3a 22 3b 0a 23 65 6c 73 65 0a 20 20 20  ory:";.#else.   
14920 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d   data.zDbFilenam
14930 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
14940 7d 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29  }.  if( i<argc )
14950 7b 0a 20 20 20 20 7a 46 69 72 73 74 43 6d 64 20  {.    zFirstCmd 
14960 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d  = argv[i++];.  }
14970 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b  .  if( i<argc ){
14980 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
14990 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20  err,"%s: Error: 
149a0 74 6f 6f 20 6d 61 6e 79 20 6f 70 74 69 6f 6e 73  too many options
149b0 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 41 72 67  : \"%s\"\n", Arg
149c0 76 30 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  v0, argv[i]);.  
149d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
149e0 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20  ,"Use -help for 
149f0 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e  a list of option
14a00 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  s.\n");.    retu
14a10 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 64 61 74 61  rn 1;.  }.  data
14a20 2e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 0a  .out = stdout;..
14a30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14a40 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
14a50 28 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61  ( data.zDbFilena
14a60 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  me==0 ){.    fpr
14a70 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
14a80 20 45 72 72 6f 72 3a 20 6e 6f 20 64 61 74 61 62   Error: no datab
14a90 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70 65  ase filename spe
14aa0 63 69 66 69 65 64 5c 6e 22 2c 20 41 72 67 76 30  cified\n", Argv0
14ab0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
14ac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14ad0 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20 6f  * Go ahead and o
14ae0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
14af0 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c 72 65   file if it alre
14b00 61 64 79 20 65 78 69 73 74 73 2e 20 20 49 66 20  ady exists.  If 
14b10 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f  the.  ** file do
14b20 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 64 65  es not exist, de
14b30 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20  lay opening it. 
14b40 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 65   This prevents e
14b50 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a 20 20  mpty database.  
14b60 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20 62 65  ** files from be
14b70 69 6e 67 20 63 72 65 61 74 65 64 20 69 66 20 61  ing created if a
14b80 20 75 73 65 72 20 6d 69 73 74 79 70 65 73 20 74   user mistypes t
14b90 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
14ba0 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74   argument.  ** t
14bb0 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6d  o the sqlite com
14bc0 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a  mand-line tool..
14bd0 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63 65 73    */.  if( acces
14be0 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61  s(data.zDbFilena
14bf0 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  me, 0)==0 ){.   
14c00 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b   open_db(&data);
14c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
14c20 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ss the initializ
14c30 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74 68  ation file if th
14c40 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
14c50 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e 0a  no -init option.
14c60 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f 6e    ** is given on
14c70 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
14c80 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66 69  e, look for a fi
14c90 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c 69  le named ~/.sqli
14ca0 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74 72  terc and.  ** tr
14cb0 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74 2e  y to process it.
14cc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 72 6f  .  */.  rc = pro
14cd0 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26 64  cess_sqliterc(&d
14ce0 61 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a  ata,zInitFile);.
14cf0 20 20 69 66 28 20 72 63 3e 30 20 29 7b 0a 20 20    if( rc>0 ){.  
14d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14d10 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65  ..  /* Make a se
14d20 63 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75 67  cond pass throug
14d30 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  h the command-li
14d40 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ne argument and 
14d50 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73  set.  ** options
14d60 2e 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20 70  .  This second p
14d70 61 73 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  ass is delayed u
14d80 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 69  ntil after the i
14d90 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
14da0 2a 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63 65  ** file is proce
14db0 73 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ssed so that the
14dc0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
14dd0 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65  guments will ove
14de0 72 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74 69  rride.  ** setti
14df0 6e 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ngs in the initi
14e00 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a  alization file..
14e10 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
14e20 69 3c 61 72 67 63 20 26 26 20 61 72 67 76 5b 69  i<argc && argv[i
14e30 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b  ][0]=='-'; i++){
14e40 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
14e50 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rgv[i];.    if( 
14e60 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b  z[1]=='-' ){ z++
14e70 3b 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63  ; }.    if( strc
14e80 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30  mp(z,"-init")==0
14e90 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
14ea0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
14eb0 63 6d 70 28 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d  cmp(z,"-html")==
14ec0 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
14ed0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c  mode = MODE_Html
14ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14ef0 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 73 74 22  strcmp(z,"-list"
14f00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
14f10 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
14f20 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ist;.    }else i
14f30 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69  f( strcmp(z,"-li
14f40 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ne")==0 ){.     
14f50 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
14f60 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73  E_Line;.    }els
14f70 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
14f80 2d 63 6f 6c 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a  -column")==0 ){.
14f90 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
14fa0 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
14fb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
14fc0 63 6d 70 28 7a 2c 22 2d 63 73 76 22 29 3d 3d 30  cmp(z,"-csv")==0
14fd0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
14fe0 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
14ff0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64 61 74        memcpy(dat
15000 61 2e 73 65 70 61 72 61 74 6f 72 2c 22 2c 22 2c  a.separator,",",
15010 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  2);.    }else if
15020 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70  ( strcmp(z,"-sep
15030 61 72 61 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  arator")==0 ){. 
15040 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
15050 69 66 28 69 3e 3d 61 72 67 63 29 7b 0a 20 20 20  if(i>=argc){.   
15060 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
15070 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20  err,"%s: Error: 
15080 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
15090 20 66 6f 72 20 6f 70 74 69 6f 6e 3a 20 25 73 5c   for option: %s\
150a0 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b 0a 20  n", Argv0, z);. 
150b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
150c0 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
150d0 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
150e0 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
150f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
15120 7a 65 6f 66 28 64 61 74 61 2e 73 65 70 61 72 61  zeof(data.separa
15130 74 6f 72 29 2c 20 64 61 74 61 2e 73 65 70 61 72  tor), data.separ
15140 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ator,.          
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
15160 2a 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28  *s",(int)sizeof(
15170 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72 29 2d  data.separator)-
15180 31 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  1,argv[i]);.    
15190 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
151a0 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29  (z,"-nullvalue")
151b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
151c0 3b 0a 20 20 20 20 20 20 69 66 28 69 3e 3d 61 72  ;.      if(i>=ar
151d0 67 63 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  gc){.        fpr
151e0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
151f0 20 45 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20   Error: missing 
15200 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  argument for opt
15210 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76  ion: %s\n", Argv
15220 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66  0, z);.        f
15230 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
15240 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c  se -help for a l
15250 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c  ist of options.\
15260 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
15270 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
15280 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
15290 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74  rintf(sizeof(dat
152a0 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2c 20 64 61  a.nullvalue), da
152b0 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20 20  ta.nullvalue,.  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 22 25 2e 2a 73 22 2c 28 69 6e 74       "%.*s",(int
152e0 29 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e 75 6c  )sizeof(data.nul
152f0 6c 76 61 6c 75 65 29 2d 31 2c 61 72 67 76 5b 69  lvalue)-1,argv[i
15300 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
15310 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61  ( strcmp(z,"-hea
15320 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  der")==0 ){.    
15330 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
15340 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 1;.    }else
15350 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
15360 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b  noheader")==0 ){
15370 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77  .      data.show
15380 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
15390 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
153a0 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d 30 20 29  (z,"-echo")==0 )
153b0 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 65 63 68  {.      data.ech
153c0 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  oOn = 1;.    }el
153d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
153e0 22 2d 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a  "-stats")==0 ){.
153f0 20 20 20 20 20 20 64 61 74 61 2e 73 74 61 74 73        data.stats
15400 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  On = 1;.    }els
15410 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
15420 2d 62 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -bail")==0 ){.  
15430 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f      bail_on_erro
15440 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 1;.    }else
15450 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
15460 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
15470 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
15480 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  \n", sqlite3_lib
15490 76 65 72 73 69 6f 6e 28 29 29 3b 0a 20 20 20 20  version());.    
154a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
154b0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
154c0 28 7a 2c 22 2d 69 6e 74 65 72 61 63 74 69 76 65  (z,"-interactive
154d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
154e0 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
154f0 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ive = 1;.    }el
15500 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
15510 22 2d 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a  "-batch")==0 ){.
15520 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69        stdin_is_i
15530 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a  nteractive = 0;.
15540 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
15550 72 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d  rcmp(z,"-heap")=
15560 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
15570 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
15580 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22 29 3d  trcmp(z,"-vfs")=
15590 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
155a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
155b0 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61  trcmp(z,"-vfstra
155c0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
155d0 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   i++;.    }else 
155e0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
155f0 65 6c 70 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  elp")==0 || strc
15600 6d 70 28 7a 2c 20 22 2d 2d 68 65 6c 70 22 29 3d  mp(z, "--help")=
15610 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67  =0 ){.      usag
15620 65 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(1);.    }else{
15630 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
15640 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72  tderr,"%s: Error
15650 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e  : unknown option
15660 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20  : %s\n", Argv0, 
15670 7a 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  z);.      fprint
15680 66 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d 68  f(stderr,"Use -h
15690 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20 6f  elp for a list o
156a0 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a  f options.\n");.
156b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
156c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
156d0 20 7a 46 69 72 73 74 43 6d 64 20 29 7b 0a 20 20   zFirstCmd ){.  
156e0 20 20 2f 2a 20 52 75 6e 20 6a 75 73 74 20 74 68    /* Run just th
156f0 65 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66  e command that f
15700 6f 6c 6c 6f 77 73 20 74 68 65 20 64 61 74 61 62  ollows the datab
15710 61 73 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a  ase name.    */.
15720 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d      if( zFirstCm
15730 64 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  d[0]=='.' ){.   
15740 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f     rc = do_meta_
15750 63 6f 6d 6d 61 6e 64 28 7a 46 69 72 73 74 43 6d  command(zFirstCm
15760 64 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20 7d  d, &data);.    }
15770 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 65 6e  else{.      open
15780 5f 64 62 28 26 64 61 74 61 29 3b 0a 20 20 20 20  _db(&data);.    
15790 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
157a0 63 28 64 61 74 61 2e 64 62 2c 20 7a 46 69 72 73  c(data.db, zFirs
157b0 74 43 6d 64 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  tCmd, shell_call
157c0 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
157d0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
157e0 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
157f0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15800 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
15810 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
15820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15830 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b 0a 20  c!=0 ? rc : 1;. 
15840 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
15850 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
15860 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
15870 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f  Error: unable to
15880 20 70 72 6f 63 65 73 73 20 53 51 4c 20 5c 22 25   process SQL \"%
15890 73 5c 22 5c 6e 22 2c 20 7a 46 69 72 73 74 43 6d  s\"\n", zFirstCm
158a0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
158b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
158c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
158d0 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d 61 6e 64    /* Run command
158e0 73 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20  s received from 
158f0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 0a 20  standard input. 
15900 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
15910 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
15920 76 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ve ){.      char
15930 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20 20 63   *zHome;.      c
15940 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20 3d 20  har *zHistory = 
15950 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  0;.      int nHi
15960 73 74 6f 72 79 3b 0a 20 20 20 20 20 20 70 72 69  story;.      pri
15970 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 51  ntf(.        "SQ
15980 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 25 73 5c  Lite version %s\
15990 6e 22 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65  n".        "Ente
159a0 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20  r \".help\" for 
159b0 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 0a  instructions\n".
159c0 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20 53          "Enter S
159d0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65  QL statements te
159e0 72 6d 69 6e 61 74 65 64 20 77 69 74 68 20 61 20  rminated with a 
159f0 5c 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  \";\"\n",.      
15a00 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72    sqlite3_libver
15a10 73 69 6f 6e 28 29 0a 20 20 20 20 20 20 29 3b 0a  sion().      );.
15a20 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 69        zHome = fi
15a30 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20  nd_home_dir();. 
15a40 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20 29       if( zHome )
15a50 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74 6f  {.        nHisto
15a60 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 48  ry = strlen30(zH
15a70 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20 20  ome) + 20;.     
15a80 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72 79     if( (zHistory
15a90 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74 6f   = malloc(nHisto
15aa0 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ry))!=0 ){.     
15ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
15ac0 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c 20  rintf(nHistory, 
15ad0 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73 71  zHistory,"%s/.sq
15ae0 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20 7a  lite_history", z
15af0 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Home);.        }
15b00 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65 66  .      }.#if def
15b10 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49  ined(HAVE_READLI
15b20 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45 41 44  NE) && HAVE_READ
15b30 4c 49 4e 45 3d 3d 31 0a 20 20 20 20 20 20 69 66  LINE==1.      if
15b40 28 20 7a 48 69 73 74 6f 72 79 20 29 20 72 65 61  ( zHistory ) rea
15b50 64 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f  d_history(zHisto
15b60 72 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ry);.#endif.    
15b70 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
15b80 6e 70 75 74 28 26 64 61 74 61 2c 20 30 29 3b 0a  nput(&data, 0);.
15b90 20 20 20 20 20 20 69 66 28 20 7a 48 69 73 74 6f        if( zHisto
15ba0 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ry ){.        st
15bb0 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 31 30 30  ifle_history(100
15bc0 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
15bd0 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72  _history(zHistor
15be0 79 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  y);.        free
15bf0 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  (zHistory);.    
15c00 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 7a    }.      free(z
15c10 48 6f 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Home);.    }else
15c20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
15c30 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61  cess_input(&data
15c40 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d 0a  , stdin);.    }.
15c50 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65 5f    }.  set_table_
15c60 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b 0a  name(&data, 0);.
15c70 20 20 69 66 28 20 64 61 74 61 2e 64 62 20 29 7b    if( data.db ){
15c80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
15c90 73 65 28 64 61 74 61 2e 64 62 29 3b 0a 20 20 7d  se(data.db);.  }
15ca0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.