xref: /sqlite-3.40.0/src/shell.c.in (revision 412a59f5)
1/*
2** 2001 September 15
3**
4** The author disclaims copyright to this source code.  In place of
5** a legal notice, here is a blessing:
6**
7**    May you do good and not evil.
8**    May you find forgiveness for yourself and forgive others.
9**    May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
14*/
15#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
20/*
21** Optionally #include a user-defined header, whereby compilation options
22** may be set prior to where they take effect, but after platform setup.
23** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
24** file. Note that this macro has a like effect on sqlite3.c compilation.
25*/
26#ifdef SQLITE_CUSTOM_INCLUDE
27# define INC_STRINGIFY_(f) #f
28# define INC_STRINGIFY(f) INC_STRINGIFY_(f)
29# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
30#endif
31
32/*
33** Determine if we are dealing with WinRT, which provides only a subset of
34** the full Win32 API.
35*/
36#if !defined(SQLITE_OS_WINRT)
37# define SQLITE_OS_WINRT 0
38#endif
39
40/*
41** Warning pragmas copied from msvc.h in the core.
42*/
43#if defined(_MSC_VER)
44#pragma warning(disable : 4054)
45#pragma warning(disable : 4055)
46#pragma warning(disable : 4100)
47#pragma warning(disable : 4127)
48#pragma warning(disable : 4130)
49#pragma warning(disable : 4152)
50#pragma warning(disable : 4189)
51#pragma warning(disable : 4206)
52#pragma warning(disable : 4210)
53#pragma warning(disable : 4232)
54#pragma warning(disable : 4244)
55#pragma warning(disable : 4305)
56#pragma warning(disable : 4306)
57#pragma warning(disable : 4702)
58#pragma warning(disable : 4706)
59#endif /* defined(_MSC_VER) */
60
61/*
62** No support for loadable extensions in VxWorks.
63*/
64#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
65# define SQLITE_OMIT_LOAD_EXTENSION 1
66#endif
67
68/*
69** Enable large-file support for fopen() and friends on unix.
70*/
71#ifndef SQLITE_DISABLE_LFS
72# define _LARGE_FILE       1
73# ifndef _FILE_OFFSET_BITS
74#   define _FILE_OFFSET_BITS 64
75# endif
76# define _LARGEFILE_SOURCE 1
77#endif
78
79#include <stdlib.h>
80#include <string.h>
81#include <stdio.h>
82#include <assert.h>
83#include "sqlite3.h"
84typedef sqlite3_int64 i64;
85typedef sqlite3_uint64 u64;
86typedef unsigned char u8;
87#if SQLITE_USER_AUTHENTICATION
88# include "sqlite3userauth.h"
89#endif
90#include <ctype.h>
91#include <stdarg.h>
92
93#if !defined(_WIN32) && !defined(WIN32)
94# include <signal.h>
95# if !defined(__RTP__) && !defined(_WRS_KERNEL)
96#  include <pwd.h>
97# endif
98#endif
99#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
100# include <unistd.h>
101# include <dirent.h>
102# define GETPID getpid
103# if defined(__MINGW32__)
104#  define DIRENT dirent
105#  ifndef S_ISLNK
106#   define S_ISLNK(mode) (0)
107#  endif
108# endif
109#else
110# define GETPID (int)GetCurrentProcessId
111#endif
112#include <sys/types.h>
113#include <sys/stat.h>
114
115#if HAVE_READLINE
116# include <readline/readline.h>
117# include <readline/history.h>
118#endif
119
120#if HAVE_EDITLINE
121# include <editline/readline.h>
122#endif
123
124#if HAVE_EDITLINE || HAVE_READLINE
125
126# define shell_add_history(X) add_history(X)
127# define shell_read_history(X) read_history(X)
128# define shell_write_history(X) write_history(X)
129# define shell_stifle_history(X) stifle_history(X)
130# define shell_readline(X) readline(X)
131
132#elif HAVE_LINENOISE
133
134# include "linenoise.h"
135# define shell_add_history(X) linenoiseHistoryAdd(X)
136# define shell_read_history(X) linenoiseHistoryLoad(X)
137# define shell_write_history(X) linenoiseHistorySave(X)
138# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
139# define shell_readline(X) linenoise(X)
140
141#else
142
143# define shell_read_history(X)
144# define shell_write_history(X)
145# define shell_stifle_history(X)
146
147# define SHELL_USE_LOCAL_GETLINE 1
148#endif
149
150
151#if defined(_WIN32) || defined(WIN32)
152# if SQLITE_OS_WINRT
153#  define SQLITE_OMIT_POPEN 1
154# else
155#  include <io.h>
156#  include <fcntl.h>
157#  define isatty(h) _isatty(h)
158#  ifndef access
159#   define access(f,m) _access((f),(m))
160#  endif
161#  ifndef unlink
162#   define unlink _unlink
163#  endif
164#  ifndef strdup
165#   define strdup _strdup
166#  endif
167#  undef popen
168#  define popen _popen
169#  undef pclose
170#  define pclose _pclose
171# endif
172#else
173 /* Make sure isatty() has a prototype. */
174 extern int isatty(int);
175
176# if !defined(__RTP__) && !defined(_WRS_KERNEL)
177  /* popen and pclose are not C89 functions and so are
178  ** sometimes omitted from the <stdio.h> header */
179   extern FILE *popen(const char*,const char*);
180   extern int pclose(FILE*);
181# else
182#  define SQLITE_OMIT_POPEN 1
183# endif
184#endif
185
186#if defined(_WIN32_WCE)
187/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
188 * thus we always assume that we have a console. That can be
189 * overridden with the -batch command line option.
190 */
191#define isatty(x) 1
192#endif
193
194/* ctype macros that work with signed characters */
195#define IsSpace(X)  isspace((unsigned char)X)
196#define IsDigit(X)  isdigit((unsigned char)X)
197#define ToLower(X)  (char)tolower((unsigned char)X)
198
199#if defined(_WIN32) || defined(WIN32)
200#if SQLITE_OS_WINRT
201#include <intrin.h>
202#endif
203#include <windows.h>
204
205/* string conversion routines only needed on Win32 */
206extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
207extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
208extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
209extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
210#endif
211
212/* On Windows, we normally run with output mode of TEXT so that \n characters
213** are automatically translated into \r\n.  However, this behavior needs
214** to be disabled in some cases (ex: when generating CSV output and when
215** rendering quoted strings that contain \n characters).  The following
216** routines take care of that.
217*/
218#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
219static void setBinaryMode(FILE *file, int isOutput){
220  if( isOutput ) fflush(file);
221  _setmode(_fileno(file), _O_BINARY);
222}
223static void setTextMode(FILE *file, int isOutput){
224  if( isOutput ) fflush(file);
225  _setmode(_fileno(file), _O_TEXT);
226}
227#else
228# define setBinaryMode(X,Y)
229# define setTextMode(X,Y)
230#endif
231
232
233/* True if the timer is enabled */
234static int enableTimer = 0;
235
236/* Return the current wall-clock time */
237static sqlite3_int64 timeOfDay(void){
238  static sqlite3_vfs *clockVfs = 0;
239  sqlite3_int64 t;
240  if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
241  if( clockVfs==0 ) return 0;  /* Never actually happens */
242  if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
243    clockVfs->xCurrentTimeInt64(clockVfs, &t);
244  }else{
245    double r;
246    clockVfs->xCurrentTime(clockVfs, &r);
247    t = (sqlite3_int64)(r*86400000.0);
248  }
249  return t;
250}
251
252#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
253#include <sys/time.h>
254#include <sys/resource.h>
255
256/* VxWorks does not support getrusage() as far as we can determine */
257#if defined(_WRS_KERNEL) || defined(__RTP__)
258struct rusage {
259  struct timeval ru_utime; /* user CPU time used */
260  struct timeval ru_stime; /* system CPU time used */
261};
262#define getrusage(A,B) memset(B,0,sizeof(*B))
263#endif
264
265/* Saved resource information for the beginning of an operation */
266static struct rusage sBegin;  /* CPU time at start */
267static sqlite3_int64 iBegin;  /* Wall-clock time at start */
268
269/*
270** Begin timing an operation
271*/
272static void beginTimer(void){
273  if( enableTimer ){
274    getrusage(RUSAGE_SELF, &sBegin);
275    iBegin = timeOfDay();
276  }
277}
278
279/* Return the difference of two time_structs in seconds */
280static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
281  return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
282         (double)(pEnd->tv_sec - pStart->tv_sec);
283}
284
285/*
286** Print the timing results.
287*/
288static void endTimer(void){
289  if( enableTimer ){
290    sqlite3_int64 iEnd = timeOfDay();
291    struct rusage sEnd;
292    getrusage(RUSAGE_SELF, &sEnd);
293    printf("Run Time: real %.3f user %f sys %f\n",
294       (iEnd - iBegin)*0.001,
295       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
296       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
297  }
298}
299
300#define BEGIN_TIMER beginTimer()
301#define END_TIMER endTimer()
302#define HAS_TIMER 1
303
304#elif (defined(_WIN32) || defined(WIN32))
305
306/* Saved resource information for the beginning of an operation */
307static HANDLE hProcess;
308static FILETIME ftKernelBegin;
309static FILETIME ftUserBegin;
310static sqlite3_int64 ftWallBegin;
311typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
312                                    LPFILETIME, LPFILETIME);
313static GETPROCTIMES getProcessTimesAddr = NULL;
314
315/*
316** Check to see if we have timer support.  Return 1 if necessary
317** support found (or found previously).
318*/
319static int hasTimer(void){
320  if( getProcessTimesAddr ){
321    return 1;
322  } else {
323#if !SQLITE_OS_WINRT
324    /* GetProcessTimes() isn't supported in WIN95 and some other Windows
325    ** versions. See if the version we are running on has it, and if it
326    ** does, save off a pointer to it and the current process handle.
327    */
328    hProcess = GetCurrentProcess();
329    if( hProcess ){
330      HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
331      if( NULL != hinstLib ){
332        getProcessTimesAddr =
333            (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
334        if( NULL != getProcessTimesAddr ){
335          return 1;
336        }
337        FreeLibrary(hinstLib);
338      }
339    }
340#endif
341  }
342  return 0;
343}
344
345/*
346** Begin timing an operation
347*/
348static void beginTimer(void){
349  if( enableTimer && getProcessTimesAddr ){
350    FILETIME ftCreation, ftExit;
351    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
352                        &ftKernelBegin,&ftUserBegin);
353    ftWallBegin = timeOfDay();
354  }
355}
356
357/* Return the difference of two FILETIME structs in seconds */
358static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
359  sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
360  sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
361  return (double) ((i64End - i64Start) / 10000000.0);
362}
363
364/*
365** Print the timing results.
366*/
367static void endTimer(void){
368  if( enableTimer && getProcessTimesAddr){
369    FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
370    sqlite3_int64 ftWallEnd = timeOfDay();
371    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
372    printf("Run Time: real %.3f user %f sys %f\n",
373       (ftWallEnd - ftWallBegin)*0.001,
374       timeDiff(&ftUserBegin, &ftUserEnd),
375       timeDiff(&ftKernelBegin, &ftKernelEnd));
376  }
377}
378
379#define BEGIN_TIMER beginTimer()
380#define END_TIMER endTimer()
381#define HAS_TIMER hasTimer()
382
383#else
384#define BEGIN_TIMER
385#define END_TIMER
386#define HAS_TIMER 0
387#endif
388
389/*
390** Used to prevent warnings about unused parameters
391*/
392#define UNUSED_PARAMETER(x) (void)(x)
393
394/*
395** Number of elements in an array
396*/
397#define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
398
399/*
400** If the following flag is set, then command execution stops
401** at an error if we are not interactive.
402*/
403static int bail_on_error = 0;
404
405/*
406** Threat stdin as an interactive input if the following variable
407** is true.  Otherwise, assume stdin is connected to a file or pipe.
408*/
409static int stdin_is_interactive = 1;
410
411/*
412** On Windows systems we have to know if standard output is a console
413** in order to translate UTF-8 into MBCS.  The following variable is
414** true if translation is required.
415*/
416static int stdout_is_console = 1;
417
418/*
419** The following is the open SQLite database.  We make a pointer
420** to this database a static variable so that it can be accessed
421** by the SIGINT handler to interrupt database processing.
422*/
423static sqlite3 *globalDb = 0;
424
425/*
426** True if an interrupt (Control-C) has been received.
427*/
428static volatile int seenInterrupt = 0;
429
430/*
431** This is the name of our program. It is set in main(), used
432** in a number of other places, mostly for error messages.
433*/
434static char *Argv0;
435
436/*
437** Prompt strings. Initialized in main. Settable with
438**   .prompt main continue
439*/
440static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
441static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
442
443/*
444** Render output like fprintf().  Except, if the output is going to the
445** console and if this is running on a Windows machine, translate the
446** output from UTF-8 into MBCS.
447*/
448#if defined(_WIN32) || defined(WIN32)
449void utf8_printf(FILE *out, const char *zFormat, ...){
450  va_list ap;
451  va_start(ap, zFormat);
452  if( stdout_is_console && (out==stdout || out==stderr) ){
453    char *z1 = sqlite3_vmprintf(zFormat, ap);
454    char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
455    sqlite3_free(z1);
456    fputs(z2, out);
457    sqlite3_free(z2);
458  }else{
459    vfprintf(out, zFormat, ap);
460  }
461  va_end(ap);
462}
463#elif !defined(utf8_printf)
464# define utf8_printf fprintf
465#endif
466
467/*
468** Render output like fprintf().  This should not be used on anything that
469** includes string formatting (e.g. "%s").
470*/
471#if !defined(raw_printf)
472# define raw_printf fprintf
473#endif
474
475/* Indicate out-of-memory and exit. */
476static void shell_out_of_memory(void){
477  raw_printf(stderr,"Error: out of memory\n");
478  exit(1);
479}
480
481/* Check a pointer to see if it is NULL.  If it is NULL, exit with an
482** out-of-memory error.
483*/
484static void shell_check_oom(void *p){
485  if( p==0 ) shell_out_of_memory();
486}
487
488/*
489** Write I/O traces to the following stream.
490*/
491#ifdef SQLITE_ENABLE_IOTRACE
492static FILE *iotrace = 0;
493#endif
494
495/*
496** This routine works like printf in that its first argument is a
497** format string and subsequent arguments are values to be substituted
498** in place of % fields.  The result of formatting this string
499** is written to iotrace.
500*/
501#ifdef SQLITE_ENABLE_IOTRACE
502static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
503  va_list ap;
504  char *z;
505  if( iotrace==0 ) return;
506  va_start(ap, zFormat);
507  z = sqlite3_vmprintf(zFormat, ap);
508  va_end(ap);
509  utf8_printf(iotrace, "%s", z);
510  sqlite3_free(z);
511}
512#endif
513
514/*
515** Output string zUtf to stream pOut as w characters.  If w is negative,
516** then right-justify the text.  W is the width in UTF-8 characters, not
517** in bytes.  This is different from the %*.*s specification in printf
518** since with %*.*s the width is measured in bytes, not characters.
519*/
520static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
521  int i;
522  int n;
523  int aw = w<0 ? -w : w;
524  for(i=n=0; zUtf[i]; i++){
525    if( (zUtf[i]&0xc0)!=0x80 ){
526      n++;
527      if( n==aw ){
528        do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
529        break;
530      }
531    }
532  }
533  if( n>=aw ){
534    utf8_printf(pOut, "%.*s", i, zUtf);
535  }else if( w<0 ){
536    utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
537  }else{
538    utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
539  }
540}
541
542
543/*
544** Determines if a string is a number of not.
545*/
546static int isNumber(const char *z, int *realnum){
547  if( *z=='-' || *z=='+' ) z++;
548  if( !IsDigit(*z) ){
549    return 0;
550  }
551  z++;
552  if( realnum ) *realnum = 0;
553  while( IsDigit(*z) ){ z++; }
554  if( *z=='.' ){
555    z++;
556    if( !IsDigit(*z) ) return 0;
557    while( IsDigit(*z) ){ z++; }
558    if( realnum ) *realnum = 1;
559  }
560  if( *z=='e' || *z=='E' ){
561    z++;
562    if( *z=='+' || *z=='-' ) z++;
563    if( !IsDigit(*z) ) return 0;
564    while( IsDigit(*z) ){ z++; }
565    if( realnum ) *realnum = 1;
566  }
567  return *z==0;
568}
569
570/*
571** Compute a string length that is limited to what can be stored in
572** lower 30 bits of a 32-bit signed integer.
573*/
574static int strlen30(const char *z){
575  const char *z2 = z;
576  while( *z2 ){ z2++; }
577  return 0x3fffffff & (int)(z2 - z);
578}
579
580/*
581** Return the length of a string in characters.  Multibyte UTF8 characters
582** count as a single character.
583*/
584static int strlenChar(const char *z){
585  int n = 0;
586  while( *z ){
587    if( (0xc0&*(z++))!=0x80 ) n++;
588  }
589  return n;
590}
591
592/*
593** Return open FILE * if zFile exists, can be opened for read
594** and is an ordinary file or a character stream source.
595** Otherwise return 0.
596*/
597static FILE * openChrSource(const char *zFile){
598#ifdef _WIN32
599  struct _stat x = {0};
600# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
601  /* On Windows, open first, then check the stream nature. This order
602  ** is necessary because _stat() and sibs, when checking a named pipe,
603  ** effectively break the pipe as its supplier sees it. */
604  FILE *rv = fopen(zFile, "rb");
605  if( rv==0 ) return 0;
606  if( _fstat(_fileno(rv), &x) != 0
607      || !STAT_CHR_SRC(x.st_mode)){
608    fclose(rv);
609    rv = 0;
610  }
611  return rv;
612#else
613  struct stat x = {0};
614  int rc = stat(zFile, &x);
615# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
616  if( rc!=0 ) return 0;
617  if( STAT_CHR_SRC(x.st_mode) ){
618    return fopen(zFile, "rb");
619  }else{
620    return 0;
621  }
622#endif
623#undef STAT_CHR_SRC
624}
625
626/*
627** This routine reads a line of text from FILE in, stores
628** the text in memory obtained from malloc() and returns a pointer
629** to the text.  NULL is returned at end of file, or if malloc()
630** fails.
631**
632** If zLine is not NULL then it is a malloced buffer returned from
633** a previous call to this routine that may be reused.
634*/
635static char *local_getline(char *zLine, FILE *in){
636  int nLine = zLine==0 ? 0 : 100;
637  int n = 0;
638
639  while( 1 ){
640    if( n+100>nLine ){
641      nLine = nLine*2 + 100;
642      zLine = realloc(zLine, nLine);
643      shell_check_oom(zLine);
644    }
645    if( fgets(&zLine[n], nLine - n, in)==0 ){
646      if( n==0 ){
647        free(zLine);
648        return 0;
649      }
650      zLine[n] = 0;
651      break;
652    }
653    while( zLine[n] ) n++;
654    if( n>0 && zLine[n-1]=='\n' ){
655      n--;
656      if( n>0 && zLine[n-1]=='\r' ) n--;
657      zLine[n] = 0;
658      break;
659    }
660  }
661#if defined(_WIN32) || defined(WIN32)
662  /* For interactive input on Windows systems, translate the
663  ** multi-byte characterset characters into UTF-8. */
664  if( stdin_is_interactive && in==stdin ){
665    char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
666    if( zTrans ){
667      int nTrans = strlen30(zTrans)+1;
668      if( nTrans>nLine ){
669        zLine = realloc(zLine, nTrans);
670        shell_check_oom(zLine);
671      }
672      memcpy(zLine, zTrans, nTrans);
673      sqlite3_free(zTrans);
674    }
675  }
676#endif /* defined(_WIN32) || defined(WIN32) */
677  return zLine;
678}
679
680/*
681** Retrieve a single line of input text.
682**
683** If in==0 then read from standard input and prompt before each line.
684** If isContinuation is true, then a continuation prompt is appropriate.
685** If isContinuation is zero, then the main prompt should be used.
686**
687** If zPrior is not NULL then it is a buffer from a prior call to this
688** routine that can be reused.
689**
690** The result is stored in space obtained from malloc() and must either
691** be freed by the caller or else passed back into this routine via the
692** zPrior argument for reuse.
693*/
694static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
695  char *zPrompt;
696  char *zResult;
697  if( in!=0 ){
698    zResult = local_getline(zPrior, in);
699  }else{
700    zPrompt = isContinuation ? continuePrompt : mainPrompt;
701#if SHELL_USE_LOCAL_GETLINE
702    printf("%s", zPrompt);
703    fflush(stdout);
704    zResult = local_getline(zPrior, stdin);
705#else
706    free(zPrior);
707    zResult = shell_readline(zPrompt);
708    if( zResult && *zResult ) shell_add_history(zResult);
709#endif
710  }
711  return zResult;
712}
713
714
715/*
716** Return the value of a hexadecimal digit.  Return -1 if the input
717** is not a hex digit.
718*/
719static int hexDigitValue(char c){
720  if( c>='0' && c<='9' ) return c - '0';
721  if( c>='a' && c<='f' ) return c - 'a' + 10;
722  if( c>='A' && c<='F' ) return c - 'A' + 10;
723  return -1;
724}
725
726/*
727** Interpret zArg as an integer value, possibly with suffixes.
728*/
729static sqlite3_int64 integerValue(const char *zArg){
730  sqlite3_int64 v = 0;
731  static const struct { char *zSuffix; int iMult; } aMult[] = {
732    { "KiB", 1024 },
733    { "MiB", 1024*1024 },
734    { "GiB", 1024*1024*1024 },
735    { "KB",  1000 },
736    { "MB",  1000000 },
737    { "GB",  1000000000 },
738    { "K",   1000 },
739    { "M",   1000000 },
740    { "G",   1000000000 },
741  };
742  int i;
743  int isNeg = 0;
744  if( zArg[0]=='-' ){
745    isNeg = 1;
746    zArg++;
747  }else if( zArg[0]=='+' ){
748    zArg++;
749  }
750  if( zArg[0]=='0' && zArg[1]=='x' ){
751    int x;
752    zArg += 2;
753    while( (x = hexDigitValue(zArg[0]))>=0 ){
754      v = (v<<4) + x;
755      zArg++;
756    }
757  }else{
758    while( IsDigit(zArg[0]) ){
759      v = v*10 + zArg[0] - '0';
760      zArg++;
761    }
762  }
763  for(i=0; i<ArraySize(aMult); i++){
764    if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
765      v *= aMult[i].iMult;
766      break;
767    }
768  }
769  return isNeg? -v : v;
770}
771
772/*
773** A variable length string to which one can append text.
774*/
775typedef struct ShellText ShellText;
776struct ShellText {
777  char *z;
778  int n;
779  int nAlloc;
780};
781
782/*
783** Initialize and destroy a ShellText object
784*/
785static void initText(ShellText *p){
786  memset(p, 0, sizeof(*p));
787}
788static void freeText(ShellText *p){
789  free(p->z);
790  initText(p);
791}
792
793/* zIn is either a pointer to a NULL-terminated string in memory obtained
794** from malloc(), or a NULL pointer. The string pointed to by zAppend is
795** added to zIn, and the result returned in memory obtained from malloc().
796** zIn, if it was not NULL, is freed.
797**
798** If the third argument, quote, is not '\0', then it is used as a
799** quote character for zAppend.
800*/
801static void appendText(ShellText *p, char const *zAppend, char quote){
802  int len;
803  int i;
804  int nAppend = strlen30(zAppend);
805
806  len = nAppend+p->n+1;
807  if( quote ){
808    len += 2;
809    for(i=0; i<nAppend; i++){
810      if( zAppend[i]==quote ) len++;
811    }
812  }
813
814  if( p->z==0 || p->n+len>=p->nAlloc ){
815    p->nAlloc = p->nAlloc*2 + len + 20;
816    p->z = realloc(p->z, p->nAlloc);
817    shell_check_oom(p->z);
818  }
819
820  if( quote ){
821    char *zCsr = p->z+p->n;
822    *zCsr++ = quote;
823    for(i=0; i<nAppend; i++){
824      *zCsr++ = zAppend[i];
825      if( zAppend[i]==quote ) *zCsr++ = quote;
826    }
827    *zCsr++ = quote;
828    p->n = (int)(zCsr - p->z);
829    *zCsr = '\0';
830  }else{
831    memcpy(p->z+p->n, zAppend, nAppend);
832    p->n += nAppend;
833    p->z[p->n] = '\0';
834  }
835}
836
837/*
838** Attempt to determine if identifier zName needs to be quoted, either
839** because it contains non-alphanumeric characters, or because it is an
840** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
841** that quoting is required.
842**
843** Return '"' if quoting is required.  Return 0 if no quoting is required.
844*/
845static char quoteChar(const char *zName){
846  int i;
847  if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
848  for(i=0; zName[i]; i++){
849    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
850  }
851  return sqlite3_keyword_check(zName, i) ? '"' : 0;
852}
853
854/*
855** Construct a fake object name and column list to describe the structure
856** of the view, virtual table, or table valued function zSchema.zName.
857*/
858static char *shellFakeSchema(
859  sqlite3 *db,            /* The database connection containing the vtab */
860  const char *zSchema,    /* Schema of the database holding the vtab */
861  const char *zName       /* The name of the virtual table */
862){
863  sqlite3_stmt *pStmt = 0;
864  char *zSql;
865  ShellText s;
866  char cQuote;
867  char *zDiv = "(";
868  int nRow = 0;
869
870  zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
871                         zSchema ? zSchema : "main", zName);
872  shell_check_oom(zSql);
873  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
874  sqlite3_free(zSql);
875  initText(&s);
876  if( zSchema ){
877    cQuote = quoteChar(zSchema);
878    if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
879    appendText(&s, zSchema, cQuote);
880    appendText(&s, ".", 0);
881  }
882  cQuote = quoteChar(zName);
883  appendText(&s, zName, cQuote);
884  while( sqlite3_step(pStmt)==SQLITE_ROW ){
885    const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
886    nRow++;
887    appendText(&s, zDiv, 0);
888    zDiv = ",";
889    if( zCol==0 ) zCol = "";
890    cQuote = quoteChar(zCol);
891    appendText(&s, zCol, cQuote);
892  }
893  appendText(&s, ")", 0);
894  sqlite3_finalize(pStmt);
895  if( nRow==0 ){
896    freeText(&s);
897    s.z = 0;
898  }
899  return s.z;
900}
901
902/*
903** SQL function:  shell_module_schema(X)
904**
905** Return a fake schema for the table-valued function or eponymous virtual
906** table X.
907*/
908static void shellModuleSchema(
909  sqlite3_context *pCtx,
910  int nVal,
911  sqlite3_value **apVal
912){
913  const char *zName;
914  char *zFake;
915  UNUSED_PARAMETER(nVal);
916  zName = (const char*)sqlite3_value_text(apVal[0]);
917  zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
918  if( zFake ){
919    sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
920                        -1, sqlite3_free);
921    free(zFake);
922  }
923}
924
925/*
926** SQL function:  shell_add_schema(S,X)
927**
928** Add the schema name X to the CREATE statement in S and return the result.
929** Examples:
930**
931**    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
932**
933** Also works on
934**
935**    CREATE INDEX
936**    CREATE UNIQUE INDEX
937**    CREATE VIEW
938**    CREATE TRIGGER
939**    CREATE VIRTUAL TABLE
940**
941** This UDF is used by the .schema command to insert the schema name of
942** attached databases into the middle of the sqlite_schema.sql field.
943*/
944static void shellAddSchemaName(
945  sqlite3_context *pCtx,
946  int nVal,
947  sqlite3_value **apVal
948){
949  static const char *aPrefix[] = {
950     "TABLE",
951     "INDEX",
952     "UNIQUE INDEX",
953     "VIEW",
954     "TRIGGER",
955     "VIRTUAL TABLE"
956  };
957  int i = 0;
958  const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
959  const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
960  const char *zName = (const char*)sqlite3_value_text(apVal[2]);
961  sqlite3 *db = sqlite3_context_db_handle(pCtx);
962  UNUSED_PARAMETER(nVal);
963  if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
964    for(i=0; i<ArraySize(aPrefix); i++){
965      int n = strlen30(aPrefix[i]);
966      if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
967        char *z = 0;
968        char *zFake = 0;
969        if( zSchema ){
970          char cQuote = quoteChar(zSchema);
971          if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
972            z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
973          }else{
974            z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
975          }
976        }
977        if( zName
978         && aPrefix[i][0]=='V'
979         && (zFake = shellFakeSchema(db, zSchema, zName))!=0
980        ){
981          if( z==0 ){
982            z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
983          }else{
984            z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
985          }
986          free(zFake);
987        }
988        if( z ){
989          sqlite3_result_text(pCtx, z, -1, sqlite3_free);
990          return;
991        }
992      }
993    }
994  }
995  sqlite3_result_value(pCtx, apVal[0]);
996}
997
998/*
999** The source code for several run-time loadable extensions is inserted
1000** below by the ../tool/mkshellc.tcl script.  Before processing that included
1001** code, we need to override some macros to make the included program code
1002** work here in the middle of this regular program.
1003*/
1004#define SQLITE_EXTENSION_INIT1
1005#define SQLITE_EXTENSION_INIT2(X) (void)(X)
1006
1007#if defined(_WIN32) && defined(_MSC_VER)
1008INCLUDE test_windirent.h
1009INCLUDE test_windirent.c
1010#define dirent DIRENT
1011#endif
1012INCLUDE ../ext/misc/shathree.c
1013INCLUDE ../ext/misc/fileio.c
1014INCLUDE ../ext/misc/completion.c
1015INCLUDE ../ext/misc/appendvfs.c
1016INCLUDE ../ext/misc/memtrace.c
1017INCLUDE ../ext/misc/uint.c
1018INCLUDE ../ext/misc/decimal.c
1019INCLUDE ../ext/misc/ieee754.c
1020INCLUDE ../ext/misc/series.c
1021INCLUDE ../ext/misc/regexp.c
1022#ifdef SQLITE_HAVE_ZLIB
1023INCLUDE ../ext/misc/zipfile.c
1024INCLUDE ../ext/misc/sqlar.c
1025#endif
1026INCLUDE ../ext/expert/sqlite3expert.h
1027INCLUDE ../ext/expert/sqlite3expert.c
1028
1029#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
1030INCLUDE ../ext/misc/dbdata.c
1031#endif
1032
1033#if defined(SQLITE_ENABLE_SESSION)
1034/*
1035** State information for a single open session
1036*/
1037typedef struct OpenSession OpenSession;
1038struct OpenSession {
1039  char *zName;             /* Symbolic name for this session */
1040  int nFilter;             /* Number of xFilter rejection GLOB patterns */
1041  char **azFilter;         /* Array of xFilter rejection GLOB patterns */
1042  sqlite3_session *p;      /* The open session */
1043};
1044#endif
1045
1046typedef struct ExpertInfo ExpertInfo;
1047struct ExpertInfo {
1048  sqlite3expert *pExpert;
1049  int bVerbose;
1050};
1051
1052/* A single line in the EQP output */
1053typedef struct EQPGraphRow EQPGraphRow;
1054struct EQPGraphRow {
1055  int iEqpId;           /* ID for this row */
1056  int iParentId;        /* ID of the parent row */
1057  EQPGraphRow *pNext;   /* Next row in sequence */
1058  char zText[1];        /* Text to display for this row */
1059};
1060
1061/* All EQP output is collected into an instance of the following */
1062typedef struct EQPGraph EQPGraph;
1063struct EQPGraph {
1064  EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
1065  EQPGraphRow *pLast;   /* Last element of the pRow list */
1066  char zPrefix[100];    /* Graph prefix */
1067};
1068
1069/*
1070** State information about the database connection is contained in an
1071** instance of the following structure.
1072*/
1073typedef struct ShellState ShellState;
1074struct ShellState {
1075  sqlite3 *db;           /* The database */
1076  u8 autoExplain;        /* Automatically turn on .explain mode */
1077  u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1078  u8 autoEQPtest;        /* autoEQP is in test mode */
1079  u8 autoEQPtrace;       /* autoEQP is in trace mode */
1080  u8 scanstatsOn;        /* True to display scan stats before each finalize */
1081  u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1082  u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
1083  u8 nEqpLevel;          /* Depth of the EQP output graph */
1084  u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
1085  u8 bSafeMode;          /* True to prohibit unsafe operations */
1086  u8 bSafeModePersist;   /* The long-term value of bSafeMode */
1087  unsigned statsOn;      /* True to display memory stats before each finalize */
1088  unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
1089  int outCount;          /* Revert to stdout when reaching zero */
1090  int cnt;               /* Number of records displayed so far */
1091  int lineno;            /* Line number of last line read from in */
1092  int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
1093  FILE *in;              /* Read commands from this stream */
1094  FILE *out;             /* Write results here */
1095  FILE *traceOut;        /* Output for sqlite3_trace() */
1096  int nErr;              /* Number of errors seen */
1097  int mode;              /* An output mode setting */
1098  int modePrior;         /* Saved mode */
1099  int cMode;             /* temporary output mode for the current query */
1100  int normalMode;        /* Output mode before ".explain on" */
1101  int writableSchema;    /* True if PRAGMA writable_schema=ON */
1102  int showHeader;        /* True to show column names in List or Column mode */
1103  int nCheck;            /* Number of ".check" commands run */
1104  unsigned nProgress;    /* Number of progress callbacks encountered */
1105  unsigned mxProgress;   /* Maximum progress callbacks before failing */
1106  unsigned flgProgress;  /* Flags for the progress callback */
1107  unsigned shellFlgs;    /* Various flags */
1108  unsigned priorShFlgs;  /* Saved copy of flags */
1109  sqlite3_int64 szMax;   /* --maxsize argument to .open */
1110  char *zDestTable;      /* Name of destination table when MODE_Insert */
1111  char *zTempFile;       /* Temporary file that might need deleting */
1112  char zTestcase[30];    /* Name of current test case */
1113  char colSeparator[20]; /* Column separator character for several modes */
1114  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1115  char colSepPrior[20];  /* Saved column separator */
1116  char rowSepPrior[20];  /* Saved row separator */
1117  int *colWidth;         /* Requested width of each column in columnar modes */
1118  int *actualWidth;      /* Actual width of each column */
1119  int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
1120  char nullValue[20];    /* The text to print when a NULL comes back from
1121                         ** the database */
1122  char outfile[FILENAME_MAX]; /* Filename for *out */
1123  sqlite3_stmt *pStmt;   /* Current statement if any. */
1124  FILE *pLog;            /* Write log output here */
1125  struct AuxDb {         /* Storage space for auxiliary database connections */
1126    sqlite3 *db;               /* Connection pointer */
1127    const char *zDbFilename;   /* Filename used to open the connection */
1128    char *zFreeOnClose;        /* Free this memory allocation on close */
1129#if defined(SQLITE_ENABLE_SESSION)
1130    int nSession;              /* Number of active sessions */
1131    OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
1132#endif
1133  } aAuxDb[5],           /* Array of all database connections */
1134    *pAuxDb;             /* Currently active database connection */
1135  int *aiIndent;         /* Array of indents used in MODE_Explain */
1136  int nIndent;           /* Size of array aiIndent[] */
1137  int iIndent;           /* Index of current op in aiIndent[] */
1138  char *zNonce;          /* Nonce for temporary safe-mode excapes */
1139  EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
1140  ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
1141};
1142
1143
1144/* Allowed values for ShellState.autoEQP
1145*/
1146#define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
1147#define AUTOEQP_on       1           /* Automatic EQP is on */
1148#define AUTOEQP_trigger  2           /* On and also show plans for triggers */
1149#define AUTOEQP_full     3           /* Show full EXPLAIN */
1150
1151/* Allowed values for ShellState.openMode
1152*/
1153#define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
1154#define SHELL_OPEN_NORMAL      1      /* Normal database file */
1155#define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
1156#define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
1157#define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
1158#define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
1159#define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
1160
1161/* Allowed values for ShellState.eTraceType
1162*/
1163#define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
1164#define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
1165#define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
1166
1167/* Bits in the ShellState.flgProgress variable */
1168#define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
1169#define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
1170                                   ** callback limit is reached, and for each
1171                                   ** top-level SQL statement */
1172#define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
1173
1174/*
1175** These are the allowed shellFlgs values
1176*/
1177#define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
1178#define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
1179#define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
1180#define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
1181#define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
1182#define SHFLG_CountChanges   0x00000020 /* .changes setting */
1183#define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
1184#define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
1185#define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
1186#define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
1187
1188/*
1189** Macros for testing and setting shellFlgs
1190*/
1191#define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
1192#define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
1193#define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
1194
1195/*
1196** These are the allowed modes.
1197*/
1198#define MODE_Line     0  /* One column per line.  Blank line between records */
1199#define MODE_Column   1  /* One record per line in neat columns */
1200#define MODE_List     2  /* One record per line with a separator */
1201#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
1202#define MODE_Html     4  /* Generate an XHTML table */
1203#define MODE_Insert   5  /* Generate SQL "insert" statements */
1204#define MODE_Quote    6  /* Quote values as for SQL */
1205#define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
1206#define MODE_Csv      8  /* Quote strings, numbers are plain */
1207#define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
1208#define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
1209#define MODE_Pretty  11  /* Pretty-print schemas */
1210#define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
1211#define MODE_Json    13  /* Output JSON */
1212#define MODE_Markdown 14 /* Markdown formatting */
1213#define MODE_Table   15  /* MySQL-style table formatting */
1214#define MODE_Box     16  /* Unicode box-drawing characters */
1215#define MODE_Count   17  /* Output only a count of the rows of output */
1216#define MODE_Off     18  /* No query output shown */
1217
1218static const char *modeDescr[] = {
1219  "line",
1220  "column",
1221  "list",
1222  "semi",
1223  "html",
1224  "insert",
1225  "quote",
1226  "tcl",
1227  "csv",
1228  "explain",
1229  "ascii",
1230  "prettyprint",
1231  "eqp",
1232  "json",
1233  "markdown",
1234  "table",
1235  "box",
1236  "count",
1237  "off"
1238};
1239
1240/*
1241** These are the column/row/line separators used by the various
1242** import/export modes.
1243*/
1244#define SEP_Column    "|"
1245#define SEP_Row       "\n"
1246#define SEP_Tab       "\t"
1247#define SEP_Space     " "
1248#define SEP_Comma     ","
1249#define SEP_CrLf      "\r\n"
1250#define SEP_Unit      "\x1F"
1251#define SEP_Record    "\x1E"
1252
1253/*
1254** A callback for the sqlite3_log() interface.
1255*/
1256static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1257  ShellState *p = (ShellState*)pArg;
1258  if( p->pLog==0 ) return;
1259  utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1260  fflush(p->pLog);
1261}
1262
1263/*
1264** SQL function:  shell_putsnl(X)
1265**
1266** Write the text X to the screen (or whatever output is being directed)
1267** adding a newline at the end, and then return X.
1268*/
1269static void shellPutsFunc(
1270  sqlite3_context *pCtx,
1271  int nVal,
1272  sqlite3_value **apVal
1273){
1274  ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1275  (void)nVal;
1276  utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1277  sqlite3_result_value(pCtx, apVal[0]);
1278}
1279
1280/*
1281** If in safe mode, print an error message described by the arguments
1282** and exit immediately.
1283*/
1284static void failIfSafeMode(
1285  ShellState *p,
1286  const char *zErrMsg,
1287  ...
1288){
1289  if( p->bSafeMode ){
1290    va_list ap;
1291    char *zMsg;
1292    va_start(ap, zErrMsg);
1293    zMsg = sqlite3_vmprintf(zErrMsg, ap);
1294    va_end(ap);
1295    raw_printf(stderr, "line %d: ", p->lineno);
1296    utf8_printf(stderr, "%s\n", zMsg);
1297    exit(1);
1298  }
1299}
1300
1301/*
1302** SQL function:   edit(VALUE)
1303**                 edit(VALUE,EDITOR)
1304**
1305** These steps:
1306**
1307**     (1) Write VALUE into a temporary file.
1308**     (2) Run program EDITOR on that temporary file.
1309**     (3) Read the temporary file back and return its content as the result.
1310**     (4) Delete the temporary file
1311**
1312** If the EDITOR argument is omitted, use the value in the VISUAL
1313** environment variable.  If still there is no EDITOR, through an error.
1314**
1315** Also throw an error if the EDITOR program returns a non-zero exit code.
1316*/
1317#ifndef SQLITE_NOHAVE_SYSTEM
1318static void editFunc(
1319  sqlite3_context *context,
1320  int argc,
1321  sqlite3_value **argv
1322){
1323  const char *zEditor;
1324  char *zTempFile = 0;
1325  sqlite3 *db;
1326  char *zCmd = 0;
1327  int bBin;
1328  int rc;
1329  int hasCRNL = 0;
1330  FILE *f = 0;
1331  sqlite3_int64 sz;
1332  sqlite3_int64 x;
1333  unsigned char *p = 0;
1334
1335  if( argc==2 ){
1336    zEditor = (const char*)sqlite3_value_text(argv[1]);
1337  }else{
1338    zEditor = getenv("VISUAL");
1339  }
1340  if( zEditor==0 ){
1341    sqlite3_result_error(context, "no editor for edit()", -1);
1342    return;
1343  }
1344  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1345    sqlite3_result_error(context, "NULL input to edit()", -1);
1346    return;
1347  }
1348  db = sqlite3_context_db_handle(context);
1349  zTempFile = 0;
1350  sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1351  if( zTempFile==0 ){
1352    sqlite3_uint64 r = 0;
1353    sqlite3_randomness(sizeof(r), &r);
1354    zTempFile = sqlite3_mprintf("temp%llx", r);
1355    if( zTempFile==0 ){
1356      sqlite3_result_error_nomem(context);
1357      return;
1358    }
1359  }
1360  bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1361  /* When writing the file to be edited, do \n to \r\n conversions on systems
1362  ** that want \r\n line endings */
1363  f = fopen(zTempFile, bBin ? "wb" : "w");
1364  if( f==0 ){
1365    sqlite3_result_error(context, "edit() cannot open temp file", -1);
1366    goto edit_func_end;
1367  }
1368  sz = sqlite3_value_bytes(argv[0]);
1369  if( bBin ){
1370    x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
1371  }else{
1372    const char *z = (const char*)sqlite3_value_text(argv[0]);
1373    /* Remember whether or not the value originally contained \r\n */
1374    if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
1375    x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
1376  }
1377  fclose(f);
1378  f = 0;
1379  if( x!=sz ){
1380    sqlite3_result_error(context, "edit() could not write the whole file", -1);
1381    goto edit_func_end;
1382  }
1383  zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1384  if( zCmd==0 ){
1385    sqlite3_result_error_nomem(context);
1386    goto edit_func_end;
1387  }
1388  rc = system(zCmd);
1389  sqlite3_free(zCmd);
1390  if( rc ){
1391    sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1392    goto edit_func_end;
1393  }
1394  f = fopen(zTempFile, "rb");
1395  if( f==0 ){
1396    sqlite3_result_error(context,
1397      "edit() cannot reopen temp file after edit", -1);
1398    goto edit_func_end;
1399  }
1400  fseek(f, 0, SEEK_END);
1401  sz = ftell(f);
1402  rewind(f);
1403  p = sqlite3_malloc64( sz+1 );
1404  if( p==0 ){
1405    sqlite3_result_error_nomem(context);
1406    goto edit_func_end;
1407  }
1408  x = fread(p, 1, (size_t)sz, f);
1409  fclose(f);
1410  f = 0;
1411  if( x!=sz ){
1412    sqlite3_result_error(context, "could not read back the whole file", -1);
1413    goto edit_func_end;
1414  }
1415  if( bBin ){
1416    sqlite3_result_blob64(context, p, sz, sqlite3_free);
1417  }else{
1418    sqlite3_int64 i, j;
1419    if( hasCRNL ){
1420      /* If the original contains \r\n then do no conversions back to \n */
1421    }else{
1422      /* If the file did not originally contain \r\n then convert any new
1423      ** \r\n back into \n */
1424      for(i=j=0; i<sz; i++){
1425        if( p[i]=='\r' && p[i+1]=='\n' ) i++;
1426        p[j++] = p[i];
1427      }
1428      sz = j;
1429      p[sz] = 0;
1430    }
1431    sqlite3_result_text64(context, (const char*)p, sz,
1432                          sqlite3_free, SQLITE_UTF8);
1433  }
1434  p = 0;
1435
1436edit_func_end:
1437  if( f ) fclose(f);
1438  unlink(zTempFile);
1439  sqlite3_free(zTempFile);
1440  sqlite3_free(p);
1441}
1442#endif /* SQLITE_NOHAVE_SYSTEM */
1443
1444/*
1445** Save or restore the current output mode
1446*/
1447static void outputModePush(ShellState *p){
1448  p->modePrior = p->mode;
1449  p->priorShFlgs = p->shellFlgs;
1450  memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1451  memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1452}
1453static void outputModePop(ShellState *p){
1454  p->mode = p->modePrior;
1455  p->shellFlgs = p->priorShFlgs;
1456  memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1457  memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1458}
1459
1460/*
1461** Output the given string as a hex-encoded blob (eg. X'1234' )
1462*/
1463static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1464  int i;
1465  char *zBlob = (char *)pBlob;
1466  raw_printf(out,"X'");
1467  for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1468  raw_printf(out,"'");
1469}
1470
1471/*
1472** Find a string that is not found anywhere in z[].  Return a pointer
1473** to that string.
1474**
1475** Try to use zA and zB first.  If both of those are already found in z[]
1476** then make up some string and store it in the buffer zBuf.
1477*/
1478static const char *unused_string(
1479  const char *z,                    /* Result must not appear anywhere in z */
1480  const char *zA, const char *zB,   /* Try these first */
1481  char *zBuf                        /* Space to store a generated string */
1482){
1483  unsigned i = 0;
1484  if( strstr(z, zA)==0 ) return zA;
1485  if( strstr(z, zB)==0 ) return zB;
1486  do{
1487    sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1488  }while( strstr(z,zBuf)!=0 );
1489  return zBuf;
1490}
1491
1492/*
1493** Output the given string as a quoted string using SQL quoting conventions.
1494**
1495** See also: output_quoted_escaped_string()
1496*/
1497static void output_quoted_string(FILE *out, const char *z){
1498  int i;
1499  char c;
1500  setBinaryMode(out, 1);
1501  for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1502  if( c==0 ){
1503    utf8_printf(out,"'%s'",z);
1504  }else{
1505    raw_printf(out, "'");
1506    while( *z ){
1507      for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1508      if( c=='\'' ) i++;
1509      if( i ){
1510        utf8_printf(out, "%.*s", i, z);
1511        z += i;
1512      }
1513      if( c=='\'' ){
1514        raw_printf(out, "'");
1515        continue;
1516      }
1517      if( c==0 ){
1518        break;
1519      }
1520      z++;
1521    }
1522    raw_printf(out, "'");
1523  }
1524  setTextMode(out, 1);
1525}
1526
1527/*
1528** Output the given string as a quoted string using SQL quoting conventions.
1529** Additionallly , escape the "\n" and "\r" characters so that they do not
1530** get corrupted by end-of-line translation facilities in some operating
1531** systems.
1532**
1533** This is like output_quoted_string() but with the addition of the \r\n
1534** escape mechanism.
1535*/
1536static void output_quoted_escaped_string(FILE *out, const char *z){
1537  int i;
1538  char c;
1539  setBinaryMode(out, 1);
1540  for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1541  if( c==0 ){
1542    utf8_printf(out,"'%s'",z);
1543  }else{
1544    const char *zNL = 0;
1545    const char *zCR = 0;
1546    int nNL = 0;
1547    int nCR = 0;
1548    char zBuf1[20], zBuf2[20];
1549    for(i=0; z[i]; i++){
1550      if( z[i]=='\n' ) nNL++;
1551      if( z[i]=='\r' ) nCR++;
1552    }
1553    if( nNL ){
1554      raw_printf(out, "replace(");
1555      zNL = unused_string(z, "\\n", "\\012", zBuf1);
1556    }
1557    if( nCR ){
1558      raw_printf(out, "replace(");
1559      zCR = unused_string(z, "\\r", "\\015", zBuf2);
1560    }
1561    raw_printf(out, "'");
1562    while( *z ){
1563      for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1564      if( c=='\'' ) i++;
1565      if( i ){
1566        utf8_printf(out, "%.*s", i, z);
1567        z += i;
1568      }
1569      if( c=='\'' ){
1570        raw_printf(out, "'");
1571        continue;
1572      }
1573      if( c==0 ){
1574        break;
1575      }
1576      z++;
1577      if( c=='\n' ){
1578        raw_printf(out, "%s", zNL);
1579        continue;
1580      }
1581      raw_printf(out, "%s", zCR);
1582    }
1583    raw_printf(out, "'");
1584    if( nCR ){
1585      raw_printf(out, ",'%s',char(13))", zCR);
1586    }
1587    if( nNL ){
1588      raw_printf(out, ",'%s',char(10))", zNL);
1589    }
1590  }
1591  setTextMode(out, 1);
1592}
1593
1594/*
1595** Output the given string as a quoted according to C or TCL quoting rules.
1596*/
1597static void output_c_string(FILE *out, const char *z){
1598  unsigned int c;
1599  fputc('"', out);
1600  while( (c = *(z++))!=0 ){
1601    if( c=='\\' ){
1602      fputc(c, out);
1603      fputc(c, out);
1604    }else if( c=='"' ){
1605      fputc('\\', out);
1606      fputc('"', out);
1607    }else if( c=='\t' ){
1608      fputc('\\', out);
1609      fputc('t', out);
1610    }else if( c=='\n' ){
1611      fputc('\\', out);
1612      fputc('n', out);
1613    }else if( c=='\r' ){
1614      fputc('\\', out);
1615      fputc('r', out);
1616    }else if( !isprint(c&0xff) ){
1617      raw_printf(out, "\\%03o", c&0xff);
1618    }else{
1619      fputc(c, out);
1620    }
1621  }
1622  fputc('"', out);
1623}
1624
1625/*
1626** Output the given string as a quoted according to JSON quoting rules.
1627*/
1628static void output_json_string(FILE *out, const char *z, int n){
1629  unsigned int c;
1630  if( n<0 ) n = (int)strlen(z);
1631  fputc('"', out);
1632  while( n-- ){
1633    c = *(z++);
1634    if( c=='\\' || c=='"' ){
1635      fputc('\\', out);
1636      fputc(c, out);
1637    }else if( c<=0x1f ){
1638      fputc('\\', out);
1639      if( c=='\b' ){
1640        fputc('b', out);
1641      }else if( c=='\f' ){
1642        fputc('f', out);
1643      }else if( c=='\n' ){
1644        fputc('n', out);
1645      }else if( c=='\r' ){
1646        fputc('r', out);
1647      }else if( c=='\t' ){
1648        fputc('t', out);
1649      }else{
1650         raw_printf(out, "u%04x",c);
1651      }
1652    }else{
1653      fputc(c, out);
1654    }
1655  }
1656  fputc('"', out);
1657}
1658
1659/*
1660** Output the given string with characters that are special to
1661** HTML escaped.
1662*/
1663static void output_html_string(FILE *out, const char *z){
1664  int i;
1665  if( z==0 ) z = "";
1666  while( *z ){
1667    for(i=0;   z[i]
1668            && z[i]!='<'
1669            && z[i]!='&'
1670            && z[i]!='>'
1671            && z[i]!='\"'
1672            && z[i]!='\'';
1673        i++){}
1674    if( i>0 ){
1675      utf8_printf(out,"%.*s",i,z);
1676    }
1677    if( z[i]=='<' ){
1678      raw_printf(out,"&lt;");
1679    }else if( z[i]=='&' ){
1680      raw_printf(out,"&amp;");
1681    }else if( z[i]=='>' ){
1682      raw_printf(out,"&gt;");
1683    }else if( z[i]=='\"' ){
1684      raw_printf(out,"&quot;");
1685    }else if( z[i]=='\'' ){
1686      raw_printf(out,"&#39;");
1687    }else{
1688      break;
1689    }
1690    z += i + 1;
1691  }
1692}
1693
1694/*
1695** If a field contains any character identified by a 1 in the following
1696** array, then the string must be quoted for CSV.
1697*/
1698static const char needCsvQuote[] = {
1699  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1700  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1701  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
1702  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1703  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1704  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1705  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1706  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
1707  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1708  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1709  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1710  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1711  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1712  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1713  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1714  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1715};
1716
1717/*
1718** Output a single term of CSV.  Actually, p->colSeparator is used for
1719** the separator, which may or may not be a comma.  p->nullValue is
1720** the null value.  Strings are quoted if necessary.  The separator
1721** is only issued if bSep is true.
1722*/
1723static void output_csv(ShellState *p, const char *z, int bSep){
1724  FILE *out = p->out;
1725  if( z==0 ){
1726    utf8_printf(out,"%s",p->nullValue);
1727  }else{
1728    unsigned i;
1729    for(i=0; z[i]; i++){
1730      if( needCsvQuote[((unsigned char*)z)[i]] ){
1731        i = 0;
1732        break;
1733      }
1734    }
1735    if( i==0 || strstr(z, p->colSeparator)!=0 ){
1736      char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1737      shell_check_oom(zQuoted);
1738      utf8_printf(out, "%s", zQuoted);
1739      sqlite3_free(zQuoted);
1740    }else{
1741      utf8_printf(out, "%s", z);
1742    }
1743  }
1744  if( bSep ){
1745    utf8_printf(p->out, "%s", p->colSeparator);
1746  }
1747}
1748
1749/*
1750** This routine runs when the user presses Ctrl-C
1751*/
1752static void interrupt_handler(int NotUsed){
1753  UNUSED_PARAMETER(NotUsed);
1754  seenInterrupt++;
1755  if( seenInterrupt>2 ) exit(1);
1756  if( globalDb ) sqlite3_interrupt(globalDb);
1757}
1758
1759#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1760/*
1761** This routine runs for console events (e.g. Ctrl-C) on Win32
1762*/
1763static BOOL WINAPI ConsoleCtrlHandler(
1764  DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1765){
1766  if( dwCtrlType==CTRL_C_EVENT ){
1767    interrupt_handler(0);
1768    return TRUE;
1769  }
1770  return FALSE;
1771}
1772#endif
1773
1774#ifndef SQLITE_OMIT_AUTHORIZATION
1775/*
1776** This authorizer runs in safe mode.
1777*/
1778static int safeModeAuth(
1779  void *pClientData,
1780  int op,
1781  const char *zA1,
1782  const char *zA2,
1783  const char *zA3,
1784  const char *zA4
1785){
1786  ShellState *p = (ShellState*)pClientData;
1787  static const char *azProhibitedFunctions[] = {
1788    "edit",
1789    "fts3_tokenizer",
1790    "load_extension",
1791    "readfile",
1792    "writefile",
1793    "zipfile",
1794    "zipfile_cds",
1795  };
1796  UNUSED_PARAMETER(zA2);
1797  UNUSED_PARAMETER(zA3);
1798  UNUSED_PARAMETER(zA4);
1799  switch( op ){
1800    case SQLITE_ATTACH: {
1801      failIfSafeMode(p, "cannot run ATTACH in safe mode");
1802      break;
1803    }
1804    case SQLITE_FUNCTION: {
1805      int i;
1806      for(i=0; i<ArraySize(azProhibitedFunctions); i++){
1807        if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
1808          failIfSafeMode(p, "cannot use the %s() function in safe mode",
1809                         azProhibitedFunctions[i]);
1810        }
1811      }
1812      break;
1813    }
1814  }
1815  return SQLITE_OK;
1816}
1817
1818/*
1819** When the ".auth ON" is set, the following authorizer callback is
1820** invoked.  It always returns SQLITE_OK.
1821*/
1822static int shellAuth(
1823  void *pClientData,
1824  int op,
1825  const char *zA1,
1826  const char *zA2,
1827  const char *zA3,
1828  const char *zA4
1829){
1830  ShellState *p = (ShellState*)pClientData;
1831  static const char *azAction[] = { 0,
1832     "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
1833     "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
1834     "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
1835     "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
1836     "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
1837     "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
1838     "PRAGMA",               "READ",                 "SELECT",
1839     "TRANSACTION",          "UPDATE",               "ATTACH",
1840     "DETACH",               "ALTER_TABLE",          "REINDEX",
1841     "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
1842     "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
1843  };
1844  int i;
1845  const char *az[4];
1846  az[0] = zA1;
1847  az[1] = zA2;
1848  az[2] = zA3;
1849  az[3] = zA4;
1850  utf8_printf(p->out, "authorizer: %s", azAction[op]);
1851  for(i=0; i<4; i++){
1852    raw_printf(p->out, " ");
1853    if( az[i] ){
1854      output_c_string(p->out, az[i]);
1855    }else{
1856      raw_printf(p->out, "NULL");
1857    }
1858  }
1859  raw_printf(p->out, "\n");
1860  if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
1861  return SQLITE_OK;
1862}
1863#endif
1864
1865/*
1866** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
1867**
1868** This routine converts some CREATE TABLE statements for shadow tables
1869** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1870*/
1871static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1872  if( z==0 ) return;
1873  if( zTail==0 ) return;
1874  if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1875    utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1876  }else{
1877    utf8_printf(out, "%s%s", z, zTail);
1878  }
1879}
1880static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1881  char c = z[n];
1882  z[n] = 0;
1883  printSchemaLine(out, z, zTail);
1884  z[n] = c;
1885}
1886
1887/*
1888** Return true if string z[] has nothing but whitespace and comments to the
1889** end of the first line.
1890*/
1891static int wsToEol(const char *z){
1892  int i;
1893  for(i=0; z[i]; i++){
1894    if( z[i]=='\n' ) return 1;
1895    if( IsSpace(z[i]) ) continue;
1896    if( z[i]=='-' && z[i+1]=='-' ) return 1;
1897    return 0;
1898  }
1899  return 1;
1900}
1901
1902/*
1903** Add a new entry to the EXPLAIN QUERY PLAN data
1904*/
1905static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
1906  EQPGraphRow *pNew;
1907  int nText = strlen30(zText);
1908  if( p->autoEQPtest ){
1909    utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1910  }
1911  pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1912  shell_check_oom(pNew);
1913  pNew->iEqpId = iEqpId;
1914  pNew->iParentId = p2;
1915  memcpy(pNew->zText, zText, nText+1);
1916  pNew->pNext = 0;
1917  if( p->sGraph.pLast ){
1918    p->sGraph.pLast->pNext = pNew;
1919  }else{
1920    p->sGraph.pRow = pNew;
1921  }
1922  p->sGraph.pLast = pNew;
1923}
1924
1925/*
1926** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1927** in p->sGraph.
1928*/
1929static void eqp_reset(ShellState *p){
1930  EQPGraphRow *pRow, *pNext;
1931  for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1932    pNext = pRow->pNext;
1933    sqlite3_free(pRow);
1934  }
1935  memset(&p->sGraph, 0, sizeof(p->sGraph));
1936}
1937
1938/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
1939** pOld, or return the first such line if pOld is NULL
1940*/
1941static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
1942  EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
1943  while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
1944  return pRow;
1945}
1946
1947/* Render a single level of the graph that has iEqpId as its parent.  Called
1948** recursively to render sublevels.
1949*/
1950static void eqp_render_level(ShellState *p, int iEqpId){
1951  EQPGraphRow *pRow, *pNext;
1952  int n = strlen30(p->sGraph.zPrefix);
1953  char *z;
1954  for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1955    pNext = eqp_next_row(p, iEqpId, pRow);
1956    z = pRow->zText;
1957    utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
1958                pNext ? "|--" : "`--", z);
1959    if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
1960      memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
1961      eqp_render_level(p, pRow->iEqpId);
1962      p->sGraph.zPrefix[n] = 0;
1963    }
1964  }
1965}
1966
1967/*
1968** Display and reset the EXPLAIN QUERY PLAN data
1969*/
1970static void eqp_render(ShellState *p){
1971  EQPGraphRow *pRow = p->sGraph.pRow;
1972  if( pRow ){
1973    if( pRow->zText[0]=='-' ){
1974      if( pRow->pNext==0 ){
1975        eqp_reset(p);
1976        return;
1977      }
1978      utf8_printf(p->out, "%s\n", pRow->zText+3);
1979      p->sGraph.pRow = pRow->pNext;
1980      sqlite3_free(pRow);
1981    }else{
1982      utf8_printf(p->out, "QUERY PLAN\n");
1983    }
1984    p->sGraph.zPrefix[0] = 0;
1985    eqp_render_level(p, 0);
1986    eqp_reset(p);
1987  }
1988}
1989
1990#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
1991/*
1992** Progress handler callback.
1993*/
1994static int progress_handler(void *pClientData) {
1995  ShellState *p = (ShellState*)pClientData;
1996  p->nProgress++;
1997  if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
1998    raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
1999    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
2000    if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
2001    return 1;
2002  }
2003  if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
2004    raw_printf(p->out, "Progress %u\n", p->nProgress);
2005  }
2006  return 0;
2007}
2008#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
2009
2010/*
2011** Print N dashes
2012*/
2013static void print_dashes(FILE *out, int N){
2014  const char zDash[] = "--------------------------------------------------";
2015  const int nDash = sizeof(zDash) - 1;
2016  while( N>nDash ){
2017    fputs(zDash, out);
2018    N -= nDash;
2019  }
2020  raw_printf(out, "%.*s", N, zDash);
2021}
2022
2023/*
2024** Print a markdown or table-style row separator using ascii-art
2025*/
2026static void print_row_separator(
2027  ShellState *p,
2028  int nArg,
2029  const char *zSep
2030){
2031  int i;
2032  if( nArg>0 ){
2033    fputs(zSep, p->out);
2034    print_dashes(p->out, p->actualWidth[0]+2);
2035    for(i=1; i<nArg; i++){
2036      fputs(zSep, p->out);
2037      print_dashes(p->out, p->actualWidth[i]+2);
2038    }
2039    fputs(zSep, p->out);
2040  }
2041  fputs("\n", p->out);
2042}
2043
2044/*
2045** This is the callback routine that the shell
2046** invokes for each row of a query result.
2047*/
2048static int shell_callback(
2049  void *pArg,
2050  int nArg,        /* Number of result columns */
2051  char **azArg,    /* Text of each result column */
2052  char **azCol,    /* Column names */
2053  int *aiType      /* Column types.  Might be NULL */
2054){
2055  int i;
2056  ShellState *p = (ShellState*)pArg;
2057
2058  if( azArg==0 ) return 0;
2059  switch( p->cMode ){
2060    case MODE_Count:
2061    case MODE_Off: {
2062      break;
2063    }
2064    case MODE_Line: {
2065      int w = 5;
2066      if( azArg==0 ) break;
2067      for(i=0; i<nArg; i++){
2068        int len = strlen30(azCol[i] ? azCol[i] : "");
2069        if( len>w ) w = len;
2070      }
2071      if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2072      for(i=0; i<nArg; i++){
2073        utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2074                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2075      }
2076      break;
2077    }
2078    case MODE_Explain: {
2079      static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
2080      if( nArg>ArraySize(aExplainWidth) ){
2081        nArg = ArraySize(aExplainWidth);
2082      }
2083      if( p->cnt++==0 ){
2084        for(i=0; i<nArg; i++){
2085          int w = aExplainWidth[i];
2086          utf8_width_print(p->out, w, azCol[i]);
2087          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2088        }
2089        for(i=0; i<nArg; i++){
2090          int w = aExplainWidth[i];
2091          print_dashes(p->out, w);
2092          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2093        }
2094      }
2095      if( azArg==0 ) break;
2096      for(i=0; i<nArg; i++){
2097        int w = aExplainWidth[i];
2098        if( i==nArg-1 ) w = 0;
2099        if( azArg[i] && strlenChar(azArg[i])>w ){
2100          w = strlenChar(azArg[i]);
2101        }
2102        if( i==1 && p->aiIndent && p->pStmt ){
2103          if( p->iIndent<p->nIndent ){
2104            utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2105          }
2106          p->iIndent++;
2107        }
2108        utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2109        fputs(i==nArg-1 ? "\n" : "  ", p->out);
2110      }
2111      break;
2112    }
2113    case MODE_Semi: {   /* .schema and .fullschema output */
2114      printSchemaLine(p->out, azArg[0], ";\n");
2115      break;
2116    }
2117    case MODE_Pretty: {  /* .schema and .fullschema with --indent */
2118      char *z;
2119      int j;
2120      int nParen = 0;
2121      char cEnd = 0;
2122      char c;
2123      int nLine = 0;
2124      assert( nArg==1 );
2125      if( azArg[0]==0 ) break;
2126      if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2127       || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2128      ){
2129        utf8_printf(p->out, "%s;\n", azArg[0]);
2130        break;
2131      }
2132      z = sqlite3_mprintf("%s", azArg[0]);
2133      shell_check_oom(z);
2134      j = 0;
2135      for(i=0; IsSpace(z[i]); i++){}
2136      for(; (c = z[i])!=0; i++){
2137        if( IsSpace(c) ){
2138          if( z[j-1]=='\r' ) z[j-1] = '\n';
2139          if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2140        }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2141          j--;
2142        }
2143        z[j++] = c;
2144      }
2145      while( j>0 && IsSpace(z[j-1]) ){ j--; }
2146      z[j] = 0;
2147      if( strlen30(z)>=79 ){
2148        for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
2149          if( c==cEnd ){
2150            cEnd = 0;
2151          }else if( c=='"' || c=='\'' || c=='`' ){
2152            cEnd = c;
2153          }else if( c=='[' ){
2154            cEnd = ']';
2155          }else if( c=='-' && z[i+1]=='-' ){
2156            cEnd = '\n';
2157          }else if( c=='(' ){
2158            nParen++;
2159          }else if( c==')' ){
2160            nParen--;
2161            if( nLine>0 && nParen==0 && j>0 ){
2162              printSchemaLineN(p->out, z, j, "\n");
2163              j = 0;
2164            }
2165          }
2166          z[j++] = c;
2167          if( nParen==1 && cEnd==0
2168           && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
2169          ){
2170            if( c=='\n' ) j--;
2171            printSchemaLineN(p->out, z, j, "\n  ");
2172            j = 0;
2173            nLine++;
2174            while( IsSpace(z[i+1]) ){ i++; }
2175          }
2176        }
2177        z[j] = 0;
2178      }
2179      printSchemaLine(p->out, z, ";\n");
2180      sqlite3_free(z);
2181      break;
2182    }
2183    case MODE_List: {
2184      if( p->cnt++==0 && p->showHeader ){
2185        for(i=0; i<nArg; i++){
2186          utf8_printf(p->out,"%s%s",azCol[i],
2187                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
2188        }
2189      }
2190      if( azArg==0 ) break;
2191      for(i=0; i<nArg; i++){
2192        char *z = azArg[i];
2193        if( z==0 ) z = p->nullValue;
2194        utf8_printf(p->out, "%s", z);
2195        if( i<nArg-1 ){
2196          utf8_printf(p->out, "%s", p->colSeparator);
2197        }else{
2198          utf8_printf(p->out, "%s", p->rowSeparator);
2199        }
2200      }
2201      break;
2202    }
2203    case MODE_Html: {
2204      if( p->cnt++==0 && p->showHeader ){
2205        raw_printf(p->out,"<TR>");
2206        for(i=0; i<nArg; i++){
2207          raw_printf(p->out,"<TH>");
2208          output_html_string(p->out, azCol[i]);
2209          raw_printf(p->out,"</TH>\n");
2210        }
2211        raw_printf(p->out,"</TR>\n");
2212      }
2213      if( azArg==0 ) break;
2214      raw_printf(p->out,"<TR>");
2215      for(i=0; i<nArg; i++){
2216        raw_printf(p->out,"<TD>");
2217        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2218        raw_printf(p->out,"</TD>\n");
2219      }
2220      raw_printf(p->out,"</TR>\n");
2221      break;
2222    }
2223    case MODE_Tcl: {
2224      if( p->cnt++==0 && p->showHeader ){
2225        for(i=0; i<nArg; i++){
2226          output_c_string(p->out,azCol[i] ? azCol[i] : "");
2227          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2228        }
2229        utf8_printf(p->out, "%s", p->rowSeparator);
2230      }
2231      if( azArg==0 ) break;
2232      for(i=0; i<nArg; i++){
2233        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2234        if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2235      }
2236      utf8_printf(p->out, "%s", p->rowSeparator);
2237      break;
2238    }
2239    case MODE_Csv: {
2240      setBinaryMode(p->out, 1);
2241      if( p->cnt++==0 && p->showHeader ){
2242        for(i=0; i<nArg; i++){
2243          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2244        }
2245        utf8_printf(p->out, "%s", p->rowSeparator);
2246      }
2247      if( nArg>0 ){
2248        for(i=0; i<nArg; i++){
2249          output_csv(p, azArg[i], i<nArg-1);
2250        }
2251        utf8_printf(p->out, "%s", p->rowSeparator);
2252      }
2253      setTextMode(p->out, 1);
2254      break;
2255    }
2256    case MODE_Insert: {
2257      if( azArg==0 ) break;
2258      utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2259      if( p->showHeader ){
2260        raw_printf(p->out,"(");
2261        for(i=0; i<nArg; i++){
2262          if( i>0 ) raw_printf(p->out, ",");
2263          if( quoteChar(azCol[i]) ){
2264            char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2265            shell_check_oom(z);
2266            utf8_printf(p->out, "%s", z);
2267            sqlite3_free(z);
2268          }else{
2269            raw_printf(p->out, "%s", azCol[i]);
2270          }
2271        }
2272        raw_printf(p->out,")");
2273      }
2274      p->cnt++;
2275      for(i=0; i<nArg; i++){
2276        raw_printf(p->out, i>0 ? "," : " VALUES(");
2277        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2278          utf8_printf(p->out,"NULL");
2279        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2280          if( ShellHasFlag(p, SHFLG_Newlines) ){
2281            output_quoted_string(p->out, azArg[i]);
2282          }else{
2283            output_quoted_escaped_string(p->out, azArg[i]);
2284          }
2285        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2286          utf8_printf(p->out,"%s", azArg[i]);
2287        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2288          char z[50];
2289          double r = sqlite3_column_double(p->pStmt, i);
2290          sqlite3_uint64 ur;
2291          memcpy(&ur,&r,sizeof(r));
2292          if( ur==0x7ff0000000000000LL ){
2293            raw_printf(p->out, "1e999");
2294          }else if( ur==0xfff0000000000000LL ){
2295            raw_printf(p->out, "-1e999");
2296          }else{
2297            sqlite3_snprintf(50,z,"%!.20g", r);
2298            raw_printf(p->out, "%s", z);
2299          }
2300        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2301          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2302          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2303          output_hex_blob(p->out, pBlob, nBlob);
2304        }else if( isNumber(azArg[i], 0) ){
2305          utf8_printf(p->out,"%s", azArg[i]);
2306        }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2307          output_quoted_string(p->out, azArg[i]);
2308        }else{
2309          output_quoted_escaped_string(p->out, azArg[i]);
2310        }
2311      }
2312      raw_printf(p->out,");\n");
2313      break;
2314    }
2315    case MODE_Json: {
2316      if( azArg==0 ) break;
2317      if( p->cnt==0 ){
2318        fputs("[{", p->out);
2319      }else{
2320        fputs(",\n{", p->out);
2321      }
2322      p->cnt++;
2323      for(i=0; i<nArg; i++){
2324        output_json_string(p->out, azCol[i], -1);
2325        putc(':', p->out);
2326        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2327          fputs("null",p->out);
2328        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2329          char z[50];
2330          double r = sqlite3_column_double(p->pStmt, i);
2331          sqlite3_uint64 ur;
2332          memcpy(&ur,&r,sizeof(r));
2333          if( ur==0x7ff0000000000000LL ){
2334            raw_printf(p->out, "1e999");
2335          }else if( ur==0xfff0000000000000LL ){
2336            raw_printf(p->out, "-1e999");
2337          }else{
2338            sqlite3_snprintf(50,z,"%!.20g", r);
2339            raw_printf(p->out, "%s", z);
2340          }
2341        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2342          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2343          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2344          output_json_string(p->out, pBlob, nBlob);
2345        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2346          output_json_string(p->out, azArg[i], -1);
2347        }else{
2348          utf8_printf(p->out,"%s", azArg[i]);
2349        }
2350        if( i<nArg-1 ){
2351          putc(',', p->out);
2352        }
2353      }
2354      putc('}', p->out);
2355      break;
2356    }
2357    case MODE_Quote: {
2358      if( azArg==0 ) break;
2359      if( p->cnt==0 && p->showHeader ){
2360        for(i=0; i<nArg; i++){
2361          if( i>0 ) fputs(p->colSeparator, p->out);
2362          output_quoted_string(p->out, azCol[i]);
2363        }
2364        fputs(p->rowSeparator, p->out);
2365      }
2366      p->cnt++;
2367      for(i=0; i<nArg; i++){
2368        if( i>0 ) fputs(p->colSeparator, p->out);
2369        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2370          utf8_printf(p->out,"NULL");
2371        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2372          output_quoted_string(p->out, azArg[i]);
2373        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2374          utf8_printf(p->out,"%s", azArg[i]);
2375        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2376          char z[50];
2377          double r = sqlite3_column_double(p->pStmt, i);
2378          sqlite3_snprintf(50,z,"%!.20g", r);
2379          raw_printf(p->out, "%s", z);
2380        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2381          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2382          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2383          output_hex_blob(p->out, pBlob, nBlob);
2384        }else if( isNumber(azArg[i], 0) ){
2385          utf8_printf(p->out,"%s", azArg[i]);
2386        }else{
2387          output_quoted_string(p->out, azArg[i]);
2388        }
2389      }
2390      fputs(p->rowSeparator, p->out);
2391      break;
2392    }
2393    case MODE_Ascii: {
2394      if( p->cnt++==0 && p->showHeader ){
2395        for(i=0; i<nArg; i++){
2396          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2397          utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2398        }
2399        utf8_printf(p->out, "%s", p->rowSeparator);
2400      }
2401      if( azArg==0 ) break;
2402      for(i=0; i<nArg; i++){
2403        if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2404        utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2405      }
2406      utf8_printf(p->out, "%s", p->rowSeparator);
2407      break;
2408    }
2409    case MODE_EQP: {
2410      eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2411      break;
2412    }
2413  }
2414  return 0;
2415}
2416
2417/*
2418** This is the callback routine that the SQLite library
2419** invokes for each row of a query result.
2420*/
2421static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2422  /* since we don't have type info, call the shell_callback with a NULL value */
2423  return shell_callback(pArg, nArg, azArg, azCol, NULL);
2424}
2425
2426/*
2427** This is the callback routine from sqlite3_exec() that appends all
2428** output onto the end of a ShellText object.
2429*/
2430static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2431  ShellText *p = (ShellText*)pArg;
2432  int i;
2433  UNUSED_PARAMETER(az);
2434  if( azArg==0 ) return 0;
2435  if( p->n ) appendText(p, "|", 0);
2436  for(i=0; i<nArg; i++){
2437    if( i ) appendText(p, ",", 0);
2438    if( azArg[i] ) appendText(p, azArg[i], 0);
2439  }
2440  return 0;
2441}
2442
2443/*
2444** Generate an appropriate SELFTEST table in the main database.
2445*/
2446static void createSelftestTable(ShellState *p){
2447  char *zErrMsg = 0;
2448  sqlite3_exec(p->db,
2449    "SAVEPOINT selftest_init;\n"
2450    "CREATE TABLE IF NOT EXISTS selftest(\n"
2451    "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
2452    "  op TEXT,\n"                   /* Operator:  memo run */
2453    "  cmd TEXT,\n"                  /* Command text */
2454    "  ans TEXT\n"                   /* Desired answer */
2455    ");"
2456    "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2457    "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2458    "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2459    "         'memo','Tests generated by --init');\n"
2460    "INSERT INTO [_shell$self]\n"
2461    "  SELECT 'run',\n"
2462    "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2463                                 "FROM sqlite_schema ORDER BY 2'',224))',\n"
2464    "    hex(sha3_query('SELECT type,name,tbl_name,sql "
2465                          "FROM sqlite_schema ORDER BY 2',224));\n"
2466    "INSERT INTO [_shell$self]\n"
2467    "  SELECT 'run',"
2468    "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2469    "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2470    "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2471    "  FROM (\n"
2472    "    SELECT name FROM sqlite_schema\n"
2473    "     WHERE type='table'\n"
2474    "       AND name<>'selftest'\n"
2475    "       AND coalesce(rootpage,0)>0\n"
2476    "  )\n"
2477    " ORDER BY name;\n"
2478    "INSERT INTO [_shell$self]\n"
2479    "  VALUES('run','PRAGMA integrity_check','ok');\n"
2480    "INSERT INTO selftest(tno,op,cmd,ans)"
2481    "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2482    "DROP TABLE [_shell$self];"
2483    ,0,0,&zErrMsg);
2484  if( zErrMsg ){
2485    utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2486    sqlite3_free(zErrMsg);
2487  }
2488  sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2489}
2490
2491
2492/*
2493** Set the destination table field of the ShellState structure to
2494** the name of the table given.  Escape any quote characters in the
2495** table name.
2496*/
2497static void set_table_name(ShellState *p, const char *zName){
2498  int i, n;
2499  char cQuote;
2500  char *z;
2501
2502  if( p->zDestTable ){
2503    free(p->zDestTable);
2504    p->zDestTable = 0;
2505  }
2506  if( zName==0 ) return;
2507  cQuote = quoteChar(zName);
2508  n = strlen30(zName);
2509  if( cQuote ) n += n+2;
2510  z = p->zDestTable = malloc( n+1 );
2511  shell_check_oom(z);
2512  n = 0;
2513  if( cQuote ) z[n++] = cQuote;
2514  for(i=0; zName[i]; i++){
2515    z[n++] = zName[i];
2516    if( zName[i]==cQuote ) z[n++] = cQuote;
2517  }
2518  if( cQuote ) z[n++] = cQuote;
2519  z[n] = 0;
2520}
2521
2522
2523/*
2524** Execute a query statement that will generate SQL output.  Print
2525** the result columns, comma-separated, on a line and then add a
2526** semicolon terminator to the end of that line.
2527**
2528** If the number of columns is 1 and that column contains text "--"
2529** then write the semicolon on a separate line.  That way, if a
2530** "--" comment occurs at the end of the statement, the comment
2531** won't consume the semicolon terminator.
2532*/
2533static int run_table_dump_query(
2534  ShellState *p,           /* Query context */
2535  const char *zSelect      /* SELECT statement to extract content */
2536){
2537  sqlite3_stmt *pSelect;
2538  int rc;
2539  int nResult;
2540  int i;
2541  const char *z;
2542  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2543  if( rc!=SQLITE_OK || !pSelect ){
2544    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2545                sqlite3_errmsg(p->db));
2546    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2547    return rc;
2548  }
2549  rc = sqlite3_step(pSelect);
2550  nResult = sqlite3_column_count(pSelect);
2551  while( rc==SQLITE_ROW ){
2552    z = (const char*)sqlite3_column_text(pSelect, 0);
2553    utf8_printf(p->out, "%s", z);
2554    for(i=1; i<nResult; i++){
2555      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2556    }
2557    if( z==0 ) z = "";
2558    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2559    if( z[0] ){
2560      raw_printf(p->out, "\n;\n");
2561    }else{
2562      raw_printf(p->out, ";\n");
2563    }
2564    rc = sqlite3_step(pSelect);
2565  }
2566  rc = sqlite3_finalize(pSelect);
2567  if( rc!=SQLITE_OK ){
2568    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2569                sqlite3_errmsg(p->db));
2570    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2571  }
2572  return rc;
2573}
2574
2575/*
2576** Allocate space and save off string indicating current error.
2577*/
2578static char *save_err_msg(
2579  sqlite3 *db,           /* Database to query */
2580  const char *zWhen,     /* Qualifier (format) wrapper */
2581  int rc                 /* Error code returned from API */
2582){
2583  char *zErr;
2584  if( zWhen==0 ) zWhen = "%s (%d)";
2585  zErr = sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc);
2586  shell_check_oom(zErr);
2587  return zErr;
2588}
2589
2590#ifdef __linux__
2591/*
2592** Attempt to display I/O stats on Linux using /proc/PID/io
2593*/
2594static void displayLinuxIoStats(FILE *out){
2595  FILE *in;
2596  char z[200];
2597  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2598  in = fopen(z, "rb");
2599  if( in==0 ) return;
2600  while( fgets(z, sizeof(z), in)!=0 ){
2601    static const struct {
2602      const char *zPattern;
2603      const char *zDesc;
2604    } aTrans[] = {
2605      { "rchar: ",                  "Bytes received by read():" },
2606      { "wchar: ",                  "Bytes sent to write():"    },
2607      { "syscr: ",                  "Read() system calls:"      },
2608      { "syscw: ",                  "Write() system calls:"     },
2609      { "read_bytes: ",             "Bytes read from storage:"  },
2610      { "write_bytes: ",            "Bytes written to storage:" },
2611      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
2612    };
2613    int i;
2614    for(i=0; i<ArraySize(aTrans); i++){
2615      int n = strlen30(aTrans[i].zPattern);
2616      if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2617        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2618        break;
2619      }
2620    }
2621  }
2622  fclose(in);
2623}
2624#endif
2625
2626/*
2627** Display a single line of status using 64-bit values.
2628*/
2629static void displayStatLine(
2630  ShellState *p,            /* The shell context */
2631  char *zLabel,             /* Label for this one line */
2632  char *zFormat,            /* Format for the result */
2633  int iStatusCtrl,          /* Which status to display */
2634  int bReset                /* True to reset the stats */
2635){
2636  sqlite3_int64 iCur = -1;
2637  sqlite3_int64 iHiwtr = -1;
2638  int i, nPercent;
2639  char zLine[200];
2640  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2641  for(i=0, nPercent=0; zFormat[i]; i++){
2642    if( zFormat[i]=='%' ) nPercent++;
2643  }
2644  if( nPercent>1 ){
2645    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2646  }else{
2647    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2648  }
2649  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2650}
2651
2652/*
2653** Display memory stats.
2654*/
2655static int display_stats(
2656  sqlite3 *db,                /* Database to query */
2657  ShellState *pArg,           /* Pointer to ShellState */
2658  int bReset                  /* True to reset the stats */
2659){
2660  int iCur;
2661  int iHiwtr;
2662  FILE *out;
2663  if( pArg==0 || pArg->out==0 ) return 0;
2664  out = pArg->out;
2665
2666  if( pArg->pStmt && pArg->statsOn==2 ){
2667    int nCol, i, x;
2668    sqlite3_stmt *pStmt = pArg->pStmt;
2669    char z[100];
2670    nCol = sqlite3_column_count(pStmt);
2671    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2672    for(i=0; i<nCol; i++){
2673      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2674      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2675#ifndef SQLITE_OMIT_DECLTYPE
2676      sqlite3_snprintf(30, z+x, "declared type:");
2677      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2678#endif
2679#ifdef SQLITE_ENABLE_COLUMN_METADATA
2680      sqlite3_snprintf(30, z+x, "database name:");
2681      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2682      sqlite3_snprintf(30, z+x, "table name:");
2683      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2684      sqlite3_snprintf(30, z+x, "origin name:");
2685      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2686#endif
2687    }
2688  }
2689
2690  if( pArg->statsOn==3 ){
2691    if( pArg->pStmt ){
2692      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2693      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2694    }
2695    return 0;
2696  }
2697
2698  displayStatLine(pArg, "Memory Used:",
2699     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2700  displayStatLine(pArg, "Number of Outstanding Allocations:",
2701     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2702  if( pArg->shellFlgs & SHFLG_Pagecache ){
2703    displayStatLine(pArg, "Number of Pcache Pages Used:",
2704       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2705  }
2706  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2707     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2708  displayStatLine(pArg, "Largest Allocation:",
2709     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2710  displayStatLine(pArg, "Largest Pcache Allocation:",
2711     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2712#ifdef YYTRACKMAXSTACKDEPTH
2713  displayStatLine(pArg, "Deepest Parser Stack:",
2714     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2715#endif
2716
2717  if( db ){
2718    if( pArg->shellFlgs & SHFLG_Lookaside ){
2719      iHiwtr = iCur = -1;
2720      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2721                        &iCur, &iHiwtr, bReset);
2722      raw_printf(pArg->out,
2723              "Lookaside Slots Used:                %d (max %d)\n",
2724              iCur, iHiwtr);
2725      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2726                        &iCur, &iHiwtr, bReset);
2727      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
2728              iHiwtr);
2729      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2730                        &iCur, &iHiwtr, bReset);
2731      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
2732              iHiwtr);
2733      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2734                        &iCur, &iHiwtr, bReset);
2735      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
2736              iHiwtr);
2737    }
2738    iHiwtr = iCur = -1;
2739    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2740    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
2741            iCur);
2742    iHiwtr = iCur = -1;
2743    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2744    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
2745    iHiwtr = iCur = -1;
2746    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2747    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
2748    iHiwtr = iCur = -1;
2749    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2750    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
2751    iHiwtr = iCur = -1;
2752    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2753    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
2754    iHiwtr = iCur = -1;
2755    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2756    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
2757            iCur);
2758    iHiwtr = iCur = -1;
2759    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2760    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
2761            iCur);
2762  }
2763
2764  if( pArg->pStmt ){
2765    int iHit, iMiss;
2766    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2767                               bReset);
2768    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
2769    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2770    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
2771    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2772    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
2773    iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2774    iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2775    if( iHit || iMiss ){
2776      raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
2777            iHit, iHit+iMiss);
2778    }
2779    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2780    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
2781    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2782    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
2783    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2784    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
2785    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2786    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
2787  }
2788
2789#ifdef __linux__
2790  displayLinuxIoStats(pArg->out);
2791#endif
2792
2793  /* Do not remove this machine readable comment: extra-stats-output-here */
2794
2795  return 0;
2796}
2797
2798/*
2799** Display scan stats.
2800*/
2801static void display_scanstats(
2802  sqlite3 *db,                    /* Database to query */
2803  ShellState *pArg                /* Pointer to ShellState */
2804){
2805#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2806  UNUSED_PARAMETER(db);
2807  UNUSED_PARAMETER(pArg);
2808#else
2809  int i, k, n, mx;
2810  raw_printf(pArg->out, "-------- scanstats --------\n");
2811  mx = 0;
2812  for(k=0; k<=mx; k++){
2813    double rEstLoop = 1.0;
2814    for(i=n=0; 1; i++){
2815      sqlite3_stmt *p = pArg->pStmt;
2816      sqlite3_int64 nLoop, nVisit;
2817      double rEst;
2818      int iSid;
2819      const char *zExplain;
2820      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2821        break;
2822      }
2823      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2824      if( iSid>mx ) mx = iSid;
2825      if( iSid!=k ) continue;
2826      if( n==0 ){
2827        rEstLoop = (double)nLoop;
2828        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2829      }
2830      n++;
2831      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2832      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2833      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2834      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2835      rEstLoop *= rEst;
2836      raw_printf(pArg->out,
2837          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2838          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2839      );
2840    }
2841  }
2842  raw_printf(pArg->out, "---------------------------\n");
2843#endif
2844}
2845
2846/*
2847** Parameter azArray points to a zero-terminated array of strings. zStr
2848** points to a single nul-terminated string. Return non-zero if zStr
2849** is equal, according to strcmp(), to any of the strings in the array.
2850** Otherwise, return zero.
2851*/
2852static int str_in_array(const char *zStr, const char **azArray){
2853  int i;
2854  for(i=0; azArray[i]; i++){
2855    if( 0==strcmp(zStr, azArray[i]) ) return 1;
2856  }
2857  return 0;
2858}
2859
2860/*
2861** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2862** and populate the ShellState.aiIndent[] array with the number of
2863** spaces each opcode should be indented before it is output.
2864**
2865** The indenting rules are:
2866**
2867**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2868**       all opcodes that occur between the p2 jump destination and the opcode
2869**       itself by 2 spaces.
2870**
2871**     * For each "Goto", if the jump destination is earlier in the program
2872**       and ends on one of:
2873**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
2874**       or if the P1 parameter is one instead of zero,
2875**       then indent all opcodes between the earlier instruction
2876**       and "Goto" by 2 spaces.
2877*/
2878static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2879  const char *zSql;               /* The text of the SQL statement */
2880  const char *z;                  /* Used to check if this is an EXPLAIN */
2881  int *abYield = 0;               /* True if op is an OP_Yield */
2882  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
2883  int iOp;                        /* Index of operation in p->aiIndent[] */
2884
2885  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
2886  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2887                            "Rewind", 0 };
2888  const char *azGoto[] = { "Goto", 0 };
2889
2890  /* Try to figure out if this is really an EXPLAIN statement. If this
2891  ** cannot be verified, return early.  */
2892  if( sqlite3_column_count(pSql)!=8 ){
2893    p->cMode = p->mode;
2894    return;
2895  }
2896  zSql = sqlite3_sql(pSql);
2897  if( zSql==0 ) return;
2898  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2899  if( sqlite3_strnicmp(z, "explain", 7) ){
2900    p->cMode = p->mode;
2901    return;
2902  }
2903
2904  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2905    int i;
2906    int iAddr = sqlite3_column_int(pSql, 0);
2907    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2908
2909    /* Set p2 to the P2 field of the current opcode. Then, assuming that
2910    ** p2 is an instruction address, set variable p2op to the index of that
2911    ** instruction in the aiIndent[] array. p2 and p2op may be different if
2912    ** the current instruction is part of a sub-program generated by an
2913    ** SQL trigger or foreign key.  */
2914    int p2 = sqlite3_column_int(pSql, 3);
2915    int p2op = (p2 + (iOp-iAddr));
2916
2917    /* Grow the p->aiIndent array as required */
2918    if( iOp>=nAlloc ){
2919      if( iOp==0 ){
2920        /* Do further verfication that this is explain output.  Abort if
2921        ** it is not */
2922        static const char *explainCols[] = {
2923           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2924        int jj;
2925        for(jj=0; jj<ArraySize(explainCols); jj++){
2926          if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2927            p->cMode = p->mode;
2928            sqlite3_reset(pSql);
2929            return;
2930          }
2931        }
2932      }
2933      nAlloc += 100;
2934      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2935      shell_check_oom(p->aiIndent);
2936      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
2937      shell_check_oom(abYield);
2938    }
2939    abYield[iOp] = str_in_array(zOp, azYield);
2940    p->aiIndent[iOp] = 0;
2941    p->nIndent = iOp+1;
2942
2943    if( str_in_array(zOp, azNext) ){
2944      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2945    }
2946    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2947     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2948    ){
2949      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2950    }
2951  }
2952
2953  p->iIndent = 0;
2954  sqlite3_free(abYield);
2955  sqlite3_reset(pSql);
2956}
2957
2958/*
2959** Free the array allocated by explain_data_prepare().
2960*/
2961static void explain_data_delete(ShellState *p){
2962  sqlite3_free(p->aiIndent);
2963  p->aiIndent = 0;
2964  p->nIndent = 0;
2965  p->iIndent = 0;
2966}
2967
2968/*
2969** Disable and restore .wheretrace and .selecttrace settings.
2970*/
2971static unsigned int savedSelectTrace;
2972static unsigned int savedWhereTrace;
2973static void disable_debug_trace_modes(void){
2974  unsigned int zero = 0;
2975  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
2976  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
2977  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
2978  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
2979}
2980static void restore_debug_trace_modes(void){
2981  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
2982  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
2983}
2984
2985/* Create the TEMP table used to store parameter bindings */
2986static void bind_table_init(ShellState *p){
2987  int wrSchema = 0;
2988  int defensiveMode = 0;
2989  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
2990  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
2991  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
2992  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
2993  sqlite3_exec(p->db,
2994    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
2995    "  key TEXT PRIMARY KEY,\n"
2996    "  value\n"
2997    ") WITHOUT ROWID;",
2998    0, 0, 0);
2999  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3000  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3001}
3002
3003/*
3004** Bind parameters on a prepared statement.
3005**
3006** Parameter bindings are taken from a TEMP table of the form:
3007**
3008**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3009**    WITHOUT ROWID;
3010**
3011** No bindings occur if this table does not exist.  The name of the table
3012** begins with "sqlite_" so that it will not collide with ordinary application
3013** tables.  The table must be in the TEMP schema.
3014*/
3015static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3016  int nVar;
3017  int i;
3018  int rc;
3019  sqlite3_stmt *pQ = 0;
3020
3021  nVar = sqlite3_bind_parameter_count(pStmt);
3022  if( nVar==0 ) return;  /* Nothing to do */
3023  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3024                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3025    return; /* Parameter table does not exist */
3026  }
3027  rc = sqlite3_prepare_v2(pArg->db,
3028          "SELECT value FROM temp.sqlite_parameters"
3029          " WHERE key=?1", -1, &pQ, 0);
3030  if( rc || pQ==0 ) return;
3031  for(i=1; i<=nVar; i++){
3032    char zNum[30];
3033    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3034    if( zVar==0 ){
3035      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3036      zVar = zNum;
3037    }
3038    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3039    if( sqlite3_step(pQ)==SQLITE_ROW ){
3040      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3041    }else{
3042      sqlite3_bind_null(pStmt, i);
3043    }
3044    sqlite3_reset(pQ);
3045  }
3046  sqlite3_finalize(pQ);
3047}
3048
3049/*
3050** UTF8 box-drawing characters.  Imagine box lines like this:
3051**
3052**           1
3053**           |
3054**       4 --+-- 2
3055**           |
3056**           3
3057**
3058** Each box characters has between 2 and 4 of the lines leading from
3059** the center.  The characters are here identified by the numbers of
3060** their corresponding lines.
3061*/
3062#define BOX_24   "\342\224\200"  /* U+2500 --- */
3063#define BOX_13   "\342\224\202"  /* U+2502  |  */
3064#define BOX_23   "\342\224\214"  /* U+250c  ,- */
3065#define BOX_34   "\342\224\220"  /* U+2510 -,  */
3066#define BOX_12   "\342\224\224"  /* U+2514  '- */
3067#define BOX_14   "\342\224\230"  /* U+2518 -'  */
3068#define BOX_123  "\342\224\234"  /* U+251c  |- */
3069#define BOX_134  "\342\224\244"  /* U+2524 -|  */
3070#define BOX_234  "\342\224\254"  /* U+252c -,- */
3071#define BOX_124  "\342\224\264"  /* U+2534 -'- */
3072#define BOX_1234 "\342\224\274"  /* U+253c -|- */
3073
3074/* Draw horizontal line N characters long using unicode box
3075** characters
3076*/
3077static void print_box_line(FILE *out, int N){
3078  const char zDash[] =
3079      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3080      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3081  const int nDash = sizeof(zDash) - 1;
3082  N *= 3;
3083  while( N>nDash ){
3084    utf8_printf(out, zDash);
3085    N -= nDash;
3086  }
3087  utf8_printf(out, "%.*s", N, zDash);
3088}
3089
3090/*
3091** Draw a horizontal separator for a MODE_Box table.
3092*/
3093static void print_box_row_separator(
3094  ShellState *p,
3095  int nArg,
3096  const char *zSep1,
3097  const char *zSep2,
3098  const char *zSep3
3099){
3100  int i;
3101  if( nArg>0 ){
3102    utf8_printf(p->out, "%s", zSep1);
3103    print_box_line(p->out, p->actualWidth[0]+2);
3104    for(i=1; i<nArg; i++){
3105      utf8_printf(p->out, "%s", zSep2);
3106      print_box_line(p->out, p->actualWidth[i]+2);
3107    }
3108    utf8_printf(p->out, "%s", zSep3);
3109  }
3110  fputs("\n", p->out);
3111}
3112
3113
3114
3115/*
3116** Run a prepared statement and output the result in one of the
3117** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3118** or MODE_Box.
3119**
3120** This is different from ordinary exec_prepared_stmt() in that
3121** it has to run the entire query and gather the results into memory
3122** first, in order to determine column widths, before providing
3123** any output.
3124*/
3125static void exec_prepared_stmt_columnar(
3126  ShellState *p,                        /* Pointer to ShellState */
3127  sqlite3_stmt *pStmt                   /* Statment to run */
3128){
3129  sqlite3_int64 nRow = 0;
3130  int nColumn = 0;
3131  char **azData = 0;
3132  sqlite3_int64 nAlloc = 0;
3133  const char *z;
3134  int rc;
3135  sqlite3_int64 i, nData;
3136  int j, nTotal, w, n;
3137  const char *colSep = 0;
3138  const char *rowSep = 0;
3139
3140  rc = sqlite3_step(pStmt);
3141  if( rc!=SQLITE_ROW ) return;
3142  nColumn = sqlite3_column_count(pStmt);
3143  nAlloc = nColumn*4;
3144  if( nAlloc<=0 ) nAlloc = 1;
3145  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3146  shell_check_oom(azData);
3147  for(i=0; i<nColumn; i++){
3148    azData[i] = strdup(sqlite3_column_name(pStmt,i));
3149  }
3150  do{
3151    if( (nRow+2)*nColumn >= nAlloc ){
3152      nAlloc *= 2;
3153      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3154      shell_check_oom(azData);
3155    }
3156    nRow++;
3157    for(i=0; i<nColumn; i++){
3158      z = (const char*)sqlite3_column_text(pStmt,i);
3159      azData[nRow*nColumn + i] = z ? strdup(z) : 0;
3160    }
3161  }while( sqlite3_step(pStmt)==SQLITE_ROW );
3162  if( nColumn>p->nWidth ){
3163    p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3164    shell_check_oom(p->colWidth);
3165    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3166    p->nWidth = nColumn;
3167    p->actualWidth = &p->colWidth[nColumn];
3168  }
3169  memset(p->actualWidth, 0, nColumn*sizeof(int));
3170  for(i=0; i<nColumn; i++){
3171    w = p->colWidth[i];
3172    if( w<0 ) w = -w;
3173    p->actualWidth[i] = w;
3174  }
3175  nTotal = nColumn*(nRow+1);
3176  for(i=0; i<nTotal; i++){
3177    z = azData[i];
3178    if( z==0 ) z = p->nullValue;
3179    n = strlenChar(z);
3180    j = i%nColumn;
3181    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3182  }
3183  if( seenInterrupt ) goto columnar_end;
3184  if( nColumn==0 ) goto columnar_end;
3185  switch( p->cMode ){
3186    case MODE_Column: {
3187      colSep = "  ";
3188      rowSep = "\n";
3189      if( p->showHeader ){
3190        for(i=0; i<nColumn; i++){
3191          w = p->actualWidth[i];
3192          if( p->colWidth[i]<0 ) w = -w;
3193          utf8_width_print(p->out, w, azData[i]);
3194          fputs(i==nColumn-1?"\n":"  ", p->out);
3195        }
3196        for(i=0; i<nColumn; i++){
3197          print_dashes(p->out, p->actualWidth[i]);
3198          fputs(i==nColumn-1?"\n":"  ", p->out);
3199        }
3200      }
3201      break;
3202    }
3203    case MODE_Table: {
3204      colSep = " | ";
3205      rowSep = " |\n";
3206      print_row_separator(p, nColumn, "+");
3207      fputs("| ", p->out);
3208      for(i=0; i<nColumn; i++){
3209        w = p->actualWidth[i];
3210        n = strlenChar(azData[i]);
3211        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3212        fputs(i==nColumn-1?" |\n":" | ", p->out);
3213      }
3214      print_row_separator(p, nColumn, "+");
3215      break;
3216    }
3217    case MODE_Markdown: {
3218      colSep = " | ";
3219      rowSep = " |\n";
3220      fputs("| ", p->out);
3221      for(i=0; i<nColumn; i++){
3222        w = p->actualWidth[i];
3223        n = strlenChar(azData[i]);
3224        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3225        fputs(i==nColumn-1?" |\n":" | ", p->out);
3226      }
3227      print_row_separator(p, nColumn, "|");
3228      break;
3229    }
3230    case MODE_Box: {
3231      colSep = " " BOX_13 " ";
3232      rowSep = " " BOX_13 "\n";
3233      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3234      utf8_printf(p->out, BOX_13 " ");
3235      for(i=0; i<nColumn; i++){
3236        w = p->actualWidth[i];
3237        n = strlenChar(azData[i]);
3238        utf8_printf(p->out, "%*s%s%*s%s",
3239            (w-n)/2, "", azData[i], (w-n+1)/2, "",
3240            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3241      }
3242      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3243      break;
3244    }
3245  }
3246  for(i=nColumn, j=0; i<nTotal; i++, j++){
3247    if( j==0 && p->cMode!=MODE_Column ){
3248      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3249    }
3250    z = azData[i];
3251    if( z==0 ) z = p->nullValue;
3252    w = p->actualWidth[j];
3253    if( p->colWidth[j]<0 ) w = -w;
3254    utf8_width_print(p->out, w, z);
3255    if( j==nColumn-1 ){
3256      utf8_printf(p->out, "%s", rowSep);
3257      j = -1;
3258      if( seenInterrupt ) goto columnar_end;
3259    }else{
3260      utf8_printf(p->out, "%s", colSep);
3261    }
3262  }
3263  if( p->cMode==MODE_Table ){
3264    print_row_separator(p, nColumn, "+");
3265  }else if( p->cMode==MODE_Box ){
3266    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3267  }
3268columnar_end:
3269  if( seenInterrupt ){
3270    utf8_printf(p->out, "Interrupt\n");
3271  }
3272  nData = (nRow+1)*nColumn;
3273  for(i=0; i<nData; i++) free(azData[i]);
3274  sqlite3_free(azData);
3275}
3276
3277/*
3278** Run a prepared statement
3279*/
3280static void exec_prepared_stmt(
3281  ShellState *pArg,                                /* Pointer to ShellState */
3282  sqlite3_stmt *pStmt                              /* Statment to run */
3283){
3284  int rc;
3285  sqlite3_uint64 nRow = 0;
3286
3287  if( pArg->cMode==MODE_Column
3288   || pArg->cMode==MODE_Table
3289   || pArg->cMode==MODE_Box
3290   || pArg->cMode==MODE_Markdown
3291  ){
3292    exec_prepared_stmt_columnar(pArg, pStmt);
3293    return;
3294  }
3295
3296  /* perform the first step.  this will tell us if we
3297  ** have a result set or not and how wide it is.
3298  */
3299  rc = sqlite3_step(pStmt);
3300  /* if we have a result set... */
3301  if( SQLITE_ROW == rc ){
3302    /* allocate space for col name ptr, value ptr, and type */
3303    int nCol = sqlite3_column_count(pStmt);
3304    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3305    if( !pData ){
3306      shell_out_of_memory();
3307    }else{
3308      char **azCols = (char **)pData;      /* Names of result columns */
3309      char **azVals = &azCols[nCol];       /* Results */
3310      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3311      int i, x;
3312      assert(sizeof(int) <= sizeof(char *));
3313      /* save off ptrs to column names */
3314      for(i=0; i<nCol; i++){
3315        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3316      }
3317      do{
3318        nRow++;
3319        /* extract the data and data types */
3320        for(i=0; i<nCol; i++){
3321          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3322          if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
3323            azVals[i] = "";
3324          }else{
3325            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3326          }
3327          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3328            rc = SQLITE_NOMEM;
3329            break; /* from for */
3330          }
3331        } /* end for */
3332
3333        /* if data and types extracted successfully... */
3334        if( SQLITE_ROW == rc ){
3335          /* call the supplied callback with the result row data */
3336          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3337            rc = SQLITE_ABORT;
3338          }else{
3339            rc = sqlite3_step(pStmt);
3340          }
3341        }
3342      } while( SQLITE_ROW == rc );
3343      sqlite3_free(pData);
3344      if( pArg->cMode==MODE_Json ){
3345        fputs("]\n", pArg->out);
3346      }else if( pArg->cMode==MODE_Count ){
3347        printf("%llu row%s\n", nRow, nRow!=1 ? "s" : "");
3348      }
3349    }
3350  }
3351}
3352
3353#ifndef SQLITE_OMIT_VIRTUALTABLE
3354/*
3355** This function is called to process SQL if the previous shell command
3356** was ".expert". It passes the SQL in the second argument directly to
3357** the sqlite3expert object.
3358**
3359** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3360** code. In this case, (*pzErr) may be set to point to a buffer containing
3361** an English language error message. It is the responsibility of the
3362** caller to eventually free this buffer using sqlite3_free().
3363*/
3364static int expertHandleSQL(
3365  ShellState *pState,
3366  const char *zSql,
3367  char **pzErr
3368){
3369  assert( pState->expert.pExpert );
3370  assert( pzErr==0 || *pzErr==0 );
3371  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3372}
3373
3374/*
3375** This function is called either to silently clean up the object
3376** created by the ".expert" command (if bCancel==1), or to generate a
3377** report from it and then clean it up (if bCancel==0).
3378**
3379** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3380** code. In this case, (*pzErr) may be set to point to a buffer containing
3381** an English language error message. It is the responsibility of the
3382** caller to eventually free this buffer using sqlite3_free().
3383*/
3384static int expertFinish(
3385  ShellState *pState,
3386  int bCancel,
3387  char **pzErr
3388){
3389  int rc = SQLITE_OK;
3390  sqlite3expert *p = pState->expert.pExpert;
3391  assert( p );
3392  assert( bCancel || pzErr==0 || *pzErr==0 );
3393  if( bCancel==0 ){
3394    FILE *out = pState->out;
3395    int bVerbose = pState->expert.bVerbose;
3396
3397    rc = sqlite3_expert_analyze(p, pzErr);
3398    if( rc==SQLITE_OK ){
3399      int nQuery = sqlite3_expert_count(p);
3400      int i;
3401
3402      if( bVerbose ){
3403        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3404        raw_printf(out, "-- Candidates -----------------------------\n");
3405        raw_printf(out, "%s\n", zCand);
3406      }
3407      for(i=0; i<nQuery; i++){
3408        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3409        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3410        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3411        if( zIdx==0 ) zIdx = "(no new indexes)\n";
3412        if( bVerbose ){
3413          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3414          raw_printf(out, "%s\n\n", zSql);
3415        }
3416        raw_printf(out, "%s\n", zIdx);
3417        raw_printf(out, "%s\n", zEQP);
3418      }
3419    }
3420  }
3421  sqlite3_expert_destroy(p);
3422  pState->expert.pExpert = 0;
3423  return rc;
3424}
3425
3426/*
3427** Implementation of ".expert" dot command.
3428*/
3429static int expertDotCommand(
3430  ShellState *pState,             /* Current shell tool state */
3431  char **azArg,                   /* Array of arguments passed to dot command */
3432  int nArg                        /* Number of entries in azArg[] */
3433){
3434  int rc = SQLITE_OK;
3435  char *zErr = 0;
3436  int i;
3437  int iSample = 0;
3438
3439  assert( pState->expert.pExpert==0 );
3440  memset(&pState->expert, 0, sizeof(ExpertInfo));
3441
3442  for(i=1; rc==SQLITE_OK && i<nArg; i++){
3443    char *z = azArg[i];
3444    int n;
3445    if( z[0]=='-' && z[1]=='-' ) z++;
3446    n = strlen30(z);
3447    if( n>=2 && 0==strncmp(z, "-verbose", n) ){
3448      pState->expert.bVerbose = 1;
3449    }
3450    else if( n>=2 && 0==strncmp(z, "-sample", n) ){
3451      if( i==(nArg-1) ){
3452        raw_printf(stderr, "option requires an argument: %s\n", z);
3453        rc = SQLITE_ERROR;
3454      }else{
3455        iSample = (int)integerValue(azArg[++i]);
3456        if( iSample<0 || iSample>100 ){
3457          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3458          rc = SQLITE_ERROR;
3459        }
3460      }
3461    }
3462    else{
3463      raw_printf(stderr, "unknown option: %s\n", z);
3464      rc = SQLITE_ERROR;
3465    }
3466  }
3467
3468  if( rc==SQLITE_OK ){
3469    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3470    if( pState->expert.pExpert==0 ){
3471      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3472      rc = SQLITE_ERROR;
3473    }else{
3474      sqlite3_expert_config(
3475          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3476      );
3477    }
3478  }
3479  sqlite3_free(zErr);
3480
3481  return rc;
3482}
3483#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3484
3485/*
3486** Execute a statement or set of statements.  Print
3487** any result rows/columns depending on the current mode
3488** set via the supplied callback.
3489**
3490** This is very similar to SQLite's built-in sqlite3_exec()
3491** function except it takes a slightly different callback
3492** and callback data argument.
3493*/
3494static int shell_exec(
3495  ShellState *pArg,                         /* Pointer to ShellState */
3496  const char *zSql,                         /* SQL to be evaluated */
3497  char **pzErrMsg                           /* Error msg written here */
3498){
3499  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
3500  int rc = SQLITE_OK;             /* Return Code */
3501  int rc2;
3502  const char *zLeftover;          /* Tail of unprocessed SQL */
3503  sqlite3 *db = pArg->db;
3504
3505  if( pzErrMsg ){
3506    *pzErrMsg = NULL;
3507  }
3508
3509#ifndef SQLITE_OMIT_VIRTUALTABLE
3510  if( pArg->expert.pExpert ){
3511    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3512    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3513  }
3514#endif
3515
3516  while( zSql[0] && (SQLITE_OK == rc) ){
3517    static const char *zStmtSql;
3518    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3519    if( SQLITE_OK != rc ){
3520      if( pzErrMsg ){
3521        *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)", rc);
3522      }
3523    }else{
3524      if( !pStmt ){
3525        /* this happens for a comment or white-space */
3526        zSql = zLeftover;
3527        while( IsSpace(zSql[0]) ) zSql++;
3528        continue;
3529      }
3530      zStmtSql = sqlite3_sql(pStmt);
3531      if( zStmtSql==0 ) zStmtSql = "";
3532      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3533
3534      /* save off the prepared statment handle and reset row count */
3535      if( pArg ){
3536        pArg->pStmt = pStmt;
3537        pArg->cnt = 0;
3538      }
3539
3540      /* echo the sql statement if echo on */
3541      if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3542        utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3543      }
3544
3545      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3546      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3547        sqlite3_stmt *pExplain;
3548        char *zEQP;
3549        int triggerEQP = 0;
3550        disable_debug_trace_modes();
3551        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3552        if( pArg->autoEQP>=AUTOEQP_trigger ){
3553          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3554        }
3555        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3556        shell_check_oom(zEQP);
3557        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3558        if( rc==SQLITE_OK ){
3559          while( sqlite3_step(pExplain)==SQLITE_ROW ){
3560            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3561            int iEqpId = sqlite3_column_int(pExplain, 0);
3562            int iParentId = sqlite3_column_int(pExplain, 1);
3563            if( zEQPLine==0 ) zEQPLine = "";
3564            if( zEQPLine[0]=='-' ) eqp_render(pArg);
3565            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3566          }
3567          eqp_render(pArg);
3568        }
3569        sqlite3_finalize(pExplain);
3570        sqlite3_free(zEQP);
3571        if( pArg->autoEQP>=AUTOEQP_full ){
3572          /* Also do an EXPLAIN for ".eqp full" mode */
3573          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3574          shell_check_oom(zEQP);
3575          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3576          if( rc==SQLITE_OK ){
3577            pArg->cMode = MODE_Explain;
3578            explain_data_prepare(pArg, pExplain);
3579            exec_prepared_stmt(pArg, pExplain);
3580            explain_data_delete(pArg);
3581          }
3582          sqlite3_finalize(pExplain);
3583          sqlite3_free(zEQP);
3584        }
3585        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3586          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3587          /* Reprepare pStmt before reactiving trace modes */
3588          sqlite3_finalize(pStmt);
3589          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3590          if( pArg ) pArg->pStmt = pStmt;
3591        }
3592        restore_debug_trace_modes();
3593      }
3594
3595      if( pArg ){
3596        pArg->cMode = pArg->mode;
3597        if( pArg->autoExplain ){
3598          if( sqlite3_stmt_isexplain(pStmt)==1 ){
3599            pArg->cMode = MODE_Explain;
3600          }
3601          if( sqlite3_stmt_isexplain(pStmt)==2 ){
3602            pArg->cMode = MODE_EQP;
3603          }
3604        }
3605
3606        /* If the shell is currently in ".explain" mode, gather the extra
3607        ** data required to add indents to the output.*/
3608        if( pArg->cMode==MODE_Explain ){
3609          explain_data_prepare(pArg, pStmt);
3610        }
3611      }
3612
3613      bind_prepared_stmt(pArg, pStmt);
3614      exec_prepared_stmt(pArg, pStmt);
3615      explain_data_delete(pArg);
3616      eqp_render(pArg);
3617
3618      /* print usage stats if stats on */
3619      if( pArg && pArg->statsOn ){
3620        display_stats(db, pArg, 0);
3621      }
3622
3623      /* print loop-counters if required */
3624      if( pArg && pArg->scanstatsOn ){
3625        display_scanstats(db, pArg);
3626      }
3627
3628      /* Finalize the statement just executed. If this fails, save a
3629      ** copy of the error message. Otherwise, set zSql to point to the
3630      ** next statement to execute. */
3631      rc2 = sqlite3_finalize(pStmt);
3632      if( rc!=SQLITE_NOMEM ) rc = rc2;
3633      if( rc==SQLITE_OK ){
3634        zSql = zLeftover;
3635        while( IsSpace(zSql[0]) ) zSql++;
3636      }else if( pzErrMsg ){
3637        *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc);
3638      }
3639
3640      /* clear saved stmt handle */
3641      if( pArg ){
3642        pArg->pStmt = NULL;
3643      }
3644    }
3645  } /* end while */
3646
3647  return rc;
3648}
3649
3650/*
3651** Release memory previously allocated by tableColumnList().
3652*/
3653static void freeColumnList(char **azCol){
3654  int i;
3655  for(i=1; azCol[i]; i++){
3656    sqlite3_free(azCol[i]);
3657  }
3658  /* azCol[0] is a static string */
3659  sqlite3_free(azCol);
3660}
3661
3662/*
3663** Return a list of pointers to strings which are the names of all
3664** columns in table zTab.   The memory to hold the names is dynamically
3665** allocated and must be released by the caller using a subsequent call
3666** to freeColumnList().
3667**
3668** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
3669** value that needs to be preserved, then azCol[0] is filled in with the
3670** name of the rowid column.
3671**
3672** The first regular column in the table is azCol[1].  The list is terminated
3673** by an entry with azCol[i]==0.
3674*/
3675static char **tableColumnList(ShellState *p, const char *zTab){
3676  char **azCol = 0;
3677  sqlite3_stmt *pStmt;
3678  char *zSql;
3679  int nCol = 0;
3680  int nAlloc = 0;
3681  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
3682  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
3683  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3684  int rc;
3685
3686  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3687  shell_check_oom(zSql);
3688  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3689  sqlite3_free(zSql);
3690  if( rc ) return 0;
3691  while( sqlite3_step(pStmt)==SQLITE_ROW ){
3692    if( nCol>=nAlloc-2 ){
3693      nAlloc = nAlloc*2 + nCol + 10;
3694      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3695      shell_check_oom(azCol);
3696    }
3697    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3698    shell_check_oom(azCol[nCol]);
3699    if( sqlite3_column_int(pStmt, 5) ){
3700      nPK++;
3701      if( nPK==1
3702       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3703                          "INTEGER")==0
3704      ){
3705        isIPK = 1;
3706      }else{
3707        isIPK = 0;
3708      }
3709    }
3710  }
3711  sqlite3_finalize(pStmt);
3712  if( azCol==0 ) return 0;
3713  azCol[0] = 0;
3714  azCol[nCol+1] = 0;
3715
3716  /* The decision of whether or not a rowid really needs to be preserved
3717  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
3718  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
3719  ** rowids on tables where the rowid is inaccessible because there are other
3720  ** columns in the table named "rowid", "_rowid_", and "oid".
3721  */
3722  if( preserveRowid && isIPK ){
3723    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3724    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
3725    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3726    ** ROWID aliases.  To distinguish these cases, check to see if
3727    ** there is a "pk" entry in "PRAGMA index_list".  There will be
3728    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3729    */
3730    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3731                           " WHERE origin='pk'", zTab);
3732    shell_check_oom(zSql);
3733    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3734    sqlite3_free(zSql);
3735    if( rc ){
3736      freeColumnList(azCol);
3737      return 0;
3738    }
3739    rc = sqlite3_step(pStmt);
3740    sqlite3_finalize(pStmt);
3741    preserveRowid = rc==SQLITE_ROW;
3742  }
3743  if( preserveRowid ){
3744    /* Only preserve the rowid if we can find a name to use for the
3745    ** rowid */
3746    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3747    int i, j;
3748    for(j=0; j<3; j++){
3749      for(i=1; i<=nCol; i++){
3750        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3751      }
3752      if( i>nCol ){
3753        /* At this point, we know that azRowid[j] is not the name of any
3754        ** ordinary column in the table.  Verify that azRowid[j] is a valid
3755        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
3756        ** tables will fail this last check */
3757        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3758        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3759        break;
3760      }
3761    }
3762  }
3763  return azCol;
3764}
3765
3766/*
3767** Toggle the reverse_unordered_selects setting.
3768*/
3769static void toggleSelectOrder(sqlite3 *db){
3770  sqlite3_stmt *pStmt = 0;
3771  int iSetting = 0;
3772  char zStmt[100];
3773  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3774  if( sqlite3_step(pStmt)==SQLITE_ROW ){
3775    iSetting = sqlite3_column_int(pStmt, 0);
3776  }
3777  sqlite3_finalize(pStmt);
3778  sqlite3_snprintf(sizeof(zStmt), zStmt,
3779       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3780  sqlite3_exec(db, zStmt, 0, 0, 0);
3781}
3782
3783/*
3784** This is a different callback routine used for dumping the database.
3785** Each row received by this callback consists of a table name,
3786** the table type ("index" or "table") and SQL to create the table.
3787** This routine should print text sufficient to recreate the table.
3788*/
3789static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
3790  int rc;
3791  const char *zTable;
3792  const char *zType;
3793  const char *zSql;
3794  ShellState *p = (ShellState *)pArg;
3795  int dataOnly;
3796  int noSys;
3797
3798  UNUSED_PARAMETER(azNotUsed);
3799  if( nArg!=3 || azArg==0 ) return 0;
3800  zTable = azArg[0];
3801  zType = azArg[1];
3802  zSql = azArg[2];
3803  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
3804  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
3805
3806  if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
3807    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
3808  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
3809    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
3810  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3811    return 0;
3812  }else if( dataOnly ){
3813    /* no-op */
3814  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3815    char *zIns;
3816    if( !p->writableSchema ){
3817      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
3818      p->writableSchema = 1;
3819    }
3820    zIns = sqlite3_mprintf(
3821       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
3822       "VALUES('table','%q','%q',0,'%q');",
3823       zTable, zTable, zSql);
3824    shell_check_oom(zIns);
3825    utf8_printf(p->out, "%s\n", zIns);
3826    sqlite3_free(zIns);
3827    return 0;
3828  }else{
3829    printSchemaLine(p->out, zSql, ";\n");
3830  }
3831
3832  if( strcmp(zType, "table")==0 ){
3833    ShellText sSelect;
3834    ShellText sTable;
3835    char **azCol;
3836    int i;
3837    char *savedDestTable;
3838    int savedMode;
3839
3840    azCol = tableColumnList(p, zTable);
3841    if( azCol==0 ){
3842      p->nErr++;
3843      return 0;
3844    }
3845
3846    /* Always quote the table name, even if it appears to be pure ascii,
3847    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
3848    initText(&sTable);
3849    appendText(&sTable, zTable, quoteChar(zTable));
3850    /* If preserving the rowid, add a column list after the table name.
3851    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3852    ** instead of the usual "INSERT INTO tab VALUES(...)".
3853    */
3854    if( azCol[0] ){
3855      appendText(&sTable, "(", 0);
3856      appendText(&sTable, azCol[0], 0);
3857      for(i=1; azCol[i]; i++){
3858        appendText(&sTable, ",", 0);
3859        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
3860      }
3861      appendText(&sTable, ")", 0);
3862    }
3863
3864    /* Build an appropriate SELECT statement */
3865    initText(&sSelect);
3866    appendText(&sSelect, "SELECT ", 0);
3867    if( azCol[0] ){
3868      appendText(&sSelect, azCol[0], 0);
3869      appendText(&sSelect, ",", 0);
3870    }
3871    for(i=1; azCol[i]; i++){
3872      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
3873      if( azCol[i+1] ){
3874        appendText(&sSelect, ",", 0);
3875      }
3876    }
3877    freeColumnList(azCol);
3878    appendText(&sSelect, " FROM ", 0);
3879    appendText(&sSelect, zTable, quoteChar(zTable));
3880
3881    savedDestTable = p->zDestTable;
3882    savedMode = p->mode;
3883    p->zDestTable = sTable.z;
3884    p->mode = p->cMode = MODE_Insert;
3885    rc = shell_exec(p, sSelect.z, 0);
3886    if( (rc&0xff)==SQLITE_CORRUPT ){
3887      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3888      toggleSelectOrder(p->db);
3889      shell_exec(p, sSelect.z, 0);
3890      toggleSelectOrder(p->db);
3891    }
3892    p->zDestTable = savedDestTable;
3893    p->mode = savedMode;
3894    freeText(&sTable);
3895    freeText(&sSelect);
3896    if( rc ) p->nErr++;
3897  }
3898  return 0;
3899}
3900
3901/*
3902** Run zQuery.  Use dump_callback() as the callback routine so that
3903** the contents of the query are output as SQL statements.
3904**
3905** If we get a SQLITE_CORRUPT error, rerun the query after appending
3906** "ORDER BY rowid DESC" to the end.
3907*/
3908static int run_schema_dump_query(
3909  ShellState *p,
3910  const char *zQuery
3911){
3912  int rc;
3913  char *zErr = 0;
3914  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
3915  if( rc==SQLITE_CORRUPT ){
3916    char *zQ2;
3917    int len = strlen30(zQuery);
3918    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3919    if( zErr ){
3920      utf8_printf(p->out, "/****** %s ******/\n", zErr);
3921      sqlite3_free(zErr);
3922      zErr = 0;
3923    }
3924    zQ2 = malloc( len+100 );
3925    if( zQ2==0 ) return rc;
3926    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
3927    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3928    if( rc ){
3929      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
3930    }else{
3931      rc = SQLITE_CORRUPT;
3932    }
3933    sqlite3_free(zErr);
3934    free(zQ2);
3935  }
3936  return rc;
3937}
3938
3939/*
3940** Text of help messages.
3941**
3942** The help text for each individual command begins with a line that starts
3943** with ".".  Subsequent lines are supplimental information.
3944**
3945** There must be two or more spaces between the end of the command and the
3946** start of the description of what that command does.
3947*/
3948static const char *(azHelp[]) = {
3949#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
3950  ".archive ...             Manage SQL archives",
3951  "   Each command must have exactly one of the following options:",
3952  "     -c, --create               Create a new archive",
3953  "     -u, --update               Add or update files with changed mtime",
3954  "     -i, --insert               Like -u but always add even if unchanged",
3955  "     -r, --remove               Remove files from archive",
3956  "     -t, --list                 List contents of archive",
3957  "     -x, --extract              Extract files from archive",
3958  "   Optional arguments:",
3959  "     -v, --verbose              Print each filename as it is processed",
3960  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
3961  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
3962  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
3963  "     -g, --glob                 Use glob matching for names in archive",
3964  "     -n, --dryrun               Show the SQL that would have occurred",
3965  "   Examples:",
3966  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
3967  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
3968  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
3969  "   See also:",
3970  "      http://sqlite.org/cli.html#sqlite_archive_support",
3971#endif
3972#ifndef SQLITE_OMIT_AUTHORIZATION
3973  ".auth ON|OFF             Show authorizer callbacks",
3974#endif
3975  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
3976  "       --append            Use the appendvfs",
3977  "       --async             Write to FILE without journal and fsync()",
3978  ".bail on|off             Stop after hitting an error.  Default OFF",
3979  ".binary on|off           Turn binary output on or off.  Default OFF",
3980  ".cd DIRECTORY            Change the working directory to DIRECTORY",
3981  ".changes on|off          Show number of rows changed by SQL",
3982  ".check GLOB              Fail if output since .testcase does not match",
3983  ".clone NEWDB             Clone data into NEWDB from the existing database",
3984  ".connection [close] [#]  Open or close an auxiliary database connection",
3985  ".databases               List names and files of attached databases",
3986  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
3987  ".dbinfo ?DB?             Show status information about the database",
3988  ".dump ?OBJECTS?          Render database content as SQL",
3989  "   Options:",
3990  "     --data-only            Output only INSERT statements",
3991  "     --newlines             Allow unescaped newline characters in output",
3992  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
3993  "     --preserve-rowids      Include ROWID values in the output",
3994  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
3995  "   Additional LIKE patterns can be given in subsequent arguments",
3996  ".echo on|off             Turn command echo on or off",
3997  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
3998  "   Other Modes:",
3999#ifdef SQLITE_DEBUG
4000  "      test                  Show raw EXPLAIN QUERY PLAN output",
4001  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4002#endif
4003  "      trigger               Like \"full\" but also show trigger bytecode",
4004  ".excel                   Display the output of next command in spreadsheet",
4005  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
4006  ".exit ?CODE?             Exit this program with return-code CODE",
4007  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
4008  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
4009  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
4010  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
4011  "   --help                  Show CMD details",
4012  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
4013  ".headers on|off          Turn display of headers on or off",
4014  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
4015  ".import FILE TABLE       Import data from FILE into TABLE",
4016  "   Options:",
4017  "     --ascii               Use \\037 and \\036 as column and row separators",
4018  "     --csv                 Use , and \\n as column and row separators",
4019  "     --skip N              Skip the first N rows of input",
4020  "     -v                    \"Verbose\" - increase auxiliary output",
4021  "   Notes:",
4022  "     *  If TABLE does not exist, it is created.  The first row of input",
4023  "        determines the column names.",
4024  "     *  If neither --csv or --ascii are used, the input mode is derived",
4025  "        from the \".mode\" output mode",
4026  "     *  If FILE begins with \"|\" then it is a command that generates the",
4027  "        input text.",
4028#ifndef SQLITE_OMIT_TEST_CONTROL
4029  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
4030#endif
4031  ".indexes ?TABLE?         Show names of indexes",
4032  "                           If TABLE is specified, only show indexes for",
4033  "                           tables matching TABLE using the LIKE operator.",
4034#ifdef SQLITE_ENABLE_IOTRACE
4035  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
4036#endif
4037  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
4038  ".lint OPTIONS            Report potential schema issues.",
4039  "     Options:",
4040  "        fkey-indexes     Find missing foreign key indexes",
4041#ifndef SQLITE_OMIT_LOAD_EXTENSION
4042  ".load FILE ?ENTRY?       Load an extension library",
4043#endif
4044  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
4045  ".mode MODE ?TABLE?       Set output mode",
4046  "   MODE is one of:",
4047  "     ascii     Columns/rows delimited by 0x1F and 0x1E",
4048  "     box       Tables using unicode box-drawing characters",
4049  "     csv       Comma-separated values",
4050  "     column    Output in columns.  (See .width)",
4051  "     html      HTML <table> code",
4052  "     insert    SQL insert statements for TABLE",
4053  "     json      Results in a JSON array",
4054  "     line      One value per line",
4055  "     list      Values delimited by \"|\"",
4056  "     markdown  Markdown table format",
4057  "     quote     Escape answers as for SQL",
4058  "     table     ASCII-art table",
4059  "     tabs      Tab-separated values",
4060  "     tcl       TCL list elements",
4061  ".nonce STRING            Disable safe mode for one command if the nonce matches",
4062  ".nullvalue STRING        Use STRING in place of NULL values",
4063  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
4064  "     If FILE begins with '|' then open as a pipe",
4065  "       --bom  Put a UTF8 byte-order mark at the beginning",
4066  "       -e     Send output to the system text editor",
4067  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
4068  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
4069  "     Options:",
4070  "        --append        Use appendvfs to append database to the end of FILE",
4071#ifndef SQLITE_OMIT_DESERIALIZE
4072  "        --deserialize   Load into memory using sqlite3_deserialize()",
4073  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
4074  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
4075#endif
4076  "        --new           Initialize FILE to an empty database",
4077  "        --nofollow      Do not follow symbolic links",
4078  "        --readonly      Open FILE readonly",
4079  "        --zip           FILE is a ZIP archive",
4080  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
4081  "   If FILE begins with '|' then open it as a pipe.",
4082  "   Options:",
4083  "     --bom                 Prefix output with a UTF8 byte-order mark",
4084  "     -e                    Send output to the system text editor",
4085  "     -x                    Send output as CSV to a spreadsheet",
4086  ".parameter CMD ...       Manage SQL parameter bindings",
4087  "   clear                   Erase all bindings",
4088  "   init                    Initialize the TEMP table that holds bindings",
4089  "   list                    List the current parameter bindings",
4090  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
4091  "                           PARAMETER should start with one of: $ : @ ?",
4092  "   unset PARAMETER         Remove PARAMETER from the binding table",
4093  ".print STRING...         Print literal STRING",
4094#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4095  ".progress N              Invoke progress handler after every N opcodes",
4096  "   --limit N                 Interrupt after N progress callbacks",
4097  "   --once                    Do no more than one progress interrupt",
4098  "   --quiet|-q                No output except at interrupts",
4099  "   --reset                   Reset the count for each input and interrupt",
4100#endif
4101  ".prompt MAIN CONTINUE    Replace the standard prompts",
4102  ".quit                    Exit this program",
4103  ".read FILE               Read input from FILE",
4104#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4105  ".recover                 Recover as much data as possible from corrupt db.",
4106  "   --freelist-corrupt       Assume the freelist is corrupt",
4107  "   --recovery-db NAME       Store recovery metadata in database file NAME",
4108  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
4109  "   --no-rowids              Do not attempt to recover rowid values",
4110  "                            that are not also INTEGER PRIMARY KEYs",
4111#endif
4112  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
4113  ".save FILE               Write in-memory database into FILE",
4114  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
4115  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
4116  "   Options:",
4117  "      --indent             Try to pretty-print the schema",
4118  "      --nosys              Omit objects whose names start with \"sqlite_\"",
4119  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
4120  "    Options:",
4121  "       --init               Create a new SELFTEST table",
4122  "       -v                   Verbose output",
4123  ".separator COL ?ROW?     Change the column and row separators",
4124#if defined(SQLITE_ENABLE_SESSION)
4125  ".session ?NAME? CMD ...  Create or control sessions",
4126  "   Subcommands:",
4127  "     attach TABLE             Attach TABLE",
4128  "     changeset FILE           Write a changeset into FILE",
4129  "     close                    Close one session",
4130  "     enable ?BOOLEAN?         Set or query the enable bit",
4131  "     filter GLOB...           Reject tables matching GLOBs",
4132  "     indirect ?BOOLEAN?       Mark or query the indirect status",
4133  "     isempty                  Query whether the session is empty",
4134  "     list                     List currently open session names",
4135  "     open DB NAME             Open a new session on DB",
4136  "     patchset FILE            Write a patchset into FILE",
4137  "   If ?NAME? is omitted, the first defined session is used.",
4138#endif
4139  ".sha3sum ...             Compute a SHA3 hash of database content",
4140  "    Options:",
4141  "      --schema              Also hash the sqlite_schema table",
4142  "      --sha3-224            Use the sha3-224 algorithm",
4143  "      --sha3-256            Use the sha3-256 algorithm (default)",
4144  "      --sha3-384            Use the sha3-384 algorithm",
4145  "      --sha3-512            Use the sha3-512 algorithm",
4146  "    Any other argument is a LIKE pattern for tables to hash",
4147#ifndef SQLITE_NOHAVE_SYSTEM
4148  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
4149#endif
4150  ".show                    Show the current values for various settings",
4151  ".stats ?ARG?             Show stats or turn stats on or off",
4152  "   off                      Turn off automatic stat display",
4153  "   on                       Turn on automatic stat display",
4154  "   stmt                     Show statement stats",
4155  "   vmstep                   Show the virtual machine step count only",
4156#ifndef SQLITE_NOHAVE_SYSTEM
4157  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
4158#endif
4159  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
4160  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
4161  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
4162  "                           Run \".testctrl\" with no arguments for details",
4163  ".timeout MS              Try opening locked tables for MS milliseconds",
4164  ".timer on|off            Turn SQL timer on or off",
4165#ifndef SQLITE_OMIT_TRACE
4166  ".trace ?OPTIONS?         Output each SQL statement as it is run",
4167  "    FILE                    Send output to FILE",
4168  "    stdout                  Send output to stdout",
4169  "    stderr                  Send output to stderr",
4170  "    off                     Disable tracing",
4171  "    --expanded              Expand query parameters",
4172#ifdef SQLITE_ENABLE_NORMALIZE
4173  "    --normalized            Normal the SQL statements",
4174#endif
4175  "    --plain                 Show SQL as it is input",
4176  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
4177  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
4178  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
4179  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
4180#endif /* SQLITE_OMIT_TRACE */
4181#ifdef SQLITE_DEBUG
4182  ".unmodule NAME ...       Unregister virtual table modules",
4183  "    --allexcept             Unregister everything except those named",
4184#endif
4185  ".vfsinfo ?AUX?           Information about the top-level VFS",
4186  ".vfslist                 List all available VFSes",
4187  ".vfsname ?AUX?           Print the name of the VFS stack",
4188  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
4189  "     Negative values right-justify",
4190};
4191
4192/*
4193** Output help text.
4194**
4195** zPattern describes the set of commands for which help text is provided.
4196** If zPattern is NULL, then show all commands, but only give a one-line
4197** description of each.
4198**
4199** Return the number of matches.
4200*/
4201static int showHelp(FILE *out, const char *zPattern){
4202  int i = 0;
4203  int j = 0;
4204  int n = 0;
4205  char *zPat;
4206  if( zPattern==0
4207   || zPattern[0]=='0'
4208   || strcmp(zPattern,"-a")==0
4209   || strcmp(zPattern,"-all")==0
4210   || strcmp(zPattern,"--all")==0
4211  ){
4212    /* Show all commands, but only one line per command */
4213    if( zPattern==0 ) zPattern = "";
4214    for(i=0; i<ArraySize(azHelp); i++){
4215      if( azHelp[i][0]=='.' || zPattern[0] ){
4216        utf8_printf(out, "%s\n", azHelp[i]);
4217        n++;
4218      }
4219    }
4220  }else{
4221    /* Look for commands that for which zPattern is an exact prefix */
4222    zPat = sqlite3_mprintf(".%s*", zPattern);
4223    shell_check_oom(zPat);
4224    for(i=0; i<ArraySize(azHelp); i++){
4225      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4226        utf8_printf(out, "%s\n", azHelp[i]);
4227        j = i+1;
4228        n++;
4229      }
4230    }
4231    sqlite3_free(zPat);
4232    if( n ){
4233      if( n==1 ){
4234        /* when zPattern is a prefix of exactly one command, then include the
4235        ** details of that command, which should begin at offset j */
4236        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4237          utf8_printf(out, "%s\n", azHelp[j]);
4238          j++;
4239        }
4240      }
4241      return n;
4242    }
4243    /* Look for commands that contain zPattern anywhere.  Show the complete
4244    ** text of all commands that match. */
4245    zPat = sqlite3_mprintf("%%%s%%", zPattern);
4246    shell_check_oom(zPat);
4247    for(i=0; i<ArraySize(azHelp); i++){
4248      if( azHelp[i][0]=='.' ) j = i;
4249      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4250        utf8_printf(out, "%s\n", azHelp[j]);
4251        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4252          j++;
4253          utf8_printf(out, "%s\n", azHelp[j]);
4254        }
4255        i = j;
4256        n++;
4257      }
4258    }
4259    sqlite3_free(zPat);
4260  }
4261  return n;
4262}
4263
4264/* Forward reference */
4265static int process_input(ShellState *p);
4266
4267/*
4268** Read the content of file zName into memory obtained from sqlite3_malloc64()
4269** and return a pointer to the buffer. The caller is responsible for freeing
4270** the memory.
4271**
4272** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4273** read.
4274**
4275** For convenience, a nul-terminator byte is always appended to the data read
4276** from the file before the buffer is returned. This byte is not included in
4277** the final value of (*pnByte), if applicable.
4278**
4279** NULL is returned if any error is encountered. The final value of *pnByte
4280** is undefined in this case.
4281*/
4282static char *readFile(const char *zName, int *pnByte){
4283  FILE *in = fopen(zName, "rb");
4284  long nIn;
4285  size_t nRead;
4286  char *pBuf;
4287  if( in==0 ) return 0;
4288  fseek(in, 0, SEEK_END);
4289  nIn = ftell(in);
4290  rewind(in);
4291  pBuf = sqlite3_malloc64( nIn+1 );
4292  if( pBuf==0 ){ fclose(in); return 0; }
4293  nRead = fread(pBuf, nIn, 1, in);
4294  fclose(in);
4295  if( nRead!=1 ){
4296    sqlite3_free(pBuf);
4297    return 0;
4298  }
4299  pBuf[nIn] = 0;
4300  if( pnByte ) *pnByte = nIn;
4301  return pBuf;
4302}
4303
4304#if defined(SQLITE_ENABLE_SESSION)
4305/*
4306** Close a single OpenSession object and release all of its associated
4307** resources.
4308*/
4309static void session_close(OpenSession *pSession){
4310  int i;
4311  sqlite3session_delete(pSession->p);
4312  sqlite3_free(pSession->zName);
4313  for(i=0; i<pSession->nFilter; i++){
4314    sqlite3_free(pSession->azFilter[i]);
4315  }
4316  sqlite3_free(pSession->azFilter);
4317  memset(pSession, 0, sizeof(OpenSession));
4318}
4319#endif
4320
4321/*
4322** Close all OpenSession objects and release all associated resources.
4323*/
4324#if defined(SQLITE_ENABLE_SESSION)
4325static void session_close_all(ShellState *p, int i){
4326  int j;
4327  struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4328  for(j=0; j<pAuxDb->nSession; j++){
4329    session_close(&pAuxDb->aSession[j]);
4330  }
4331  pAuxDb->nSession = 0;
4332}
4333#else
4334# define session_close_all(X,Y)
4335#endif
4336
4337/*
4338** Implementation of the xFilter function for an open session.  Omit
4339** any tables named by ".session filter" but let all other table through.
4340*/
4341#if defined(SQLITE_ENABLE_SESSION)
4342static int session_filter(void *pCtx, const char *zTab){
4343  OpenSession *pSession = (OpenSession*)pCtx;
4344  int i;
4345  for(i=0; i<pSession->nFilter; i++){
4346    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4347  }
4348  return 1;
4349}
4350#endif
4351
4352/*
4353** Try to deduce the type of file for zName based on its content.  Return
4354** one of the SHELL_OPEN_* constants.
4355**
4356** If the file does not exist or is empty but its name looks like a ZIP
4357** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4358** Otherwise, assume an ordinary database regardless of the filename if
4359** the type cannot be determined from content.
4360*/
4361int deduceDatabaseType(const char *zName, int dfltZip){
4362  FILE *f = fopen(zName, "rb");
4363  size_t n;
4364  int rc = SHELL_OPEN_UNSPEC;
4365  char zBuf[100];
4366  if( f==0 ){
4367    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4368       return SHELL_OPEN_ZIPFILE;
4369    }else{
4370       return SHELL_OPEN_NORMAL;
4371    }
4372  }
4373  n = fread(zBuf, 16, 1, f);
4374  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4375    fclose(f);
4376    return SHELL_OPEN_NORMAL;
4377  }
4378  fseek(f, -25, SEEK_END);
4379  n = fread(zBuf, 25, 1, f);
4380  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4381    rc = SHELL_OPEN_APPENDVFS;
4382  }else{
4383    fseek(f, -22, SEEK_END);
4384    n = fread(zBuf, 22, 1, f);
4385    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4386       && zBuf[3]==0x06 ){
4387      rc = SHELL_OPEN_ZIPFILE;
4388    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4389      rc = SHELL_OPEN_ZIPFILE;
4390    }
4391  }
4392  fclose(f);
4393  return rc;
4394}
4395
4396#ifndef SQLITE_OMIT_DESERIALIZE
4397/*
4398** Reconstruct an in-memory database using the output from the "dbtotxt"
4399** program.  Read content from the file in p->aAuxDb[].zDbFilename.
4400** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4401*/
4402static unsigned char *readHexDb(ShellState *p, int *pnData){
4403  unsigned char *a = 0;
4404  int nLine;
4405  int n = 0;
4406  int pgsz = 0;
4407  int iOffset = 0;
4408  int j, k;
4409  int rc;
4410  FILE *in;
4411  const char *zDbFilename = p->pAuxDb->zDbFilename;
4412  unsigned int x[16];
4413  char zLine[1000];
4414  if( zDbFilename ){
4415    in = fopen(zDbFilename, "r");
4416    if( in==0 ){
4417      utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4418      return 0;
4419    }
4420    nLine = 0;
4421  }else{
4422    in = p->in;
4423    nLine = p->lineno;
4424    if( in==0 ) in = stdin;
4425  }
4426  *pnData = 0;
4427  nLine++;
4428  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4429  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4430  if( rc!=2 ) goto readHexDb_error;
4431  if( n<0 ) goto readHexDb_error;
4432  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4433  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
4434  a = sqlite3_malloc( n ? n : 1 );
4435  shell_check_oom(a);
4436  memset(a, 0, n);
4437  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4438    utf8_printf(stderr, "invalid pagesize\n");
4439    goto readHexDb_error;
4440  }
4441  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4442    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4443    if( rc==2 ){
4444      iOffset = k;
4445      continue;
4446    }
4447    if( strncmp(zLine, "| end ", 6)==0 ){
4448      break;
4449    }
4450    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4451                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4452                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4453    if( rc==17 ){
4454      k = iOffset+j;
4455      if( k+16<=n && k>=0 ){
4456        int ii;
4457        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4458      }
4459    }
4460  }
4461  *pnData = n;
4462  if( in!=p->in ){
4463    fclose(in);
4464  }else{
4465    p->lineno = nLine;
4466  }
4467  return a;
4468
4469readHexDb_error:
4470  if( in!=p->in ){
4471    fclose(in);
4472  }else{
4473    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4474      nLine++;
4475      if(strncmp(zLine, "| end ", 6)==0 ) break;
4476    }
4477    p->lineno = nLine;
4478  }
4479  sqlite3_free(a);
4480  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4481  return 0;
4482}
4483#endif /* SQLITE_OMIT_DESERIALIZE */
4484
4485/*
4486** Scalar function "shell_int32". The first argument to this function
4487** must be a blob. The second a non-negative integer. This function
4488** reads and returns a 32-bit big-endian integer from byte
4489** offset (4*<arg2>) of the blob.
4490*/
4491static void shellInt32(
4492  sqlite3_context *context,
4493  int argc,
4494  sqlite3_value **argv
4495){
4496  const unsigned char *pBlob;
4497  int nBlob;
4498  int iInt;
4499
4500  UNUSED_PARAMETER(argc);
4501  nBlob = sqlite3_value_bytes(argv[0]);
4502  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4503  iInt = sqlite3_value_int(argv[1]);
4504
4505  if( iInt>=0 && (iInt+1)*4<=nBlob ){
4506    const unsigned char *a = &pBlob[iInt*4];
4507    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4508                       + ((sqlite3_int64)a[1]<<16)
4509                       + ((sqlite3_int64)a[2]<< 8)
4510                       + ((sqlite3_int64)a[3]<< 0);
4511    sqlite3_result_int64(context, iVal);
4512  }
4513}
4514
4515/*
4516** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4517** using "..." with internal double-quote characters doubled.
4518*/
4519static void shellIdQuote(
4520  sqlite3_context *context,
4521  int argc,
4522  sqlite3_value **argv
4523){
4524  const char *zName = (const char*)sqlite3_value_text(argv[0]);
4525  UNUSED_PARAMETER(argc);
4526  if( zName ){
4527    char *z = sqlite3_mprintf("\"%w\"", zName);
4528    sqlite3_result_text(context, z, -1, sqlite3_free);
4529  }
4530}
4531
4532/*
4533** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4534*/
4535static void shellUSleepFunc(
4536  sqlite3_context *context,
4537  int argcUnused,
4538  sqlite3_value **argv
4539){
4540  int sleep = sqlite3_value_int(argv[0]);
4541  (void)argcUnused;
4542  sqlite3_sleep(sleep/1000);
4543  sqlite3_result_int(context, sleep);
4544}
4545
4546/*
4547** Scalar function "shell_escape_crnl" used by the .recover command.
4548** The argument passed to this function is the output of built-in
4549** function quote(). If the first character of the input is "'",
4550** indicating that the value passed to quote() was a text value,
4551** then this function searches the input for "\n" and "\r" characters
4552** and adds a wrapper similar to the following:
4553**
4554**   replace(replace(<input>, '\n', char(10), '\r', char(13));
4555**
4556** Or, if the first character of the input is not "'", then a copy
4557** of the input is returned.
4558*/
4559static void shellEscapeCrnl(
4560  sqlite3_context *context,
4561  int argc,
4562  sqlite3_value **argv
4563){
4564  const char *zText = (const char*)sqlite3_value_text(argv[0]);
4565  UNUSED_PARAMETER(argc);
4566  if( zText && zText[0]=='\'' ){
4567    int nText = sqlite3_value_bytes(argv[0]);
4568    int i;
4569    char zBuf1[20];
4570    char zBuf2[20];
4571    const char *zNL = 0;
4572    const char *zCR = 0;
4573    int nCR = 0;
4574    int nNL = 0;
4575
4576    for(i=0; zText[i]; i++){
4577      if( zNL==0 && zText[i]=='\n' ){
4578        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4579        nNL = (int)strlen(zNL);
4580      }
4581      if( zCR==0 && zText[i]=='\r' ){
4582        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4583        nCR = (int)strlen(zCR);
4584      }
4585    }
4586
4587    if( zNL || zCR ){
4588      int iOut = 0;
4589      i64 nMax = (nNL > nCR) ? nNL : nCR;
4590      i64 nAlloc = nMax * nText + (nMax+64)*2;
4591      char *zOut = (char*)sqlite3_malloc64(nAlloc);
4592      if( zOut==0 ){
4593        sqlite3_result_error_nomem(context);
4594        return;
4595      }
4596
4597      if( zNL && zCR ){
4598        memcpy(&zOut[iOut], "replace(replace(", 16);
4599        iOut += 16;
4600      }else{
4601        memcpy(&zOut[iOut], "replace(", 8);
4602        iOut += 8;
4603      }
4604      for(i=0; zText[i]; i++){
4605        if( zText[i]=='\n' ){
4606          memcpy(&zOut[iOut], zNL, nNL);
4607          iOut += nNL;
4608        }else if( zText[i]=='\r' ){
4609          memcpy(&zOut[iOut], zCR, nCR);
4610          iOut += nCR;
4611        }else{
4612          zOut[iOut] = zText[i];
4613          iOut++;
4614        }
4615      }
4616
4617      if( zNL ){
4618        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4619        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
4620        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
4621      }
4622      if( zCR ){
4623        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4624        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
4625        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
4626      }
4627
4628      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
4629      sqlite3_free(zOut);
4630      return;
4631    }
4632  }
4633
4634  sqlite3_result_value(context, argv[0]);
4635}
4636
4637/* Flags for open_db().
4638**
4639** The default behavior of open_db() is to exit(1) if the database fails to
4640** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
4641** but still returns without calling exit.
4642**
4643** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
4644** ZIP archive if the file does not exist or is empty and its name matches
4645** the *.zip pattern.
4646*/
4647#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
4648#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
4649
4650/*
4651** Make sure the database is open.  If it is not, then open it.  If
4652** the database fails to open, print an error message and exit.
4653*/
4654static void open_db(ShellState *p, int openFlags){
4655  if( p->db==0 ){
4656    const char *zDbFilename = p->pAuxDb->zDbFilename;
4657    if( p->openMode==SHELL_OPEN_UNSPEC ){
4658      if( zDbFilename==0 || zDbFilename[0]==0 ){
4659        p->openMode = SHELL_OPEN_NORMAL;
4660      }else{
4661        p->openMode = (u8)deduceDatabaseType(zDbFilename,
4662                             (openFlags & OPEN_DB_ZIPFILE)!=0);
4663      }
4664    }
4665    switch( p->openMode ){
4666      case SHELL_OPEN_APPENDVFS: {
4667        sqlite3_open_v2(zDbFilename, &p->db,
4668           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
4669        break;
4670      }
4671      case SHELL_OPEN_HEXDB:
4672      case SHELL_OPEN_DESERIALIZE: {
4673        sqlite3_open(0, &p->db);
4674        break;
4675      }
4676      case SHELL_OPEN_ZIPFILE: {
4677        sqlite3_open(":memory:", &p->db);
4678        break;
4679      }
4680      case SHELL_OPEN_READONLY: {
4681        sqlite3_open_v2(zDbFilename, &p->db,
4682            SQLITE_OPEN_READONLY|p->openFlags, 0);
4683        break;
4684      }
4685      case SHELL_OPEN_UNSPEC:
4686      case SHELL_OPEN_NORMAL: {
4687        sqlite3_open_v2(zDbFilename, &p->db,
4688           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
4689        break;
4690      }
4691    }
4692    globalDb = p->db;
4693    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4694      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4695          zDbFilename, sqlite3_errmsg(p->db));
4696      if( openFlags & OPEN_DB_KEEPALIVE ){
4697        sqlite3_open(":memory:", &p->db);
4698        return;
4699      }
4700      exit(1);
4701    }
4702#ifndef SQLITE_OMIT_LOAD_EXTENSION
4703    sqlite3_enable_load_extension(p->db, 1);
4704#endif
4705    sqlite3_fileio_init(p->db, 0, 0);
4706    sqlite3_shathree_init(p->db, 0, 0);
4707    sqlite3_completion_init(p->db, 0, 0);
4708    sqlite3_uint_init(p->db, 0, 0);
4709    sqlite3_decimal_init(p->db, 0, 0);
4710    sqlite3_regexp_init(p->db, 0, 0);
4711    sqlite3_ieee_init(p->db, 0, 0);
4712    sqlite3_series_init(p->db, 0, 0);
4713#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4714    sqlite3_dbdata_init(p->db, 0, 0);
4715#endif
4716#ifdef SQLITE_HAVE_ZLIB
4717    sqlite3_zipfile_init(p->db, 0, 0);
4718    sqlite3_sqlar_init(p->db, 0, 0);
4719#endif
4720    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
4721                            shellAddSchemaName, 0, 0);
4722    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
4723                            shellModuleSchema, 0, 0);
4724    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
4725                            shellPutsFunc, 0, 0);
4726    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
4727                            shellEscapeCrnl, 0, 0);
4728    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
4729                            shellInt32, 0, 0);
4730    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
4731                            shellIdQuote, 0, 0);
4732    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
4733                            shellUSleepFunc, 0, 0);
4734#ifndef SQLITE_NOHAVE_SYSTEM
4735    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
4736                            editFunc, 0, 0);
4737    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
4738                            editFunc, 0, 0);
4739#endif
4740    if( p->openMode==SHELL_OPEN_ZIPFILE ){
4741      char *zSql = sqlite3_mprintf(
4742         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
4743      shell_check_oom(zSql);
4744      sqlite3_exec(p->db, zSql, 0, 0, 0);
4745      sqlite3_free(zSql);
4746    }
4747#ifndef SQLITE_OMIT_DESERIALIZE
4748    else
4749    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
4750      int rc;
4751      int nData = 0;
4752      unsigned char *aData;
4753      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
4754        aData = (unsigned char*)readFile(zDbFilename, &nData);
4755      }else{
4756        aData = readHexDb(p, &nData);
4757        if( aData==0 ){
4758          return;
4759        }
4760      }
4761      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
4762                   SQLITE_DESERIALIZE_RESIZEABLE |
4763                   SQLITE_DESERIALIZE_FREEONCLOSE);
4764      if( rc ){
4765        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
4766      }
4767      if( p->szMax>0 ){
4768        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
4769      }
4770    }
4771#endif
4772  }
4773  if( p->bSafeModePersist && p->db!=0 ){
4774    sqlite3_set_authorizer(p->db, safeModeAuth, p);
4775  }
4776}
4777
4778/*
4779** Attempt to close the databaes connection.  Report errors.
4780*/
4781void close_db(sqlite3 *db){
4782  int rc = sqlite3_close(db);
4783  if( rc ){
4784    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
4785        rc, sqlite3_errmsg(db));
4786  }
4787}
4788
4789#if HAVE_READLINE || HAVE_EDITLINE
4790/*
4791** Readline completion callbacks
4792*/
4793static char *readline_completion_generator(const char *text, int state){
4794  static sqlite3_stmt *pStmt = 0;
4795  char *zRet;
4796  if( state==0 ){
4797    char *zSql;
4798    sqlite3_finalize(pStmt);
4799    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4800                           "  FROM completion(%Q) ORDER BY 1", text);
4801    shell_check_oom(zSql);
4802    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4803    sqlite3_free(zSql);
4804  }
4805  if( sqlite3_step(pStmt)==SQLITE_ROW ){
4806    const char *z = (const char*)sqlite3_column_text(pStmt,0);
4807    zRet = z ? strdup(z) : 0;
4808  }else{
4809    sqlite3_finalize(pStmt);
4810    pStmt = 0;
4811    zRet = 0;
4812  }
4813  return zRet;
4814}
4815static char **readline_completion(const char *zText, int iStart, int iEnd){
4816  rl_attempted_completion_over = 1;
4817  return rl_completion_matches(zText, readline_completion_generator);
4818}
4819
4820#elif HAVE_LINENOISE
4821/*
4822** Linenoise completion callback
4823*/
4824static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
4825  int nLine = strlen30(zLine);
4826  int i, iStart;
4827  sqlite3_stmt *pStmt = 0;
4828  char *zSql;
4829  char zBuf[1000];
4830
4831  if( nLine>sizeof(zBuf)-30 ) return;
4832  if( zLine[0]=='.' || zLine[0]=='#') return;
4833  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
4834  if( i==nLine-1 ) return;
4835  iStart = i+1;
4836  memcpy(zBuf, zLine, iStart);
4837  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4838                         "  FROM completion(%Q,%Q) ORDER BY 1",
4839                         &zLine[iStart], zLine);
4840  shell_check_oom(zSql);
4841  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4842  sqlite3_free(zSql);
4843  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
4844  while( sqlite3_step(pStmt)==SQLITE_ROW ){
4845    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
4846    int nCompletion = sqlite3_column_bytes(pStmt, 0);
4847    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
4848      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
4849      linenoiseAddCompletion(lc, zBuf);
4850    }
4851  }
4852  sqlite3_finalize(pStmt);
4853}
4854#endif
4855
4856/*
4857** Do C-language style dequoting.
4858**
4859**    \a    -> alarm
4860**    \b    -> backspace
4861**    \t    -> tab
4862**    \n    -> newline
4863**    \v    -> vertical tab
4864**    \f    -> form feed
4865**    \r    -> carriage return
4866**    \s    -> space
4867**    \"    -> "
4868**    \'    -> '
4869**    \\    -> backslash
4870**    \NNN  -> ascii character NNN in octal
4871*/
4872static void resolve_backslashes(char *z){
4873  int i, j;
4874  char c;
4875  while( *z && *z!='\\' ) z++;
4876  for(i=j=0; (c = z[i])!=0; i++, j++){
4877    if( c=='\\' && z[i+1]!=0 ){
4878      c = z[++i];
4879      if( c=='a' ){
4880        c = '\a';
4881      }else if( c=='b' ){
4882        c = '\b';
4883      }else if( c=='t' ){
4884        c = '\t';
4885      }else if( c=='n' ){
4886        c = '\n';
4887      }else if( c=='v' ){
4888        c = '\v';
4889      }else if( c=='f' ){
4890        c = '\f';
4891      }else if( c=='r' ){
4892        c = '\r';
4893      }else if( c=='"' ){
4894        c = '"';
4895      }else if( c=='\'' ){
4896        c = '\'';
4897      }else if( c=='\\' ){
4898        c = '\\';
4899      }else if( c>='0' && c<='7' ){
4900        c -= '0';
4901        if( z[i+1]>='0' && z[i+1]<='7' ){
4902          i++;
4903          c = (c<<3) + z[i] - '0';
4904          if( z[i+1]>='0' && z[i+1]<='7' ){
4905            i++;
4906            c = (c<<3) + z[i] - '0';
4907          }
4908        }
4909      }
4910    }
4911    z[j] = c;
4912  }
4913  if( j<i ) z[j] = 0;
4914}
4915
4916/*
4917** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
4918** for TRUE and FALSE.  Return the integer value if appropriate.
4919*/
4920static int booleanValue(const char *zArg){
4921  int i;
4922  if( zArg[0]=='0' && zArg[1]=='x' ){
4923    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
4924  }else{
4925    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
4926  }
4927  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
4928  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
4929    return 1;
4930  }
4931  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
4932    return 0;
4933  }
4934  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
4935          zArg);
4936  return 0;
4937}
4938
4939/*
4940** Set or clear a shell flag according to a boolean value.
4941*/
4942static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
4943  if( booleanValue(zArg) ){
4944    ShellSetFlag(p, mFlag);
4945  }else{
4946    ShellClearFlag(p, mFlag);
4947  }
4948}
4949
4950/*
4951** Close an output file, assuming it is not stderr or stdout
4952*/
4953static void output_file_close(FILE *f){
4954  if( f && f!=stdout && f!=stderr ) fclose(f);
4955}
4956
4957/*
4958** Try to open an output file.   The names "stdout" and "stderr" are
4959** recognized and do the right thing.  NULL is returned if the output
4960** filename is "off".
4961*/
4962static FILE *output_file_open(const char *zFile, int bTextMode){
4963  FILE *f;
4964  if( strcmp(zFile,"stdout")==0 ){
4965    f = stdout;
4966  }else if( strcmp(zFile, "stderr")==0 ){
4967    f = stderr;
4968  }else if( strcmp(zFile, "off")==0 ){
4969    f = 0;
4970  }else{
4971    f = fopen(zFile, bTextMode ? "w" : "wb");
4972    if( f==0 ){
4973      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
4974    }
4975  }
4976  return f;
4977}
4978
4979#ifndef SQLITE_OMIT_TRACE
4980/*
4981** A routine for handling output from sqlite3_trace().
4982*/
4983static int sql_trace_callback(
4984  unsigned mType,         /* The trace type */
4985  void *pArg,             /* The ShellState pointer */
4986  void *pP,               /* Usually a pointer to sqlite_stmt */
4987  void *pX                /* Auxiliary output */
4988){
4989  ShellState *p = (ShellState*)pArg;
4990  sqlite3_stmt *pStmt;
4991  const char *zSql;
4992  int nSql;
4993  if( p->traceOut==0 ) return 0;
4994  if( mType==SQLITE_TRACE_CLOSE ){
4995    utf8_printf(p->traceOut, "-- closing database connection\n");
4996    return 0;
4997  }
4998  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
4999    zSql = (const char*)pX;
5000  }else{
5001    pStmt = (sqlite3_stmt*)pP;
5002    switch( p->eTraceType ){
5003      case SHELL_TRACE_EXPANDED: {
5004        zSql = sqlite3_expanded_sql(pStmt);
5005        break;
5006      }
5007#ifdef SQLITE_ENABLE_NORMALIZE
5008      case SHELL_TRACE_NORMALIZED: {
5009        zSql = sqlite3_normalized_sql(pStmt);
5010        break;
5011      }
5012#endif
5013      default: {
5014        zSql = sqlite3_sql(pStmt);
5015        break;
5016      }
5017    }
5018  }
5019  if( zSql==0 ) return 0;
5020  nSql = strlen30(zSql);
5021  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5022  switch( mType ){
5023    case SQLITE_TRACE_ROW:
5024    case SQLITE_TRACE_STMT: {
5025      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5026      break;
5027    }
5028    case SQLITE_TRACE_PROFILE: {
5029      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5030      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5031      break;
5032    }
5033  }
5034  return 0;
5035}
5036#endif
5037
5038/*
5039** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5040** a useful spot to set a debugger breakpoint.
5041*/
5042static void test_breakpoint(void){
5043  static int nCall = 0;
5044  nCall++;
5045}
5046
5047/*
5048** An object used to read a CSV and other files for import.
5049*/
5050typedef struct ImportCtx ImportCtx;
5051struct ImportCtx {
5052  const char *zFile;  /* Name of the input file */
5053  FILE *in;           /* Read the CSV text from this input stream */
5054  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5055  char *z;            /* Accumulated text for a field */
5056  int n;              /* Number of bytes in z */
5057  int nAlloc;         /* Space allocated for z[] */
5058  int nLine;          /* Current line number */
5059  int nRow;           /* Number of rows imported */
5060  int nErr;           /* Number of errors encountered */
5061  int bNotFirst;      /* True if one or more bytes already read */
5062  int cTerm;          /* Character that terminated the most recent field */
5063  int cColSep;        /* The column separator character.  (Usually ",") */
5064  int cRowSep;        /* The row separator character.  (Usually "\n") */
5065};
5066
5067/* Clean up resourced used by an ImportCtx */
5068static void import_cleanup(ImportCtx *p){
5069  if( p->in!=0 && p->xCloser!=0 ){
5070    p->xCloser(p->in);
5071    p->in = 0;
5072  }
5073  sqlite3_free(p->z);
5074  p->z = 0;
5075}
5076
5077/* Append a single byte to z[] */
5078static void import_append_char(ImportCtx *p, int c){
5079  if( p->n+1>=p->nAlloc ){
5080    p->nAlloc += p->nAlloc + 100;
5081    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5082    shell_check_oom(p->z);
5083  }
5084  p->z[p->n++] = (char)c;
5085}
5086
5087/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5088** with the option of having a separator other than ",".
5089**
5090**   +  Input comes from p->in.
5091**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5092**      from sqlite3_malloc64().
5093**   +  Use p->cSep as the column separator.  The default is ",".
5094**   +  Use p->rSep as the row separator.  The default is "\n".
5095**   +  Keep track of the line number in p->nLine.
5096**   +  Store the character that terminates the field in p->cTerm.  Store
5097**      EOF on end-of-file.
5098**   +  Report syntax errors on stderr
5099*/
5100static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5101  int c;
5102  int cSep = p->cColSep;
5103  int rSep = p->cRowSep;
5104  p->n = 0;
5105  c = fgetc(p->in);
5106  if( c==EOF || seenInterrupt ){
5107    p->cTerm = EOF;
5108    return 0;
5109  }
5110  if( c=='"' ){
5111    int pc, ppc;
5112    int startLine = p->nLine;
5113    int cQuote = c;
5114    pc = ppc = 0;
5115    while( 1 ){
5116      c = fgetc(p->in);
5117      if( c==rSep ) p->nLine++;
5118      if( c==cQuote ){
5119        if( pc==cQuote ){
5120          pc = 0;
5121          continue;
5122        }
5123      }
5124      if( (c==cSep && pc==cQuote)
5125       || (c==rSep && pc==cQuote)
5126       || (c==rSep && pc=='\r' && ppc==cQuote)
5127       || (c==EOF && pc==cQuote)
5128      ){
5129        do{ p->n--; }while( p->z[p->n]!=cQuote );
5130        p->cTerm = c;
5131        break;
5132      }
5133      if( pc==cQuote && c!='\r' ){
5134        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5135                p->zFile, p->nLine, cQuote);
5136      }
5137      if( c==EOF ){
5138        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5139                p->zFile, startLine, cQuote);
5140        p->cTerm = c;
5141        break;
5142      }
5143      import_append_char(p, c);
5144      ppc = pc;
5145      pc = c;
5146    }
5147  }else{
5148    /* If this is the first field being parsed and it begins with the
5149    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5150    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5151      import_append_char(p, c);
5152      c = fgetc(p->in);
5153      if( (c&0xff)==0xbb ){
5154        import_append_char(p, c);
5155        c = fgetc(p->in);
5156        if( (c&0xff)==0xbf ){
5157          p->bNotFirst = 1;
5158          p->n = 0;
5159          return csv_read_one_field(p);
5160        }
5161      }
5162    }
5163    while( c!=EOF && c!=cSep && c!=rSep ){
5164      import_append_char(p, c);
5165      c = fgetc(p->in);
5166    }
5167    if( c==rSep ){
5168      p->nLine++;
5169      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5170    }
5171    p->cTerm = c;
5172  }
5173  if( p->z ) p->z[p->n] = 0;
5174  p->bNotFirst = 1;
5175  return p->z;
5176}
5177
5178/* Read a single field of ASCII delimited text.
5179**
5180**   +  Input comes from p->in.
5181**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5182**      from sqlite3_malloc64().
5183**   +  Use p->cSep as the column separator.  The default is "\x1F".
5184**   +  Use p->rSep as the row separator.  The default is "\x1E".
5185**   +  Keep track of the row number in p->nLine.
5186**   +  Store the character that terminates the field in p->cTerm.  Store
5187**      EOF on end-of-file.
5188**   +  Report syntax errors on stderr
5189*/
5190static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5191  int c;
5192  int cSep = p->cColSep;
5193  int rSep = p->cRowSep;
5194  p->n = 0;
5195  c = fgetc(p->in);
5196  if( c==EOF || seenInterrupt ){
5197    p->cTerm = EOF;
5198    return 0;
5199  }
5200  while( c!=EOF && c!=cSep && c!=rSep ){
5201    import_append_char(p, c);
5202    c = fgetc(p->in);
5203  }
5204  if( c==rSep ){
5205    p->nLine++;
5206  }
5207  p->cTerm = c;
5208  if( p->z ) p->z[p->n] = 0;
5209  return p->z;
5210}
5211
5212/*
5213** Try to transfer data for table zTable.  If an error is seen while
5214** moving forward, try to go backwards.  The backwards movement won't
5215** work for WITHOUT ROWID tables.
5216*/
5217static void tryToCloneData(
5218  ShellState *p,
5219  sqlite3 *newDb,
5220  const char *zTable
5221){
5222  sqlite3_stmt *pQuery = 0;
5223  sqlite3_stmt *pInsert = 0;
5224  char *zQuery = 0;
5225  char *zInsert = 0;
5226  int rc;
5227  int i, j, n;
5228  int nTable = strlen30(zTable);
5229  int k = 0;
5230  int cnt = 0;
5231  const int spinRate = 10000;
5232
5233  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5234  shell_check_oom(zQuery);
5235  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5236  if( rc ){
5237    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5238            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5239            zQuery);
5240    goto end_data_xfer;
5241  }
5242  n = sqlite3_column_count(pQuery);
5243  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5244  shell_check_oom(zInsert);
5245  sqlite3_snprintf(200+nTable,zInsert,
5246                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5247  i = strlen30(zInsert);
5248  for(j=1; j<n; j++){
5249    memcpy(zInsert+i, ",?", 2);
5250    i += 2;
5251  }
5252  memcpy(zInsert+i, ");", 3);
5253  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5254  if( rc ){
5255    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5256            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5257            zQuery);
5258    goto end_data_xfer;
5259  }
5260  for(k=0; k<2; k++){
5261    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5262      for(i=0; i<n; i++){
5263        switch( sqlite3_column_type(pQuery, i) ){
5264          case SQLITE_NULL: {
5265            sqlite3_bind_null(pInsert, i+1);
5266            break;
5267          }
5268          case SQLITE_INTEGER: {
5269            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5270            break;
5271          }
5272          case SQLITE_FLOAT: {
5273            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5274            break;
5275          }
5276          case SQLITE_TEXT: {
5277            sqlite3_bind_text(pInsert, i+1,
5278                             (const char*)sqlite3_column_text(pQuery,i),
5279                             -1, SQLITE_STATIC);
5280            break;
5281          }
5282          case SQLITE_BLOB: {
5283            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5284                                            sqlite3_column_bytes(pQuery,i),
5285                                            SQLITE_STATIC);
5286            break;
5287          }
5288        }
5289      } /* End for */
5290      rc = sqlite3_step(pInsert);
5291      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5292        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5293                        sqlite3_errmsg(newDb));
5294      }
5295      sqlite3_reset(pInsert);
5296      cnt++;
5297      if( (cnt%spinRate)==0 ){
5298        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5299        fflush(stdout);
5300      }
5301    } /* End while */
5302    if( rc==SQLITE_DONE ) break;
5303    sqlite3_finalize(pQuery);
5304    sqlite3_free(zQuery);
5305    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5306                             zTable);
5307    shell_check_oom(zQuery);
5308    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5309    if( rc ){
5310      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5311      break;
5312    }
5313  } /* End for(k=0...) */
5314
5315end_data_xfer:
5316  sqlite3_finalize(pQuery);
5317  sqlite3_finalize(pInsert);
5318  sqlite3_free(zQuery);
5319  sqlite3_free(zInsert);
5320}
5321
5322
5323/*
5324** Try to transfer all rows of the schema that match zWhere.  For
5325** each row, invoke xForEach() on the object defined by that row.
5326** If an error is encountered while moving forward through the
5327** sqlite_schema table, try again moving backwards.
5328*/
5329static void tryToCloneSchema(
5330  ShellState *p,
5331  sqlite3 *newDb,
5332  const char *zWhere,
5333  void (*xForEach)(ShellState*,sqlite3*,const char*)
5334){
5335  sqlite3_stmt *pQuery = 0;
5336  char *zQuery = 0;
5337  int rc;
5338  const unsigned char *zName;
5339  const unsigned char *zSql;
5340  char *zErrMsg = 0;
5341
5342  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5343                           " WHERE %s", zWhere);
5344  shell_check_oom(zQuery);
5345  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5346  if( rc ){
5347    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5348                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5349                    zQuery);
5350    goto end_schema_xfer;
5351  }
5352  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5353    zName = sqlite3_column_text(pQuery, 0);
5354    zSql = sqlite3_column_text(pQuery, 1);
5355    if( zName==0 || zSql==0 ) continue;
5356    printf("%s... ", zName); fflush(stdout);
5357    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5358    if( zErrMsg ){
5359      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5360      sqlite3_free(zErrMsg);
5361      zErrMsg = 0;
5362    }
5363    if( xForEach ){
5364      xForEach(p, newDb, (const char*)zName);
5365    }
5366    printf("done\n");
5367  }
5368  if( rc!=SQLITE_DONE ){
5369    sqlite3_finalize(pQuery);
5370    sqlite3_free(zQuery);
5371    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5372                             " WHERE %s ORDER BY rowid DESC", zWhere);
5373    shell_check_oom(zQuery);
5374    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5375    if( rc ){
5376      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5377                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5378                      zQuery);
5379      goto end_schema_xfer;
5380    }
5381    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5382      zName = sqlite3_column_text(pQuery, 0);
5383      zSql = sqlite3_column_text(pQuery, 1);
5384      if( zName==0 || zSql==0 ) continue;
5385      printf("%s... ", zName); fflush(stdout);
5386      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5387      if( zErrMsg ){
5388        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5389        sqlite3_free(zErrMsg);
5390        zErrMsg = 0;
5391      }
5392      if( xForEach ){
5393        xForEach(p, newDb, (const char*)zName);
5394      }
5395      printf("done\n");
5396    }
5397  }
5398end_schema_xfer:
5399  sqlite3_finalize(pQuery);
5400  sqlite3_free(zQuery);
5401}
5402
5403/*
5404** Open a new database file named "zNewDb".  Try to recover as much information
5405** as possible out of the main database (which might be corrupt) and write it
5406** into zNewDb.
5407*/
5408static void tryToClone(ShellState *p, const char *zNewDb){
5409  int rc;
5410  sqlite3 *newDb = 0;
5411  if( access(zNewDb,0)==0 ){
5412    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5413    return;
5414  }
5415  rc = sqlite3_open(zNewDb, &newDb);
5416  if( rc ){
5417    utf8_printf(stderr, "Cannot create output database: %s\n",
5418            sqlite3_errmsg(newDb));
5419  }else{
5420    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5421    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5422    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5423    tryToCloneSchema(p, newDb, "type!='table'", 0);
5424    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5425    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5426  }
5427  close_db(newDb);
5428}
5429
5430/*
5431** Change the output file back to stdout.
5432**
5433** If the p->doXdgOpen flag is set, that means the output was being
5434** redirected to a temporary file named by p->zTempFile.  In that case,
5435** launch start/open/xdg-open on that temporary file.
5436*/
5437static void output_reset(ShellState *p){
5438  if( p->outfile[0]=='|' ){
5439#ifndef SQLITE_OMIT_POPEN
5440    pclose(p->out);
5441#endif
5442  }else{
5443    output_file_close(p->out);
5444#ifndef SQLITE_NOHAVE_SYSTEM
5445    if( p->doXdgOpen ){
5446      const char *zXdgOpenCmd =
5447#if defined(_WIN32)
5448      "start";
5449#elif defined(__APPLE__)
5450      "open";
5451#else
5452      "xdg-open";
5453#endif
5454      char *zCmd;
5455      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5456      if( system(zCmd) ){
5457        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5458      }else{
5459        /* Give the start/open/xdg-open command some time to get
5460        ** going before we continue, and potential delete the
5461        ** p->zTempFile data file out from under it */
5462        sqlite3_sleep(2000);
5463      }
5464      sqlite3_free(zCmd);
5465      outputModePop(p);
5466      p->doXdgOpen = 0;
5467    }
5468#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5469  }
5470  p->outfile[0] = 0;
5471  p->out = stdout;
5472}
5473
5474/*
5475** Run an SQL command and return the single integer result.
5476*/
5477static int db_int(ShellState *p, const char *zSql){
5478  sqlite3_stmt *pStmt;
5479  int res = 0;
5480  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5481  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5482    res = sqlite3_column_int(pStmt,0);
5483  }
5484  sqlite3_finalize(pStmt);
5485  return res;
5486}
5487
5488/*
5489** Convert a 2-byte or 4-byte big-endian integer into a native integer
5490*/
5491static unsigned int get2byteInt(unsigned char *a){
5492  return (a[0]<<8) + a[1];
5493}
5494static unsigned int get4byteInt(unsigned char *a){
5495  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5496}
5497
5498/*
5499** Implementation of the ".dbinfo" command.
5500**
5501** Return 1 on error, 2 to exit, and 0 otherwise.
5502*/
5503static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5504  static const struct { const char *zName; int ofst; } aField[] = {
5505     { "file change counter:",  24  },
5506     { "database page count:",  28  },
5507     { "freelist page count:",  36  },
5508     { "schema cookie:",        40  },
5509     { "schema format:",        44  },
5510     { "default cache size:",   48  },
5511     { "autovacuum top root:",  52  },
5512     { "incremental vacuum:",   64  },
5513     { "text encoding:",        56  },
5514     { "user version:",         60  },
5515     { "application id:",       68  },
5516     { "software version:",     96  },
5517  };
5518  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5519     { "number of tables:",
5520       "SELECT count(*) FROM %s WHERE type='table'" },
5521     { "number of indexes:",
5522       "SELECT count(*) FROM %s WHERE type='index'" },
5523     { "number of triggers:",
5524       "SELECT count(*) FROM %s WHERE type='trigger'" },
5525     { "number of views:",
5526       "SELECT count(*) FROM %s WHERE type='view'" },
5527     { "schema size:",
5528       "SELECT total(length(sql)) FROM %s" },
5529  };
5530  int i, rc;
5531  unsigned iDataVersion;
5532  char *zSchemaTab;
5533  char *zDb = nArg>=2 ? azArg[1] : "main";
5534  sqlite3_stmt *pStmt = 0;
5535  unsigned char aHdr[100];
5536  open_db(p, 0);
5537  if( p->db==0 ) return 1;
5538  rc = sqlite3_prepare_v2(p->db,
5539             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5540             -1, &pStmt, 0);
5541  if( rc ){
5542    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5543    sqlite3_finalize(pStmt);
5544    return 1;
5545  }
5546  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5547  if( sqlite3_step(pStmt)==SQLITE_ROW
5548   && sqlite3_column_bytes(pStmt,0)>100
5549  ){
5550    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5551    sqlite3_finalize(pStmt);
5552  }else{
5553    raw_printf(stderr, "unable to read database header\n");
5554    sqlite3_finalize(pStmt);
5555    return 1;
5556  }
5557  i = get2byteInt(aHdr+16);
5558  if( i==1 ) i = 65536;
5559  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5560  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5561  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5562  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5563  for(i=0; i<ArraySize(aField); i++){
5564    int ofst = aField[i].ofst;
5565    unsigned int val = get4byteInt(aHdr + ofst);
5566    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5567    switch( ofst ){
5568      case 56: {
5569        if( val==1 ) raw_printf(p->out, " (utf8)");
5570        if( val==2 ) raw_printf(p->out, " (utf16le)");
5571        if( val==3 ) raw_printf(p->out, " (utf16be)");
5572      }
5573    }
5574    raw_printf(p->out, "\n");
5575  }
5576  if( zDb==0 ){
5577    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5578  }else if( strcmp(zDb,"temp")==0 ){
5579    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5580  }else{
5581    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5582  }
5583  for(i=0; i<ArraySize(aQuery); i++){
5584    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5585    int val = db_int(p, zSql);
5586    sqlite3_free(zSql);
5587    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5588  }
5589  sqlite3_free(zSchemaTab);
5590  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5591  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5592  return 0;
5593}
5594
5595/*
5596** Print the current sqlite3_errmsg() value to stderr and return 1.
5597*/
5598static int shellDatabaseError(sqlite3 *db){
5599  const char *zErr = sqlite3_errmsg(db);
5600  utf8_printf(stderr, "Error: %s\n", zErr);
5601  return 1;
5602}
5603
5604/*
5605** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
5606** if they match and FALSE (0) if they do not match.
5607**
5608** Globbing rules:
5609**
5610**      '*'       Matches any sequence of zero or more characters.
5611**
5612**      '?'       Matches exactly one character.
5613**
5614**     [...]      Matches one character from the enclosed list of
5615**                characters.
5616**
5617**     [^...]     Matches one character not in the enclosed list.
5618**
5619**      '#'       Matches any sequence of one or more digits with an
5620**                optional + or - sign in front
5621**
5622**      ' '       Any span of whitespace matches any other span of
5623**                whitespace.
5624**
5625** Extra whitespace at the end of z[] is ignored.
5626*/
5627static int testcase_glob(const char *zGlob, const char *z){
5628  int c, c2;
5629  int invert;
5630  int seen;
5631
5632  while( (c = (*(zGlob++)))!=0 ){
5633    if( IsSpace(c) ){
5634      if( !IsSpace(*z) ) return 0;
5635      while( IsSpace(*zGlob) ) zGlob++;
5636      while( IsSpace(*z) ) z++;
5637    }else if( c=='*' ){
5638      while( (c=(*(zGlob++))) == '*' || c=='?' ){
5639        if( c=='?' && (*(z++))==0 ) return 0;
5640      }
5641      if( c==0 ){
5642        return 1;
5643      }else if( c=='[' ){
5644        while( *z && testcase_glob(zGlob-1,z)==0 ){
5645          z++;
5646        }
5647        return (*z)!=0;
5648      }
5649      while( (c2 = (*(z++)))!=0 ){
5650        while( c2!=c ){
5651          c2 = *(z++);
5652          if( c2==0 ) return 0;
5653        }
5654        if( testcase_glob(zGlob,z) ) return 1;
5655      }
5656      return 0;
5657    }else if( c=='?' ){
5658      if( (*(z++))==0 ) return 0;
5659    }else if( c=='[' ){
5660      int prior_c = 0;
5661      seen = 0;
5662      invert = 0;
5663      c = *(z++);
5664      if( c==0 ) return 0;
5665      c2 = *(zGlob++);
5666      if( c2=='^' ){
5667        invert = 1;
5668        c2 = *(zGlob++);
5669      }
5670      if( c2==']' ){
5671        if( c==']' ) seen = 1;
5672        c2 = *(zGlob++);
5673      }
5674      while( c2 && c2!=']' ){
5675        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5676          c2 = *(zGlob++);
5677          if( c>=prior_c && c<=c2 ) seen = 1;
5678          prior_c = 0;
5679        }else{
5680          if( c==c2 ){
5681            seen = 1;
5682          }
5683          prior_c = c2;
5684        }
5685        c2 = *(zGlob++);
5686      }
5687      if( c2==0 || (seen ^ invert)==0 ) return 0;
5688    }else if( c=='#' ){
5689      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5690      if( !IsDigit(z[0]) ) return 0;
5691      z++;
5692      while( IsDigit(z[0]) ){ z++; }
5693    }else{
5694      if( c!=(*(z++)) ) return 0;
5695    }
5696  }
5697  while( IsSpace(*z) ){ z++; }
5698  return *z==0;
5699}
5700
5701
5702/*
5703** Compare the string as a command-line option with either one or two
5704** initial "-" characters.
5705*/
5706static int optionMatch(const char *zStr, const char *zOpt){
5707  if( zStr[0]!='-' ) return 0;
5708  zStr++;
5709  if( zStr[0]=='-' ) zStr++;
5710  return strcmp(zStr, zOpt)==0;
5711}
5712
5713/*
5714** Delete a file.
5715*/
5716int shellDeleteFile(const char *zFilename){
5717  int rc;
5718#ifdef _WIN32
5719  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
5720  rc = _wunlink(z);
5721  sqlite3_free(z);
5722#else
5723  rc = unlink(zFilename);
5724#endif
5725  return rc;
5726}
5727
5728/*
5729** Try to delete the temporary file (if there is one) and free the
5730** memory used to hold the name of the temp file.
5731*/
5732static void clearTempFile(ShellState *p){
5733  if( p->zTempFile==0 ) return;
5734  if( p->doXdgOpen ) return;
5735  if( shellDeleteFile(p->zTempFile) ) return;
5736  sqlite3_free(p->zTempFile);
5737  p->zTempFile = 0;
5738}
5739
5740/*
5741** Create a new temp file name with the given suffix.
5742*/
5743static void newTempFile(ShellState *p, const char *zSuffix){
5744  clearTempFile(p);
5745  sqlite3_free(p->zTempFile);
5746  p->zTempFile = 0;
5747  if( p->db ){
5748    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
5749  }
5750  if( p->zTempFile==0 ){
5751    /* If p->db is an in-memory database then the TEMPFILENAME file-control
5752    ** will not work and we will need to fallback to guessing */
5753    char *zTemp;
5754    sqlite3_uint64 r;
5755    sqlite3_randomness(sizeof(r), &r);
5756    zTemp = getenv("TEMP");
5757    if( zTemp==0 ) zTemp = getenv("TMP");
5758    if( zTemp==0 ){
5759#ifdef _WIN32
5760      zTemp = "\\tmp";
5761#else
5762      zTemp = "/tmp";
5763#endif
5764    }
5765    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
5766  }else{
5767    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
5768  }
5769  shell_check_oom(p->zTempFile);
5770}
5771
5772
5773/*
5774** The implementation of SQL scalar function fkey_collate_clause(), used
5775** by the ".lint fkey-indexes" command. This scalar function is always
5776** called with four arguments - the parent table name, the parent column name,
5777** the child table name and the child column name.
5778**
5779**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
5780**
5781** If either of the named tables or columns do not exist, this function
5782** returns an empty string. An empty string is also returned if both tables
5783** and columns exist but have the same default collation sequence. Or,
5784** if both exist but the default collation sequences are different, this
5785** function returns the string " COLLATE <parent-collation>", where
5786** <parent-collation> is the default collation sequence of the parent column.
5787*/
5788static void shellFkeyCollateClause(
5789  sqlite3_context *pCtx,
5790  int nVal,
5791  sqlite3_value **apVal
5792){
5793  sqlite3 *db = sqlite3_context_db_handle(pCtx);
5794  const char *zParent;
5795  const char *zParentCol;
5796  const char *zParentSeq;
5797  const char *zChild;
5798  const char *zChildCol;
5799  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
5800  int rc;
5801
5802  assert( nVal==4 );
5803  zParent = (const char*)sqlite3_value_text(apVal[0]);
5804  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
5805  zChild = (const char*)sqlite3_value_text(apVal[2]);
5806  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
5807
5808  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
5809  rc = sqlite3_table_column_metadata(
5810      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
5811  );
5812  if( rc==SQLITE_OK ){
5813    rc = sqlite3_table_column_metadata(
5814        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
5815    );
5816  }
5817
5818  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
5819    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
5820    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
5821    sqlite3_free(z);
5822  }
5823}
5824
5825
5826/*
5827** The implementation of dot-command ".lint fkey-indexes".
5828*/
5829static int lintFkeyIndexes(
5830  ShellState *pState,             /* Current shell tool state */
5831  char **azArg,                   /* Array of arguments passed to dot command */
5832  int nArg                        /* Number of entries in azArg[] */
5833){
5834  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
5835  FILE *out = pState->out;        /* Stream to write non-error output to */
5836  int bVerbose = 0;               /* If -verbose is present */
5837  int bGroupByParent = 0;         /* If -groupbyparent is present */
5838  int i;                          /* To iterate through azArg[] */
5839  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
5840  int rc;                         /* Return code */
5841  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
5842
5843  /*
5844  ** This SELECT statement returns one row for each foreign key constraint
5845  ** in the schema of the main database. The column values are:
5846  **
5847  ** 0. The text of an SQL statement similar to:
5848  **
5849  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
5850  **
5851  **    This SELECT is similar to the one that the foreign keys implementation
5852  **    needs to run internally on child tables. If there is an index that can
5853  **    be used to optimize this query, then it can also be used by the FK
5854  **    implementation to optimize DELETE or UPDATE statements on the parent
5855  **    table.
5856  **
5857  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
5858  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
5859  **    contains an index that can be used to optimize the query.
5860  **
5861  ** 2. Human readable text that describes the child table and columns. e.g.
5862  **
5863  **       "child_table(child_key1, child_key2)"
5864  **
5865  ** 3. Human readable text that describes the parent table and columns. e.g.
5866  **
5867  **       "parent_table(parent_key1, parent_key2)"
5868  **
5869  ** 4. A full CREATE INDEX statement for an index that could be used to
5870  **    optimize DELETE or UPDATE statements on the parent table. e.g.
5871  **
5872  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
5873  **
5874  ** 5. The name of the parent table.
5875  **
5876  ** These six values are used by the C logic below to generate the report.
5877  */
5878  const char *zSql =
5879  "SELECT "
5880    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
5881    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
5882    "  || fkey_collate_clause("
5883    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
5884    ", "
5885    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
5886    "  || group_concat('*=?', ' AND ') || ')'"
5887    ", "
5888    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
5889    ", "
5890    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
5891    ", "
5892    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
5893    "  || ' ON ' || quote(s.name) || '('"
5894    "  || group_concat(quote(f.[from]) ||"
5895    "        fkey_collate_clause("
5896    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
5897    "  || ');'"
5898    ", "
5899    "     f.[table] "
5900    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
5901    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
5902    "GROUP BY s.name, f.id "
5903    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
5904  ;
5905  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
5906
5907  for(i=2; i<nArg; i++){
5908    int n = strlen30(azArg[i]);
5909    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
5910      bVerbose = 1;
5911    }
5912    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
5913      bGroupByParent = 1;
5914      zIndent = "    ";
5915    }
5916    else{
5917      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
5918          azArg[0], azArg[1]
5919      );
5920      return SQLITE_ERROR;
5921    }
5922  }
5923
5924  /* Register the fkey_collate_clause() SQL function */
5925  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
5926      0, shellFkeyCollateClause, 0, 0
5927  );
5928
5929
5930  if( rc==SQLITE_OK ){
5931    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
5932  }
5933  if( rc==SQLITE_OK ){
5934    sqlite3_bind_int(pSql, 1, bGroupByParent);
5935  }
5936
5937  if( rc==SQLITE_OK ){
5938    int rc2;
5939    char *zPrev = 0;
5940    while( SQLITE_ROW==sqlite3_step(pSql) ){
5941      int res = -1;
5942      sqlite3_stmt *pExplain = 0;
5943      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
5944      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
5945      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
5946      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
5947      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
5948      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
5949
5950      if( zEQP==0 ) continue;
5951      if( zGlob==0 ) continue;
5952      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
5953      if( rc!=SQLITE_OK ) break;
5954      if( SQLITE_ROW==sqlite3_step(pExplain) ){
5955        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
5956        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
5957                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
5958      }
5959      rc = sqlite3_finalize(pExplain);
5960      if( rc!=SQLITE_OK ) break;
5961
5962      if( res<0 ){
5963        raw_printf(stderr, "Error: internal error");
5964        break;
5965      }else{
5966        if( bGroupByParent
5967        && (bVerbose || res==0)
5968        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
5969        ){
5970          raw_printf(out, "-- Parent table %s\n", zParent);
5971          sqlite3_free(zPrev);
5972          zPrev = sqlite3_mprintf("%s", zParent);
5973        }
5974
5975        if( res==0 ){
5976          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
5977        }else if( bVerbose ){
5978          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
5979              zIndent, zFrom, zTarget
5980          );
5981        }
5982      }
5983    }
5984    sqlite3_free(zPrev);
5985
5986    if( rc!=SQLITE_OK ){
5987      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5988    }
5989
5990    rc2 = sqlite3_finalize(pSql);
5991    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
5992      rc = rc2;
5993      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5994    }
5995  }else{
5996    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5997  }
5998
5999  return rc;
6000}
6001
6002/*
6003** Implementation of ".lint" dot command.
6004*/
6005static int lintDotCommand(
6006  ShellState *pState,             /* Current shell tool state */
6007  char **azArg,                   /* Array of arguments passed to dot command */
6008  int nArg                        /* Number of entries in azArg[] */
6009){
6010  int n;
6011  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6012  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6013  return lintFkeyIndexes(pState, azArg, nArg);
6014
6015 usage:
6016  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6017  raw_printf(stderr, "Where sub-commands are:\n");
6018  raw_printf(stderr, "    fkey-indexes\n");
6019  return SQLITE_ERROR;
6020}
6021
6022#if !defined SQLITE_OMIT_VIRTUALTABLE
6023static void shellPrepare(
6024  sqlite3 *db,
6025  int *pRc,
6026  const char *zSql,
6027  sqlite3_stmt **ppStmt
6028){
6029  *ppStmt = 0;
6030  if( *pRc==SQLITE_OK ){
6031    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6032    if( rc!=SQLITE_OK ){
6033      raw_printf(stderr, "sql error: %s (%d)\n",
6034          sqlite3_errmsg(db), sqlite3_errcode(db)
6035      );
6036      *pRc = rc;
6037    }
6038  }
6039}
6040
6041/*
6042** Create a prepared statement using printf-style arguments for the SQL.
6043**
6044** This routine is could be marked "static".  But it is not always used,
6045** depending on compile-time options.  By omitting the "static", we avoid
6046** nuisance compiler warnings about "defined but not used".
6047*/
6048void shellPreparePrintf(
6049  sqlite3 *db,
6050  int *pRc,
6051  sqlite3_stmt **ppStmt,
6052  const char *zFmt,
6053  ...
6054){
6055  *ppStmt = 0;
6056  if( *pRc==SQLITE_OK ){
6057    va_list ap;
6058    char *z;
6059    va_start(ap, zFmt);
6060    z = sqlite3_vmprintf(zFmt, ap);
6061    va_end(ap);
6062    if( z==0 ){
6063      *pRc = SQLITE_NOMEM;
6064    }else{
6065      shellPrepare(db, pRc, z, ppStmt);
6066      sqlite3_free(z);
6067    }
6068  }
6069}
6070
6071/* Finalize the prepared statement created using shellPreparePrintf().
6072**
6073** This routine is could be marked "static".  But it is not always used,
6074** depending on compile-time options.  By omitting the "static", we avoid
6075** nuisance compiler warnings about "defined but not used".
6076*/
6077void shellFinalize(
6078  int *pRc,
6079  sqlite3_stmt *pStmt
6080){
6081  if( pStmt ){
6082    sqlite3 *db = sqlite3_db_handle(pStmt);
6083    int rc = sqlite3_finalize(pStmt);
6084    if( *pRc==SQLITE_OK ){
6085      if( rc!=SQLITE_OK ){
6086        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6087      }
6088      *pRc = rc;
6089    }
6090  }
6091}
6092
6093/* Reset the prepared statement created using shellPreparePrintf().
6094**
6095** This routine is could be marked "static".  But it is not always used,
6096** depending on compile-time options.  By omitting the "static", we avoid
6097** nuisance compiler warnings about "defined but not used".
6098*/
6099void shellReset(
6100  int *pRc,
6101  sqlite3_stmt *pStmt
6102){
6103  int rc = sqlite3_reset(pStmt);
6104  if( *pRc==SQLITE_OK ){
6105    if( rc!=SQLITE_OK ){
6106      sqlite3 *db = sqlite3_db_handle(pStmt);
6107      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6108    }
6109    *pRc = rc;
6110  }
6111}
6112#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6113
6114#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6115/******************************************************************************
6116** The ".archive" or ".ar" command.
6117*/
6118/*
6119** Structure representing a single ".ar" command.
6120*/
6121typedef struct ArCommand ArCommand;
6122struct ArCommand {
6123  u8 eCmd;                        /* An AR_CMD_* value */
6124  u8 bVerbose;                    /* True if --verbose */
6125  u8 bZip;                        /* True if the archive is a ZIP */
6126  u8 bDryRun;                     /* True if --dry-run */
6127  u8 bAppend;                     /* True if --append */
6128  u8 bGlob;                       /* True if --glob */
6129  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6130  int nArg;                       /* Number of command arguments */
6131  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6132  const char *zFile;              /* --file argument, or NULL */
6133  const char *zDir;               /* --directory argument, or NULL */
6134  char **azArg;                   /* Array of command arguments */
6135  ShellState *p;                  /* Shell state */
6136  sqlite3 *db;                    /* Database containing the archive */
6137};
6138
6139/*
6140** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6141*/
6142static int arUsage(FILE *f){
6143  showHelp(f,"archive");
6144  return SQLITE_ERROR;
6145}
6146
6147/*
6148** Print an error message for the .ar command to stderr and return
6149** SQLITE_ERROR.
6150*/
6151static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6152  va_list ap;
6153  char *z;
6154  va_start(ap, zFmt);
6155  z = sqlite3_vmprintf(zFmt, ap);
6156  va_end(ap);
6157  utf8_printf(stderr, "Error: %s\n", z);
6158  if( pAr->fromCmdLine ){
6159    utf8_printf(stderr, "Use \"-A\" for more help\n");
6160  }else{
6161    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6162  }
6163  sqlite3_free(z);
6164  return SQLITE_ERROR;
6165}
6166
6167/*
6168** Values for ArCommand.eCmd.
6169*/
6170#define AR_CMD_CREATE       1
6171#define AR_CMD_UPDATE       2
6172#define AR_CMD_INSERT       3
6173#define AR_CMD_EXTRACT      4
6174#define AR_CMD_LIST         5
6175#define AR_CMD_HELP         6
6176#define AR_CMD_REMOVE       7
6177
6178/*
6179** Other (non-command) switches.
6180*/
6181#define AR_SWITCH_VERBOSE     8
6182#define AR_SWITCH_FILE        9
6183#define AR_SWITCH_DIRECTORY  10
6184#define AR_SWITCH_APPEND     11
6185#define AR_SWITCH_DRYRUN     12
6186#define AR_SWITCH_GLOB       13
6187
6188static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6189  switch( eSwitch ){
6190    case AR_CMD_CREATE:
6191    case AR_CMD_EXTRACT:
6192    case AR_CMD_LIST:
6193    case AR_CMD_REMOVE:
6194    case AR_CMD_UPDATE:
6195    case AR_CMD_INSERT:
6196    case AR_CMD_HELP:
6197      if( pAr->eCmd ){
6198        return arErrorMsg(pAr, "multiple command options");
6199      }
6200      pAr->eCmd = eSwitch;
6201      break;
6202
6203    case AR_SWITCH_DRYRUN:
6204      pAr->bDryRun = 1;
6205      break;
6206    case AR_SWITCH_GLOB:
6207      pAr->bGlob = 1;
6208      break;
6209    case AR_SWITCH_VERBOSE:
6210      pAr->bVerbose = 1;
6211      break;
6212    case AR_SWITCH_APPEND:
6213      pAr->bAppend = 1;
6214      /* Fall thru into --file */
6215    case AR_SWITCH_FILE:
6216      pAr->zFile = zArg;
6217      break;
6218    case AR_SWITCH_DIRECTORY:
6219      pAr->zDir = zArg;
6220      break;
6221  }
6222
6223  return SQLITE_OK;
6224}
6225
6226/*
6227** Parse the command line for an ".ar" command. The results are written into
6228** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6229** successfully, otherwise an error message is written to stderr and
6230** SQLITE_ERROR returned.
6231*/
6232static int arParseCommand(
6233  char **azArg,                   /* Array of arguments passed to dot command */
6234  int nArg,                       /* Number of entries in azArg[] */
6235  ArCommand *pAr                  /* Populate this object */
6236){
6237  struct ArSwitch {
6238    const char *zLong;
6239    char cShort;
6240    u8 eSwitch;
6241    u8 bArg;
6242  } aSwitch[] = {
6243    { "create",    'c', AR_CMD_CREATE,       0 },
6244    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6245    { "insert",    'i', AR_CMD_INSERT,       0 },
6246    { "list",      't', AR_CMD_LIST,         0 },
6247    { "remove",    'r', AR_CMD_REMOVE,       0 },
6248    { "update",    'u', AR_CMD_UPDATE,       0 },
6249    { "help",      'h', AR_CMD_HELP,         0 },
6250    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6251    { "file",      'f', AR_SWITCH_FILE,      1 },
6252    { "append",    'a', AR_SWITCH_APPEND,    1 },
6253    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6254    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6255    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6256  };
6257  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6258  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6259
6260  if( nArg<=1 ){
6261    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6262    return arUsage(stderr);
6263  }else{
6264    char *z = azArg[1];
6265    if( z[0]!='-' ){
6266      /* Traditional style [tar] invocation */
6267      int i;
6268      int iArg = 2;
6269      for(i=0; z[i]; i++){
6270        const char *zArg = 0;
6271        struct ArSwitch *pOpt;
6272        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6273          if( z[i]==pOpt->cShort ) break;
6274        }
6275        if( pOpt==pEnd ){
6276          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6277        }
6278        if( pOpt->bArg ){
6279          if( iArg>=nArg ){
6280            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6281          }
6282          zArg = azArg[iArg++];
6283        }
6284        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6285      }
6286      pAr->nArg = nArg-iArg;
6287      if( pAr->nArg>0 ){
6288        pAr->azArg = &azArg[iArg];
6289      }
6290    }else{
6291      /* Non-traditional invocation */
6292      int iArg;
6293      for(iArg=1; iArg<nArg; iArg++){
6294        int n;
6295        z = azArg[iArg];
6296        if( z[0]!='-' ){
6297          /* All remaining command line words are command arguments. */
6298          pAr->azArg = &azArg[iArg];
6299          pAr->nArg = nArg-iArg;
6300          break;
6301        }
6302        n = strlen30(z);
6303
6304        if( z[1]!='-' ){
6305          int i;
6306          /* One or more short options */
6307          for(i=1; i<n; i++){
6308            const char *zArg = 0;
6309            struct ArSwitch *pOpt;
6310            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6311              if( z[i]==pOpt->cShort ) break;
6312            }
6313            if( pOpt==pEnd ){
6314              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6315            }
6316            if( pOpt->bArg ){
6317              if( i<(n-1) ){
6318                zArg = &z[i+1];
6319                i = n;
6320              }else{
6321                if( iArg>=(nArg-1) ){
6322                  return arErrorMsg(pAr, "option requires an argument: %c",
6323                                    z[i]);
6324                }
6325                zArg = azArg[++iArg];
6326              }
6327            }
6328            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6329          }
6330        }else if( z[2]=='\0' ){
6331          /* A -- option, indicating that all remaining command line words
6332          ** are command arguments.  */
6333          pAr->azArg = &azArg[iArg+1];
6334          pAr->nArg = nArg-iArg-1;
6335          break;
6336        }else{
6337          /* A long option */
6338          const char *zArg = 0;             /* Argument for option, if any */
6339          struct ArSwitch *pMatch = 0;      /* Matching option */
6340          struct ArSwitch *pOpt;            /* Iterator */
6341          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6342            const char *zLong = pOpt->zLong;
6343            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6344              if( pMatch ){
6345                return arErrorMsg(pAr, "ambiguous option: %s",z);
6346              }else{
6347                pMatch = pOpt;
6348              }
6349            }
6350          }
6351
6352          if( pMatch==0 ){
6353            return arErrorMsg(pAr, "unrecognized option: %s", z);
6354          }
6355          if( pMatch->bArg ){
6356            if( iArg>=(nArg-1) ){
6357              return arErrorMsg(pAr, "option requires an argument: %s", z);
6358            }
6359            zArg = azArg[++iArg];
6360          }
6361          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6362        }
6363      }
6364    }
6365  }
6366
6367  return SQLITE_OK;
6368}
6369
6370/*
6371** This function assumes that all arguments within the ArCommand.azArg[]
6372** array refer to archive members, as for the --extract, --list or --remove
6373** commands. It checks that each of them are "present". If any specified
6374** file is not present in the archive, an error is printed to stderr and an
6375** error code returned. Otherwise, if all specified arguments are present
6376** in the archive, SQLITE_OK is returned. Here, "present" means either an
6377** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6378** when pAr->bGlob is true.
6379**
6380** This function strips any trailing '/' characters from each argument.
6381** This is consistent with the way the [tar] command seems to work on
6382** Linux.
6383*/
6384static int arCheckEntries(ArCommand *pAr){
6385  int rc = SQLITE_OK;
6386  if( pAr->nArg ){
6387    int i, j;
6388    sqlite3_stmt *pTest = 0;
6389    const char *zSel = (pAr->bGlob)
6390      ? "SELECT name FROM %s WHERE glob($name,name)"
6391      : "SELECT name FROM %s WHERE name=$name";
6392
6393    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6394    j = sqlite3_bind_parameter_index(pTest, "$name");
6395    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6396      char *z = pAr->azArg[i];
6397      int n = strlen30(z);
6398      int bOk = 0;
6399      while( n>0 && z[n-1]=='/' ) n--;
6400      z[n] = '\0';
6401      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6402      if( SQLITE_ROW==sqlite3_step(pTest) ){
6403        bOk = 1;
6404      }
6405      shellReset(&rc, pTest);
6406      if( rc==SQLITE_OK && bOk==0 ){
6407        utf8_printf(stderr, "not found in archive: %s\n", z);
6408        rc = SQLITE_ERROR;
6409      }
6410    }
6411    shellFinalize(&rc, pTest);
6412  }
6413  return rc;
6414}
6415
6416/*
6417** Format a WHERE clause that can be used against the "sqlar" table to
6418** identify all archive members that match the command arguments held
6419** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6420** The caller is responsible for eventually calling sqlite3_free() on
6421** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6422** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6423*/
6424static void arWhereClause(
6425  int *pRc,
6426  ArCommand *pAr,
6427  char **pzWhere                  /* OUT: New WHERE clause */
6428){
6429  char *zWhere = 0;
6430  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6431  if( *pRc==SQLITE_OK ){
6432    if( pAr->nArg==0 ){
6433      zWhere = sqlite3_mprintf("1");
6434    }else{
6435      int i;
6436      const char *zSep = "";
6437      for(i=0; i<pAr->nArg; i++){
6438        const char *z = pAr->azArg[i];
6439        zWhere = sqlite3_mprintf(
6440          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6441          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6442        );
6443        if( zWhere==0 ){
6444          *pRc = SQLITE_NOMEM;
6445          break;
6446        }
6447        zSep = " OR ";
6448      }
6449    }
6450  }
6451  *pzWhere = zWhere;
6452}
6453
6454/*
6455** Implementation of .ar "lisT" command.
6456*/
6457static int arListCommand(ArCommand *pAr){
6458  const char *zSql = "SELECT %s FROM %s WHERE %s";
6459  const char *azCols[] = {
6460    "name",
6461    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6462  };
6463
6464  char *zWhere = 0;
6465  sqlite3_stmt *pSql = 0;
6466  int rc;
6467
6468  rc = arCheckEntries(pAr);
6469  arWhereClause(&rc, pAr, &zWhere);
6470
6471  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6472                     pAr->zSrcTable, zWhere);
6473  if( pAr->bDryRun ){
6474    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6475  }else{
6476    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6477      if( pAr->bVerbose ){
6478        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6479            sqlite3_column_text(pSql, 0),
6480            sqlite3_column_int(pSql, 1),
6481            sqlite3_column_text(pSql, 2),
6482            sqlite3_column_text(pSql, 3)
6483        );
6484      }else{
6485        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6486      }
6487    }
6488  }
6489  shellFinalize(&rc, pSql);
6490  sqlite3_free(zWhere);
6491  return rc;
6492}
6493
6494
6495/*
6496** Implementation of .ar "Remove" command.
6497*/
6498static int arRemoveCommand(ArCommand *pAr){
6499  int rc = 0;
6500  char *zSql = 0;
6501  char *zWhere = 0;
6502
6503  if( pAr->nArg ){
6504    /* Verify that args actually exist within the archive before proceeding.
6505    ** And formulate a WHERE clause to match them.  */
6506    rc = arCheckEntries(pAr);
6507    arWhereClause(&rc, pAr, &zWhere);
6508  }
6509  if( rc==SQLITE_OK ){
6510    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6511                           pAr->zSrcTable, zWhere);
6512    if( pAr->bDryRun ){
6513      utf8_printf(pAr->p->out, "%s\n", zSql);
6514    }else{
6515      char *zErr = 0;
6516      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6517      if( rc==SQLITE_OK ){
6518        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6519        if( rc!=SQLITE_OK ){
6520          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6521        }else{
6522          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6523        }
6524      }
6525      if( zErr ){
6526        utf8_printf(stdout, "ERROR: %s\n", zErr);
6527        sqlite3_free(zErr);
6528      }
6529    }
6530  }
6531  sqlite3_free(zWhere);
6532  sqlite3_free(zSql);
6533  return rc;
6534}
6535
6536/*
6537** Implementation of .ar "eXtract" command.
6538*/
6539static int arExtractCommand(ArCommand *pAr){
6540  const char *zSql1 =
6541    "SELECT "
6542    " ($dir || name),"
6543    " writefile(($dir || name), %s, mode, mtime) "
6544    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6545    " AND name NOT GLOB '*..[/\\]*'";
6546
6547  const char *azExtraArg[] = {
6548    "sqlar_uncompress(data, sz)",
6549    "data"
6550  };
6551
6552  sqlite3_stmt *pSql = 0;
6553  int rc = SQLITE_OK;
6554  char *zDir = 0;
6555  char *zWhere = 0;
6556  int i, j;
6557
6558  /* If arguments are specified, check that they actually exist within
6559  ** the archive before proceeding. And formulate a WHERE clause to
6560  ** match them.  */
6561  rc = arCheckEntries(pAr);
6562  arWhereClause(&rc, pAr, &zWhere);
6563
6564  if( rc==SQLITE_OK ){
6565    if( pAr->zDir ){
6566      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6567    }else{
6568      zDir = sqlite3_mprintf("");
6569    }
6570    if( zDir==0 ) rc = SQLITE_NOMEM;
6571  }
6572
6573  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6574      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6575  );
6576
6577  if( rc==SQLITE_OK ){
6578    j = sqlite3_bind_parameter_index(pSql, "$dir");
6579    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6580
6581    /* Run the SELECT statement twice. The first time, writefile() is called
6582    ** for all archive members that should be extracted. The second time,
6583    ** only for the directories. This is because the timestamps for
6584    ** extracted directories must be reset after they are populated (as
6585    ** populating them changes the timestamp).  */
6586    for(i=0; i<2; i++){
6587      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6588      sqlite3_bind_int(pSql, j, i);
6589      if( pAr->bDryRun ){
6590        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6591      }else{
6592        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6593          if( i==0 && pAr->bVerbose ){
6594            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6595          }
6596        }
6597      }
6598      shellReset(&rc, pSql);
6599    }
6600    shellFinalize(&rc, pSql);
6601  }
6602
6603  sqlite3_free(zDir);
6604  sqlite3_free(zWhere);
6605  return rc;
6606}
6607
6608/*
6609** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
6610*/
6611static int arExecSql(ArCommand *pAr, const char *zSql){
6612  int rc;
6613  if( pAr->bDryRun ){
6614    utf8_printf(pAr->p->out, "%s\n", zSql);
6615    rc = SQLITE_OK;
6616  }else{
6617    char *zErr = 0;
6618    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6619    if( zErr ){
6620      utf8_printf(stdout, "ERROR: %s\n", zErr);
6621      sqlite3_free(zErr);
6622    }
6623  }
6624  return rc;
6625}
6626
6627
6628/*
6629** Implementation of .ar "create", "insert", and "update" commands.
6630**
6631**     create    ->     Create a new SQL archive
6632**     insert    ->     Insert or reinsert all files listed
6633**     update    ->     Insert files that have changed or that were not
6634**                      previously in the archive
6635**
6636** Create the "sqlar" table in the database if it does not already exist.
6637** Then add each file in the azFile[] array to the archive. Directories
6638** are added recursively. If argument bVerbose is non-zero, a message is
6639** printed on stdout for each file archived.
6640**
6641** The create command is the same as update, except that it drops
6642** any existing "sqlar" table before beginning.  The "insert" command
6643** always overwrites every file named on the command-line, where as
6644** "update" only overwrites if the size or mtime or mode has changed.
6645*/
6646static int arCreateOrUpdateCommand(
6647  ArCommand *pAr,                 /* Command arguments and options */
6648  int bUpdate,                    /* true for a --create. */
6649  int bOnlyIfChanged              /* Only update if file has changed */
6650){
6651  const char *zCreate =
6652      "CREATE TABLE IF NOT EXISTS sqlar(\n"
6653      "  name TEXT PRIMARY KEY,  -- name of the file\n"
6654      "  mode INT,               -- access permissions\n"
6655      "  mtime INT,              -- last modification time\n"
6656      "  sz INT,                 -- original file size\n"
6657      "  data BLOB               -- compressed content\n"
6658      ")";
6659  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6660  const char *zInsertFmt[2] = {
6661     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6662     "  SELECT\n"
6663     "    %s,\n"
6664     "    mode,\n"
6665     "    mtime,\n"
6666     "    CASE substr(lsmode(mode),1,1)\n"
6667     "      WHEN '-' THEN length(data)\n"
6668     "      WHEN 'd' THEN 0\n"
6669     "      ELSE -1 END,\n"
6670     "    sqlar_compress(data)\n"
6671     "  FROM fsdir(%Q,%Q) AS disk\n"
6672     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6673     ,
6674     "REPLACE INTO %s(name,mode,mtime,data)\n"
6675     "  SELECT\n"
6676     "    %s,\n"
6677     "    mode,\n"
6678     "    mtime,\n"
6679     "    data\n"
6680     "  FROM fsdir(%Q,%Q) AS disk\n"
6681     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6682  };
6683  int i;                          /* For iterating through azFile[] */
6684  int rc;                         /* Return code */
6685  const char *zTab = 0;           /* SQL table into which to insert */
6686  char *zSql;
6687  char zTemp[50];
6688  char *zExists = 0;
6689
6690  arExecSql(pAr, "PRAGMA page_size=512");
6691  rc = arExecSql(pAr, "SAVEPOINT ar;");
6692  if( rc!=SQLITE_OK ) return rc;
6693  zTemp[0] = 0;
6694  if( pAr->bZip ){
6695    /* Initialize the zipfile virtual table, if necessary */
6696    if( pAr->zFile ){
6697      sqlite3_uint64 r;
6698      sqlite3_randomness(sizeof(r),&r);
6699      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6700      zTab = zTemp;
6701      zSql = sqlite3_mprintf(
6702         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6703         zTab, pAr->zFile
6704      );
6705      rc = arExecSql(pAr, zSql);
6706      sqlite3_free(zSql);
6707    }else{
6708      zTab = "zip";
6709    }
6710  }else{
6711    /* Initialize the table for an SQLAR */
6712    zTab = "sqlar";
6713    if( bUpdate==0 ){
6714      rc = arExecSql(pAr, zDrop);
6715      if( rc!=SQLITE_OK ) goto end_ar_transaction;
6716    }
6717    rc = arExecSql(pAr, zCreate);
6718  }
6719  if( bOnlyIfChanged ){
6720    zExists = sqlite3_mprintf(
6721      " AND NOT EXISTS("
6722          "SELECT 1 FROM %s AS mem"
6723          " WHERE mem.name=disk.name"
6724          " AND mem.mtime=disk.mtime"
6725          " AND mem.mode=disk.mode)", zTab);
6726  }else{
6727    zExists = sqlite3_mprintf("");
6728  }
6729  if( zExists==0 ) rc = SQLITE_NOMEM;
6730  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6731    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
6732        pAr->bVerbose ? "shell_putsnl(name)" : "name",
6733        pAr->azArg[i], pAr->zDir, zExists);
6734    rc = arExecSql(pAr, zSql2);
6735    sqlite3_free(zSql2);
6736  }
6737end_ar_transaction:
6738  if( rc!=SQLITE_OK ){
6739    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6740  }else{
6741    rc = arExecSql(pAr, "RELEASE ar;");
6742    if( pAr->bZip && pAr->zFile ){
6743      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
6744      arExecSql(pAr, zSql);
6745      sqlite3_free(zSql);
6746    }
6747  }
6748  sqlite3_free(zExists);
6749  return rc;
6750}
6751
6752/*
6753** Implementation of ".ar" dot command.
6754*/
6755static int arDotCommand(
6756  ShellState *pState,          /* Current shell tool state */
6757  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
6758  char **azArg,                /* Array of arguments passed to dot command */
6759  int nArg                     /* Number of entries in azArg[] */
6760){
6761  ArCommand cmd;
6762  int rc;
6763  memset(&cmd, 0, sizeof(cmd));
6764  cmd.fromCmdLine = fromCmdLine;
6765  rc = arParseCommand(azArg, nArg, &cmd);
6766  if( rc==SQLITE_OK ){
6767    int eDbType = SHELL_OPEN_UNSPEC;
6768    cmd.p = pState;
6769    cmd.db = pState->db;
6770    if( cmd.zFile ){
6771      eDbType = deduceDatabaseType(cmd.zFile, 1);
6772    }else{
6773      eDbType = pState->openMode;
6774    }
6775    if( eDbType==SHELL_OPEN_ZIPFILE ){
6776      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
6777        if( cmd.zFile==0 ){
6778          cmd.zSrcTable = sqlite3_mprintf("zip");
6779        }else{
6780          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
6781        }
6782      }
6783      cmd.bZip = 1;
6784    }else if( cmd.zFile ){
6785      int flags;
6786      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
6787      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
6788           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
6789        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
6790      }else{
6791        flags = SQLITE_OPEN_READONLY;
6792      }
6793      cmd.db = 0;
6794      if( cmd.bDryRun ){
6795        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
6796             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
6797      }
6798      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
6799             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
6800      if( rc!=SQLITE_OK ){
6801        utf8_printf(stderr, "cannot open file: %s (%s)\n",
6802            cmd.zFile, sqlite3_errmsg(cmd.db)
6803        );
6804        goto end_ar_command;
6805      }
6806      sqlite3_fileio_init(cmd.db, 0, 0);
6807      sqlite3_sqlar_init(cmd.db, 0, 0);
6808      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
6809                              shellPutsFunc, 0, 0);
6810
6811    }
6812    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
6813      if( cmd.eCmd!=AR_CMD_CREATE
6814       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
6815      ){
6816        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
6817        rc = SQLITE_ERROR;
6818        goto end_ar_command;
6819      }
6820      cmd.zSrcTable = sqlite3_mprintf("sqlar");
6821    }
6822
6823    switch( cmd.eCmd ){
6824      case AR_CMD_CREATE:
6825        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
6826        break;
6827
6828      case AR_CMD_EXTRACT:
6829        rc = arExtractCommand(&cmd);
6830        break;
6831
6832      case AR_CMD_LIST:
6833        rc = arListCommand(&cmd);
6834        break;
6835
6836      case AR_CMD_HELP:
6837        arUsage(pState->out);
6838        break;
6839
6840      case AR_CMD_INSERT:
6841        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
6842        break;
6843
6844      case AR_CMD_REMOVE:
6845        rc = arRemoveCommand(&cmd);
6846        break;
6847
6848      default:
6849        assert( cmd.eCmd==AR_CMD_UPDATE );
6850        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
6851        break;
6852    }
6853  }
6854end_ar_command:
6855  if( cmd.db!=pState->db ){
6856    close_db(cmd.db);
6857  }
6858  sqlite3_free(cmd.zSrcTable);
6859
6860  return rc;
6861}
6862/* End of the ".archive" or ".ar" command logic
6863*******************************************************************************/
6864#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
6865
6866#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
6867/*
6868** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
6869** Otherwise, the SQL statement or statements in zSql are executed using
6870** database connection db and the error code written to *pRc before
6871** this function returns.
6872*/
6873static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
6874  int rc = *pRc;
6875  if( rc==SQLITE_OK ){
6876    char *zErr = 0;
6877    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
6878    if( rc!=SQLITE_OK ){
6879      raw_printf(stderr, "SQL error: %s\n", zErr);
6880    }
6881    sqlite3_free(zErr);
6882    *pRc = rc;
6883  }
6884}
6885
6886/*
6887** Like shellExec(), except that zFmt is a printf() style format string.
6888*/
6889static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
6890  char *z = 0;
6891  if( *pRc==SQLITE_OK ){
6892    va_list ap;
6893    va_start(ap, zFmt);
6894    z = sqlite3_vmprintf(zFmt, ap);
6895    va_end(ap);
6896    if( z==0 ){
6897      *pRc = SQLITE_NOMEM;
6898    }else{
6899      shellExec(db, pRc, z);
6900    }
6901    sqlite3_free(z);
6902  }
6903}
6904
6905/*
6906** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
6907** Otherwise, an attempt is made to allocate, zero and return a pointer
6908** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
6909** to SQLITE_NOMEM and NULL returned.
6910*/
6911static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
6912  void *pRet = 0;
6913  if( *pRc==SQLITE_OK ){
6914    pRet = sqlite3_malloc64(nByte);
6915    if( pRet==0 ){
6916      *pRc = SQLITE_NOMEM;
6917    }else{
6918      memset(pRet, 0, nByte);
6919    }
6920  }
6921  return pRet;
6922}
6923
6924/*
6925** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
6926** Otherwise, zFmt is treated as a printf() style string. The result of
6927** formatting it along with any trailing arguments is written into a
6928** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
6929** It is the responsibility of the caller to eventually free this buffer
6930** using a call to sqlite3_free().
6931**
6932** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
6933** pointer returned.
6934*/
6935static char *shellMPrintf(int *pRc, const char *zFmt, ...){
6936  char *z = 0;
6937  if( *pRc==SQLITE_OK ){
6938    va_list ap;
6939    va_start(ap, zFmt);
6940    z = sqlite3_vmprintf(zFmt, ap);
6941    va_end(ap);
6942    if( z==0 ){
6943      *pRc = SQLITE_NOMEM;
6944    }
6945  }
6946  return z;
6947}
6948
6949/*
6950** When running the ".recover" command, each output table, and the special
6951** orphaned row table if it is required, is represented by an instance
6952** of the following struct.
6953*/
6954typedef struct RecoverTable RecoverTable;
6955struct RecoverTable {
6956  char *zQuoted;                  /* Quoted version of table name */
6957  int nCol;                       /* Number of columns in table */
6958  char **azlCol;                  /* Array of column lists */
6959  int iPk;                        /* Index of IPK column */
6960};
6961
6962/*
6963** Free a RecoverTable object allocated by recoverFindTable() or
6964** recoverOrphanTable().
6965*/
6966static void recoverFreeTable(RecoverTable *pTab){
6967  if( pTab ){
6968    sqlite3_free(pTab->zQuoted);
6969    if( pTab->azlCol ){
6970      int i;
6971      for(i=0; i<=pTab->nCol; i++){
6972        sqlite3_free(pTab->azlCol[i]);
6973      }
6974      sqlite3_free(pTab->azlCol);
6975    }
6976    sqlite3_free(pTab);
6977  }
6978}
6979
6980/*
6981** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
6982** Otherwise, it allocates and returns a RecoverTable object based on the
6983** final four arguments passed to this function. It is the responsibility
6984** of the caller to eventually free the returned object using
6985** recoverFreeTable().
6986*/
6987static RecoverTable *recoverNewTable(
6988  int *pRc,                       /* IN/OUT: Error code */
6989  const char *zName,              /* Name of table */
6990  const char *zSql,               /* CREATE TABLE statement */
6991  int bIntkey,
6992  int nCol
6993){
6994  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
6995  int rc = *pRc;
6996  RecoverTable *pTab = 0;
6997
6998  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
6999  if( rc==SQLITE_OK ){
7000    int nSqlCol = 0;
7001    int bSqlIntkey = 0;
7002    sqlite3_stmt *pStmt = 0;
7003
7004    rc = sqlite3_open("", &dbtmp);
7005    if( rc==SQLITE_OK ){
7006      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7007                              shellIdQuote, 0, 0);
7008    }
7009    if( rc==SQLITE_OK ){
7010      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7011    }
7012    if( rc==SQLITE_OK ){
7013      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7014      if( rc==SQLITE_ERROR ){
7015        rc = SQLITE_OK;
7016        goto finished;
7017      }
7018    }
7019    shellPreparePrintf(dbtmp, &rc, &pStmt,
7020        "SELECT count(*) FROM pragma_table_info(%Q)", zName
7021    );
7022    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7023      nSqlCol = sqlite3_column_int(pStmt, 0);
7024    }
7025    shellFinalize(&rc, pStmt);
7026
7027    if( rc!=SQLITE_OK || nSqlCol<nCol ){
7028      goto finished;
7029    }
7030
7031    shellPreparePrintf(dbtmp, &rc, &pStmt,
7032      "SELECT ("
7033      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7034      ") FROM sqlite_schema WHERE name = %Q", zName
7035    );
7036    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7037      bSqlIntkey = sqlite3_column_int(pStmt, 0);
7038    }
7039    shellFinalize(&rc, pStmt);
7040
7041    if( bIntkey==bSqlIntkey ){
7042      int i;
7043      const char *zPk = "_rowid_";
7044      sqlite3_stmt *pPkFinder = 0;
7045
7046      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7047      ** set zPk to the name of the PK column, and pTab->iPk to the index
7048      ** of the column, where columns are 0-numbered from left to right.
7049      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7050      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
7051      pTab->iPk = -2;
7052      if( bIntkey ){
7053        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7054          "SELECT cid, name FROM pragma_table_info(%Q) "
7055          "  WHERE pk=1 AND type='integer' COLLATE nocase"
7056          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7057          , zName, zName
7058        );
7059        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7060          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7061          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7062          if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
7063        }
7064      }
7065
7066      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7067      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7068      pTab->nCol = nSqlCol;
7069
7070      if( bIntkey ){
7071        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7072      }else{
7073        pTab->azlCol[0] = shellMPrintf(&rc, "");
7074      }
7075      i = 1;
7076      shellPreparePrintf(dbtmp, &rc, &pStmt,
7077          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7078          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7079          "FROM pragma_table_info(%Q)",
7080          bIntkey ? ", " : "", pTab->iPk,
7081          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7082          zName
7083      );
7084      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7085        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7086        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7087        i++;
7088      }
7089      shellFinalize(&rc, pStmt);
7090
7091      shellFinalize(&rc, pPkFinder);
7092    }
7093  }
7094
7095 finished:
7096  sqlite3_close(dbtmp);
7097  *pRc = rc;
7098  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7099    recoverFreeTable(pTab);
7100    pTab = 0;
7101  }
7102  return pTab;
7103}
7104
7105/*
7106** This function is called to search the schema recovered from the
7107** sqlite_schema table of the (possibly) corrupt database as part
7108** of a ".recover" command. Specifically, for a table with root page
7109** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7110** table must be a WITHOUT ROWID table, or if non-zero, not one of
7111** those.
7112**
7113** If a table is found, a (RecoverTable*) object is returned. Or, if
7114** no such table is found, but bIntkey is false and iRoot is the
7115** root page of an index in the recovered schema, then (*pbNoop) is
7116** set to true and NULL returned. Or, if there is no such table or
7117** index, NULL is returned and (*pbNoop) set to 0, indicating that
7118** the caller should write data to the orphans table.
7119*/
7120static RecoverTable *recoverFindTable(
7121  ShellState *pState,             /* Shell state object */
7122  int *pRc,                       /* IN/OUT: Error code */
7123  int iRoot,                      /* Root page of table */
7124  int bIntkey,                    /* True for an intkey table */
7125  int nCol,                       /* Number of columns in table */
7126  int *pbNoop                     /* OUT: True if iRoot is root of index */
7127){
7128  sqlite3_stmt *pStmt = 0;
7129  RecoverTable *pRet = 0;
7130  int bNoop = 0;
7131  const char *zSql = 0;
7132  const char *zName = 0;
7133
7134  /* Search the recovered schema for an object with root page iRoot. */
7135  shellPreparePrintf(pState->db, pRc, &pStmt,
7136      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7137  );
7138  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7139    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7140    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7141      bNoop = 1;
7142      break;
7143    }
7144    if( sqlite3_stricmp(zType, "table")==0 ){
7145      zName = (const char*)sqlite3_column_text(pStmt, 1);
7146      zSql = (const char*)sqlite3_column_text(pStmt, 2);
7147      if( zName!=0 && zSql!=0 ){
7148        pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7149        break;
7150      }
7151    }
7152  }
7153
7154  shellFinalize(pRc, pStmt);
7155  *pbNoop = bNoop;
7156  return pRet;
7157}
7158
7159/*
7160** Return a RecoverTable object representing the orphans table.
7161*/
7162static RecoverTable *recoverOrphanTable(
7163  ShellState *pState,             /* Shell state object */
7164  int *pRc,                       /* IN/OUT: Error code */
7165  const char *zLostAndFound,      /* Base name for orphans table */
7166  int nCol                        /* Number of user data columns */
7167){
7168  RecoverTable *pTab = 0;
7169  if( nCol>=0 && *pRc==SQLITE_OK ){
7170    int i;
7171
7172    /* This block determines the name of the orphan table. The prefered
7173    ** name is zLostAndFound. But if that clashes with another name
7174    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7175    ** and so on until a non-clashing name is found.  */
7176    int iTab = 0;
7177    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7178    sqlite3_stmt *pTest = 0;
7179    shellPrepare(pState->db, pRc,
7180        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7181    );
7182    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7183    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7184      shellReset(pRc, pTest);
7185      sqlite3_free(zTab);
7186      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7187      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7188    }
7189    shellFinalize(pRc, pTest);
7190
7191    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7192    if( pTab ){
7193      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7194      pTab->nCol = nCol;
7195      pTab->iPk = -2;
7196      if( nCol>0 ){
7197        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7198        if( pTab->azlCol ){
7199          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7200          for(i=nCol-1; i>=0; i--){
7201            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7202          }
7203        }
7204      }
7205
7206      if( *pRc!=SQLITE_OK ){
7207        recoverFreeTable(pTab);
7208        pTab = 0;
7209      }else{
7210        raw_printf(pState->out,
7211            "CREATE TABLE %s(rootpgno INTEGER, "
7212            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7213        );
7214        for(i=0; i<nCol; i++){
7215          raw_printf(pState->out, ", c%d", i);
7216        }
7217        raw_printf(pState->out, ");\n");
7218      }
7219    }
7220    sqlite3_free(zTab);
7221  }
7222  return pTab;
7223}
7224
7225/*
7226** This function is called to recover data from the database. A script
7227** to construct a new database containing all recovered data is output
7228** on stream pState->out.
7229*/
7230static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7231  int rc = SQLITE_OK;
7232  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
7233  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
7234  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
7235  const char *zRecoveryDb = "";   /* Name of "recovery" database */
7236  const char *zLostAndFound = "lost_and_found";
7237  int i;
7238  int nOrphan = -1;
7239  RecoverTable *pOrphan = 0;
7240
7241  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
7242  int bRowids = 1;                /* 0 if --no-rowids */
7243  for(i=1; i<nArg; i++){
7244    char *z = azArg[i];
7245    int n;
7246    if( z[0]=='-' && z[1]=='-' ) z++;
7247    n = strlen30(z);
7248    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7249      bFreelist = 0;
7250    }else
7251    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7252      i++;
7253      zRecoveryDb = azArg[i];
7254    }else
7255    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7256      i++;
7257      zLostAndFound = azArg[i];
7258    }else
7259    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7260      bRowids = 0;
7261    }
7262    else{
7263      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7264      showHelp(pState->out, azArg[0]);
7265      return 1;
7266    }
7267  }
7268
7269  shellExecPrintf(pState->db, &rc,
7270    /* Attach an in-memory database named 'recovery'. Create an indexed
7271    ** cache of the sqlite_dbptr virtual table. */
7272    "PRAGMA writable_schema = on;"
7273    "ATTACH %Q AS recovery;"
7274    "DROP TABLE IF EXISTS recovery.dbptr;"
7275    "DROP TABLE IF EXISTS recovery.freelist;"
7276    "DROP TABLE IF EXISTS recovery.map;"
7277    "DROP TABLE IF EXISTS recovery.schema;"
7278    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7279  );
7280
7281  if( bFreelist ){
7282    shellExec(pState->db, &rc,
7283      "WITH trunk(pgno) AS ("
7284      "  SELECT shell_int32("
7285      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7286      "      WHERE x>0"
7287      "    UNION"
7288      "  SELECT shell_int32("
7289      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7290      "      FROM trunk WHERE x>0"
7291      "),"
7292      "freelist(data, n, freepgno) AS ("
7293      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7294      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7295      "    UNION ALL"
7296      "  SELECT data, n-1, shell_int32(data, 2+n) "
7297      "      FROM freelist WHERE n>=0"
7298      ")"
7299      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7300    );
7301  }
7302
7303  /* If this is an auto-vacuum database, add all pointer-map pages to
7304  ** the freelist table. Do this regardless of whether or not
7305  ** --freelist-corrupt was specified.  */
7306  shellExec(pState->db, &rc,
7307    "WITH ptrmap(pgno) AS ("
7308    "  SELECT 2 WHERE shell_int32("
7309    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7310    "  )"
7311    "    UNION ALL "
7312    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7313    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7314    ")"
7315    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7316  );
7317
7318  shellExec(pState->db, &rc,
7319    "CREATE TABLE recovery.dbptr("
7320    "      pgno, child, PRIMARY KEY(child, pgno)"
7321    ") WITHOUT ROWID;"
7322    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7323    "    SELECT * FROM sqlite_dbptr"
7324    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7325
7326    /* Delete any pointer to page 1. This ensures that page 1 is considered
7327    ** a root page, regardless of how corrupt the db is. */
7328    "DELETE FROM recovery.dbptr WHERE child = 1;"
7329
7330    /* Delete all pointers to any pages that have more than one pointer
7331    ** to them. Such pages will be treated as root pages when recovering
7332    ** data.  */
7333    "DELETE FROM recovery.dbptr WHERE child IN ("
7334    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7335    ");"
7336
7337    /* Create the "map" table that will (eventually) contain instructions
7338    ** for dealing with each page in the db that contains one or more
7339    ** records. */
7340    "CREATE TABLE recovery.map("
7341      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7342    ");"
7343
7344    /* Populate table [map]. If there are circular loops of pages in the
7345    ** database, the following adds all pages in such a loop to the map
7346    ** as individual root pages. This could be handled better.  */
7347    "WITH pages(i, maxlen) AS ("
7348    "  SELECT page_count, ("
7349    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7350    "  ) FROM pragma_page_count WHERE page_count>0"
7351    "    UNION ALL"
7352    "  SELECT i-1, ("
7353    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7354    "  ) FROM pages WHERE i>=2"
7355    ")"
7356    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7357    "  SELECT i, maxlen, NULL, ("
7358    "    WITH p(orig, pgno, parent) AS ("
7359    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7360    "        UNION "
7361    "      SELECT i, p.parent, "
7362    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7363    "    )"
7364    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7365    ") "
7366    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7367    "UPDATE recovery.map AS o SET intkey = ("
7368    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7369    ");"
7370
7371    /* Extract data from page 1 and any linked pages into table
7372    ** recovery.schema. With the same schema as an sqlite_schema table.  */
7373    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7374    "INSERT INTO recovery.schema SELECT "
7375    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
7376    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
7377    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
7378    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
7379    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
7380    "FROM sqlite_dbdata WHERE pgno IN ("
7381    "  SELECT pgno FROM recovery.map WHERE root=1"
7382    ")"
7383    "GROUP BY pgno, cell;"
7384    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7385  );
7386
7387  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7388  ** CREATE TABLE statements that extracted from the existing schema.  */
7389  if( rc==SQLITE_OK ){
7390    sqlite3_stmt *pStmt = 0;
7391    /* ".recover" might output content in an order which causes immediate
7392    ** foreign key constraints to be violated. So disable foreign-key
7393    ** constraint enforcement to prevent problems when running the output
7394    ** script. */
7395    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7396    raw_printf(pState->out, "BEGIN;\n");
7397    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7398    shellPrepare(pState->db, &rc,
7399        "SELECT sql FROM recovery.schema "
7400        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7401    );
7402    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7403      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7404      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7405          &zCreateTable[12]
7406      );
7407    }
7408    shellFinalize(&rc, pStmt);
7409  }
7410
7411  /* Figure out if an orphan table will be required. And if so, how many
7412  ** user columns it should contain */
7413  shellPrepare(pState->db, &rc,
7414      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7415      , &pLoop
7416  );
7417  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7418    nOrphan = sqlite3_column_int(pLoop, 0);
7419  }
7420  shellFinalize(&rc, pLoop);
7421  pLoop = 0;
7422
7423  shellPrepare(pState->db, &rc,
7424      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7425  );
7426
7427  shellPrepare(pState->db, &rc,
7428      "SELECT max(field), group_concat(shell_escape_crnl(quote"
7429      "(case when (? AND field<0) then NULL else value end)"
7430      "), ', ')"
7431      ", min(field) "
7432      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7433      "GROUP BY cell", &pCells
7434  );
7435
7436  /* Loop through each root page. */
7437  shellPrepare(pState->db, &rc,
7438      "SELECT root, intkey, max(maxlen) FROM recovery.map"
7439      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7440      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7441      ")", &pLoop
7442  );
7443  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7444    int iRoot = sqlite3_column_int(pLoop, 0);
7445    int bIntkey = sqlite3_column_int(pLoop, 1);
7446    int nCol = sqlite3_column_int(pLoop, 2);
7447    int bNoop = 0;
7448    RecoverTable *pTab;
7449
7450    assert( bIntkey==0 || bIntkey==1 );
7451    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7452    if( bNoop || rc ) continue;
7453    if( pTab==0 ){
7454      if( pOrphan==0 ){
7455        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7456      }
7457      pTab = pOrphan;
7458      if( pTab==0 ) break;
7459    }
7460
7461    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7462      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7463    }
7464    sqlite3_bind_int(pPages, 1, iRoot);
7465    if( bRowids==0 && pTab->iPk<0 ){
7466      sqlite3_bind_int(pCells, 1, 1);
7467    }else{
7468      sqlite3_bind_int(pCells, 1, 0);
7469    }
7470    sqlite3_bind_int(pCells, 3, pTab->iPk);
7471
7472    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7473      int iPgno = sqlite3_column_int(pPages, 0);
7474      sqlite3_bind_int(pCells, 2, iPgno);
7475      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7476        int nField = sqlite3_column_int(pCells, 0);
7477        int iMin = sqlite3_column_int(pCells, 2);
7478        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7479
7480        RecoverTable *pTab2 = pTab;
7481        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7482          if( pOrphan==0 ){
7483            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7484          }
7485          pTab2 = pOrphan;
7486          if( pTab2==0 ) break;
7487        }
7488
7489        nField = nField+1;
7490        if( pTab2==pOrphan ){
7491          raw_printf(pState->out,
7492              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7493              pTab2->zQuoted, iRoot, iPgno, nField,
7494              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7495          );
7496        }else{
7497          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7498              pTab2->zQuoted, pTab2->azlCol[nField], zVal
7499          );
7500        }
7501      }
7502      shellReset(&rc, pCells);
7503    }
7504    shellReset(&rc, pPages);
7505    if( pTab!=pOrphan ) recoverFreeTable(pTab);
7506  }
7507  shellFinalize(&rc, pLoop);
7508  shellFinalize(&rc, pPages);
7509  shellFinalize(&rc, pCells);
7510  recoverFreeTable(pOrphan);
7511
7512  /* The rest of the schema */
7513  if( rc==SQLITE_OK ){
7514    sqlite3_stmt *pStmt = 0;
7515    shellPrepare(pState->db, &rc,
7516        "SELECT sql, name FROM recovery.schema "
7517        "WHERE sql NOT LIKE 'create table%'", &pStmt
7518    );
7519    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7520      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7521      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7522        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7523        char *zPrint = shellMPrintf(&rc,
7524          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7525          zName, zName, zSql
7526        );
7527        raw_printf(pState->out, "%s;\n", zPrint);
7528        sqlite3_free(zPrint);
7529      }else{
7530        raw_printf(pState->out, "%s;\n", zSql);
7531      }
7532    }
7533    shellFinalize(&rc, pStmt);
7534  }
7535
7536  if( rc==SQLITE_OK ){
7537    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7538    raw_printf(pState->out, "COMMIT;\n");
7539  }
7540  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7541  return rc;
7542}
7543#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7544
7545/*
7546** If an input line begins with "." then invoke this routine to
7547** process that line.
7548**
7549** Return 1 on error, 2 to exit, and 0 otherwise.
7550*/
7551static int do_meta_command(char *zLine, ShellState *p){
7552  int h = 1;
7553  int nArg = 0;
7554  int n, c;
7555  int rc = 0;
7556  char *azArg[52];
7557
7558#ifndef SQLITE_OMIT_VIRTUALTABLE
7559  if( p->expert.pExpert ){
7560    expertFinish(p, 1, 0);
7561  }
7562#endif
7563
7564  /* Parse the input line into tokens.
7565  */
7566  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
7567    while( IsSpace(zLine[h]) ){ h++; }
7568    if( zLine[h]==0 ) break;
7569    if( zLine[h]=='\'' || zLine[h]=='"' ){
7570      int delim = zLine[h++];
7571      azArg[nArg++] = &zLine[h];
7572      while( zLine[h] && zLine[h]!=delim ){
7573        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
7574        h++;
7575      }
7576      if( zLine[h]==delim ){
7577        zLine[h++] = 0;
7578      }
7579      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
7580    }else{
7581      azArg[nArg++] = &zLine[h];
7582      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
7583      if( zLine[h] ) zLine[h++] = 0;
7584      resolve_backslashes(azArg[nArg-1]);
7585    }
7586  }
7587  azArg[nArg] = 0;
7588
7589  /* Process the input line.
7590  */
7591  if( nArg==0 ) return 0; /* no tokens, no error */
7592  n = strlen30(azArg[0]);
7593  c = azArg[0][0];
7594  clearTempFile(p);
7595
7596#ifndef SQLITE_OMIT_AUTHORIZATION
7597  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
7598    if( nArg!=2 ){
7599      raw_printf(stderr, "Usage: .auth ON|OFF\n");
7600      rc = 1;
7601      goto meta_command_exit;
7602    }
7603    open_db(p, 0);
7604    if( booleanValue(azArg[1]) ){
7605      sqlite3_set_authorizer(p->db, shellAuth, p);
7606    }else if( p->bSafeModePersist ){
7607      sqlite3_set_authorizer(p->db, safeModeAuth, p);
7608    }else{
7609      sqlite3_set_authorizer(p->db, 0, 0);
7610    }
7611  }else
7612#endif
7613
7614#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
7615  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
7616    open_db(p, 0);
7617    failIfSafeMode(p, "cannot run .archive in safe mode");
7618    rc = arDotCommand(p, 0, azArg, nArg);
7619  }else
7620#endif
7621
7622  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
7623   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
7624  ){
7625    const char *zDestFile = 0;
7626    const char *zDb = 0;
7627    sqlite3 *pDest;
7628    sqlite3_backup *pBackup;
7629    int j;
7630    int bAsync = 0;
7631    const char *zVfs = 0;
7632    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
7633    for(j=1; j<nArg; j++){
7634      const char *z = azArg[j];
7635      if( z[0]=='-' ){
7636        if( z[1]=='-' ) z++;
7637        if( strcmp(z, "-append")==0 ){
7638          zVfs = "apndvfs";
7639        }else
7640        if( strcmp(z, "-async")==0 ){
7641          bAsync = 1;
7642        }else
7643        {
7644          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
7645          return 1;
7646        }
7647      }else if( zDestFile==0 ){
7648        zDestFile = azArg[j];
7649      }else if( zDb==0 ){
7650        zDb = zDestFile;
7651        zDestFile = azArg[j];
7652      }else{
7653        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
7654        return 1;
7655      }
7656    }
7657    if( zDestFile==0 ){
7658      raw_printf(stderr, "missing FILENAME argument on .backup\n");
7659      return 1;
7660    }
7661    if( zDb==0 ) zDb = "main";
7662    rc = sqlite3_open_v2(zDestFile, &pDest,
7663                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
7664    if( rc!=SQLITE_OK ){
7665      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
7666      close_db(pDest);
7667      return 1;
7668    }
7669    if( bAsync ){
7670      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
7671                   0, 0, 0);
7672    }
7673    open_db(p, 0);
7674    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
7675    if( pBackup==0 ){
7676      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7677      close_db(pDest);
7678      return 1;
7679    }
7680    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
7681    sqlite3_backup_finish(pBackup);
7682    if( rc==SQLITE_DONE ){
7683      rc = 0;
7684    }else{
7685      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7686      rc = 1;
7687    }
7688    close_db(pDest);
7689  }else
7690
7691  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
7692    if( nArg==2 ){
7693      bail_on_error = booleanValue(azArg[1]);
7694    }else{
7695      raw_printf(stderr, "Usage: .bail on|off\n");
7696      rc = 1;
7697    }
7698  }else
7699
7700  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
7701    if( nArg==2 ){
7702      if( booleanValue(azArg[1]) ){
7703        setBinaryMode(p->out, 1);
7704      }else{
7705        setTextMode(p->out, 1);
7706      }
7707    }else{
7708      raw_printf(stderr, "Usage: .binary on|off\n");
7709      rc = 1;
7710    }
7711  }else
7712
7713  /* The undocumented ".breakpoint" command causes a call to the no-op
7714  ** routine named test_breakpoint().
7715  */
7716  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
7717    test_breakpoint();
7718  }else
7719
7720  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
7721    failIfSafeMode(p, "cannot run .cd in safe mode");
7722    if( nArg==2 ){
7723#if defined(_WIN32) || defined(WIN32)
7724      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
7725      rc = !SetCurrentDirectoryW(z);
7726      sqlite3_free(z);
7727#else
7728      rc = chdir(azArg[1]);
7729#endif
7730      if( rc ){
7731        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
7732        rc = 1;
7733      }
7734    }else{
7735      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
7736      rc = 1;
7737    }
7738  }else
7739
7740  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
7741    if( nArg==2 ){
7742      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
7743    }else{
7744      raw_printf(stderr, "Usage: .changes on|off\n");
7745      rc = 1;
7746    }
7747  }else
7748
7749  /* Cancel output redirection, if it is currently set (by .testcase)
7750  ** Then read the content of the testcase-out.txt file and compare against
7751  ** azArg[1].  If there are differences, report an error and exit.
7752  */
7753  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
7754    char *zRes = 0;
7755    output_reset(p);
7756    if( nArg!=2 ){
7757      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
7758      rc = 2;
7759    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
7760      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
7761      rc = 2;
7762    }else if( testcase_glob(azArg[1],zRes)==0 ){
7763      utf8_printf(stderr,
7764                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
7765                 p->zTestcase, azArg[1], zRes);
7766      rc = 1;
7767    }else{
7768      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
7769      p->nCheck++;
7770    }
7771    sqlite3_free(zRes);
7772  }else
7773
7774  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
7775    failIfSafeMode(p, "cannot run .clone in safe mode");
7776    if( nArg==2 ){
7777      tryToClone(p, azArg[1]);
7778    }else{
7779      raw_printf(stderr, "Usage: .clone FILENAME\n");
7780      rc = 1;
7781    }
7782  }else
7783
7784  if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
7785    if( nArg==1 ){
7786      /* List available connections */
7787      int i;
7788      for(i=0; i<ArraySize(p->aAuxDb); i++){
7789        const char *zFile = p->aAuxDb[i].zDbFilename;
7790        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
7791          zFile = "(not open)";
7792        }else if( zFile==0 ){
7793          zFile = "(memory)";
7794        }else if( zFile[0]==0 ){
7795          zFile = "(temporary-file)";
7796        }
7797        if( p->pAuxDb == &p->aAuxDb[i] ){
7798          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
7799        }else if( p->aAuxDb[i].db!=0 ){
7800          utf8_printf(stdout, "       %d: %s\n", i, zFile);
7801        }
7802      }
7803    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
7804      int i = azArg[1][0] - '0';
7805      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
7806        p->pAuxDb->db = p->db;
7807        p->pAuxDb = &p->aAuxDb[i];
7808        globalDb = p->db = p->pAuxDb->db;
7809        p->pAuxDb->db = 0;
7810      }
7811    }else if( nArg==3 && strcmp(azArg[1], "close")==0
7812           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
7813      int i = azArg[2][0] - '0';
7814      if( i<0 || i>=ArraySize(p->aAuxDb) ){
7815        /* No-op */
7816      }else if( p->pAuxDb == &p->aAuxDb[i] ){
7817        raw_printf(stderr, "cannot close the active database connection\n");
7818        rc = 1;
7819      }else if( p->aAuxDb[i].db ){
7820        session_close_all(p, i);
7821        close_db(p->aAuxDb[i].db);
7822        p->aAuxDb[i].db = 0;
7823      }
7824    }else{
7825      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
7826      rc = 1;
7827    }
7828  }else
7829
7830  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
7831    char **azName = 0;
7832    int nName = 0;
7833    sqlite3_stmt *pStmt;
7834    int i;
7835    open_db(p, 0);
7836    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
7837    if( rc ){
7838      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
7839      rc = 1;
7840    }else{
7841      while( sqlite3_step(pStmt)==SQLITE_ROW ){
7842        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
7843        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
7844        if( zSchema==0 || zFile==0 ) continue;
7845        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
7846        shell_check_oom(azName);
7847        azName[nName*2] = strdup(zSchema);
7848        azName[nName*2+1] = strdup(zFile);
7849        nName++;
7850      }
7851    }
7852    sqlite3_finalize(pStmt);
7853    for(i=0; i<nName; i++){
7854      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
7855      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
7856      const char *z = azName[i*2+1];
7857      utf8_printf(p->out, "%s: %s %s%s\n",
7858         azName[i*2],
7859         z && z[0] ? z : "\"\"",
7860         bRdonly ? "r/o" : "r/w",
7861         eTxn==SQLITE_TXN_NONE ? "" :
7862            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
7863      free(azName[i*2]);
7864      free(azName[i*2+1]);
7865    }
7866    sqlite3_free(azName);
7867  }else
7868
7869  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
7870    static const struct DbConfigChoices {
7871      const char *zName;
7872      int op;
7873    } aDbConfig[] = {
7874        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
7875        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
7876        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
7877        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
7878        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
7879        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
7880        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
7881        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
7882        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
7883        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
7884        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
7885        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
7886        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
7887        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
7888        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
7889        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
7890    };
7891    int ii, v;
7892    open_db(p, 0);
7893    for(ii=0; ii<ArraySize(aDbConfig); ii++){
7894      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
7895      if( nArg>=3 ){
7896        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
7897      }
7898      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
7899      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
7900      if( nArg>1 ) break;
7901    }
7902    if( nArg>1 && ii==ArraySize(aDbConfig) ){
7903      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
7904      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
7905    }
7906  }else
7907
7908  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
7909    rc = shell_dbinfo_command(p, nArg, azArg);
7910  }else
7911
7912#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7913  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
7914    open_db(p, 0);
7915    rc = recoverDatabaseCmd(p, nArg, azArg);
7916  }else
7917#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7918
7919  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
7920    char *zLike = 0;
7921    char *zSql;
7922    int i;
7923    int savedShowHeader = p->showHeader;
7924    int savedShellFlags = p->shellFlgs;
7925    ShellClearFlag(p,
7926       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
7927       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
7928    for(i=1; i<nArg; i++){
7929      if( azArg[i][0]=='-' ){
7930        const char *z = azArg[i]+1;
7931        if( z[0]=='-' ) z++;
7932        if( strcmp(z,"preserve-rowids")==0 ){
7933#ifdef SQLITE_OMIT_VIRTUALTABLE
7934          raw_printf(stderr, "The --preserve-rowids option is not compatible"
7935                             " with SQLITE_OMIT_VIRTUALTABLE\n");
7936          rc = 1;
7937          sqlite3_free(zLike);
7938          goto meta_command_exit;
7939#else
7940          ShellSetFlag(p, SHFLG_PreserveRowid);
7941#endif
7942        }else
7943        if( strcmp(z,"newlines")==0 ){
7944          ShellSetFlag(p, SHFLG_Newlines);
7945        }else
7946        if( strcmp(z,"data-only")==0 ){
7947          ShellSetFlag(p, SHFLG_DumpDataOnly);
7948        }else
7949        if( strcmp(z,"nosys")==0 ){
7950          ShellSetFlag(p, SHFLG_DumpNoSys);
7951        }else
7952        {
7953          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
7954          rc = 1;
7955          sqlite3_free(zLike);
7956          goto meta_command_exit;
7957        }
7958      }else{
7959        /* azArg[i] contains a LIKE pattern. This ".dump" request should
7960        ** only dump data for tables for which either the table name matches
7961        ** the LIKE pattern, or the table appears to be a shadow table of
7962        ** a virtual table for which the name matches the LIKE pattern.
7963        */
7964        char *zExpr = sqlite3_mprintf(
7965            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
7966            "  SELECT 1 FROM sqlite_schema WHERE "
7967            "    name LIKE %Q ESCAPE '\\' AND"
7968            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
7969            "    substr(o.name, 1, length(name)+1) == (name||'_')"
7970            ")", azArg[i], azArg[i]
7971        );
7972
7973        if( zLike ){
7974          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
7975        }else{
7976          zLike = zExpr;
7977        }
7978      }
7979    }
7980
7981    open_db(p, 0);
7982
7983    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
7984      /* When playing back a "dump", the content might appear in an order
7985      ** which causes immediate foreign key constraints to be violated.
7986      ** So disable foreign-key constraint enforcement to prevent problems. */
7987      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
7988      raw_printf(p->out, "BEGIN TRANSACTION;\n");
7989    }
7990    p->writableSchema = 0;
7991    p->showHeader = 0;
7992    /* Set writable_schema=ON since doing so forces SQLite to initialize
7993    ** as much of the schema as it can even if the sqlite_schema table is
7994    ** corrupt. */
7995    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
7996    p->nErr = 0;
7997    if( zLike==0 ) zLike = sqlite3_mprintf("true");
7998    zSql = sqlite3_mprintf(
7999      "SELECT name, type, sql FROM sqlite_schema AS o "
8000      "WHERE (%s) AND type=='table'"
8001      "  AND sql NOT NULL"
8002      " ORDER BY tbl_name='sqlite_sequence', rowid",
8003      zLike
8004    );
8005    run_schema_dump_query(p,zSql);
8006    sqlite3_free(zSql);
8007    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8008      zSql = sqlite3_mprintf(
8009        "SELECT sql FROM sqlite_schema AS o "
8010        "WHERE (%s) AND sql NOT NULL"
8011        "  AND type IN ('index','trigger','view')",
8012        zLike
8013      );
8014      run_table_dump_query(p, zSql);
8015      sqlite3_free(zSql);
8016    }
8017    sqlite3_free(zLike);
8018    if( p->writableSchema ){
8019      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8020      p->writableSchema = 0;
8021    }
8022    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8023    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8024    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8025      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8026    }
8027    p->showHeader = savedShowHeader;
8028    p->shellFlgs = savedShellFlags;
8029  }else
8030
8031  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8032    if( nArg==2 ){
8033      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8034    }else{
8035      raw_printf(stderr, "Usage: .echo on|off\n");
8036      rc = 1;
8037    }
8038  }else
8039
8040  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8041    if( nArg==2 ){
8042      p->autoEQPtest = 0;
8043      if( p->autoEQPtrace ){
8044        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8045        p->autoEQPtrace = 0;
8046      }
8047      if( strcmp(azArg[1],"full")==0 ){
8048        p->autoEQP = AUTOEQP_full;
8049      }else if( strcmp(azArg[1],"trigger")==0 ){
8050        p->autoEQP = AUTOEQP_trigger;
8051#ifdef SQLITE_DEBUG
8052      }else if( strcmp(azArg[1],"test")==0 ){
8053        p->autoEQP = AUTOEQP_on;
8054        p->autoEQPtest = 1;
8055      }else if( strcmp(azArg[1],"trace")==0 ){
8056        p->autoEQP = AUTOEQP_full;
8057        p->autoEQPtrace = 1;
8058        open_db(p, 0);
8059        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8060        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8061#endif
8062      }else{
8063        p->autoEQP = (u8)booleanValue(azArg[1]);
8064      }
8065    }else{
8066      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8067      rc = 1;
8068    }
8069  }else
8070
8071  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8072    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8073    rc = 2;
8074  }else
8075
8076  /* The ".explain" command is automatic now.  It is largely pointless.  It
8077  ** retained purely for backwards compatibility */
8078  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8079    int val = 1;
8080    if( nArg>=2 ){
8081      if( strcmp(azArg[1],"auto")==0 ){
8082        val = 99;
8083      }else{
8084        val =  booleanValue(azArg[1]);
8085      }
8086    }
8087    if( val==1 && p->mode!=MODE_Explain ){
8088      p->normalMode = p->mode;
8089      p->mode = MODE_Explain;
8090      p->autoExplain = 0;
8091    }else if( val==0 ){
8092      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8093      p->autoExplain = 0;
8094    }else if( val==99 ){
8095      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8096      p->autoExplain = 1;
8097    }
8098  }else
8099
8100#ifndef SQLITE_OMIT_VIRTUALTABLE
8101  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8102    if( p->bSafeMode ){
8103      raw_printf(stderr,
8104        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8105        azArg[0]);
8106      rc = 1;
8107    }else{
8108      open_db(p, 0);
8109      expertDotCommand(p, azArg, nArg);
8110    }
8111  }else
8112#endif
8113
8114  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8115    static const struct {
8116       const char *zCtrlName;   /* Name of a test-control option */
8117       int ctrlCode;            /* Integer code for that option */
8118       const char *zUsage;      /* Usage notes */
8119    } aCtrl[] = {
8120      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8121      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8122      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8123      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8124      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8125   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8126      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8127      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8128      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8129      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8130   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8131    };
8132    int filectrl = -1;
8133    int iCtrl = -1;
8134    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8135    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8136    int n2, i;
8137    const char *zCmd = 0;
8138    const char *zSchema = 0;
8139
8140    open_db(p, 0);
8141    zCmd = nArg>=2 ? azArg[1] : "help";
8142
8143    if( zCmd[0]=='-'
8144     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8145     && nArg>=4
8146    ){
8147      zSchema = azArg[2];
8148      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8149      nArg -= 2;
8150      zCmd = azArg[1];
8151    }
8152
8153    /* The argument can optionally begin with "-" or "--" */
8154    if( zCmd[0]=='-' && zCmd[1] ){
8155      zCmd++;
8156      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8157    }
8158
8159    /* --help lists all file-controls */
8160    if( strcmp(zCmd,"help")==0 ){
8161      utf8_printf(p->out, "Available file-controls:\n");
8162      for(i=0; i<ArraySize(aCtrl); i++){
8163        utf8_printf(p->out, "  .filectrl %s %s\n",
8164                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8165      }
8166      rc = 1;
8167      goto meta_command_exit;
8168    }
8169
8170    /* convert filectrl text option to value. allow any unique prefix
8171    ** of the option name, or a numerical value. */
8172    n2 = strlen30(zCmd);
8173    for(i=0; i<ArraySize(aCtrl); i++){
8174      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8175        if( filectrl<0 ){
8176          filectrl = aCtrl[i].ctrlCode;
8177          iCtrl = i;
8178        }else{
8179          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8180                              "Use \".filectrl --help\" for help\n", zCmd);
8181          rc = 1;
8182          goto meta_command_exit;
8183        }
8184      }
8185    }
8186    if( filectrl<0 ){
8187      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8188                         "Use \".filectrl --help\" for help\n", zCmd);
8189    }else{
8190      switch(filectrl){
8191        case SQLITE_FCNTL_SIZE_LIMIT: {
8192          if( nArg!=2 && nArg!=3 ) break;
8193          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8194          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8195          isOk = 1;
8196          break;
8197        }
8198        case SQLITE_FCNTL_LOCK_TIMEOUT:
8199        case SQLITE_FCNTL_CHUNK_SIZE: {
8200          int x;
8201          if( nArg!=3 ) break;
8202          x = (int)integerValue(azArg[2]);
8203          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8204          isOk = 2;
8205          break;
8206        }
8207        case SQLITE_FCNTL_PERSIST_WAL:
8208        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8209          int x;
8210          if( nArg!=2 && nArg!=3 ) break;
8211          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8212          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8213          iRes = x;
8214          isOk = 1;
8215          break;
8216        }
8217        case SQLITE_FCNTL_DATA_VERSION:
8218        case SQLITE_FCNTL_HAS_MOVED: {
8219          int x;
8220          if( nArg!=2 ) break;
8221          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8222          iRes = x;
8223          isOk = 1;
8224          break;
8225        }
8226        case SQLITE_FCNTL_TEMPFILENAME: {
8227          char *z = 0;
8228          if( nArg!=2 ) break;
8229          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8230          if( z ){
8231            utf8_printf(p->out, "%s\n", z);
8232            sqlite3_free(z);
8233          }
8234          isOk = 2;
8235          break;
8236        }
8237        case SQLITE_FCNTL_RESERVE_BYTES: {
8238          int x;
8239          if( nArg>=3 ){
8240            x = atoi(azArg[2]);
8241            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8242          }
8243          x = -1;
8244          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8245          utf8_printf(p->out,"%d\n", x);
8246          isOk = 2;
8247          break;
8248        }
8249      }
8250    }
8251    if( isOk==0 && iCtrl>=0 ){
8252      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8253      rc = 1;
8254    }else if( isOk==1 ){
8255      char zBuf[100];
8256      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8257      raw_printf(p->out, "%s\n", zBuf);
8258    }
8259  }else
8260
8261  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8262    ShellState data;
8263    int doStats = 0;
8264    memcpy(&data, p, sizeof(data));
8265    data.showHeader = 0;
8266    data.cMode = data.mode = MODE_Semi;
8267    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8268      data.cMode = data.mode = MODE_Pretty;
8269      nArg = 1;
8270    }
8271    if( nArg!=1 ){
8272      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8273      rc = 1;
8274      goto meta_command_exit;
8275    }
8276    open_db(p, 0);
8277    rc = sqlite3_exec(p->db,
8278       "SELECT sql FROM"
8279       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8280       "     FROM sqlite_schema UNION ALL"
8281       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8282       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8283       "ORDER BY x",
8284       callback, &data, 0
8285    );
8286    if( rc==SQLITE_OK ){
8287      sqlite3_stmt *pStmt;
8288      rc = sqlite3_prepare_v2(p->db,
8289               "SELECT rowid FROM sqlite_schema"
8290               " WHERE name GLOB 'sqlite_stat[134]'",
8291               -1, &pStmt, 0);
8292      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8293      sqlite3_finalize(pStmt);
8294    }
8295    if( doStats==0 ){
8296      raw_printf(p->out, "/* No STAT tables available */\n");
8297    }else{
8298      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8299      data.cMode = data.mode = MODE_Insert;
8300      data.zDestTable = "sqlite_stat1";
8301      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8302      data.zDestTable = "sqlite_stat4";
8303      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8304      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8305    }
8306  }else
8307
8308  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8309    if( nArg==2 ){
8310      p->showHeader = booleanValue(azArg[1]);
8311      p->shellFlgs |= SHFLG_HeaderSet;
8312    }else{
8313      raw_printf(stderr, "Usage: .headers on|off\n");
8314      rc = 1;
8315    }
8316  }else
8317
8318  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8319    if( nArg>=2 ){
8320      n = showHelp(p->out, azArg[1]);
8321      if( n==0 ){
8322        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8323      }
8324    }else{
8325      showHelp(p->out, 0);
8326    }
8327  }else
8328
8329  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8330    char *zTable = 0;           /* Insert data into this table */
8331    char *zFile = 0;            /* Name of file to extra content from */
8332    sqlite3_stmt *pStmt = NULL; /* A statement */
8333    int nCol;                   /* Number of columns in the table */
8334    int nByte;                  /* Number of bytes in an SQL string */
8335    int i, j;                   /* Loop counters */
8336    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8337    int nSep;                   /* Number of bytes in p->colSeparator[] */
8338    char *zSql;                 /* An SQL statement */
8339    ImportCtx sCtx;             /* Reader context */
8340    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8341    int eVerbose = 0;           /* Larger for more console output */
8342    int nSkip = 0;              /* Initial lines to skip */
8343    int useOutputMode = 1;      /* Use output mode to determine separators */
8344
8345    failIfSafeMode(p, "cannot run .import in safe mode");
8346    memset(&sCtx, 0, sizeof(sCtx));
8347    sCtx.z = sqlite3_malloc64(120);
8348    if( sCtx.z==0 ){
8349      import_cleanup(&sCtx);
8350      shell_out_of_memory();
8351    }
8352    if( p->mode==MODE_Ascii ){
8353      xRead = ascii_read_one_field;
8354    }else{
8355      xRead = csv_read_one_field;
8356    }
8357    for(i=1; i<nArg; i++){
8358      char *z = azArg[i];
8359      if( z[0]=='-' && z[1]=='-' ) z++;
8360      if( z[0]!='-' ){
8361        if( zFile==0 ){
8362          zFile = z;
8363        }else if( zTable==0 ){
8364          zTable = z;
8365        }else{
8366          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8367          showHelp(p->out, "import");
8368          rc = 1;
8369          goto meta_command_exit;
8370        }
8371      }else if( strcmp(z,"-v")==0 ){
8372        eVerbose++;
8373      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8374        nSkip = integerValue(azArg[++i]);
8375      }else if( strcmp(z,"-ascii")==0 ){
8376        sCtx.cColSep = SEP_Unit[0];
8377        sCtx.cRowSep = SEP_Record[0];
8378        xRead = ascii_read_one_field;
8379        useOutputMode = 0;
8380      }else if( strcmp(z,"-csv")==0 ){
8381        sCtx.cColSep = ',';
8382        sCtx.cRowSep = '\n';
8383        xRead = csv_read_one_field;
8384        useOutputMode = 0;
8385      }else{
8386        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8387        showHelp(p->out, "import");
8388        rc = 1;
8389        goto meta_command_exit;
8390      }
8391    }
8392    if( zTable==0 ){
8393      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8394                  zFile==0 ? "FILE" : "TABLE");
8395      showHelp(p->out, "import");
8396      rc = 1;
8397      goto meta_command_exit;
8398    }
8399    seenInterrupt = 0;
8400    open_db(p, 0);
8401    if( useOutputMode ){
8402      /* If neither the --csv or --ascii options are specified, then set
8403      ** the column and row separator characters from the output mode. */
8404      nSep = strlen30(p->colSeparator);
8405      if( nSep==0 ){
8406        raw_printf(stderr,
8407                   "Error: non-null column separator required for import\n");
8408        rc = 1;
8409        goto meta_command_exit;
8410      }
8411      if( nSep>1 ){
8412        raw_printf(stderr,
8413              "Error: multi-character column separators not allowed"
8414              " for import\n");
8415        rc = 1;
8416        goto meta_command_exit;
8417      }
8418      nSep = strlen30(p->rowSeparator);
8419      if( nSep==0 ){
8420        raw_printf(stderr,
8421            "Error: non-null row separator required for import\n");
8422        rc = 1;
8423        goto meta_command_exit;
8424      }
8425      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8426        /* When importing CSV (only), if the row separator is set to the
8427        ** default output row separator, change it to the default input
8428        ** row separator.  This avoids having to maintain different input
8429        ** and output row separators. */
8430        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8431        nSep = strlen30(p->rowSeparator);
8432      }
8433      if( nSep>1 ){
8434        raw_printf(stderr, "Error: multi-character row separators not allowed"
8435                           " for import\n");
8436        rc = 1;
8437        goto meta_command_exit;
8438      }
8439      sCtx.cColSep = p->colSeparator[0];
8440      sCtx.cRowSep = p->rowSeparator[0];
8441    }
8442    sCtx.zFile = zFile;
8443    sCtx.nLine = 1;
8444    if( sCtx.zFile[0]=='|' ){
8445#ifdef SQLITE_OMIT_POPEN
8446      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8447      rc = 1;
8448      goto meta_command_exit;
8449#else
8450      sCtx.in = popen(sCtx.zFile+1, "r");
8451      sCtx.zFile = "<pipe>";
8452      sCtx.xCloser = pclose;
8453#endif
8454    }else{
8455      sCtx.in = fopen(sCtx.zFile, "rb");
8456      sCtx.xCloser = fclose;
8457    }
8458    if( sCtx.in==0 ){
8459      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8460      rc = 1;
8461      import_cleanup(&sCtx);
8462      goto meta_command_exit;
8463    }
8464    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8465      char zSep[2];
8466      zSep[1] = 0;
8467      zSep[0] = sCtx.cColSep;
8468      utf8_printf(p->out, "Column separator ");
8469      output_c_string(p->out, zSep);
8470      utf8_printf(p->out, ", row separator ");
8471      zSep[0] = sCtx.cRowSep;
8472      output_c_string(p->out, zSep);
8473      utf8_printf(p->out, "\n");
8474    }
8475    while( (nSkip--)>0 ){
8476      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8477    }
8478    zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
8479    if( zSql==0 ){
8480      import_cleanup(&sCtx);
8481      shell_out_of_memory();
8482    }
8483    nByte = strlen30(zSql);
8484    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8485    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8486    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8487      char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable);
8488      char cSep = '(';
8489      while( xRead(&sCtx) ){
8490        zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
8491        cSep = ',';
8492        if( sCtx.cTerm!=sCtx.cColSep ) break;
8493      }
8494      if( cSep=='(' ){
8495        sqlite3_free(zCreate);
8496        import_cleanup(&sCtx);
8497        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
8498        rc = 1;
8499        goto meta_command_exit;
8500      }
8501      zCreate = sqlite3_mprintf("%z\n)", zCreate);
8502      if( eVerbose>=1 ){
8503        utf8_printf(p->out, "%s\n", zCreate);
8504      }
8505      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
8506      sqlite3_free(zCreate);
8507      if( rc ){
8508        utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable,
8509                sqlite3_errmsg(p->db));
8510        import_cleanup(&sCtx);
8511        rc = 1;
8512        goto meta_command_exit;
8513      }
8514      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8515    }
8516    sqlite3_free(zSql);
8517    if( rc ){
8518      if (pStmt) sqlite3_finalize(pStmt);
8519      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
8520      import_cleanup(&sCtx);
8521      rc = 1;
8522      goto meta_command_exit;
8523    }
8524    nCol = sqlite3_column_count(pStmt);
8525    sqlite3_finalize(pStmt);
8526    pStmt = 0;
8527    if( nCol==0 ) return 0; /* no columns, no error */
8528    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
8529    if( zSql==0 ){
8530      import_cleanup(&sCtx);
8531      shell_out_of_memory();
8532    }
8533    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
8534    j = strlen30(zSql);
8535    for(i=1; i<nCol; i++){
8536      zSql[j++] = ',';
8537      zSql[j++] = '?';
8538    }
8539    zSql[j++] = ')';
8540    zSql[j] = 0;
8541    if( eVerbose>=2 ){
8542      utf8_printf(p->out, "Insert using: %s\n", zSql);
8543    }
8544    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8545    sqlite3_free(zSql);
8546    if( rc ){
8547      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8548      if (pStmt) sqlite3_finalize(pStmt);
8549      import_cleanup(&sCtx);
8550      rc = 1;
8551      goto meta_command_exit;
8552    }
8553    needCommit = sqlite3_get_autocommit(p->db);
8554    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
8555    do{
8556      int startLine = sCtx.nLine;
8557      for(i=0; i<nCol; i++){
8558        char *z = xRead(&sCtx);
8559        /*
8560        ** Did we reach end-of-file before finding any columns?
8561        ** If so, stop instead of NULL filling the remaining columns.
8562        */
8563        if( z==0 && i==0 ) break;
8564        /*
8565        ** Did we reach end-of-file OR end-of-line before finding any
8566        ** columns in ASCII mode?  If so, stop instead of NULL filling
8567        ** the remaining columns.
8568        */
8569        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
8570        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
8571        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
8572          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8573                          "filling the rest with NULL\n",
8574                          sCtx.zFile, startLine, nCol, i+1);
8575          i += 2;
8576          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
8577        }
8578      }
8579      if( sCtx.cTerm==sCtx.cColSep ){
8580        do{
8581          xRead(&sCtx);
8582          i++;
8583        }while( sCtx.cTerm==sCtx.cColSep );
8584        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8585                        "extras ignored\n",
8586                        sCtx.zFile, startLine, nCol, i);
8587      }
8588      if( i>=nCol ){
8589        sqlite3_step(pStmt);
8590        rc = sqlite3_reset(pStmt);
8591        if( rc!=SQLITE_OK ){
8592          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
8593                      startLine, sqlite3_errmsg(p->db));
8594          sCtx.nErr++;
8595        }else{
8596          sCtx.nRow++;
8597        }
8598      }
8599    }while( sCtx.cTerm!=EOF );
8600
8601    import_cleanup(&sCtx);
8602    sqlite3_finalize(pStmt);
8603    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
8604    if( eVerbose>0 ){
8605      utf8_printf(p->out,
8606          "Added %d rows with %d errors using %d lines of input\n",
8607          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
8608    }
8609  }else
8610
8611#ifndef SQLITE_UNTESTABLE
8612  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
8613    char *zSql;
8614    char *zCollist = 0;
8615    sqlite3_stmt *pStmt;
8616    int tnum = 0;
8617    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
8618    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
8619    int i;
8620    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
8621      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
8622                          "       .imposter off\n");
8623      /* Also allowed, but not documented:
8624      **
8625      **    .imposter TABLE IMPOSTER
8626      **
8627      ** where TABLE is a WITHOUT ROWID table.  In that case, the
8628      ** imposter is another WITHOUT ROWID table with the columns in
8629      ** storage order. */
8630      rc = 1;
8631      goto meta_command_exit;
8632    }
8633    open_db(p, 0);
8634    if( nArg==2 ){
8635      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
8636      goto meta_command_exit;
8637    }
8638    zSql = sqlite3_mprintf(
8639      "SELECT rootpage, 0 FROM sqlite_schema"
8640      " WHERE name='%q' AND type='index'"
8641      "UNION ALL "
8642      "SELECT rootpage, 1 FROM sqlite_schema"
8643      " WHERE name='%q' AND type='table'"
8644      "   AND sql LIKE '%%without%%rowid%%'",
8645      azArg[1], azArg[1]
8646    );
8647    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8648    sqlite3_free(zSql);
8649    if( sqlite3_step(pStmt)==SQLITE_ROW ){
8650      tnum = sqlite3_column_int(pStmt, 0);
8651      isWO = sqlite3_column_int(pStmt, 1);
8652    }
8653    sqlite3_finalize(pStmt);
8654    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
8655    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8656    sqlite3_free(zSql);
8657    i = 0;
8658    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
8659      char zLabel[20];
8660      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
8661      i++;
8662      if( zCol==0 ){
8663        if( sqlite3_column_int(pStmt,1)==-1 ){
8664          zCol = "_ROWID_";
8665        }else{
8666          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
8667          zCol = zLabel;
8668        }
8669      }
8670      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
8671        lenPK = (int)strlen(zCollist);
8672      }
8673      if( zCollist==0 ){
8674        zCollist = sqlite3_mprintf("\"%w\"", zCol);
8675      }else{
8676        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
8677      }
8678    }
8679    sqlite3_finalize(pStmt);
8680    if( i==0 || tnum==0 ){
8681      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
8682      rc = 1;
8683      sqlite3_free(zCollist);
8684      goto meta_command_exit;
8685    }
8686    if( lenPK==0 ) lenPK = 100000;
8687    zSql = sqlite3_mprintf(
8688          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
8689          azArg[2], zCollist, lenPK, zCollist);
8690    sqlite3_free(zCollist);
8691    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
8692    if( rc==SQLITE_OK ){
8693      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
8694      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
8695      if( rc ){
8696        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
8697      }else{
8698        utf8_printf(stdout, "%s;\n", zSql);
8699        raw_printf(stdout,
8700          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
8701          azArg[1], isWO ? "table" : "index"
8702        );
8703      }
8704    }else{
8705      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
8706      rc = 1;
8707    }
8708    sqlite3_free(zSql);
8709  }else
8710#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
8711
8712#ifdef SQLITE_ENABLE_IOTRACE
8713  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
8714    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
8715    if( iotrace && iotrace!=stdout ) fclose(iotrace);
8716    iotrace = 0;
8717    if( nArg<2 ){
8718      sqlite3IoTrace = 0;
8719    }else if( strcmp(azArg[1], "-")==0 ){
8720      sqlite3IoTrace = iotracePrintf;
8721      iotrace = stdout;
8722    }else{
8723      iotrace = fopen(azArg[1], "w");
8724      if( iotrace==0 ){
8725        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
8726        sqlite3IoTrace = 0;
8727        rc = 1;
8728      }else{
8729        sqlite3IoTrace = iotracePrintf;
8730      }
8731    }
8732  }else
8733#endif
8734
8735  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
8736    static const struct {
8737       const char *zLimitName;   /* Name of a limit */
8738       int limitCode;            /* Integer code for that limit */
8739    } aLimit[] = {
8740      { "length",                SQLITE_LIMIT_LENGTH                    },
8741      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
8742      { "column",                SQLITE_LIMIT_COLUMN                    },
8743      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
8744      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
8745      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
8746      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
8747      { "attached",              SQLITE_LIMIT_ATTACHED                  },
8748      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
8749      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
8750      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
8751      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
8752    };
8753    int i, n2;
8754    open_db(p, 0);
8755    if( nArg==1 ){
8756      for(i=0; i<ArraySize(aLimit); i++){
8757        printf("%20s %d\n", aLimit[i].zLimitName,
8758               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
8759      }
8760    }else if( nArg>3 ){
8761      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
8762      rc = 1;
8763      goto meta_command_exit;
8764    }else{
8765      int iLimit = -1;
8766      n2 = strlen30(azArg[1]);
8767      for(i=0; i<ArraySize(aLimit); i++){
8768        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
8769          if( iLimit<0 ){
8770            iLimit = i;
8771          }else{
8772            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
8773            rc = 1;
8774            goto meta_command_exit;
8775          }
8776        }
8777      }
8778      if( iLimit<0 ){
8779        utf8_printf(stderr, "unknown limit: \"%s\"\n"
8780                        "enter \".limits\" with no arguments for a list.\n",
8781                         azArg[1]);
8782        rc = 1;
8783        goto meta_command_exit;
8784      }
8785      if( nArg==3 ){
8786        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
8787                      (int)integerValue(azArg[2]));
8788      }
8789      printf("%20s %d\n", aLimit[iLimit].zLimitName,
8790             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
8791    }
8792  }else
8793
8794  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
8795    open_db(p, 0);
8796    lintDotCommand(p, azArg, nArg);
8797  }else
8798
8799#ifndef SQLITE_OMIT_LOAD_EXTENSION
8800  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
8801    const char *zFile, *zProc;
8802    char *zErrMsg = 0;
8803    failIfSafeMode(p, "cannot run .load in safe mode");
8804    if( nArg<2 ){
8805      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
8806      rc = 1;
8807      goto meta_command_exit;
8808    }
8809    zFile = azArg[1];
8810    zProc = nArg>=3 ? azArg[2] : 0;
8811    open_db(p, 0);
8812    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
8813    if( rc!=SQLITE_OK ){
8814      utf8_printf(stderr, "Error: %s\n", zErrMsg);
8815      sqlite3_free(zErrMsg);
8816      rc = 1;
8817    }
8818  }else
8819#endif
8820
8821  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
8822    failIfSafeMode(p, "cannot run .log in safe mode");
8823    if( nArg!=2 ){
8824      raw_printf(stderr, "Usage: .log FILENAME\n");
8825      rc = 1;
8826    }else{
8827      const char *zFile = azArg[1];
8828      output_file_close(p->pLog);
8829      p->pLog = output_file_open(zFile, 0);
8830    }
8831  }else
8832
8833  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
8834    const char *zMode = nArg>=2 ? azArg[1] : "";
8835    int n2 = strlen30(zMode);
8836    int c2 = zMode[0];
8837    if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
8838      p->mode = MODE_Line;
8839      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8840    }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
8841      p->mode = MODE_Column;
8842      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
8843        p->showHeader = 1;
8844      }
8845      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8846    }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
8847      p->mode = MODE_List;
8848      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
8849      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8850    }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
8851      p->mode = MODE_Html;
8852    }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
8853      p->mode = MODE_Tcl;
8854      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
8855      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8856    }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
8857      p->mode = MODE_Csv;
8858      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8859      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
8860    }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
8861      p->mode = MODE_List;
8862      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
8863    }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
8864      p->mode = MODE_Insert;
8865      set_table_name(p, nArg>=3 ? azArg[2] : "table");
8866    }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
8867      p->mode = MODE_Quote;
8868      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8869      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8870    }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
8871      p->mode = MODE_Ascii;
8872      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
8873      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
8874    }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){
8875      p->mode = MODE_Markdown;
8876    }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){
8877      p->mode = MODE_Table;
8878    }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){
8879      p->mode = MODE_Box;
8880    }else if( c2=='c' && strncmp(azArg[1],"count",n2)==0 ){
8881      p->mode = MODE_Count;
8882    }else if( c2=='o' && strncmp(azArg[1],"off",n2)==0 ){
8883      p->mode = MODE_Off;
8884    }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){
8885      p->mode = MODE_Json;
8886    }else if( nArg==1 ){
8887      raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
8888    }else{
8889      raw_printf(stderr, "Error: mode should be one of: "
8890         "ascii box column csv html insert json line list markdown "
8891         "quote table tabs tcl\n");
8892      rc = 1;
8893    }
8894    p->cMode = p->mode;
8895  }else
8896
8897  if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
8898    if( nArg!=2 ){
8899      raw_printf(stderr, "Usage: .nonce NONCE\n");
8900      rc = 1;
8901    }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
8902      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
8903                 p->lineno, azArg[1]);
8904      exit(1);
8905    }else{
8906      p->bSafeMode = 0;
8907      return 0;  /* Return immediately to bypass the safe mode reset
8908                 ** at the end of this procedure */
8909    }
8910  }else
8911
8912  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
8913    if( nArg==2 ){
8914      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
8915                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
8916    }else{
8917      raw_printf(stderr, "Usage: .nullvalue STRING\n");
8918      rc = 1;
8919    }
8920  }else
8921
8922  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
8923    const char *zFN = 0;     /* Pointer to constant filename */
8924    char *zNewFilename = 0;  /* Name of the database file to open */
8925    int iName = 1;           /* Index in azArg[] of the filename */
8926    int newFlag = 0;         /* True to delete file before opening */
8927    int openMode = SHELL_OPEN_UNSPEC;
8928
8929    /* Check for command-line arguments */
8930    for(iName=1; iName<nArg; iName++){
8931      const char *z = azArg[iName];
8932      if( optionMatch(z,"new") ){
8933        newFlag = 1;
8934#ifdef SQLITE_HAVE_ZLIB
8935      }else if( optionMatch(z, "zip") ){
8936        openMode = SHELL_OPEN_ZIPFILE;
8937#endif
8938      }else if( optionMatch(z, "append") ){
8939        openMode = SHELL_OPEN_APPENDVFS;
8940      }else if( optionMatch(z, "readonly") ){
8941        openMode = SHELL_OPEN_READONLY;
8942      }else if( optionMatch(z, "nofollow") ){
8943        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
8944#ifndef SQLITE_OMIT_DESERIALIZE
8945      }else if( optionMatch(z, "deserialize") ){
8946        openMode = SHELL_OPEN_DESERIALIZE;
8947      }else if( optionMatch(z, "hexdb") ){
8948        openMode = SHELL_OPEN_HEXDB;
8949      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
8950        p->szMax = integerValue(azArg[++iName]);
8951#endif /* SQLITE_OMIT_DESERIALIZE */
8952      }else if( z[0]=='-' ){
8953        utf8_printf(stderr, "unknown option: %s\n", z);
8954        rc = 1;
8955        goto meta_command_exit;
8956      }else if( zFN ){
8957        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
8958        rc = 1;
8959        goto meta_command_exit;
8960      }else{
8961        zFN = z;
8962      }
8963    }
8964
8965    /* Close the existing database */
8966    session_close_all(p, -1);
8967    close_db(p->db);
8968    p->db = 0;
8969    p->pAuxDb->zDbFilename = 0;
8970    sqlite3_free(p->pAuxDb->zFreeOnClose);
8971    p->pAuxDb->zFreeOnClose = 0;
8972    p->openMode = openMode;
8973    p->openFlags = 0;
8974    p->szMax = 0;
8975
8976    /* If a filename is specified, try to open it first */
8977    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
8978      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
8979      if( p->bSafeMode
8980       && p->openMode!=SHELL_OPEN_HEXDB
8981       && zFN
8982       && strcmp(zFN,":memory:")!=0
8983      ){
8984        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
8985      }
8986      if( zFN ){
8987        zNewFilename = sqlite3_mprintf("%s", zFN);
8988        shell_check_oom(zNewFilename);
8989      }else{
8990        zNewFilename = 0;
8991      }
8992      p->pAuxDb->zDbFilename = zNewFilename;
8993      open_db(p, OPEN_DB_KEEPALIVE);
8994      if( p->db==0 ){
8995        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
8996        sqlite3_free(zNewFilename);
8997      }else{
8998        p->pAuxDb->zFreeOnClose = zNewFilename;
8999      }
9000    }
9001    if( p->db==0 ){
9002      /* As a fall-back open a TEMP database */
9003      p->pAuxDb->zDbFilename = 0;
9004      open_db(p, 0);
9005    }
9006  }else
9007
9008  if( (c=='o'
9009        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9010   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9011  ){
9012    char *zFile = 0;
9013    int bTxtMode = 0;
9014    int i;
9015    int eMode = 0;
9016    int bBOM = 0;
9017    int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
9018
9019    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9020    if( c=='e' ){
9021      eMode = 'x';
9022      bOnce = 2;
9023    }else if( strncmp(azArg[0],"once",n)==0 ){
9024      bOnce = 1;
9025    }
9026    for(i=1; i<nArg; i++){
9027      char *z = azArg[i];
9028      if( z[0]=='-' ){
9029        if( z[1]=='-' ) z++;
9030        if( strcmp(z,"-bom")==0 ){
9031          bBOM = 1;
9032        }else if( c!='e' && strcmp(z,"-x")==0 ){
9033          eMode = 'x';  /* spreadsheet */
9034        }else if( c!='e' && strcmp(z,"-e")==0 ){
9035          eMode = 'e';  /* text editor */
9036        }else{
9037          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9038                      azArg[i]);
9039          showHelp(p->out, azArg[0]);
9040          rc = 1;
9041          goto meta_command_exit;
9042        }
9043      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9044        zFile = sqlite3_mprintf("%s", z);
9045        if( zFile && zFile[0]=='|' ){
9046          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9047          break;
9048        }
9049      }else{
9050        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9051                    azArg[i]);
9052        showHelp(p->out, azArg[0]);
9053        rc = 1;
9054        sqlite3_free(zFile);
9055        goto meta_command_exit;
9056      }
9057    }
9058    if( zFile==0 ){
9059      zFile = sqlite3_mprintf("stdout");
9060    }
9061    if( bOnce ){
9062      p->outCount = 2;
9063    }else{
9064      p->outCount = 0;
9065    }
9066    output_reset(p);
9067#ifndef SQLITE_NOHAVE_SYSTEM
9068    if( eMode=='e' || eMode=='x' ){
9069      p->doXdgOpen = 1;
9070      outputModePush(p);
9071      if( eMode=='x' ){
9072        /* spreadsheet mode.  Output as CSV. */
9073        newTempFile(p, "csv");
9074        ShellClearFlag(p, SHFLG_Echo);
9075        p->mode = MODE_Csv;
9076        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9077        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9078      }else{
9079        /* text editor mode */
9080        newTempFile(p, "txt");
9081        bTxtMode = 1;
9082      }
9083      sqlite3_free(zFile);
9084      zFile = sqlite3_mprintf("%s", p->zTempFile);
9085    }
9086#endif /* SQLITE_NOHAVE_SYSTEM */
9087    shell_check_oom(zFile);
9088    if( zFile[0]=='|' ){
9089#ifdef SQLITE_OMIT_POPEN
9090      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9091      rc = 1;
9092      p->out = stdout;
9093#else
9094      p->out = popen(zFile + 1, "w");
9095      if( p->out==0 ){
9096        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9097        p->out = stdout;
9098        rc = 1;
9099      }else{
9100        if( bBOM ) fprintf(p->out,"\357\273\277");
9101        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9102      }
9103#endif
9104    }else{
9105      p->out = output_file_open(zFile, bTxtMode);
9106      if( p->out==0 ){
9107        if( strcmp(zFile,"off")!=0 ){
9108          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9109        }
9110        p->out = stdout;
9111        rc = 1;
9112      } else {
9113        if( bBOM ) fprintf(p->out,"\357\273\277");
9114        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9115      }
9116    }
9117    sqlite3_free(zFile);
9118  }else
9119
9120  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9121    open_db(p,0);
9122    if( nArg<=1 ) goto parameter_syntax_error;
9123
9124    /* .parameter clear
9125    ** Clear all bind parameters by dropping the TEMP table that holds them.
9126    */
9127    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9128      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9129                   0, 0, 0);
9130    }else
9131
9132    /* .parameter list
9133    ** List all bind parameters.
9134    */
9135    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9136      sqlite3_stmt *pStmt = 0;
9137      int rx;
9138      int len = 0;
9139      rx = sqlite3_prepare_v2(p->db,
9140             "SELECT max(length(key)) "
9141             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9142      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9143        len = sqlite3_column_int(pStmt, 0);
9144        if( len>40 ) len = 40;
9145      }
9146      sqlite3_finalize(pStmt);
9147      pStmt = 0;
9148      if( len ){
9149        rx = sqlite3_prepare_v2(p->db,
9150             "SELECT key, quote(value) "
9151             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9152        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9153          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9154                      sqlite3_column_text(pStmt,1));
9155        }
9156        sqlite3_finalize(pStmt);
9157      }
9158    }else
9159
9160    /* .parameter init
9161    ** Make sure the TEMP table used to hold bind parameters exists.
9162    ** Create it if necessary.
9163    */
9164    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9165      bind_table_init(p);
9166    }else
9167
9168    /* .parameter set NAME VALUE
9169    ** Set or reset a bind parameter.  NAME should be the full parameter
9170    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9171    ** VALUE can be in either SQL literal notation, or if not it will be
9172    ** understood to be a text string.
9173    */
9174    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9175      int rx;
9176      char *zSql;
9177      sqlite3_stmt *pStmt;
9178      const char *zKey = azArg[2];
9179      const char *zValue = azArg[3];
9180      bind_table_init(p);
9181      zSql = sqlite3_mprintf(
9182                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9183                  "VALUES(%Q,%s);", zKey, zValue);
9184      shell_check_oom(zSql);
9185      pStmt = 0;
9186      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9187      sqlite3_free(zSql);
9188      if( rx!=SQLITE_OK ){
9189        sqlite3_finalize(pStmt);
9190        pStmt = 0;
9191        zSql = sqlite3_mprintf(
9192                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9193                   "VALUES(%Q,%Q);", zKey, zValue);
9194        shell_check_oom(zSql);
9195        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9196        sqlite3_free(zSql);
9197        if( rx!=SQLITE_OK ){
9198          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9199          sqlite3_finalize(pStmt);
9200          pStmt = 0;
9201          rc = 1;
9202        }
9203      }
9204      sqlite3_step(pStmt);
9205      sqlite3_finalize(pStmt);
9206    }else
9207
9208    /* .parameter unset NAME
9209    ** Remove the NAME binding from the parameter binding table, if it
9210    ** exists.
9211    */
9212    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9213      char *zSql = sqlite3_mprintf(
9214          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9215      shell_check_oom(zSql);
9216      sqlite3_exec(p->db, zSql, 0, 0, 0);
9217      sqlite3_free(zSql);
9218    }else
9219    /* If no command name matches, show a syntax error */
9220    parameter_syntax_error:
9221    showHelp(p->out, "parameter");
9222  }else
9223
9224  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9225    int i;
9226    for(i=1; i<nArg; i++){
9227      if( i>1 ) raw_printf(p->out, " ");
9228      utf8_printf(p->out, "%s", azArg[i]);
9229    }
9230    raw_printf(p->out, "\n");
9231  }else
9232
9233#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9234  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9235    int i;
9236    int nn = 0;
9237    p->flgProgress = 0;
9238    p->mxProgress = 0;
9239    p->nProgress = 0;
9240    for(i=1; i<nArg; i++){
9241      const char *z = azArg[i];
9242      if( z[0]=='-' ){
9243        z++;
9244        if( z[0]=='-' ) z++;
9245        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9246          p->flgProgress |= SHELL_PROGRESS_QUIET;
9247          continue;
9248        }
9249        if( strcmp(z,"reset")==0 ){
9250          p->flgProgress |= SHELL_PROGRESS_RESET;
9251          continue;
9252        }
9253        if( strcmp(z,"once")==0 ){
9254          p->flgProgress |= SHELL_PROGRESS_ONCE;
9255          continue;
9256        }
9257        if( strcmp(z,"limit")==0 ){
9258          if( i+1>=nArg ){
9259            utf8_printf(stderr, "Error: missing argument on --limit\n");
9260            rc = 1;
9261            goto meta_command_exit;
9262          }else{
9263            p->mxProgress = (int)integerValue(azArg[++i]);
9264          }
9265          continue;
9266        }
9267        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9268        rc = 1;
9269        goto meta_command_exit;
9270      }else{
9271        nn = (int)integerValue(z);
9272      }
9273    }
9274    open_db(p, 0);
9275    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9276  }else
9277#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9278
9279  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9280    if( nArg >= 2) {
9281      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9282    }
9283    if( nArg >= 3) {
9284      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9285    }
9286  }else
9287
9288  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9289    rc = 2;
9290  }else
9291
9292  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9293    FILE *inSaved = p->in;
9294    int savedLineno = p->lineno;
9295    failIfSafeMode(p, "cannot run .read in safe mode");
9296    if( nArg!=2 ){
9297      raw_printf(stderr, "Usage: .read FILE\n");
9298      rc = 1;
9299      goto meta_command_exit;
9300    }
9301    if( azArg[1][0]=='|' ){
9302#ifdef SQLITE_OMIT_POPEN
9303      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9304      rc = 1;
9305      p->out = stdout;
9306#else
9307      p->in = popen(azArg[1]+1, "r");
9308      if( p->in==0 ){
9309        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9310        rc = 1;
9311      }else{
9312        rc = process_input(p);
9313        pclose(p->in);
9314      }
9315#endif
9316    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9317      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9318      rc = 1;
9319    }else{
9320      rc = process_input(p);
9321      fclose(p->in);
9322    }
9323    p->in = inSaved;
9324    p->lineno = savedLineno;
9325  }else
9326
9327  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9328    const char *zSrcFile;
9329    const char *zDb;
9330    sqlite3 *pSrc;
9331    sqlite3_backup *pBackup;
9332    int nTimeout = 0;
9333
9334    failIfSafeMode(p, "cannot run .restore in safe mode");
9335    if( nArg==2 ){
9336      zSrcFile = azArg[1];
9337      zDb = "main";
9338    }else if( nArg==3 ){
9339      zSrcFile = azArg[2];
9340      zDb = azArg[1];
9341    }else{
9342      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9343      rc = 1;
9344      goto meta_command_exit;
9345    }
9346    rc = sqlite3_open(zSrcFile, &pSrc);
9347    if( rc!=SQLITE_OK ){
9348      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9349      close_db(pSrc);
9350      return 1;
9351    }
9352    open_db(p, 0);
9353    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9354    if( pBackup==0 ){
9355      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9356      close_db(pSrc);
9357      return 1;
9358    }
9359    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9360          || rc==SQLITE_BUSY  ){
9361      if( rc==SQLITE_BUSY ){
9362        if( nTimeout++ >= 3 ) break;
9363        sqlite3_sleep(100);
9364      }
9365    }
9366    sqlite3_backup_finish(pBackup);
9367    if( rc==SQLITE_DONE ){
9368      rc = 0;
9369    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9370      raw_printf(stderr, "Error: source database is busy\n");
9371      rc = 1;
9372    }else{
9373      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9374      rc = 1;
9375    }
9376    close_db(pSrc);
9377  }else
9378
9379  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9380    if( nArg==2 ){
9381      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9382#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9383      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9384#endif
9385    }else{
9386      raw_printf(stderr, "Usage: .scanstats on|off\n");
9387      rc = 1;
9388    }
9389  }else
9390
9391  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9392    ShellText sSelect;
9393    ShellState data;
9394    char *zErrMsg = 0;
9395    const char *zDiv = "(";
9396    const char *zName = 0;
9397    int iSchema = 0;
9398    int bDebug = 0;
9399    int bNoSystemTabs = 0;
9400    int ii;
9401
9402    open_db(p, 0);
9403    memcpy(&data, p, sizeof(data));
9404    data.showHeader = 0;
9405    data.cMode = data.mode = MODE_Semi;
9406    initText(&sSelect);
9407    for(ii=1; ii<nArg; ii++){
9408      if( optionMatch(azArg[ii],"indent") ){
9409        data.cMode = data.mode = MODE_Pretty;
9410      }else if( optionMatch(azArg[ii],"debug") ){
9411        bDebug = 1;
9412      }else if( optionMatch(azArg[ii],"nosys") ){
9413        bNoSystemTabs = 1;
9414      }else if( azArg[ii][0]=='-' ){
9415        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9416        rc = 1;
9417        goto meta_command_exit;
9418      }else if( zName==0 ){
9419        zName = azArg[ii];
9420      }else{
9421        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9422        rc = 1;
9423        goto meta_command_exit;
9424      }
9425    }
9426    if( zName!=0 ){
9427      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
9428                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
9429                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
9430                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
9431      if( isSchema ){
9432        char *new_argv[2], *new_colv[2];
9433        new_argv[0] = sqlite3_mprintf(
9434                      "CREATE TABLE %s (\n"
9435                      "  type text,\n"
9436                      "  name text,\n"
9437                      "  tbl_name text,\n"
9438                      "  rootpage integer,\n"
9439                      "  sql text\n"
9440                      ")", zName);
9441        shell_check_oom(new_argv[0]);
9442        new_argv[1] = 0;
9443        new_colv[0] = "sql";
9444        new_colv[1] = 0;
9445        callback(&data, 1, new_argv, new_colv);
9446        sqlite3_free(new_argv[0]);
9447      }
9448    }
9449    if( zDiv ){
9450      sqlite3_stmt *pStmt = 0;
9451      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
9452                              -1, &pStmt, 0);
9453      if( rc ){
9454        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9455        sqlite3_finalize(pStmt);
9456        rc = 1;
9457        goto meta_command_exit;
9458      }
9459      appendText(&sSelect, "SELECT sql FROM", 0);
9460      iSchema = 0;
9461      while( sqlite3_step(pStmt)==SQLITE_ROW ){
9462        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
9463        char zScNum[30];
9464        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
9465        appendText(&sSelect, zDiv, 0);
9466        zDiv = " UNION ALL ";
9467        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
9468        if( sqlite3_stricmp(zDb, "main")!=0 ){
9469          appendText(&sSelect, zDb, '\'');
9470        }else{
9471          appendText(&sSelect, "NULL", 0);
9472        }
9473        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
9474        appendText(&sSelect, zScNum, 0);
9475        appendText(&sSelect, " AS snum, ", 0);
9476        appendText(&sSelect, zDb, '\'');
9477        appendText(&sSelect, " AS sname FROM ", 0);
9478        appendText(&sSelect, zDb, quoteChar(zDb));
9479        appendText(&sSelect, ".sqlite_schema", 0);
9480      }
9481      sqlite3_finalize(pStmt);
9482#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
9483      if( zName ){
9484        appendText(&sSelect,
9485           " UNION ALL SELECT shell_module_schema(name),"
9486           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
9487        0);
9488      }
9489#endif
9490      appendText(&sSelect, ") WHERE ", 0);
9491      if( zName ){
9492        char *zQarg = sqlite3_mprintf("%Q", zName);
9493        shell_check_oom(zQarg);
9494        int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
9495                    strchr(zName, '[') != 0;
9496        if( strchr(zName, '.') ){
9497          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
9498        }else{
9499          appendText(&sSelect, "lower(tbl_name)", 0);
9500        }
9501        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
9502        appendText(&sSelect, zQarg, 0);
9503        if( !bGlob ){
9504          appendText(&sSelect, " ESCAPE '\\' ", 0);
9505        }
9506        appendText(&sSelect, " AND ", 0);
9507        sqlite3_free(zQarg);
9508      }
9509      if( bNoSystemTabs ){
9510        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
9511      }
9512      appendText(&sSelect, "sql IS NOT NULL"
9513                           " ORDER BY snum, rowid", 0);
9514      if( bDebug ){
9515        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
9516      }else{
9517        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
9518      }
9519      freeText(&sSelect);
9520    }
9521    if( zErrMsg ){
9522      utf8_printf(stderr,"Error: %s\n", zErrMsg);
9523      sqlite3_free(zErrMsg);
9524      rc = 1;
9525    }else if( rc != SQLITE_OK ){
9526      raw_printf(stderr,"Error: querying schema information\n");
9527      rc = 1;
9528    }else{
9529      rc = 0;
9530    }
9531  }else
9532
9533  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
9534    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
9535    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
9536  }else
9537
9538#if defined(SQLITE_ENABLE_SESSION)
9539  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
9540    struct AuxDb *pAuxDb = p->pAuxDb;
9541    OpenSession *pSession = &pAuxDb->aSession[0];
9542    char **azCmd = &azArg[1];
9543    int iSes = 0;
9544    int nCmd = nArg - 1;
9545    int i;
9546    if( nArg<=1 ) goto session_syntax_error;
9547    open_db(p, 0);
9548    if( nArg>=3 ){
9549      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
9550        if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
9551      }
9552      if( iSes<pAuxDb->nSession ){
9553        pSession = &pAuxDb->aSession[iSes];
9554        azCmd++;
9555        nCmd--;
9556      }else{
9557        pSession = &pAuxDb->aSession[0];
9558        iSes = 0;
9559      }
9560    }
9561
9562    /* .session attach TABLE
9563    ** Invoke the sqlite3session_attach() interface to attach a particular
9564    ** table so that it is never filtered.
9565    */
9566    if( strcmp(azCmd[0],"attach")==0 ){
9567      if( nCmd!=2 ) goto session_syntax_error;
9568      if( pSession->p==0 ){
9569        session_not_open:
9570        raw_printf(stderr, "ERROR: No sessions are open\n");
9571      }else{
9572        rc = sqlite3session_attach(pSession->p, azCmd[1]);
9573        if( rc ){
9574          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
9575          rc = 0;
9576        }
9577      }
9578    }else
9579
9580    /* .session changeset FILE
9581    ** .session patchset FILE
9582    ** Write a changeset or patchset into a file.  The file is overwritten.
9583    */
9584    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
9585      FILE *out = 0;
9586      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
9587      if( nCmd!=2 ) goto session_syntax_error;
9588      if( pSession->p==0 ) goto session_not_open;
9589      out = fopen(azCmd[1], "wb");
9590      if( out==0 ){
9591        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
9592                    azCmd[1]);
9593      }else{
9594        int szChng;
9595        void *pChng;
9596        if( azCmd[0][0]=='c' ){
9597          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
9598        }else{
9599          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
9600        }
9601        if( rc ){
9602          printf("Error: error code %d\n", rc);
9603          rc = 0;
9604        }
9605        if( pChng
9606          && fwrite(pChng, szChng, 1, out)!=1 ){
9607          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
9608                  szChng);
9609        }
9610        sqlite3_free(pChng);
9611        fclose(out);
9612      }
9613    }else
9614
9615    /* .session close
9616    ** Close the identified session
9617    */
9618    if( strcmp(azCmd[0], "close")==0 ){
9619      if( nCmd!=1 ) goto session_syntax_error;
9620      if( pAuxDb->nSession ){
9621        session_close(pSession);
9622        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
9623      }
9624    }else
9625
9626    /* .session enable ?BOOLEAN?
9627    ** Query or set the enable flag
9628    */
9629    if( strcmp(azCmd[0], "enable")==0 ){
9630      int ii;
9631      if( nCmd>2 ) goto session_syntax_error;
9632      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9633      if( pAuxDb->nSession ){
9634        ii = sqlite3session_enable(pSession->p, ii);
9635        utf8_printf(p->out, "session %s enable flag = %d\n",
9636                    pSession->zName, ii);
9637      }
9638    }else
9639
9640    /* .session filter GLOB ....
9641    ** Set a list of GLOB patterns of table names to be excluded.
9642    */
9643    if( strcmp(azCmd[0], "filter")==0 ){
9644      int ii, nByte;
9645      if( nCmd<2 ) goto session_syntax_error;
9646      if( pAuxDb->nSession ){
9647        for(ii=0; ii<pSession->nFilter; ii++){
9648          sqlite3_free(pSession->azFilter[ii]);
9649        }
9650        sqlite3_free(pSession->azFilter);
9651        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
9652        pSession->azFilter = sqlite3_malloc( nByte );
9653        if( pSession->azFilter==0 ){
9654          raw_printf(stderr, "Error: out or memory\n");
9655          exit(1);
9656        }
9657        for(ii=1; ii<nCmd; ii++){
9658          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
9659          shell_check_oom(x);
9660        }
9661        pSession->nFilter = ii-1;
9662      }
9663    }else
9664
9665    /* .session indirect ?BOOLEAN?
9666    ** Query or set the indirect flag
9667    */
9668    if( strcmp(azCmd[0], "indirect")==0 ){
9669      int ii;
9670      if( nCmd>2 ) goto session_syntax_error;
9671      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9672      if( pAuxDb->nSession ){
9673        ii = sqlite3session_indirect(pSession->p, ii);
9674        utf8_printf(p->out, "session %s indirect flag = %d\n",
9675                    pSession->zName, ii);
9676      }
9677    }else
9678
9679    /* .session isempty
9680    ** Determine if the session is empty
9681    */
9682    if( strcmp(azCmd[0], "isempty")==0 ){
9683      int ii;
9684      if( nCmd!=1 ) goto session_syntax_error;
9685      if( pAuxDb->nSession ){
9686        ii = sqlite3session_isempty(pSession->p);
9687        utf8_printf(p->out, "session %s isempty flag = %d\n",
9688                    pSession->zName, ii);
9689      }
9690    }else
9691
9692    /* .session list
9693    ** List all currently open sessions
9694    */
9695    if( strcmp(azCmd[0],"list")==0 ){
9696      for(i=0; i<pAuxDb->nSession; i++){
9697        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
9698      }
9699    }else
9700
9701    /* .session open DB NAME
9702    ** Open a new session called NAME on the attached database DB.
9703    ** DB is normally "main".
9704    */
9705    if( strcmp(azCmd[0],"open")==0 ){
9706      char *zName;
9707      if( nCmd!=3 ) goto session_syntax_error;
9708      zName = azCmd[2];
9709      if( zName[0]==0 ) goto session_syntax_error;
9710      for(i=0; i<pAuxDb->nSession; i++){
9711        if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
9712          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
9713          goto meta_command_exit;
9714        }
9715      }
9716      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
9717        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
9718        goto meta_command_exit;
9719      }
9720      pSession = &pAuxDb->aSession[pAuxDb->nSession];
9721      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
9722      if( rc ){
9723        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
9724        rc = 0;
9725        goto meta_command_exit;
9726      }
9727      pSession->nFilter = 0;
9728      sqlite3session_table_filter(pSession->p, session_filter, pSession);
9729      pAuxDb->nSession++;
9730      pSession->zName = sqlite3_mprintf("%s", zName);
9731      shell_check_oom(pSession->zName);
9732    }else
9733    /* If no command name matches, show a syntax error */
9734    session_syntax_error:
9735    showHelp(p->out, "session");
9736  }else
9737#endif
9738
9739#ifdef SQLITE_DEBUG
9740  /* Undocumented commands for internal testing.  Subject to change
9741  ** without notice. */
9742  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
9743    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
9744      int i, v;
9745      for(i=1; i<nArg; i++){
9746        v = booleanValue(azArg[i]);
9747        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
9748      }
9749    }
9750    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
9751      int i; sqlite3_int64 v;
9752      for(i=1; i<nArg; i++){
9753        char zBuf[200];
9754        v = integerValue(azArg[i]);
9755        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
9756        utf8_printf(p->out, "%s", zBuf);
9757      }
9758    }
9759  }else
9760#endif
9761
9762  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
9763    int bIsInit = 0;         /* True to initialize the SELFTEST table */
9764    int bVerbose = 0;        /* Verbose output */
9765    int bSelftestExists;     /* True if SELFTEST already exists */
9766    int i, k;                /* Loop counters */
9767    int nTest = 0;           /* Number of tests runs */
9768    int nErr = 0;            /* Number of errors seen */
9769    ShellText str;           /* Answer for a query */
9770    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
9771
9772    open_db(p,0);
9773    for(i=1; i<nArg; i++){
9774      const char *z = azArg[i];
9775      if( z[0]=='-' && z[1]=='-' ) z++;
9776      if( strcmp(z,"-init")==0 ){
9777        bIsInit = 1;
9778      }else
9779      if( strcmp(z,"-v")==0 ){
9780        bVerbose++;
9781      }else
9782      {
9783        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
9784                    azArg[i], azArg[0]);
9785        raw_printf(stderr, "Should be one of: --init -v\n");
9786        rc = 1;
9787        goto meta_command_exit;
9788      }
9789    }
9790    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
9791           != SQLITE_OK ){
9792      bSelftestExists = 0;
9793    }else{
9794      bSelftestExists = 1;
9795    }
9796    if( bIsInit ){
9797      createSelftestTable(p);
9798      bSelftestExists = 1;
9799    }
9800    initText(&str);
9801    appendText(&str, "x", 0);
9802    for(k=bSelftestExists; k>=0; k--){
9803      if( k==1 ){
9804        rc = sqlite3_prepare_v2(p->db,
9805            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
9806            -1, &pStmt, 0);
9807      }else{
9808        rc = sqlite3_prepare_v2(p->db,
9809          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
9810          "      (1,'run','PRAGMA integrity_check','ok')",
9811          -1, &pStmt, 0);
9812      }
9813      if( rc ){
9814        raw_printf(stderr, "Error querying the selftest table\n");
9815        rc = 1;
9816        sqlite3_finalize(pStmt);
9817        goto meta_command_exit;
9818      }
9819      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
9820        int tno = sqlite3_column_int(pStmt, 0);
9821        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
9822        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
9823        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
9824
9825        if( zOp==0 ) continue;
9826        if( zSql==0 ) continue;
9827        if( zAns==0 ) continue;
9828        k = 0;
9829        if( bVerbose>0 ){
9830          printf("%d: %s %s\n", tno, zOp, zSql);
9831        }
9832        if( strcmp(zOp,"memo")==0 ){
9833          utf8_printf(p->out, "%s\n", zSql);
9834        }else
9835        if( strcmp(zOp,"run")==0 ){
9836          char *zErrMsg = 0;
9837          str.n = 0;
9838          str.z[0] = 0;
9839          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
9840          nTest++;
9841          if( bVerbose ){
9842            utf8_printf(p->out, "Result: %s\n", str.z);
9843          }
9844          if( rc || zErrMsg ){
9845            nErr++;
9846            rc = 1;
9847            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
9848            sqlite3_free(zErrMsg);
9849          }else if( strcmp(zAns,str.z)!=0 ){
9850            nErr++;
9851            rc = 1;
9852            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
9853            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
9854          }
9855        }else
9856        {
9857          utf8_printf(stderr,
9858            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
9859          rc = 1;
9860          break;
9861        }
9862      } /* End loop over rows of content from SELFTEST */
9863      sqlite3_finalize(pStmt);
9864    } /* End loop over k */
9865    freeText(&str);
9866    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
9867  }else
9868
9869  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
9870    if( nArg<2 || nArg>3 ){
9871      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
9872      rc = 1;
9873    }
9874    if( nArg>=2 ){
9875      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
9876                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
9877    }
9878    if( nArg>=3 ){
9879      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
9880                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
9881    }
9882  }else
9883
9884  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
9885    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
9886    int i;                   /* Loop counter */
9887    int bSchema = 0;         /* Also hash the schema */
9888    int bSeparate = 0;       /* Hash each table separately */
9889    int iSize = 224;         /* Hash algorithm to use */
9890    int bDebug = 0;          /* Only show the query that would have run */
9891    sqlite3_stmt *pStmt;     /* For querying tables names */
9892    char *zSql;              /* SQL to be run */
9893    char *zSep;              /* Separator */
9894    ShellText sSql;          /* Complete SQL for the query to run the hash */
9895    ShellText sQuery;        /* Set of queries used to read all content */
9896    open_db(p, 0);
9897    for(i=1; i<nArg; i++){
9898      const char *z = azArg[i];
9899      if( z[0]=='-' ){
9900        z++;
9901        if( z[0]=='-' ) z++;
9902        if( strcmp(z,"schema")==0 ){
9903          bSchema = 1;
9904        }else
9905        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
9906         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
9907        ){
9908          iSize = atoi(&z[5]);
9909        }else
9910        if( strcmp(z,"debug")==0 ){
9911          bDebug = 1;
9912        }else
9913        {
9914          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
9915                      azArg[i], azArg[0]);
9916          showHelp(p->out, azArg[0]);
9917          rc = 1;
9918          goto meta_command_exit;
9919        }
9920      }else if( zLike ){
9921        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
9922        rc = 1;
9923        goto meta_command_exit;
9924      }else{
9925        zLike = z;
9926        bSeparate = 1;
9927        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
9928      }
9929    }
9930    if( bSchema ){
9931      zSql = "SELECT lower(name) FROM sqlite_schema"
9932             " WHERE type='table' AND coalesce(rootpage,0)>1"
9933             " UNION ALL SELECT 'sqlite_schema'"
9934             " ORDER BY 1 collate nocase";
9935    }else{
9936      zSql = "SELECT lower(name) FROM sqlite_schema"
9937             " WHERE type='table' AND coalesce(rootpage,0)>1"
9938             " AND name NOT LIKE 'sqlite_%'"
9939             " ORDER BY 1 collate nocase";
9940    }
9941    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9942    initText(&sQuery);
9943    initText(&sSql);
9944    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
9945    zSep = "VALUES(";
9946    while( SQLITE_ROW==sqlite3_step(pStmt) ){
9947      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
9948      if( zTab==0 ) continue;
9949      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
9950      if( strncmp(zTab, "sqlite_",7)!=0 ){
9951        appendText(&sQuery,"SELECT * FROM ", 0);
9952        appendText(&sQuery,zTab,'"');
9953        appendText(&sQuery," NOT INDEXED;", 0);
9954      }else if( strcmp(zTab, "sqlite_schema")==0 ){
9955        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
9956                           " ORDER BY name;", 0);
9957      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
9958        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
9959                           " ORDER BY name;", 0);
9960      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
9961        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
9962                           " ORDER BY tbl,idx;", 0);
9963      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
9964        appendText(&sQuery, "SELECT * FROM ", 0);
9965        appendText(&sQuery, zTab, 0);
9966        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
9967      }
9968      appendText(&sSql, zSep, 0);
9969      appendText(&sSql, sQuery.z, '\'');
9970      sQuery.n = 0;
9971      appendText(&sSql, ",", 0);
9972      appendText(&sSql, zTab, '\'');
9973      zSep = "),(";
9974    }
9975    sqlite3_finalize(pStmt);
9976    if( bSeparate ){
9977      zSql = sqlite3_mprintf(
9978          "%s))"
9979          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
9980          "   FROM [sha3sum$query]",
9981          sSql.z, iSize);
9982    }else{
9983      zSql = sqlite3_mprintf(
9984          "%s))"
9985          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
9986          "   FROM [sha3sum$query]",
9987          sSql.z, iSize);
9988    }
9989    shell_check_oom(zSql);
9990    freeText(&sQuery);
9991    freeText(&sSql);
9992    if( bDebug ){
9993      utf8_printf(p->out, "%s\n", zSql);
9994    }else{
9995      shell_exec(p, zSql, 0);
9996    }
9997    sqlite3_free(zSql);
9998  }else
9999
10000#ifndef SQLITE_NOHAVE_SYSTEM
10001  if( c=='s'
10002   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10003  ){
10004    char *zCmd;
10005    int i, x;
10006    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10007    if( nArg<2 ){
10008      raw_printf(stderr, "Usage: .system COMMAND\n");
10009      rc = 1;
10010      goto meta_command_exit;
10011    }
10012    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10013    for(i=2; i<nArg && zCmd!=0; i++){
10014      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10015                             zCmd, azArg[i]);
10016    }
10017    x = zCmd!=0 ? system(zCmd) : 1;
10018    sqlite3_free(zCmd);
10019    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10020  }else
10021#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10022
10023  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10024    static const char *azBool[] = { "off", "on", "trigger", "full"};
10025    const char *zOut;
10026    int i;
10027    if( nArg!=1 ){
10028      raw_printf(stderr, "Usage: .show\n");
10029      rc = 1;
10030      goto meta_command_exit;
10031    }
10032    utf8_printf(p->out, "%12.12s: %s\n","echo",
10033                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
10034    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10035    utf8_printf(p->out, "%12.12s: %s\n","explain",
10036         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10037    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10038    utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10039    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10040      output_c_string(p->out, p->nullValue);
10041      raw_printf(p->out, "\n");
10042    utf8_printf(p->out,"%12.12s: %s\n","output",
10043            strlen30(p->outfile) ? p->outfile : "stdout");
10044    utf8_printf(p->out,"%12.12s: ", "colseparator");
10045      output_c_string(p->out, p->colSeparator);
10046      raw_printf(p->out, "\n");
10047    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10048      output_c_string(p->out, p->rowSeparator);
10049      raw_printf(p->out, "\n");
10050    switch( p->statsOn ){
10051      case 0:  zOut = "off";     break;
10052      default: zOut = "on";      break;
10053      case 2:  zOut = "stmt";    break;
10054      case 3:  zOut = "vmstep";  break;
10055    }
10056    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10057    utf8_printf(p->out, "%12.12s: ", "width");
10058    for (i=0;i<p->nWidth;i++) {
10059      raw_printf(p->out, "%d ", p->colWidth[i]);
10060    }
10061    raw_printf(p->out, "\n");
10062    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10063                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10064  }else
10065
10066  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10067    if( nArg==2 ){
10068      if( strcmp(azArg[1],"stmt")==0 ){
10069        p->statsOn = 2;
10070      }else if( strcmp(azArg[1],"vmstep")==0 ){
10071        p->statsOn = 3;
10072      }else{
10073        p->statsOn = (u8)booleanValue(azArg[1]);
10074      }
10075    }else if( nArg==1 ){
10076      display_stats(p->db, p, 0);
10077    }else{
10078      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10079      rc = 1;
10080    }
10081  }else
10082
10083  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10084   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10085                 || strncmp(azArg[0], "indexes", n)==0) )
10086  ){
10087    sqlite3_stmt *pStmt;
10088    char **azResult;
10089    int nRow, nAlloc;
10090    int ii;
10091    ShellText s;
10092    initText(&s);
10093    open_db(p, 0);
10094    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10095    if( rc ){
10096      sqlite3_finalize(pStmt);
10097      return shellDatabaseError(p->db);
10098    }
10099
10100    if( nArg>2 && c=='i' ){
10101      /* It is an historical accident that the .indexes command shows an error
10102      ** when called with the wrong number of arguments whereas the .tables
10103      ** command does not. */
10104      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10105      rc = 1;
10106      sqlite3_finalize(pStmt);
10107      goto meta_command_exit;
10108    }
10109    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10110      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10111      if( zDbName==0 ) continue;
10112      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10113      if( sqlite3_stricmp(zDbName, "main")==0 ){
10114        appendText(&s, "SELECT name FROM ", 0);
10115      }else{
10116        appendText(&s, "SELECT ", 0);
10117        appendText(&s, zDbName, '\'');
10118        appendText(&s, "||'.'||name FROM ", 0);
10119      }
10120      appendText(&s, zDbName, '"');
10121      appendText(&s, ".sqlite_schema ", 0);
10122      if( c=='t' ){
10123        appendText(&s," WHERE type IN ('table','view')"
10124                      "   AND name NOT LIKE 'sqlite_%'"
10125                      "   AND name LIKE ?1", 0);
10126      }else{
10127        appendText(&s," WHERE type='index'"
10128                      "   AND tbl_name LIKE ?1", 0);
10129      }
10130    }
10131    rc = sqlite3_finalize(pStmt);
10132    if( rc==SQLITE_OK ){
10133      appendText(&s, " ORDER BY 1", 0);
10134      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10135    }
10136    freeText(&s);
10137    if( rc ) return shellDatabaseError(p->db);
10138
10139    /* Run the SQL statement prepared by the above block. Store the results
10140    ** as an array of nul-terminated strings in azResult[].  */
10141    nRow = nAlloc = 0;
10142    azResult = 0;
10143    if( nArg>1 ){
10144      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10145    }else{
10146      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10147    }
10148    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10149      if( nRow>=nAlloc ){
10150        char **azNew;
10151        int n2 = nAlloc*2 + 10;
10152        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10153        shell_check_oom(azNew);
10154        nAlloc = n2;
10155        azResult = azNew;
10156      }
10157      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10158      shell_check_oom(azResult[nRow]);
10159      nRow++;
10160    }
10161    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10162      rc = shellDatabaseError(p->db);
10163    }
10164
10165    /* Pretty-print the contents of array azResult[] to the output */
10166    if( rc==0 && nRow>0 ){
10167      int len, maxlen = 0;
10168      int i, j;
10169      int nPrintCol, nPrintRow;
10170      for(i=0; i<nRow; i++){
10171        len = strlen30(azResult[i]);
10172        if( len>maxlen ) maxlen = len;
10173      }
10174      nPrintCol = 80/(maxlen+2);
10175      if( nPrintCol<1 ) nPrintCol = 1;
10176      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10177      for(i=0; i<nPrintRow; i++){
10178        for(j=i; j<nRow; j+=nPrintRow){
10179          char *zSp = j<nPrintRow ? "" : "  ";
10180          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10181                      azResult[j] ? azResult[j]:"");
10182        }
10183        raw_printf(p->out, "\n");
10184      }
10185    }
10186
10187    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10188    sqlite3_free(azResult);
10189  }else
10190
10191  /* Begin redirecting output to the file "testcase-out.txt" */
10192  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10193    output_reset(p);
10194    p->out = output_file_open("testcase-out.txt", 0);
10195    if( p->out==0 ){
10196      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10197    }
10198    if( nArg>=2 ){
10199      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10200    }else{
10201      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10202    }
10203  }else
10204
10205#ifndef SQLITE_UNTESTABLE
10206  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10207    static const struct {
10208       const char *zCtrlName;   /* Name of a test-control option */
10209       int ctrlCode;            /* Integer code for that option */
10210       int unSafe;              /* Not valid for --safe mode */
10211       const char *zUsage;      /* Usage notes */
10212    } aCtrl[] = {
10213      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10214      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10215    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10216    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10217      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10218      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10219    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10220      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10221      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10222      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10223      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10224      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10225#ifdef YYCOVERAGE
10226      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10227#endif
10228      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10229      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10230      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10231      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10232      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10233      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10234      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10235    };
10236    int testctrl = -1;
10237    int iCtrl = -1;
10238    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10239    int isOk = 0;
10240    int i, n2;
10241    const char *zCmd = 0;
10242
10243    open_db(p, 0);
10244    zCmd = nArg>=2 ? azArg[1] : "help";
10245
10246    /* The argument can optionally begin with "-" or "--" */
10247    if( zCmd[0]=='-' && zCmd[1] ){
10248      zCmd++;
10249      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10250    }
10251
10252    /* --help lists all test-controls */
10253    if( strcmp(zCmd,"help")==0 ){
10254      utf8_printf(p->out, "Available test-controls:\n");
10255      for(i=0; i<ArraySize(aCtrl); i++){
10256        utf8_printf(p->out, "  .testctrl %s %s\n",
10257                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10258      }
10259      rc = 1;
10260      goto meta_command_exit;
10261    }
10262
10263    /* convert testctrl text option to value. allow any unique prefix
10264    ** of the option name, or a numerical value. */
10265    n2 = strlen30(zCmd);
10266    for(i=0; i<ArraySize(aCtrl); i++){
10267      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10268        if( testctrl<0 ){
10269          testctrl = aCtrl[i].ctrlCode;
10270          iCtrl = i;
10271        }else{
10272          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10273                              "Use \".testctrl --help\" for help\n", zCmd);
10274          rc = 1;
10275          goto meta_command_exit;
10276        }
10277      }
10278    }
10279    if( testctrl<0 ){
10280      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10281                         "Use \".testctrl --help\" for help\n", zCmd);
10282    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10283      utf8_printf(stderr,
10284         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10285         p->lineno, aCtrl[iCtrl].zCtrlName);
10286      exit(1);
10287    }else{
10288      switch(testctrl){
10289
10290        /* sqlite3_test_control(int, db, int) */
10291        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10292          if( nArg==3 ){
10293            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10294            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10295            isOk = 3;
10296          }
10297          break;
10298
10299        /* sqlite3_test_control(int) */
10300        case SQLITE_TESTCTRL_PRNG_SAVE:
10301        case SQLITE_TESTCTRL_PRNG_RESTORE:
10302        case SQLITE_TESTCTRL_BYTEORDER:
10303          if( nArg==2 ){
10304            rc2 = sqlite3_test_control(testctrl);
10305            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10306          }
10307          break;
10308
10309        /* sqlite3_test_control(int, uint) */
10310        case SQLITE_TESTCTRL_PENDING_BYTE:
10311          if( nArg==3 ){
10312            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10313            rc2 = sqlite3_test_control(testctrl, opt);
10314            isOk = 3;
10315          }
10316          break;
10317
10318        /* sqlite3_test_control(int, int, sqlite3*) */
10319        case SQLITE_TESTCTRL_PRNG_SEED:
10320          if( nArg==3 || nArg==4 ){
10321            int ii = (int)integerValue(azArg[2]);
10322            sqlite3 *db;
10323            if( ii==0 && strcmp(azArg[2],"random")==0 ){
10324              sqlite3_randomness(sizeof(ii),&ii);
10325              printf("-- random seed: %d\n", ii);
10326            }
10327            if( nArg==3 ){
10328              db = 0;
10329            }else{
10330              db = p->db;
10331              /* Make sure the schema has been loaded */
10332              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10333            }
10334            rc2 = sqlite3_test_control(testctrl, ii, db);
10335            isOk = 3;
10336          }
10337          break;
10338
10339        /* sqlite3_test_control(int, int) */
10340        case SQLITE_TESTCTRL_ASSERT:
10341        case SQLITE_TESTCTRL_ALWAYS:
10342          if( nArg==3 ){
10343            int opt = booleanValue(azArg[2]);
10344            rc2 = sqlite3_test_control(testctrl, opt);
10345            isOk = 1;
10346          }
10347          break;
10348
10349        /* sqlite3_test_control(int, int) */
10350        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10351        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10352          if( nArg==3 ){
10353            int opt = booleanValue(azArg[2]);
10354            rc2 = sqlite3_test_control(testctrl, opt);
10355            isOk = 3;
10356          }
10357          break;
10358
10359        /* sqlite3_test_control(sqlite3*) */
10360        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10361          rc2 = sqlite3_test_control(testctrl, p->db);
10362          isOk = 3;
10363          break;
10364
10365        case SQLITE_TESTCTRL_IMPOSTER:
10366          if( nArg==5 ){
10367            rc2 = sqlite3_test_control(testctrl, p->db,
10368                          azArg[2],
10369                          integerValue(azArg[3]),
10370                          integerValue(azArg[4]));
10371            isOk = 3;
10372          }
10373          break;
10374
10375        case SQLITE_TESTCTRL_SEEK_COUNT: {
10376          u64 x = 0;
10377          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10378          utf8_printf(p->out, "%llu\n", x);
10379          isOk = 3;
10380          break;
10381        }
10382
10383#ifdef YYCOVERAGE
10384        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10385          if( nArg==2 ){
10386            sqlite3_test_control(testctrl, p->out);
10387            isOk = 3;
10388          }
10389          break;
10390        }
10391#endif
10392#ifdef SQLITE_DEBUG
10393        case SQLITE_TESTCTRL_TUNE: {
10394          if( nArg==4 ){
10395            int id = (int)integerValue(azArg[2]);
10396            int val = (int)integerValue(azArg[3]);
10397            sqlite3_test_control(testctrl, id, &val);
10398            isOk = 3;
10399          }else if( nArg==3 ){
10400            int id = (int)integerValue(azArg[2]);
10401            sqlite3_test_control(testctrl, -id, &rc2);
10402            isOk = 1;
10403          }else if( nArg==2 ){
10404            int id = 1;
10405            while(1){
10406              int val = 0;
10407              rc2 = sqlite3_test_control(testctrl, -id, &val);
10408              if( rc2!=SQLITE_OK ) break;
10409              if( id>1 ) utf8_printf(p->out, "  ");
10410              utf8_printf(p->out, "%d: %d", id, val);
10411              id++;
10412            }
10413            if( id>1 ) utf8_printf(p->out, "\n");
10414            isOk = 3;
10415          }
10416          break;
10417        }
10418#endif
10419        case SQLITE_TESTCTRL_SORTER_MMAP:
10420          if( nArg==3 ){
10421            int opt = (unsigned int)integerValue(azArg[2]);
10422            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10423            isOk = 3;
10424          }
10425          break;
10426      }
10427    }
10428    if( isOk==0 && iCtrl>=0 ){
10429      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
10430      rc = 1;
10431    }else if( isOk==1 ){
10432      raw_printf(p->out, "%d\n", rc2);
10433    }else if( isOk==2 ){
10434      raw_printf(p->out, "0x%08x\n", rc2);
10435    }
10436  }else
10437#endif /* !defined(SQLITE_UNTESTABLE) */
10438
10439  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
10440    open_db(p, 0);
10441    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
10442  }else
10443
10444  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
10445    if( nArg==2 ){
10446      enableTimer = booleanValue(azArg[1]);
10447      if( enableTimer && !HAS_TIMER ){
10448        raw_printf(stderr, "Error: timer not available on this system.\n");
10449        enableTimer = 0;
10450      }
10451    }else{
10452      raw_printf(stderr, "Usage: .timer on|off\n");
10453      rc = 1;
10454    }
10455  }else
10456
10457#ifndef SQLITE_OMIT_TRACE
10458  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
10459    int mType = 0;
10460    int jj;
10461    open_db(p, 0);
10462    for(jj=1; jj<nArg; jj++){
10463      const char *z = azArg[jj];
10464      if( z[0]=='-' ){
10465        if( optionMatch(z, "expanded") ){
10466          p->eTraceType = SHELL_TRACE_EXPANDED;
10467        }
10468#ifdef SQLITE_ENABLE_NORMALIZE
10469        else if( optionMatch(z, "normalized") ){
10470          p->eTraceType = SHELL_TRACE_NORMALIZED;
10471        }
10472#endif
10473        else if( optionMatch(z, "plain") ){
10474          p->eTraceType = SHELL_TRACE_PLAIN;
10475        }
10476        else if( optionMatch(z, "profile") ){
10477          mType |= SQLITE_TRACE_PROFILE;
10478        }
10479        else if( optionMatch(z, "row") ){
10480          mType |= SQLITE_TRACE_ROW;
10481        }
10482        else if( optionMatch(z, "stmt") ){
10483          mType |= SQLITE_TRACE_STMT;
10484        }
10485        else if( optionMatch(z, "close") ){
10486          mType |= SQLITE_TRACE_CLOSE;
10487        }
10488        else {
10489          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
10490          rc = 1;
10491          goto meta_command_exit;
10492        }
10493      }else{
10494        output_file_close(p->traceOut);
10495        p->traceOut = output_file_open(azArg[1], 0);
10496      }
10497    }
10498    if( p->traceOut==0 ){
10499      sqlite3_trace_v2(p->db, 0, 0, 0);
10500    }else{
10501      if( mType==0 ) mType = SQLITE_TRACE_STMT;
10502      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
10503    }
10504  }else
10505#endif /* !defined(SQLITE_OMIT_TRACE) */
10506
10507#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
10508  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
10509    int ii;
10510    int lenOpt;
10511    char *zOpt;
10512    if( nArg<2 ){
10513      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
10514      rc = 1;
10515      goto meta_command_exit;
10516    }
10517    open_db(p, 0);
10518    zOpt = azArg[1];
10519    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
10520    lenOpt = (int)strlen(zOpt);
10521    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
10522      assert( azArg[nArg]==0 );
10523      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
10524    }else{
10525      for(ii=1; ii<nArg; ii++){
10526        sqlite3_create_module(p->db, azArg[ii], 0, 0);
10527      }
10528    }
10529  }else
10530#endif
10531
10532#if SQLITE_USER_AUTHENTICATION
10533  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
10534    if( nArg<2 ){
10535      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
10536      rc = 1;
10537      goto meta_command_exit;
10538    }
10539    open_db(p, 0);
10540    if( strcmp(azArg[1],"login")==0 ){
10541      if( nArg!=4 ){
10542        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
10543        rc = 1;
10544        goto meta_command_exit;
10545      }
10546      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
10547                                     strlen30(azArg[3]));
10548      if( rc ){
10549        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
10550        rc = 1;
10551      }
10552    }else if( strcmp(azArg[1],"add")==0 ){
10553      if( nArg!=5 ){
10554        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
10555        rc = 1;
10556        goto meta_command_exit;
10557      }
10558      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10559                            booleanValue(azArg[4]));
10560      if( rc ){
10561        raw_printf(stderr, "User-Add failed: %d\n", rc);
10562        rc = 1;
10563      }
10564    }else if( strcmp(azArg[1],"edit")==0 ){
10565      if( nArg!=5 ){
10566        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
10567        rc = 1;
10568        goto meta_command_exit;
10569      }
10570      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10571                              booleanValue(azArg[4]));
10572      if( rc ){
10573        raw_printf(stderr, "User-Edit failed: %d\n", rc);
10574        rc = 1;
10575      }
10576    }else if( strcmp(azArg[1],"delete")==0 ){
10577      if( nArg!=3 ){
10578        raw_printf(stderr, "Usage: .user delete USER\n");
10579        rc = 1;
10580        goto meta_command_exit;
10581      }
10582      rc = sqlite3_user_delete(p->db, azArg[2]);
10583      if( rc ){
10584        raw_printf(stderr, "User-Delete failed: %d\n", rc);
10585        rc = 1;
10586      }
10587    }else{
10588      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
10589      rc = 1;
10590      goto meta_command_exit;
10591    }
10592  }else
10593#endif /* SQLITE_USER_AUTHENTICATION */
10594
10595  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
10596    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
10597        sqlite3_libversion(), sqlite3_sourceid());
10598#if SQLITE_HAVE_ZLIB
10599    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
10600#endif
10601#define CTIMEOPT_VAL_(opt) #opt
10602#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
10603#if defined(__clang__) && defined(__clang_major__)
10604    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
10605                    CTIMEOPT_VAL(__clang_minor__) "."
10606                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
10607#elif defined(_MSC_VER)
10608    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
10609#elif defined(__GNUC__) && defined(__VERSION__)
10610    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
10611#endif
10612  }else
10613
10614  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
10615    const char *zDbName = nArg==2 ? azArg[1] : "main";
10616    sqlite3_vfs *pVfs = 0;
10617    if( p->db ){
10618      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
10619      if( pVfs ){
10620        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
10621        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10622        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10623        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10624      }
10625    }
10626  }else
10627
10628  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
10629    sqlite3_vfs *pVfs;
10630    sqlite3_vfs *pCurrent = 0;
10631    if( p->db ){
10632      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
10633    }
10634    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
10635      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
10636           pVfs==pCurrent ? "  <--- CURRENT" : "");
10637      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10638      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10639      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10640      if( pVfs->pNext ){
10641        raw_printf(p->out, "-----------------------------------\n");
10642      }
10643    }
10644  }else
10645
10646  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
10647    const char *zDbName = nArg==2 ? azArg[1] : "main";
10648    char *zVfsName = 0;
10649    if( p->db ){
10650      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
10651      if( zVfsName ){
10652        utf8_printf(p->out, "%s\n", zVfsName);
10653        sqlite3_free(zVfsName);
10654      }
10655    }
10656  }else
10657
10658  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
10659    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10660    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
10661  }else
10662
10663  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
10664    int j;
10665    assert( nArg<=ArraySize(azArg) );
10666    p->nWidth = nArg-1;
10667    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
10668    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
10669    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
10670    for(j=1; j<nArg; j++){
10671      p->colWidth[j-1] = (int)integerValue(azArg[j]);
10672    }
10673  }else
10674
10675  {
10676    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
10677      " \"%s\". Enter \".help\" for help\n", azArg[0]);
10678    rc = 1;
10679  }
10680
10681meta_command_exit:
10682  if( p->outCount ){
10683    p->outCount--;
10684    if( p->outCount==0 ) output_reset(p);
10685  }
10686  p->bSafeMode = p->bSafeModePersist;
10687  return rc;
10688}
10689
10690/* Line scan result and intermediate states (supporting scan resumption)
10691*/
10692#ifndef CHAR_BIT
10693# define CHAR_BIT 8
10694#endif
10695typedef enum {
10696  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
10697  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
10698  QSS_Start = 0
10699} QuickScanState;
10700#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
10701#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
10702#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
10703#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
10704#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
10705
10706/*
10707** Scan line for classification to guide shell's handling.
10708** The scan is resumable for subsequent lines when prior
10709** return values are passed as the 2nd argument.
10710*/
10711static QuickScanState quickscan(char *zLine, QuickScanState qss){
10712  char cin;
10713  char cWait = (char)qss; /* intentional narrowing loss */
10714  if( cWait==0 ){
10715  PlainScan:
10716    assert( cWait==0 );
10717    while( (cin = *zLine++)!=0 ){
10718      if( IsSpace(cin) )
10719        continue;
10720      switch (cin){
10721      case '-':
10722        if( *zLine!='-' )
10723          break;
10724        while((cin = *++zLine)!=0 )
10725          if( cin=='\n')
10726            goto PlainScan;
10727        return qss;
10728      case ';':
10729        qss |= QSS_EndingSemi;
10730        continue;
10731      case '/':
10732        if( *zLine=='*' ){
10733          ++zLine;
10734          cWait = '*';
10735          qss = QSS_SETV(qss, cWait);
10736          goto TermScan;
10737        }
10738        break;
10739      case '[':
10740        cin = ']';
10741        /* fall thru */
10742      case '`': case '\'': case '"':
10743        cWait = cin;
10744        qss = QSS_HasDark | cWait;
10745        goto TermScan;
10746      default:
10747        break;
10748      }
10749      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
10750    }
10751  }else{
10752  TermScan:
10753    while( (cin = *zLine++)!=0 ){
10754      if( cin==cWait ){
10755        switch( cWait ){
10756        case '*':
10757          if( *zLine != '/' )
10758            continue;
10759          ++zLine;
10760          cWait = 0;
10761          qss = QSS_SETV(qss, 0);
10762          goto PlainScan;
10763        case '`': case '\'': case '"':
10764          if(*zLine==cWait){
10765            ++zLine;
10766            continue;
10767          }
10768          /* fall thru */
10769        case ']':
10770          cWait = 0;
10771          qss = QSS_SETV(qss, 0);
10772          goto PlainScan;
10773        default: assert(0);
10774        }
10775      }
10776    }
10777  }
10778  return qss;
10779}
10780
10781/*
10782** Return TRUE if the line typed in is an SQL command terminator other
10783** than a semi-colon.  The SQL Server style "go" command is understood
10784** as is the Oracle "/".
10785*/
10786static int line_is_command_terminator(char *zLine){
10787  while( IsSpace(zLine[0]) ){ zLine++; };
10788  if( zLine[0]=='/' )
10789    zLine += 1; /* Oracle */
10790  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
10791    zLine += 2; /* SQL Server */
10792  else
10793    return 0;
10794  return quickscan(zLine,QSS_Start)==QSS_Start;
10795}
10796
10797/*
10798** We need a default sqlite3_complete() implementation to use in case
10799** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
10800** any arbitrary text is a complete SQL statement.  This is not very
10801** user-friendly, but it does seem to work.
10802*/
10803#ifdef SQLITE_OMIT_COMPLETE
10804#define sqlite3_complete(x) 1
10805#endif
10806
10807/*
10808** Return true if zSql is a complete SQL statement.  Return false if it
10809** ends in the middle of a string literal or C-style comment.
10810*/
10811static int line_is_complete(char *zSql, int nSql){
10812  int rc;
10813  if( zSql==0 ) return 1;
10814  zSql[nSql] = ';';
10815  zSql[nSql+1] = 0;
10816  rc = sqlite3_complete(zSql);
10817  zSql[nSql] = 0;
10818  return rc;
10819}
10820
10821/*
10822** Run a single line of SQL.  Return the number of errors.
10823*/
10824static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
10825  int rc;
10826  char *zErrMsg = 0;
10827
10828  open_db(p, 0);
10829  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
10830  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
10831  BEGIN_TIMER;
10832  rc = shell_exec(p, zSql, &zErrMsg);
10833  END_TIMER;
10834  if( rc || zErrMsg ){
10835    char zPrefix[100];
10836    if( in!=0 || !stdin_is_interactive ){
10837      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
10838                       "Error: near line %d:", startline);
10839    }else{
10840      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
10841    }
10842    if( zErrMsg!=0 ){
10843      utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
10844      sqlite3_free(zErrMsg);
10845      zErrMsg = 0;
10846    }else{
10847      utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
10848    }
10849    return 1;
10850  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
10851    char zLineBuf[2000];
10852    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
10853            "changes: %lld   total_changes: %lld",
10854            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
10855    raw_printf(p->out, "%s\n", zLineBuf);
10856  }
10857  return 0;
10858}
10859
10860
10861/*
10862** Read input from *in and process it.  If *in==0 then input
10863** is interactive - the user is typing it it.  Otherwise, input
10864** is coming from a file or device.  A prompt is issued and history
10865** is saved only if input is interactive.  An interrupt signal will
10866** cause this routine to exit immediately, unless input is interactive.
10867**
10868** Return the number of errors.
10869*/
10870static int process_input(ShellState *p){
10871  char *zLine = 0;          /* A single input line */
10872  char *zSql = 0;           /* Accumulated SQL text */
10873  int nLine;                /* Length of current line */
10874  int nSql = 0;             /* Bytes of zSql[] used */
10875  int nAlloc = 0;           /* Allocated zSql[] space */
10876  int rc;                   /* Error code */
10877  int errCnt = 0;           /* Number of errors seen */
10878  int startline = 0;        /* Line number for start of current input */
10879  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
10880
10881  p->lineno = 0;
10882  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
10883    fflush(p->out);
10884    zLine = one_input_line(p->in, zLine, nSql>0);
10885    if( zLine==0 ){
10886      /* End of input */
10887      if( p->in==0 && stdin_is_interactive ) printf("\n");
10888      break;
10889    }
10890    if( seenInterrupt ){
10891      if( p->in!=0 ) break;
10892      seenInterrupt = 0;
10893    }
10894    p->lineno++;
10895    if( QSS_INPLAIN(qss)
10896        && line_is_command_terminator(zLine)
10897        && line_is_complete(zSql, nSql) ){
10898      memcpy(zLine,";",2);
10899    }
10900    qss = quickscan(zLine, qss);
10901    if( QSS_PLAINWHITE(qss) && nSql==0 ){
10902      if( ShellHasFlag(p, SHFLG_Echo) )
10903        printf("%s\n", zLine);
10904      /* Just swallow single-line whitespace */
10905      qss = QSS_Start;
10906      continue;
10907    }
10908    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
10909      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
10910      if( zLine[0]=='.' ){
10911        rc = do_meta_command(zLine, p);
10912        if( rc==2 ){ /* exit requested */
10913          break;
10914        }else if( rc ){
10915          errCnt++;
10916        }
10917      }
10918      qss = QSS_Start;
10919      continue;
10920    }
10921    /* No single-line dispositions remain; accumulate line(s). */
10922    nLine = strlen30(zLine);
10923    if( nSql+nLine+2>=nAlloc ){
10924      /* Grow buffer by half-again increments when big. */
10925      nAlloc = nSql+(nSql>>1)+nLine+100;
10926      zSql = realloc(zSql, nAlloc);
10927      shell_check_oom(zSql);
10928    }
10929    if( nSql==0 ){
10930      int i;
10931      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
10932      assert( nAlloc>0 && zSql!=0 );
10933      memcpy(zSql, zLine+i, nLine+1-i);
10934      startline = p->lineno;
10935      nSql = nLine-i;
10936    }else{
10937      zSql[nSql++] = '\n';
10938      memcpy(zSql+nSql, zLine, nLine+1);
10939      nSql += nLine;
10940    }
10941    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
10942      errCnt += runOneSqlLine(p, zSql, p->in, startline);
10943      nSql = 0;
10944      if( p->outCount ){
10945        output_reset(p);
10946        p->outCount = 0;
10947      }else{
10948        clearTempFile(p);
10949      }
10950      p->bSafeMode = p->bSafeModePersist;
10951      qss = QSS_Start;
10952    }else if( nSql && QSS_PLAINWHITE(qss) ){
10953      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
10954      nSql = 0;
10955      qss = QSS_Start;
10956    }
10957  }
10958  if( nSql && QSS_PLAINDARK(qss) ){
10959    errCnt += runOneSqlLine(p, zSql, p->in, startline);
10960  }
10961  free(zSql);
10962  free(zLine);
10963  return errCnt>0;
10964}
10965
10966/*
10967** Return a pathname which is the user's home directory.  A
10968** 0 return indicates an error of some kind.
10969*/
10970static char *find_home_dir(int clearFlag){
10971  static char *home_dir = NULL;
10972  if( clearFlag ){
10973    free(home_dir);
10974    home_dir = 0;
10975    return 0;
10976  }
10977  if( home_dir ) return home_dir;
10978
10979#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
10980     && !defined(__RTP__) && !defined(_WRS_KERNEL)
10981  {
10982    struct passwd *pwent;
10983    uid_t uid = getuid();
10984    if( (pwent=getpwuid(uid)) != NULL) {
10985      home_dir = pwent->pw_dir;
10986    }
10987  }
10988#endif
10989
10990#if defined(_WIN32_WCE)
10991  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
10992   */
10993  home_dir = "/";
10994#else
10995
10996#if defined(_WIN32) || defined(WIN32)
10997  if (!home_dir) {
10998    home_dir = getenv("USERPROFILE");
10999  }
11000#endif
11001
11002  if (!home_dir) {
11003    home_dir = getenv("HOME");
11004  }
11005
11006#if defined(_WIN32) || defined(WIN32)
11007  if (!home_dir) {
11008    char *zDrive, *zPath;
11009    int n;
11010    zDrive = getenv("HOMEDRIVE");
11011    zPath = getenv("HOMEPATH");
11012    if( zDrive && zPath ){
11013      n = strlen30(zDrive) + strlen30(zPath) + 1;
11014      home_dir = malloc( n );
11015      if( home_dir==0 ) return 0;
11016      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11017      return home_dir;
11018    }
11019    home_dir = "c:\\";
11020  }
11021#endif
11022
11023#endif /* !_WIN32_WCE */
11024
11025  if( home_dir ){
11026    int n = strlen30(home_dir) + 1;
11027    char *z = malloc( n );
11028    if( z ) memcpy(z, home_dir, n);
11029    home_dir = z;
11030  }
11031
11032  return home_dir;
11033}
11034
11035/*
11036** Read input from the file given by sqliterc_override.  Or if that
11037** parameter is NULL, take input from ~/.sqliterc
11038**
11039** Returns the number of errors.
11040*/
11041static void process_sqliterc(
11042  ShellState *p,                  /* Configuration data */
11043  const char *sqliterc_override   /* Name of config file. NULL to use default */
11044){
11045  char *home_dir = NULL;
11046  const char *sqliterc = sqliterc_override;
11047  char *zBuf = 0;
11048  FILE *inSaved = p->in;
11049  int savedLineno = p->lineno;
11050
11051  if (sqliterc == NULL) {
11052    home_dir = find_home_dir(0);
11053    if( home_dir==0 ){
11054      raw_printf(stderr, "-- warning: cannot find home directory;"
11055                      " cannot read ~/.sqliterc\n");
11056      return;
11057    }
11058    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11059    shell_check_oom(zBuf);
11060    sqliterc = zBuf;
11061  }
11062  p->in = fopen(sqliterc,"rb");
11063  if( p->in ){
11064    if( stdin_is_interactive ){
11065      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11066    }
11067    if( process_input(p) && bail_on_error ) exit(1);
11068    fclose(p->in);
11069  }else if( sqliterc_override!=0 ){
11070    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11071    if( bail_on_error ) exit(1);
11072  }
11073  p->in = inSaved;
11074  p->lineno = savedLineno;
11075  sqlite3_free(zBuf);
11076}
11077
11078/*
11079** Show available command line options
11080*/
11081static const char zOptions[] =
11082#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11083  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11084#endif
11085  "   -append              append the database to the end of the file\n"
11086  "   -ascii               set output mode to 'ascii'\n"
11087  "   -bail                stop after hitting an error\n"
11088  "   -batch               force batch I/O\n"
11089  "   -box                 set output mode to 'box'\n"
11090  "   -column              set output mode to 'column'\n"
11091  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11092  "   -csv                 set output mode to 'csv'\n"
11093#if !defined(SQLITE_OMIT_DESERIALIZE)
11094  "   -deserialize         open the database using sqlite3_deserialize()\n"
11095#endif
11096  "   -echo                print commands before execution\n"
11097  "   -init FILENAME       read/process named file\n"
11098  "   -[no]header          turn headers on or off\n"
11099#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11100  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11101#endif
11102  "   -help                show this message\n"
11103  "   -html                set output mode to HTML\n"
11104  "   -interactive         force interactive I/O\n"
11105  "   -json                set output mode to 'json'\n"
11106  "   -line                set output mode to 'line'\n"
11107  "   -list                set output mode to 'list'\n"
11108  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11109  "   -markdown            set output mode to 'markdown'\n"
11110#if !defined(SQLITE_OMIT_DESERIALIZE)
11111  "   -maxsize N           maximum size for a --deserialize database\n"
11112#endif
11113  "   -memtrace            trace all memory allocations and deallocations\n"
11114  "   -mmap N              default mmap size set to N\n"
11115#ifdef SQLITE_ENABLE_MULTIPLEX
11116  "   -multiplex           enable the multiplexor VFS\n"
11117#endif
11118  "   -newline SEP         set output row separator. Default: '\\n'\n"
11119  "   -nofollow            refuse to open symbolic links to database files\n"
11120  "   -nonce STRING        set the safe-mode escape nonce\n"
11121  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11122  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11123  "   -quote               set output mode to 'quote'\n"
11124  "   -readonly            open the database read-only\n"
11125  "   -safe                enable safe-mode\n"
11126  "   -separator SEP       set output column separator. Default: '|'\n"
11127#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11128  "   -sorterref SIZE      sorter references threshold size\n"
11129#endif
11130  "   -stats               print memory stats before each finalize\n"
11131  "   -table               set output mode to 'table'\n"
11132  "   -tabs                set output mode to 'tabs'\n"
11133  "   -version             show SQLite version\n"
11134  "   -vfs NAME            use NAME as the default VFS\n"
11135#ifdef SQLITE_ENABLE_VFSTRACE
11136  "   -vfstrace            enable tracing of all VFS calls\n"
11137#endif
11138#ifdef SQLITE_HAVE_ZLIB
11139  "   -zip                 open the file as a ZIP Archive\n"
11140#endif
11141;
11142static void usage(int showDetail){
11143  utf8_printf(stderr,
11144      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11145      "FILENAME is the name of an SQLite database. A new database is created\n"
11146      "if the file does not previously exist.\n", Argv0);
11147  if( showDetail ){
11148    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11149  }else{
11150    raw_printf(stderr, "Use the -help option for additional information\n");
11151  }
11152  exit(1);
11153}
11154
11155/*
11156** Internal check:  Verify that the SQLite is uninitialized.  Print a
11157** error message if it is initialized.
11158*/
11159static void verify_uninitialized(void){
11160  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11161    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11162                        " initialization.\n");
11163  }
11164}
11165
11166/*
11167** Initialize the state information in data
11168*/
11169static void main_init(ShellState *data) {
11170  memset(data, 0, sizeof(*data));
11171  data->normalMode = data->cMode = data->mode = MODE_List;
11172  data->autoExplain = 1;
11173  data->pAuxDb = &data->aAuxDb[0];
11174  memcpy(data->colSeparator,SEP_Column, 2);
11175  memcpy(data->rowSeparator,SEP_Row, 2);
11176  data->showHeader = 0;
11177  data->shellFlgs = SHFLG_Lookaside;
11178  verify_uninitialized();
11179  sqlite3_config(SQLITE_CONFIG_URI, 1);
11180  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11181  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11182  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11183  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11184}
11185
11186/*
11187** Output text to the console in a font that attracts extra attention.
11188*/
11189#ifdef _WIN32
11190static void printBold(const char *zText){
11191#if !SQLITE_OS_WINRT
11192  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11193  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11194  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11195  SetConsoleTextAttribute(out,
11196         FOREGROUND_RED|FOREGROUND_INTENSITY
11197  );
11198#endif
11199  printf("%s", zText);
11200#if !SQLITE_OS_WINRT
11201  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11202#endif
11203}
11204#else
11205static void printBold(const char *zText){
11206  printf("\033[1m%s\033[0m", zText);
11207}
11208#endif
11209
11210/*
11211** Get the argument to an --option.  Throw an error and die if no argument
11212** is available.
11213*/
11214static char *cmdline_option_value(int argc, char **argv, int i){
11215  if( i==argc ){
11216    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11217            argv[0], argv[argc-1]);
11218    exit(1);
11219  }
11220  return argv[i];
11221}
11222
11223#ifndef SQLITE_SHELL_IS_UTF8
11224#  if (defined(_WIN32) || defined(WIN32)) \
11225   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11226#    define SQLITE_SHELL_IS_UTF8          (0)
11227#  else
11228#    define SQLITE_SHELL_IS_UTF8          (1)
11229#  endif
11230#endif
11231
11232#if SQLITE_SHELL_IS_UTF8
11233int SQLITE_CDECL main(int argc, char **argv){
11234#else
11235int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11236  char **argv;
11237#endif
11238  char *zErrMsg = 0;
11239  ShellState data;
11240  const char *zInitFile = 0;
11241  int i;
11242  int rc = 0;
11243  int warnInmemoryDb = 0;
11244  int readStdin = 1;
11245  int nCmd = 0;
11246  char **azCmd = 0;
11247  const char *zVfs = 0;           /* Value of -vfs command-line option */
11248#if !SQLITE_SHELL_IS_UTF8
11249  char **argvToFree = 0;
11250  int argcToFree = 0;
11251#endif
11252
11253  setBinaryMode(stdin, 0);
11254  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11255  stdin_is_interactive = isatty(0);
11256  stdout_is_console = isatty(1);
11257
11258#if !defined(_WIN32_WCE)
11259  if( getenv("SQLITE_DEBUG_BREAK") ){
11260    if( isatty(0) && isatty(2) ){
11261      fprintf(stderr,
11262          "attach debugger to process %d and press any key to continue.\n",
11263          GETPID());
11264      fgetc(stdin);
11265    }else{
11266#if defined(_WIN32) || defined(WIN32)
11267#if SQLITE_OS_WINRT
11268      __debugbreak();
11269#else
11270      DebugBreak();
11271#endif
11272#elif defined(SIGTRAP)
11273      raise(SIGTRAP);
11274#endif
11275    }
11276  }
11277#endif
11278
11279#if USE_SYSTEM_SQLITE+0!=1
11280  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11281    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11282            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11283    exit(1);
11284  }
11285#endif
11286  main_init(&data);
11287
11288  /* On Windows, we must translate command-line arguments into UTF-8.
11289  ** The SQLite memory allocator subsystem has to be enabled in order to
11290  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11291  ** subsequent sqlite3_config() calls will work.  So copy all results into
11292  ** memory that does not come from the SQLite memory allocator.
11293  */
11294#if !SQLITE_SHELL_IS_UTF8
11295  sqlite3_initialize();
11296  argvToFree = malloc(sizeof(argv[0])*argc*2);
11297  shell_check_oom(argvToFree);
11298  argcToFree = argc;
11299  argv = argvToFree + argc;
11300  for(i=0; i<argc; i++){
11301    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11302    int n;
11303    shell_check_oom(z);
11304    n = (int)strlen(z);
11305    argv[i] = malloc( n+1 );
11306    shell_check_oom(argv[i]);
11307    memcpy(argv[i], z, n+1);
11308    argvToFree[i] = argv[i];
11309    sqlite3_free(z);
11310  }
11311  sqlite3_shutdown();
11312#endif
11313
11314  assert( argc>=1 && argv && argv[0] );
11315  Argv0 = argv[0];
11316
11317  /* Make sure we have a valid signal handler early, before anything
11318  ** else is done.
11319  */
11320#ifdef SIGINT
11321  signal(SIGINT, interrupt_handler);
11322#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11323  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11324#endif
11325
11326#ifdef SQLITE_SHELL_DBNAME_PROC
11327  {
11328    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11329    ** of a C-function that will provide the name of the database file.  Use
11330    ** this compile-time option to embed this shell program in larger
11331    ** applications. */
11332    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11333    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11334    warnInmemoryDb = 0;
11335  }
11336#endif
11337
11338  /* Do an initial pass through the command-line argument to locate
11339  ** the name of the database file, the name of the initialization file,
11340  ** the size of the alternative malloc heap,
11341  ** and the first command to execute.
11342  */
11343  verify_uninitialized();
11344  for(i=1; i<argc; i++){
11345    char *z;
11346    z = argv[i];
11347    if( z[0]!='-' ){
11348      if( data.aAuxDb->zDbFilename==0 ){
11349        data.aAuxDb->zDbFilename = z;
11350      }else{
11351        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11352        ** mean that nothing is read from stdin */
11353        readStdin = 0;
11354        nCmd++;
11355        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11356        shell_check_oom(azCmd);
11357        azCmd[nCmd-1] = z;
11358      }
11359    }
11360    if( z[1]=='-' ) z++;
11361    if( strcmp(z,"-separator")==0
11362     || strcmp(z,"-nullvalue")==0
11363     || strcmp(z,"-newline")==0
11364     || strcmp(z,"-cmd")==0
11365    ){
11366      (void)cmdline_option_value(argc, argv, ++i);
11367    }else if( strcmp(z,"-init")==0 ){
11368      zInitFile = cmdline_option_value(argc, argv, ++i);
11369    }else if( strcmp(z,"-batch")==0 ){
11370      /* Need to check for batch mode here to so we can avoid printing
11371      ** informational messages (like from process_sqliterc) before
11372      ** we do the actual processing of arguments later in a second pass.
11373      */
11374      stdin_is_interactive = 0;
11375    }else if( strcmp(z,"-heap")==0 ){
11376#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11377      const char *zSize;
11378      sqlite3_int64 szHeap;
11379
11380      zSize = cmdline_option_value(argc, argv, ++i);
11381      szHeap = integerValue(zSize);
11382      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11383      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11384#else
11385      (void)cmdline_option_value(argc, argv, ++i);
11386#endif
11387    }else if( strcmp(z,"-pagecache")==0 ){
11388      sqlite3_int64 n, sz;
11389      sz = integerValue(cmdline_option_value(argc,argv,++i));
11390      if( sz>70000 ) sz = 70000;
11391      if( sz<0 ) sz = 0;
11392      n = integerValue(cmdline_option_value(argc,argv,++i));
11393      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
11394        n = 0xffffffffffffLL/sz;
11395      }
11396      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
11397                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
11398      data.shellFlgs |= SHFLG_Pagecache;
11399    }else if( strcmp(z,"-lookaside")==0 ){
11400      int n, sz;
11401      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
11402      if( sz<0 ) sz = 0;
11403      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11404      if( n<0 ) n = 0;
11405      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
11406      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
11407    }else if( strcmp(z,"-threadsafe")==0 ){
11408      int n;
11409      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11410      switch( n ){
11411         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
11412         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
11413         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
11414      }
11415#ifdef SQLITE_ENABLE_VFSTRACE
11416    }else if( strcmp(z,"-vfstrace")==0 ){
11417      extern int vfstrace_register(
11418         const char *zTraceName,
11419         const char *zOldVfsName,
11420         int (*xOut)(const char*,void*),
11421         void *pOutArg,
11422         int makeDefault
11423      );
11424      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
11425#endif
11426#ifdef SQLITE_ENABLE_MULTIPLEX
11427    }else if( strcmp(z,"-multiplex")==0 ){
11428      extern int sqlite3_multiple_initialize(const char*,int);
11429      sqlite3_multiplex_initialize(0, 1);
11430#endif
11431    }else if( strcmp(z,"-mmap")==0 ){
11432      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11433      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
11434#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11435    }else if( strcmp(z,"-sorterref")==0 ){
11436      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11437      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
11438#endif
11439    }else if( strcmp(z,"-vfs")==0 ){
11440      zVfs = cmdline_option_value(argc, argv, ++i);
11441#ifdef SQLITE_HAVE_ZLIB
11442    }else if( strcmp(z,"-zip")==0 ){
11443      data.openMode = SHELL_OPEN_ZIPFILE;
11444#endif
11445    }else if( strcmp(z,"-append")==0 ){
11446      data.openMode = SHELL_OPEN_APPENDVFS;
11447#ifndef SQLITE_OMIT_DESERIALIZE
11448    }else if( strcmp(z,"-deserialize")==0 ){
11449      data.openMode = SHELL_OPEN_DESERIALIZE;
11450    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
11451      data.szMax = integerValue(argv[++i]);
11452#endif
11453    }else if( strcmp(z,"-readonly")==0 ){
11454      data.openMode = SHELL_OPEN_READONLY;
11455    }else if( strcmp(z,"-nofollow")==0 ){
11456      data.openFlags = SQLITE_OPEN_NOFOLLOW;
11457#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11458    }else if( strncmp(z, "-A",2)==0 ){
11459      /* All remaining command-line arguments are passed to the ".archive"
11460      ** command, so ignore them */
11461      break;
11462#endif
11463    }else if( strcmp(z, "-memtrace")==0 ){
11464      sqlite3MemTraceActivate(stderr);
11465    }else if( strcmp(z,"-bail")==0 ){
11466      bail_on_error = 1;
11467    }else if( strcmp(z,"-nonce")==0 ){
11468      free(data.zNonce);
11469      data.zNonce = strdup(argv[++i]);
11470    }else if( strcmp(z,"-safe")==0 ){
11471      /* no-op - catch this on the second pass */
11472    }
11473  }
11474  verify_uninitialized();
11475
11476
11477#ifdef SQLITE_SHELL_INIT_PROC
11478  {
11479    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
11480    ** of a C-function that will perform initialization actions on SQLite that
11481    ** occur just before or after sqlite3_initialize(). Use this compile-time
11482    ** option to embed this shell program in larger applications. */
11483    extern void SQLITE_SHELL_INIT_PROC(void);
11484    SQLITE_SHELL_INIT_PROC();
11485  }
11486#else
11487  /* All the sqlite3_config() calls have now been made. So it is safe
11488  ** to call sqlite3_initialize() and process any command line -vfs option. */
11489  sqlite3_initialize();
11490#endif
11491
11492  if( zVfs ){
11493    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
11494    if( pVfs ){
11495      sqlite3_vfs_register(pVfs, 1);
11496    }else{
11497      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
11498      exit(1);
11499    }
11500  }
11501
11502  if( data.pAuxDb->zDbFilename==0 ){
11503#ifndef SQLITE_OMIT_MEMORYDB
11504    data.pAuxDb->zDbFilename = ":memory:";
11505    warnInmemoryDb = argc==1;
11506#else
11507    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
11508    return 1;
11509#endif
11510  }
11511  data.out = stdout;
11512  sqlite3_appendvfs_init(0,0,0);
11513
11514  /* Go ahead and open the database file if it already exists.  If the
11515  ** file does not exist, delay opening it.  This prevents empty database
11516  ** files from being created if a user mistypes the database name argument
11517  ** to the sqlite command-line tool.
11518  */
11519  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
11520    open_db(&data, 0);
11521  }
11522
11523  /* Process the initialization file if there is one.  If no -init option
11524  ** is given on the command line, look for a file named ~/.sqliterc and
11525  ** try to process it.
11526  */
11527  process_sqliterc(&data,zInitFile);
11528
11529  /* Make a second pass through the command-line argument and set
11530  ** options.  This second pass is delayed until after the initialization
11531  ** file is processed so that the command-line arguments will override
11532  ** settings in the initialization file.
11533  */
11534  for(i=1; i<argc; i++){
11535    char *z = argv[i];
11536    if( z[0]!='-' ) continue;
11537    if( z[1]=='-' ){ z++; }
11538    if( strcmp(z,"-init")==0 ){
11539      i++;
11540    }else if( strcmp(z,"-html")==0 ){
11541      data.mode = MODE_Html;
11542    }else if( strcmp(z,"-list")==0 ){
11543      data.mode = MODE_List;
11544    }else if( strcmp(z,"-quote")==0 ){
11545      data.mode = MODE_Quote;
11546      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
11547      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11548    }else if( strcmp(z,"-line")==0 ){
11549      data.mode = MODE_Line;
11550    }else if( strcmp(z,"-column")==0 ){
11551      data.mode = MODE_Column;
11552    }else if( strcmp(z,"-json")==0 ){
11553      data.mode = MODE_Json;
11554    }else if( strcmp(z,"-markdown")==0 ){
11555      data.mode = MODE_Markdown;
11556    }else if( strcmp(z,"-table")==0 ){
11557      data.mode = MODE_Table;
11558    }else if( strcmp(z,"-box")==0 ){
11559      data.mode = MODE_Box;
11560    }else if( strcmp(z,"-csv")==0 ){
11561      data.mode = MODE_Csv;
11562      memcpy(data.colSeparator,",",2);
11563#ifdef SQLITE_HAVE_ZLIB
11564    }else if( strcmp(z,"-zip")==0 ){
11565      data.openMode = SHELL_OPEN_ZIPFILE;
11566#endif
11567    }else if( strcmp(z,"-append")==0 ){
11568      data.openMode = SHELL_OPEN_APPENDVFS;
11569#ifndef SQLITE_OMIT_DESERIALIZE
11570    }else if( strcmp(z,"-deserialize")==0 ){
11571      data.openMode = SHELL_OPEN_DESERIALIZE;
11572    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
11573      data.szMax = integerValue(argv[++i]);
11574#endif
11575    }else if( strcmp(z,"-readonly")==0 ){
11576      data.openMode = SHELL_OPEN_READONLY;
11577    }else if( strcmp(z,"-nofollow")==0 ){
11578      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
11579    }else if( strcmp(z,"-ascii")==0 ){
11580      data.mode = MODE_Ascii;
11581      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
11582      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
11583    }else if( strcmp(z,"-tabs")==0 ){
11584      data.mode = MODE_List;
11585      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
11586      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11587    }else if( strcmp(z,"-separator")==0 ){
11588      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
11589                       "%s",cmdline_option_value(argc,argv,++i));
11590    }else if( strcmp(z,"-newline")==0 ){
11591      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
11592                       "%s",cmdline_option_value(argc,argv,++i));
11593    }else if( strcmp(z,"-nullvalue")==0 ){
11594      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
11595                       "%s",cmdline_option_value(argc,argv,++i));
11596    }else if( strcmp(z,"-header")==0 ){
11597      data.showHeader = 1;
11598      ShellSetFlag(&data, SHFLG_HeaderSet);
11599     }else if( strcmp(z,"-noheader")==0 ){
11600      data.showHeader = 0;
11601      ShellSetFlag(&data, SHFLG_HeaderSet);
11602    }else if( strcmp(z,"-echo")==0 ){
11603      ShellSetFlag(&data, SHFLG_Echo);
11604    }else if( strcmp(z,"-eqp")==0 ){
11605      data.autoEQP = AUTOEQP_on;
11606    }else if( strcmp(z,"-eqpfull")==0 ){
11607      data.autoEQP = AUTOEQP_full;
11608    }else if( strcmp(z,"-stats")==0 ){
11609      data.statsOn = 1;
11610    }else if( strcmp(z,"-scanstats")==0 ){
11611      data.scanstatsOn = 1;
11612    }else if( strcmp(z,"-backslash")==0 ){
11613      /* Undocumented command-line option: -backslash
11614      ** Causes C-style backslash escapes to be evaluated in SQL statements
11615      ** prior to sending the SQL into SQLite.  Useful for injecting
11616      ** crazy bytes in the middle of SQL statements for testing and debugging.
11617      */
11618      ShellSetFlag(&data, SHFLG_Backslash);
11619    }else if( strcmp(z,"-bail")==0 ){
11620      /* No-op.  The bail_on_error flag should already be set. */
11621    }else if( strcmp(z,"-version")==0 ){
11622      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
11623      return 0;
11624    }else if( strcmp(z,"-interactive")==0 ){
11625      stdin_is_interactive = 1;
11626    }else if( strcmp(z,"-batch")==0 ){
11627      stdin_is_interactive = 0;
11628    }else if( strcmp(z,"-heap")==0 ){
11629      i++;
11630    }else if( strcmp(z,"-pagecache")==0 ){
11631      i+=2;
11632    }else if( strcmp(z,"-lookaside")==0 ){
11633      i+=2;
11634    }else if( strcmp(z,"-threadsafe")==0 ){
11635      i+=2;
11636    }else if( strcmp(z,"-nonce")==0 ){
11637      i += 2;
11638    }else if( strcmp(z,"-mmap")==0 ){
11639      i++;
11640    }else if( strcmp(z,"-memtrace")==0 ){
11641      i++;
11642#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11643    }else if( strcmp(z,"-sorterref")==0 ){
11644      i++;
11645#endif
11646    }else if( strcmp(z,"-vfs")==0 ){
11647      i++;
11648#ifdef SQLITE_ENABLE_VFSTRACE
11649    }else if( strcmp(z,"-vfstrace")==0 ){
11650      i++;
11651#endif
11652#ifdef SQLITE_ENABLE_MULTIPLEX
11653    }else if( strcmp(z,"-multiplex")==0 ){
11654      i++;
11655#endif
11656    }else if( strcmp(z,"-help")==0 ){
11657      usage(1);
11658    }else if( strcmp(z,"-cmd")==0 ){
11659      /* Run commands that follow -cmd first and separately from commands
11660      ** that simply appear on the command-line.  This seems goofy.  It would
11661      ** be better if all commands ran in the order that they appear.  But
11662      ** we retain the goofy behavior for historical compatibility. */
11663      if( i==argc-1 ) break;
11664      z = cmdline_option_value(argc,argv,++i);
11665      if( z[0]=='.' ){
11666        rc = do_meta_command(z, &data);
11667        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
11668      }else{
11669        open_db(&data, 0);
11670        rc = shell_exec(&data, z, &zErrMsg);
11671        if( zErrMsg!=0 ){
11672          utf8_printf(stderr,"Error: %s\n", zErrMsg);
11673          if( bail_on_error ) return rc!=0 ? rc : 1;
11674        }else if( rc!=0 ){
11675          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
11676          if( bail_on_error ) return rc;
11677        }
11678      }
11679#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11680    }else if( strncmp(z, "-A", 2)==0 ){
11681      if( nCmd>0 ){
11682        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
11683                            " with \"%s\"\n", z);
11684        return 1;
11685      }
11686      open_db(&data, OPEN_DB_ZIPFILE);
11687      if( z[2] ){
11688        argv[i] = &z[2];
11689        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
11690      }else{
11691        arDotCommand(&data, 1, argv+i, argc-i);
11692      }
11693      readStdin = 0;
11694      break;
11695#endif
11696    }else if( strcmp(z,"-safe")==0 ){
11697      data.bSafeMode = data.bSafeModePersist = 1;
11698    }else{
11699      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
11700      raw_printf(stderr,"Use -help for a list of options.\n");
11701      return 1;
11702    }
11703    data.cMode = data.mode;
11704  }
11705
11706  if( !readStdin ){
11707    /* Run all arguments that do not begin with '-' as if they were separate
11708    ** command-line inputs, except for the argToSkip argument which contains
11709    ** the database filename.
11710    */
11711    for(i=0; i<nCmd; i++){
11712      if( azCmd[i][0]=='.' ){
11713        rc = do_meta_command(azCmd[i], &data);
11714        if( rc ){
11715          free(azCmd);
11716          return rc==2 ? 0 : rc;
11717        }
11718      }else{
11719        open_db(&data, 0);
11720        rc = shell_exec(&data, azCmd[i], &zErrMsg);
11721        if( zErrMsg || rc ){
11722          if( zErrMsg!=0 ){
11723            utf8_printf(stderr,"Error: %s\n", zErrMsg);
11724          }else{
11725            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
11726          }
11727          sqlite3_free(zErrMsg);
11728          free(azCmd);
11729          return rc!=0 ? rc : 1;
11730        }
11731      }
11732    }
11733  }else{
11734    /* Run commands received from standard input
11735    */
11736    if( stdin_is_interactive ){
11737      char *zHome;
11738      char *zHistory;
11739      int nHistory;
11740      printf(
11741        "SQLite version %s %.19s\n" /*extra-version-info*/
11742        "Enter \".help\" for usage hints.\n",
11743        sqlite3_libversion(), sqlite3_sourceid()
11744      );
11745      if( warnInmemoryDb ){
11746        printf("Connected to a ");
11747        printBold("transient in-memory database");
11748        printf(".\nUse \".open FILENAME\" to reopen on a "
11749               "persistent database.\n");
11750      }
11751      zHistory = getenv("SQLITE_HISTORY");
11752      if( zHistory ){
11753        zHistory = strdup(zHistory);
11754      }else if( (zHome = find_home_dir(0))!=0 ){
11755        nHistory = strlen30(zHome) + 20;
11756        if( (zHistory = malloc(nHistory))!=0 ){
11757          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
11758        }
11759      }
11760      if( zHistory ){ shell_read_history(zHistory); }
11761#if HAVE_READLINE || HAVE_EDITLINE
11762      rl_attempted_completion_function = readline_completion;
11763#elif HAVE_LINENOISE
11764      linenoiseSetCompletionCallback(linenoise_completion);
11765#endif
11766      data.in = 0;
11767      rc = process_input(&data);
11768      if( zHistory ){
11769        shell_stifle_history(2000);
11770        shell_write_history(zHistory);
11771        free(zHistory);
11772      }
11773    }else{
11774      data.in = stdin;
11775      rc = process_input(&data);
11776    }
11777  }
11778  free(azCmd);
11779  set_table_name(&data, 0);
11780  if( data.db ){
11781    session_close_all(&data, -1);
11782    close_db(data.db);
11783  }
11784  for(i=0; i<ArraySize(data.aAuxDb); i++){
11785    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
11786    if( data.aAuxDb[i].db ){
11787      session_close_all(&data, i);
11788      close_db(data.aAuxDb[i].db);
11789    }
11790  }
11791  find_home_dir(1);
11792  output_reset(&data);
11793  data.doXdgOpen = 0;
11794  clearTempFile(&data);
11795#if !SQLITE_SHELL_IS_UTF8
11796  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
11797  free(argvToFree);
11798#endif
11799  free(data.colWidth);
11800  free(data.zNonce);
11801  /* Clear the global data structure so that valgrind will detect memory
11802  ** leaks */
11803  memset(&data, 0, sizeof(data));
11804  return rc;
11805}
11806