xref: /sqlite-3.40.0/src/shell.c.in (revision 2b5fbb28)
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** Maybe construct two lines of text that point out the position of a
2524** syntax error.  Return a pointer to the text, in memory obtained from
2525** sqlite3_malloc().  Or, if the most recent error does not involve a
2526** specific token that we can point to, return an empty string.
2527**
2528** In all cases, the memory returned is obtained from sqlite3_malloc64()
2529** and should be released by the caller invoking sqlite3_free().
2530*/
2531static char *shell_error_context(const char *zSql, sqlite3 *db){
2532  int iOffset;
2533  size_t len;
2534  char *zCode;
2535  char *zMsg;
2536  int i;
2537  if( db==0
2538   || zSql==0
2539   || (iOffset = sqlite3_error_offset(db))<0
2540  ){
2541    return sqlite3_mprintf("");
2542  }
2543  while( iOffset>50 ){
2544    iOffset--;
2545    zSql++;
2546    while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
2547  }
2548  len = strlen(zSql);
2549  if( len>78 ){
2550    len = 78;
2551    while( (zSql[len]&0xc0)==0x80 ) len--;
2552  }
2553  zCode = sqlite3_mprintf("%.*s", len, zSql);
2554  for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
2555  if( iOffset<25 ){
2556    zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode, iOffset, "");
2557  }else{
2558    zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode, iOffset-14, "");
2559  }
2560  return zMsg;
2561}
2562
2563
2564/*
2565** Execute a query statement that will generate SQL output.  Print
2566** the result columns, comma-separated, on a line and then add a
2567** semicolon terminator to the end of that line.
2568**
2569** If the number of columns is 1 and that column contains text "--"
2570** then write the semicolon on a separate line.  That way, if a
2571** "--" comment occurs at the end of the statement, the comment
2572** won't consume the semicolon terminator.
2573*/
2574static int run_table_dump_query(
2575  ShellState *p,           /* Query context */
2576  const char *zSelect      /* SELECT statement to extract content */
2577){
2578  sqlite3_stmt *pSelect;
2579  int rc;
2580  int nResult;
2581  int i;
2582  const char *z;
2583  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2584  if( rc!=SQLITE_OK || !pSelect ){
2585    char *zContext = shell_error_context(zSelect, p->db);
2586    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
2587                sqlite3_errmsg(p->db), zContext);
2588    sqlite3_free(zContext);
2589    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2590    return rc;
2591  }
2592  rc = sqlite3_step(pSelect);
2593  nResult = sqlite3_column_count(pSelect);
2594  while( rc==SQLITE_ROW ){
2595    z = (const char*)sqlite3_column_text(pSelect, 0);
2596    utf8_printf(p->out, "%s", z);
2597    for(i=1; i<nResult; i++){
2598      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2599    }
2600    if( z==0 ) z = "";
2601    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2602    if( z[0] ){
2603      raw_printf(p->out, "\n;\n");
2604    }else{
2605      raw_printf(p->out, ";\n");
2606    }
2607    rc = sqlite3_step(pSelect);
2608  }
2609  rc = sqlite3_finalize(pSelect);
2610  if( rc!=SQLITE_OK ){
2611    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2612                sqlite3_errmsg(p->db));
2613    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2614  }
2615  return rc;
2616}
2617
2618/*
2619** Allocate space and save off string indicating current error.
2620*/
2621static char *save_err_msg(
2622  sqlite3 *db,           /* Database to query */
2623  const char *zWhen,     /* Qualifier (format) wrapper */
2624  int rc,                /* Error code returned from API */
2625  const char *zSql       /* SQL string, or NULL */
2626){
2627  char *zErr;
2628  char *zContext;
2629  if( zWhen==0 ) zWhen = "%s (%d)%s";
2630  zContext = shell_error_context(zSql, db);
2631  zErr = sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc, zContext);
2632  shell_check_oom(zErr);
2633  sqlite3_free(zContext);
2634  return zErr;
2635}
2636
2637#ifdef __linux__
2638/*
2639** Attempt to display I/O stats on Linux using /proc/PID/io
2640*/
2641static void displayLinuxIoStats(FILE *out){
2642  FILE *in;
2643  char z[200];
2644  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2645  in = fopen(z, "rb");
2646  if( in==0 ) return;
2647  while( fgets(z, sizeof(z), in)!=0 ){
2648    static const struct {
2649      const char *zPattern;
2650      const char *zDesc;
2651    } aTrans[] = {
2652      { "rchar: ",                  "Bytes received by read():" },
2653      { "wchar: ",                  "Bytes sent to write():"    },
2654      { "syscr: ",                  "Read() system calls:"      },
2655      { "syscw: ",                  "Write() system calls:"     },
2656      { "read_bytes: ",             "Bytes read from storage:"  },
2657      { "write_bytes: ",            "Bytes written to storage:" },
2658      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
2659    };
2660    int i;
2661    for(i=0; i<ArraySize(aTrans); i++){
2662      int n = strlen30(aTrans[i].zPattern);
2663      if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2664        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2665        break;
2666      }
2667    }
2668  }
2669  fclose(in);
2670}
2671#endif
2672
2673/*
2674** Display a single line of status using 64-bit values.
2675*/
2676static void displayStatLine(
2677  ShellState *p,            /* The shell context */
2678  char *zLabel,             /* Label for this one line */
2679  char *zFormat,            /* Format for the result */
2680  int iStatusCtrl,          /* Which status to display */
2681  int bReset                /* True to reset the stats */
2682){
2683  sqlite3_int64 iCur = -1;
2684  sqlite3_int64 iHiwtr = -1;
2685  int i, nPercent;
2686  char zLine[200];
2687  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2688  for(i=0, nPercent=0; zFormat[i]; i++){
2689    if( zFormat[i]=='%' ) nPercent++;
2690  }
2691  if( nPercent>1 ){
2692    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2693  }else{
2694    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2695  }
2696  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2697}
2698
2699/*
2700** Display memory stats.
2701*/
2702static int display_stats(
2703  sqlite3 *db,                /* Database to query */
2704  ShellState *pArg,           /* Pointer to ShellState */
2705  int bReset                  /* True to reset the stats */
2706){
2707  int iCur;
2708  int iHiwtr;
2709  FILE *out;
2710  if( pArg==0 || pArg->out==0 ) return 0;
2711  out = pArg->out;
2712
2713  if( pArg->pStmt && pArg->statsOn==2 ){
2714    int nCol, i, x;
2715    sqlite3_stmt *pStmt = pArg->pStmt;
2716    char z[100];
2717    nCol = sqlite3_column_count(pStmt);
2718    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2719    for(i=0; i<nCol; i++){
2720      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2721      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2722#ifndef SQLITE_OMIT_DECLTYPE
2723      sqlite3_snprintf(30, z+x, "declared type:");
2724      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2725#endif
2726#ifdef SQLITE_ENABLE_COLUMN_METADATA
2727      sqlite3_snprintf(30, z+x, "database name:");
2728      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2729      sqlite3_snprintf(30, z+x, "table name:");
2730      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2731      sqlite3_snprintf(30, z+x, "origin name:");
2732      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2733#endif
2734    }
2735  }
2736
2737  if( pArg->statsOn==3 ){
2738    if( pArg->pStmt ){
2739      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2740      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2741    }
2742    return 0;
2743  }
2744
2745  displayStatLine(pArg, "Memory Used:",
2746     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2747  displayStatLine(pArg, "Number of Outstanding Allocations:",
2748     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2749  if( pArg->shellFlgs & SHFLG_Pagecache ){
2750    displayStatLine(pArg, "Number of Pcache Pages Used:",
2751       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2752  }
2753  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2754     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2755  displayStatLine(pArg, "Largest Allocation:",
2756     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2757  displayStatLine(pArg, "Largest Pcache Allocation:",
2758     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2759#ifdef YYTRACKMAXSTACKDEPTH
2760  displayStatLine(pArg, "Deepest Parser Stack:",
2761     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2762#endif
2763
2764  if( db ){
2765    if( pArg->shellFlgs & SHFLG_Lookaside ){
2766      iHiwtr = iCur = -1;
2767      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2768                        &iCur, &iHiwtr, bReset);
2769      raw_printf(pArg->out,
2770              "Lookaside Slots Used:                %d (max %d)\n",
2771              iCur, iHiwtr);
2772      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2773                        &iCur, &iHiwtr, bReset);
2774      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
2775              iHiwtr);
2776      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2777                        &iCur, &iHiwtr, bReset);
2778      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
2779              iHiwtr);
2780      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2781                        &iCur, &iHiwtr, bReset);
2782      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
2783              iHiwtr);
2784    }
2785    iHiwtr = iCur = -1;
2786    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2787    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
2788            iCur);
2789    iHiwtr = iCur = -1;
2790    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2791    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
2792    iHiwtr = iCur = -1;
2793    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2794    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
2795    iHiwtr = iCur = -1;
2796    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2797    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
2798    iHiwtr = iCur = -1;
2799    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2800    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
2801    iHiwtr = iCur = -1;
2802    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2803    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
2804            iCur);
2805    iHiwtr = iCur = -1;
2806    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2807    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
2808            iCur);
2809  }
2810
2811  if( pArg->pStmt ){
2812    int iHit, iMiss;
2813    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2814                               bReset);
2815    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
2816    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2817    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
2818    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2819    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
2820    iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2821    iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2822    if( iHit || iMiss ){
2823      raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
2824            iHit, iHit+iMiss);
2825    }
2826    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2827    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
2828    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2829    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
2830    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2831    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
2832    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2833    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
2834  }
2835
2836#ifdef __linux__
2837  displayLinuxIoStats(pArg->out);
2838#endif
2839
2840  /* Do not remove this machine readable comment: extra-stats-output-here */
2841
2842  return 0;
2843}
2844
2845/*
2846** Display scan stats.
2847*/
2848static void display_scanstats(
2849  sqlite3 *db,                    /* Database to query */
2850  ShellState *pArg                /* Pointer to ShellState */
2851){
2852#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2853  UNUSED_PARAMETER(db);
2854  UNUSED_PARAMETER(pArg);
2855#else
2856  int i, k, n, mx;
2857  raw_printf(pArg->out, "-------- scanstats --------\n");
2858  mx = 0;
2859  for(k=0; k<=mx; k++){
2860    double rEstLoop = 1.0;
2861    for(i=n=0; 1; i++){
2862      sqlite3_stmt *p = pArg->pStmt;
2863      sqlite3_int64 nLoop, nVisit;
2864      double rEst;
2865      int iSid;
2866      const char *zExplain;
2867      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2868        break;
2869      }
2870      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2871      if( iSid>mx ) mx = iSid;
2872      if( iSid!=k ) continue;
2873      if( n==0 ){
2874        rEstLoop = (double)nLoop;
2875        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2876      }
2877      n++;
2878      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2879      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2880      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2881      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2882      rEstLoop *= rEst;
2883      raw_printf(pArg->out,
2884          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2885          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2886      );
2887    }
2888  }
2889  raw_printf(pArg->out, "---------------------------\n");
2890#endif
2891}
2892
2893/*
2894** Parameter azArray points to a zero-terminated array of strings. zStr
2895** points to a single nul-terminated string. Return non-zero if zStr
2896** is equal, according to strcmp(), to any of the strings in the array.
2897** Otherwise, return zero.
2898*/
2899static int str_in_array(const char *zStr, const char **azArray){
2900  int i;
2901  for(i=0; azArray[i]; i++){
2902    if( 0==strcmp(zStr, azArray[i]) ) return 1;
2903  }
2904  return 0;
2905}
2906
2907/*
2908** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2909** and populate the ShellState.aiIndent[] array with the number of
2910** spaces each opcode should be indented before it is output.
2911**
2912** The indenting rules are:
2913**
2914**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2915**       all opcodes that occur between the p2 jump destination and the opcode
2916**       itself by 2 spaces.
2917**
2918**     * For each "Goto", if the jump destination is earlier in the program
2919**       and ends on one of:
2920**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
2921**       or if the P1 parameter is one instead of zero,
2922**       then indent all opcodes between the earlier instruction
2923**       and "Goto" by 2 spaces.
2924*/
2925static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2926  const char *zSql;               /* The text of the SQL statement */
2927  const char *z;                  /* Used to check if this is an EXPLAIN */
2928  int *abYield = 0;               /* True if op is an OP_Yield */
2929  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
2930  int iOp;                        /* Index of operation in p->aiIndent[] */
2931
2932  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
2933  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2934                            "Rewind", 0 };
2935  const char *azGoto[] = { "Goto", 0 };
2936
2937  /* Try to figure out if this is really an EXPLAIN statement. If this
2938  ** cannot be verified, return early.  */
2939  if( sqlite3_column_count(pSql)!=8 ){
2940    p->cMode = p->mode;
2941    return;
2942  }
2943  zSql = sqlite3_sql(pSql);
2944  if( zSql==0 ) return;
2945  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2946  if( sqlite3_strnicmp(z, "explain", 7) ){
2947    p->cMode = p->mode;
2948    return;
2949  }
2950
2951  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2952    int i;
2953    int iAddr = sqlite3_column_int(pSql, 0);
2954    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2955
2956    /* Set p2 to the P2 field of the current opcode. Then, assuming that
2957    ** p2 is an instruction address, set variable p2op to the index of that
2958    ** instruction in the aiIndent[] array. p2 and p2op may be different if
2959    ** the current instruction is part of a sub-program generated by an
2960    ** SQL trigger or foreign key.  */
2961    int p2 = sqlite3_column_int(pSql, 3);
2962    int p2op = (p2 + (iOp-iAddr));
2963
2964    /* Grow the p->aiIndent array as required */
2965    if( iOp>=nAlloc ){
2966      if( iOp==0 ){
2967        /* Do further verfication that this is explain output.  Abort if
2968        ** it is not */
2969        static const char *explainCols[] = {
2970           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2971        int jj;
2972        for(jj=0; jj<ArraySize(explainCols); jj++){
2973          if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2974            p->cMode = p->mode;
2975            sqlite3_reset(pSql);
2976            return;
2977          }
2978        }
2979      }
2980      nAlloc += 100;
2981      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2982      shell_check_oom(p->aiIndent);
2983      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
2984      shell_check_oom(abYield);
2985    }
2986    abYield[iOp] = str_in_array(zOp, azYield);
2987    p->aiIndent[iOp] = 0;
2988    p->nIndent = iOp+1;
2989
2990    if( str_in_array(zOp, azNext) ){
2991      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2992    }
2993    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2994     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2995    ){
2996      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2997    }
2998  }
2999
3000  p->iIndent = 0;
3001  sqlite3_free(abYield);
3002  sqlite3_reset(pSql);
3003}
3004
3005/*
3006** Free the array allocated by explain_data_prepare().
3007*/
3008static void explain_data_delete(ShellState *p){
3009  sqlite3_free(p->aiIndent);
3010  p->aiIndent = 0;
3011  p->nIndent = 0;
3012  p->iIndent = 0;
3013}
3014
3015/*
3016** Disable and restore .wheretrace and .selecttrace settings.
3017*/
3018static unsigned int savedSelectTrace;
3019static unsigned int savedWhereTrace;
3020static void disable_debug_trace_modes(void){
3021  unsigned int zero = 0;
3022  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
3023  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
3024  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
3025  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
3026}
3027static void restore_debug_trace_modes(void){
3028  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
3029  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
3030}
3031
3032/* Create the TEMP table used to store parameter bindings */
3033static void bind_table_init(ShellState *p){
3034  int wrSchema = 0;
3035  int defensiveMode = 0;
3036  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
3037  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
3038  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
3039  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
3040  sqlite3_exec(p->db,
3041    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
3042    "  key TEXT PRIMARY KEY,\n"
3043    "  value\n"
3044    ") WITHOUT ROWID;",
3045    0, 0, 0);
3046  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3047  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3048}
3049
3050/*
3051** Bind parameters on a prepared statement.
3052**
3053** Parameter bindings are taken from a TEMP table of the form:
3054**
3055**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3056**    WITHOUT ROWID;
3057**
3058** No bindings occur if this table does not exist.  The name of the table
3059** begins with "sqlite_" so that it will not collide with ordinary application
3060** tables.  The table must be in the TEMP schema.
3061*/
3062static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3063  int nVar;
3064  int i;
3065  int rc;
3066  sqlite3_stmt *pQ = 0;
3067
3068  nVar = sqlite3_bind_parameter_count(pStmt);
3069  if( nVar==0 ) return;  /* Nothing to do */
3070  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3071                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3072    return; /* Parameter table does not exist */
3073  }
3074  rc = sqlite3_prepare_v2(pArg->db,
3075          "SELECT value FROM temp.sqlite_parameters"
3076          " WHERE key=?1", -1, &pQ, 0);
3077  if( rc || pQ==0 ) return;
3078  for(i=1; i<=nVar; i++){
3079    char zNum[30];
3080    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3081    if( zVar==0 ){
3082      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3083      zVar = zNum;
3084    }
3085    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3086    if( sqlite3_step(pQ)==SQLITE_ROW ){
3087      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3088    }else{
3089      sqlite3_bind_null(pStmt, i);
3090    }
3091    sqlite3_reset(pQ);
3092  }
3093  sqlite3_finalize(pQ);
3094}
3095
3096/*
3097** UTF8 box-drawing characters.  Imagine box lines like this:
3098**
3099**           1
3100**           |
3101**       4 --+-- 2
3102**           |
3103**           3
3104**
3105** Each box characters has between 2 and 4 of the lines leading from
3106** the center.  The characters are here identified by the numbers of
3107** their corresponding lines.
3108*/
3109#define BOX_24   "\342\224\200"  /* U+2500 --- */
3110#define BOX_13   "\342\224\202"  /* U+2502  |  */
3111#define BOX_23   "\342\224\214"  /* U+250c  ,- */
3112#define BOX_34   "\342\224\220"  /* U+2510 -,  */
3113#define BOX_12   "\342\224\224"  /* U+2514  '- */
3114#define BOX_14   "\342\224\230"  /* U+2518 -'  */
3115#define BOX_123  "\342\224\234"  /* U+251c  |- */
3116#define BOX_134  "\342\224\244"  /* U+2524 -|  */
3117#define BOX_234  "\342\224\254"  /* U+252c -,- */
3118#define BOX_124  "\342\224\264"  /* U+2534 -'- */
3119#define BOX_1234 "\342\224\274"  /* U+253c -|- */
3120
3121/* Draw horizontal line N characters long using unicode box
3122** characters
3123*/
3124static void print_box_line(FILE *out, int N){
3125  const char zDash[] =
3126      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3127      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3128  const int nDash = sizeof(zDash) - 1;
3129  N *= 3;
3130  while( N>nDash ){
3131    utf8_printf(out, zDash);
3132    N -= nDash;
3133  }
3134  utf8_printf(out, "%.*s", N, zDash);
3135}
3136
3137/*
3138** Draw a horizontal separator for a MODE_Box table.
3139*/
3140static void print_box_row_separator(
3141  ShellState *p,
3142  int nArg,
3143  const char *zSep1,
3144  const char *zSep2,
3145  const char *zSep3
3146){
3147  int i;
3148  if( nArg>0 ){
3149    utf8_printf(p->out, "%s", zSep1);
3150    print_box_line(p->out, p->actualWidth[0]+2);
3151    for(i=1; i<nArg; i++){
3152      utf8_printf(p->out, "%s", zSep2);
3153      print_box_line(p->out, p->actualWidth[i]+2);
3154    }
3155    utf8_printf(p->out, "%s", zSep3);
3156  }
3157  fputs("\n", p->out);
3158}
3159
3160
3161
3162/*
3163** Run a prepared statement and output the result in one of the
3164** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3165** or MODE_Box.
3166**
3167** This is different from ordinary exec_prepared_stmt() in that
3168** it has to run the entire query and gather the results into memory
3169** first, in order to determine column widths, before providing
3170** any output.
3171*/
3172static void exec_prepared_stmt_columnar(
3173  ShellState *p,                        /* Pointer to ShellState */
3174  sqlite3_stmt *pStmt                   /* Statment to run */
3175){
3176  sqlite3_int64 nRow = 0;
3177  int nColumn = 0;
3178  char **azData = 0;
3179  sqlite3_int64 nAlloc = 0;
3180  const char *z;
3181  int rc;
3182  sqlite3_int64 i, nData;
3183  int j, nTotal, w, n;
3184  const char *colSep = 0;
3185  const char *rowSep = 0;
3186
3187  rc = sqlite3_step(pStmt);
3188  if( rc!=SQLITE_ROW ) return;
3189  nColumn = sqlite3_column_count(pStmt);
3190  nAlloc = nColumn*4;
3191  if( nAlloc<=0 ) nAlloc = 1;
3192  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3193  shell_check_oom(azData);
3194  for(i=0; i<nColumn; i++){
3195    azData[i] = strdup(sqlite3_column_name(pStmt,i));
3196  }
3197  do{
3198    if( (nRow+2)*nColumn >= nAlloc ){
3199      nAlloc *= 2;
3200      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3201      shell_check_oom(azData);
3202    }
3203    nRow++;
3204    for(i=0; i<nColumn; i++){
3205      z = (const char*)sqlite3_column_text(pStmt,i);
3206      azData[nRow*nColumn + i] = z ? strdup(z) : 0;
3207    }
3208  }while( sqlite3_step(pStmt)==SQLITE_ROW );
3209  if( nColumn>p->nWidth ){
3210    p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3211    shell_check_oom(p->colWidth);
3212    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3213    p->nWidth = nColumn;
3214    p->actualWidth = &p->colWidth[nColumn];
3215  }
3216  memset(p->actualWidth, 0, nColumn*sizeof(int));
3217  for(i=0; i<nColumn; i++){
3218    w = p->colWidth[i];
3219    if( w<0 ) w = -w;
3220    p->actualWidth[i] = w;
3221  }
3222  nTotal = nColumn*(nRow+1);
3223  for(i=0; i<nTotal; i++){
3224    z = azData[i];
3225    if( z==0 ) z = p->nullValue;
3226    n = strlenChar(z);
3227    j = i%nColumn;
3228    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3229  }
3230  if( seenInterrupt ) goto columnar_end;
3231  if( nColumn==0 ) goto columnar_end;
3232  switch( p->cMode ){
3233    case MODE_Column: {
3234      colSep = "  ";
3235      rowSep = "\n";
3236      if( p->showHeader ){
3237        for(i=0; i<nColumn; i++){
3238          w = p->actualWidth[i];
3239          if( p->colWidth[i]<0 ) w = -w;
3240          utf8_width_print(p->out, w, azData[i]);
3241          fputs(i==nColumn-1?"\n":"  ", p->out);
3242        }
3243        for(i=0; i<nColumn; i++){
3244          print_dashes(p->out, p->actualWidth[i]);
3245          fputs(i==nColumn-1?"\n":"  ", p->out);
3246        }
3247      }
3248      break;
3249    }
3250    case MODE_Table: {
3251      colSep = " | ";
3252      rowSep = " |\n";
3253      print_row_separator(p, nColumn, "+");
3254      fputs("| ", p->out);
3255      for(i=0; i<nColumn; i++){
3256        w = p->actualWidth[i];
3257        n = strlenChar(azData[i]);
3258        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3259        fputs(i==nColumn-1?" |\n":" | ", p->out);
3260      }
3261      print_row_separator(p, nColumn, "+");
3262      break;
3263    }
3264    case MODE_Markdown: {
3265      colSep = " | ";
3266      rowSep = " |\n";
3267      fputs("| ", p->out);
3268      for(i=0; i<nColumn; i++){
3269        w = p->actualWidth[i];
3270        n = strlenChar(azData[i]);
3271        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3272        fputs(i==nColumn-1?" |\n":" | ", p->out);
3273      }
3274      print_row_separator(p, nColumn, "|");
3275      break;
3276    }
3277    case MODE_Box: {
3278      colSep = " " BOX_13 " ";
3279      rowSep = " " BOX_13 "\n";
3280      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3281      utf8_printf(p->out, BOX_13 " ");
3282      for(i=0; i<nColumn; i++){
3283        w = p->actualWidth[i];
3284        n = strlenChar(azData[i]);
3285        utf8_printf(p->out, "%*s%s%*s%s",
3286            (w-n)/2, "", azData[i], (w-n+1)/2, "",
3287            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3288      }
3289      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3290      break;
3291    }
3292  }
3293  for(i=nColumn, j=0; i<nTotal; i++, j++){
3294    if( j==0 && p->cMode!=MODE_Column ){
3295      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3296    }
3297    z = azData[i];
3298    if( z==0 ) z = p->nullValue;
3299    w = p->actualWidth[j];
3300    if( p->colWidth[j]<0 ) w = -w;
3301    utf8_width_print(p->out, w, z);
3302    if( j==nColumn-1 ){
3303      utf8_printf(p->out, "%s", rowSep);
3304      j = -1;
3305      if( seenInterrupt ) goto columnar_end;
3306    }else{
3307      utf8_printf(p->out, "%s", colSep);
3308    }
3309  }
3310  if( p->cMode==MODE_Table ){
3311    print_row_separator(p, nColumn, "+");
3312  }else if( p->cMode==MODE_Box ){
3313    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3314  }
3315columnar_end:
3316  if( seenInterrupt ){
3317    utf8_printf(p->out, "Interrupt\n");
3318  }
3319  nData = (nRow+1)*nColumn;
3320  for(i=0; i<nData; i++) free(azData[i]);
3321  sqlite3_free(azData);
3322}
3323
3324/*
3325** Run a prepared statement
3326*/
3327static void exec_prepared_stmt(
3328  ShellState *pArg,                                /* Pointer to ShellState */
3329  sqlite3_stmt *pStmt                              /* Statment to run */
3330){
3331  int rc;
3332  sqlite3_uint64 nRow = 0;
3333
3334  if( pArg->cMode==MODE_Column
3335   || pArg->cMode==MODE_Table
3336   || pArg->cMode==MODE_Box
3337   || pArg->cMode==MODE_Markdown
3338  ){
3339    exec_prepared_stmt_columnar(pArg, pStmt);
3340    return;
3341  }
3342
3343  /* perform the first step.  this will tell us if we
3344  ** have a result set or not and how wide it is.
3345  */
3346  rc = sqlite3_step(pStmt);
3347  /* if we have a result set... */
3348  if( SQLITE_ROW == rc ){
3349    /* allocate space for col name ptr, value ptr, and type */
3350    int nCol = sqlite3_column_count(pStmt);
3351    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3352    if( !pData ){
3353      shell_out_of_memory();
3354    }else{
3355      char **azCols = (char **)pData;      /* Names of result columns */
3356      char **azVals = &azCols[nCol];       /* Results */
3357      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3358      int i, x;
3359      assert(sizeof(int) <= sizeof(char *));
3360      /* save off ptrs to column names */
3361      for(i=0; i<nCol; i++){
3362        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3363      }
3364      do{
3365        nRow++;
3366        /* extract the data and data types */
3367        for(i=0; i<nCol; i++){
3368          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3369          if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
3370            azVals[i] = "";
3371          }else{
3372            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3373          }
3374          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3375            rc = SQLITE_NOMEM;
3376            break; /* from for */
3377          }
3378        } /* end for */
3379
3380        /* if data and types extracted successfully... */
3381        if( SQLITE_ROW == rc ){
3382          /* call the supplied callback with the result row data */
3383          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3384            rc = SQLITE_ABORT;
3385          }else{
3386            rc = sqlite3_step(pStmt);
3387          }
3388        }
3389      } while( SQLITE_ROW == rc );
3390      sqlite3_free(pData);
3391      if( pArg->cMode==MODE_Json ){
3392        fputs("]\n", pArg->out);
3393      }else if( pArg->cMode==MODE_Count ){
3394        printf("%llu row%s\n", nRow, nRow!=1 ? "s" : "");
3395      }
3396    }
3397  }
3398}
3399
3400#ifndef SQLITE_OMIT_VIRTUALTABLE
3401/*
3402** This function is called to process SQL if the previous shell command
3403** was ".expert". It passes the SQL in the second argument directly to
3404** the sqlite3expert object.
3405**
3406** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3407** code. In this case, (*pzErr) may be set to point to a buffer containing
3408** an English language error message. It is the responsibility of the
3409** caller to eventually free this buffer using sqlite3_free().
3410*/
3411static int expertHandleSQL(
3412  ShellState *pState,
3413  const char *zSql,
3414  char **pzErr
3415){
3416  assert( pState->expert.pExpert );
3417  assert( pzErr==0 || *pzErr==0 );
3418  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3419}
3420
3421/*
3422** This function is called either to silently clean up the object
3423** created by the ".expert" command (if bCancel==1), or to generate a
3424** report from it and then clean it up (if bCancel==0).
3425**
3426** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3427** code. In this case, (*pzErr) may be set to point to a buffer containing
3428** an English language error message. It is the responsibility of the
3429** caller to eventually free this buffer using sqlite3_free().
3430*/
3431static int expertFinish(
3432  ShellState *pState,
3433  int bCancel,
3434  char **pzErr
3435){
3436  int rc = SQLITE_OK;
3437  sqlite3expert *p = pState->expert.pExpert;
3438  assert( p );
3439  assert( bCancel || pzErr==0 || *pzErr==0 );
3440  if( bCancel==0 ){
3441    FILE *out = pState->out;
3442    int bVerbose = pState->expert.bVerbose;
3443
3444    rc = sqlite3_expert_analyze(p, pzErr);
3445    if( rc==SQLITE_OK ){
3446      int nQuery = sqlite3_expert_count(p);
3447      int i;
3448
3449      if( bVerbose ){
3450        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3451        raw_printf(out, "-- Candidates -----------------------------\n");
3452        raw_printf(out, "%s\n", zCand);
3453      }
3454      for(i=0; i<nQuery; i++){
3455        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3456        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3457        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3458        if( zIdx==0 ) zIdx = "(no new indexes)\n";
3459        if( bVerbose ){
3460          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3461          raw_printf(out, "%s\n\n", zSql);
3462        }
3463        raw_printf(out, "%s\n", zIdx);
3464        raw_printf(out, "%s\n", zEQP);
3465      }
3466    }
3467  }
3468  sqlite3_expert_destroy(p);
3469  pState->expert.pExpert = 0;
3470  return rc;
3471}
3472
3473/*
3474** Implementation of ".expert" dot command.
3475*/
3476static int expertDotCommand(
3477  ShellState *pState,             /* Current shell tool state */
3478  char **azArg,                   /* Array of arguments passed to dot command */
3479  int nArg                        /* Number of entries in azArg[] */
3480){
3481  int rc = SQLITE_OK;
3482  char *zErr = 0;
3483  int i;
3484  int iSample = 0;
3485
3486  assert( pState->expert.pExpert==0 );
3487  memset(&pState->expert, 0, sizeof(ExpertInfo));
3488
3489  for(i=1; rc==SQLITE_OK && i<nArg; i++){
3490    char *z = azArg[i];
3491    int n;
3492    if( z[0]=='-' && z[1]=='-' ) z++;
3493    n = strlen30(z);
3494    if( n>=2 && 0==strncmp(z, "-verbose", n) ){
3495      pState->expert.bVerbose = 1;
3496    }
3497    else if( n>=2 && 0==strncmp(z, "-sample", n) ){
3498      if( i==(nArg-1) ){
3499        raw_printf(stderr, "option requires an argument: %s\n", z);
3500        rc = SQLITE_ERROR;
3501      }else{
3502        iSample = (int)integerValue(azArg[++i]);
3503        if( iSample<0 || iSample>100 ){
3504          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3505          rc = SQLITE_ERROR;
3506        }
3507      }
3508    }
3509    else{
3510      raw_printf(stderr, "unknown option: %s\n", z);
3511      rc = SQLITE_ERROR;
3512    }
3513  }
3514
3515  if( rc==SQLITE_OK ){
3516    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3517    if( pState->expert.pExpert==0 ){
3518      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3519      rc = SQLITE_ERROR;
3520    }else{
3521      sqlite3_expert_config(
3522          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3523      );
3524    }
3525  }
3526  sqlite3_free(zErr);
3527
3528  return rc;
3529}
3530#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3531
3532/*
3533** Execute a statement or set of statements.  Print
3534** any result rows/columns depending on the current mode
3535** set via the supplied callback.
3536**
3537** This is very similar to SQLite's built-in sqlite3_exec()
3538** function except it takes a slightly different callback
3539** and callback data argument.
3540*/
3541static int shell_exec(
3542  ShellState *pArg,                         /* Pointer to ShellState */
3543  const char *zSql,                         /* SQL to be evaluated */
3544  char **pzErrMsg                           /* Error msg written here */
3545){
3546  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
3547  int rc = SQLITE_OK;             /* Return Code */
3548  int rc2;
3549  const char *zLeftover;          /* Tail of unprocessed SQL */
3550  sqlite3 *db = pArg->db;
3551
3552  if( pzErrMsg ){
3553    *pzErrMsg = NULL;
3554  }
3555
3556#ifndef SQLITE_OMIT_VIRTUALTABLE
3557  if( pArg->expert.pExpert ){
3558    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3559    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3560  }
3561#endif
3562
3563  while( zSql[0] && (SQLITE_OK == rc) ){
3564    static const char *zStmtSql;
3565    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3566    if( SQLITE_OK != rc ){
3567      if( pzErrMsg ){
3568        *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)%s", rc, zSql);
3569      }
3570    }else{
3571      if( !pStmt ){
3572        /* this happens for a comment or white-space */
3573        zSql = zLeftover;
3574        while( IsSpace(zSql[0]) ) zSql++;
3575        continue;
3576      }
3577      zStmtSql = sqlite3_sql(pStmt);
3578      if( zStmtSql==0 ) zStmtSql = "";
3579      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3580
3581      /* save off the prepared statment handle and reset row count */
3582      if( pArg ){
3583        pArg->pStmt = pStmt;
3584        pArg->cnt = 0;
3585      }
3586
3587      /* echo the sql statement if echo on */
3588      if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3589        utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3590      }
3591
3592      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3593      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3594        sqlite3_stmt *pExplain;
3595        char *zEQP;
3596        int triggerEQP = 0;
3597        disable_debug_trace_modes();
3598        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3599        if( pArg->autoEQP>=AUTOEQP_trigger ){
3600          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3601        }
3602        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3603        shell_check_oom(zEQP);
3604        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3605        if( rc==SQLITE_OK ){
3606          while( sqlite3_step(pExplain)==SQLITE_ROW ){
3607            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3608            int iEqpId = sqlite3_column_int(pExplain, 0);
3609            int iParentId = sqlite3_column_int(pExplain, 1);
3610            if( zEQPLine==0 ) zEQPLine = "";
3611            if( zEQPLine[0]=='-' ) eqp_render(pArg);
3612            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3613          }
3614          eqp_render(pArg);
3615        }
3616        sqlite3_finalize(pExplain);
3617        sqlite3_free(zEQP);
3618        if( pArg->autoEQP>=AUTOEQP_full ){
3619          /* Also do an EXPLAIN for ".eqp full" mode */
3620          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3621          shell_check_oom(zEQP);
3622          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3623          if( rc==SQLITE_OK ){
3624            pArg->cMode = MODE_Explain;
3625            explain_data_prepare(pArg, pExplain);
3626            exec_prepared_stmt(pArg, pExplain);
3627            explain_data_delete(pArg);
3628          }
3629          sqlite3_finalize(pExplain);
3630          sqlite3_free(zEQP);
3631        }
3632        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3633          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3634          /* Reprepare pStmt before reactiving trace modes */
3635          sqlite3_finalize(pStmt);
3636          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3637          if( pArg ) pArg->pStmt = pStmt;
3638        }
3639        restore_debug_trace_modes();
3640      }
3641
3642      if( pArg ){
3643        pArg->cMode = pArg->mode;
3644        if( pArg->autoExplain ){
3645          if( sqlite3_stmt_isexplain(pStmt)==1 ){
3646            pArg->cMode = MODE_Explain;
3647          }
3648          if( sqlite3_stmt_isexplain(pStmt)==2 ){
3649            pArg->cMode = MODE_EQP;
3650          }
3651        }
3652
3653        /* If the shell is currently in ".explain" mode, gather the extra
3654        ** data required to add indents to the output.*/
3655        if( pArg->cMode==MODE_Explain ){
3656          explain_data_prepare(pArg, pStmt);
3657        }
3658      }
3659
3660      bind_prepared_stmt(pArg, pStmt);
3661      exec_prepared_stmt(pArg, pStmt);
3662      explain_data_delete(pArg);
3663      eqp_render(pArg);
3664
3665      /* print usage stats if stats on */
3666      if( pArg && pArg->statsOn ){
3667        display_stats(db, pArg, 0);
3668      }
3669
3670      /* print loop-counters if required */
3671      if( pArg && pArg->scanstatsOn ){
3672        display_scanstats(db, pArg);
3673      }
3674
3675      /* Finalize the statement just executed. If this fails, save a
3676      ** copy of the error message. Otherwise, set zSql to point to the
3677      ** next statement to execute. */
3678      rc2 = sqlite3_finalize(pStmt);
3679      if( rc!=SQLITE_NOMEM ) rc = rc2;
3680      if( rc==SQLITE_OK ){
3681        zSql = zLeftover;
3682        while( IsSpace(zSql[0]) ) zSql++;
3683      }else if( pzErrMsg ){
3684        *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc, 0);
3685      }
3686
3687      /* clear saved stmt handle */
3688      if( pArg ){
3689        pArg->pStmt = NULL;
3690      }
3691    }
3692  } /* end while */
3693
3694  return rc;
3695}
3696
3697/*
3698** Release memory previously allocated by tableColumnList().
3699*/
3700static void freeColumnList(char **azCol){
3701  int i;
3702  for(i=1; azCol[i]; i++){
3703    sqlite3_free(azCol[i]);
3704  }
3705  /* azCol[0] is a static string */
3706  sqlite3_free(azCol);
3707}
3708
3709/*
3710** Return a list of pointers to strings which are the names of all
3711** columns in table zTab.   The memory to hold the names is dynamically
3712** allocated and must be released by the caller using a subsequent call
3713** to freeColumnList().
3714**
3715** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
3716** value that needs to be preserved, then azCol[0] is filled in with the
3717** name of the rowid column.
3718**
3719** The first regular column in the table is azCol[1].  The list is terminated
3720** by an entry with azCol[i]==0.
3721*/
3722static char **tableColumnList(ShellState *p, const char *zTab){
3723  char **azCol = 0;
3724  sqlite3_stmt *pStmt;
3725  char *zSql;
3726  int nCol = 0;
3727  int nAlloc = 0;
3728  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
3729  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
3730  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3731  int rc;
3732
3733  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3734  shell_check_oom(zSql);
3735  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3736  sqlite3_free(zSql);
3737  if( rc ) return 0;
3738  while( sqlite3_step(pStmt)==SQLITE_ROW ){
3739    if( nCol>=nAlloc-2 ){
3740      nAlloc = nAlloc*2 + nCol + 10;
3741      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3742      shell_check_oom(azCol);
3743    }
3744    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3745    shell_check_oom(azCol[nCol]);
3746    if( sqlite3_column_int(pStmt, 5) ){
3747      nPK++;
3748      if( nPK==1
3749       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3750                          "INTEGER")==0
3751      ){
3752        isIPK = 1;
3753      }else{
3754        isIPK = 0;
3755      }
3756    }
3757  }
3758  sqlite3_finalize(pStmt);
3759  if( azCol==0 ) return 0;
3760  azCol[0] = 0;
3761  azCol[nCol+1] = 0;
3762
3763  /* The decision of whether or not a rowid really needs to be preserved
3764  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
3765  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
3766  ** rowids on tables where the rowid is inaccessible because there are other
3767  ** columns in the table named "rowid", "_rowid_", and "oid".
3768  */
3769  if( preserveRowid && isIPK ){
3770    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3771    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
3772    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3773    ** ROWID aliases.  To distinguish these cases, check to see if
3774    ** there is a "pk" entry in "PRAGMA index_list".  There will be
3775    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3776    */
3777    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3778                           " WHERE origin='pk'", zTab);
3779    shell_check_oom(zSql);
3780    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3781    sqlite3_free(zSql);
3782    if( rc ){
3783      freeColumnList(azCol);
3784      return 0;
3785    }
3786    rc = sqlite3_step(pStmt);
3787    sqlite3_finalize(pStmt);
3788    preserveRowid = rc==SQLITE_ROW;
3789  }
3790  if( preserveRowid ){
3791    /* Only preserve the rowid if we can find a name to use for the
3792    ** rowid */
3793    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3794    int i, j;
3795    for(j=0; j<3; j++){
3796      for(i=1; i<=nCol; i++){
3797        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3798      }
3799      if( i>nCol ){
3800        /* At this point, we know that azRowid[j] is not the name of any
3801        ** ordinary column in the table.  Verify that azRowid[j] is a valid
3802        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
3803        ** tables will fail this last check */
3804        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3805        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3806        break;
3807      }
3808    }
3809  }
3810  return azCol;
3811}
3812
3813/*
3814** Toggle the reverse_unordered_selects setting.
3815*/
3816static void toggleSelectOrder(sqlite3 *db){
3817  sqlite3_stmt *pStmt = 0;
3818  int iSetting = 0;
3819  char zStmt[100];
3820  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3821  if( sqlite3_step(pStmt)==SQLITE_ROW ){
3822    iSetting = sqlite3_column_int(pStmt, 0);
3823  }
3824  sqlite3_finalize(pStmt);
3825  sqlite3_snprintf(sizeof(zStmt), zStmt,
3826       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3827  sqlite3_exec(db, zStmt, 0, 0, 0);
3828}
3829
3830/*
3831** This is a different callback routine used for dumping the database.
3832** Each row received by this callback consists of a table name,
3833** the table type ("index" or "table") and SQL to create the table.
3834** This routine should print text sufficient to recreate the table.
3835*/
3836static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
3837  int rc;
3838  const char *zTable;
3839  const char *zType;
3840  const char *zSql;
3841  ShellState *p = (ShellState *)pArg;
3842  int dataOnly;
3843  int noSys;
3844
3845  UNUSED_PARAMETER(azNotUsed);
3846  if( nArg!=3 || azArg==0 ) return 0;
3847  zTable = azArg[0];
3848  zType = azArg[1];
3849  zSql = azArg[2];
3850  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
3851  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
3852
3853  if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
3854    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
3855  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
3856    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
3857  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3858    return 0;
3859  }else if( dataOnly ){
3860    /* no-op */
3861  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3862    char *zIns;
3863    if( !p->writableSchema ){
3864      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
3865      p->writableSchema = 1;
3866    }
3867    zIns = sqlite3_mprintf(
3868       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
3869       "VALUES('table','%q','%q',0,'%q');",
3870       zTable, zTable, zSql);
3871    shell_check_oom(zIns);
3872    utf8_printf(p->out, "%s\n", zIns);
3873    sqlite3_free(zIns);
3874    return 0;
3875  }else{
3876    printSchemaLine(p->out, zSql, ";\n");
3877  }
3878
3879  if( strcmp(zType, "table")==0 ){
3880    ShellText sSelect;
3881    ShellText sTable;
3882    char **azCol;
3883    int i;
3884    char *savedDestTable;
3885    int savedMode;
3886
3887    azCol = tableColumnList(p, zTable);
3888    if( azCol==0 ){
3889      p->nErr++;
3890      return 0;
3891    }
3892
3893    /* Always quote the table name, even if it appears to be pure ascii,
3894    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
3895    initText(&sTable);
3896    appendText(&sTable, zTable, quoteChar(zTable));
3897    /* If preserving the rowid, add a column list after the table name.
3898    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3899    ** instead of the usual "INSERT INTO tab VALUES(...)".
3900    */
3901    if( azCol[0] ){
3902      appendText(&sTable, "(", 0);
3903      appendText(&sTable, azCol[0], 0);
3904      for(i=1; azCol[i]; i++){
3905        appendText(&sTable, ",", 0);
3906        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
3907      }
3908      appendText(&sTable, ")", 0);
3909    }
3910
3911    /* Build an appropriate SELECT statement */
3912    initText(&sSelect);
3913    appendText(&sSelect, "SELECT ", 0);
3914    if( azCol[0] ){
3915      appendText(&sSelect, azCol[0], 0);
3916      appendText(&sSelect, ",", 0);
3917    }
3918    for(i=1; azCol[i]; i++){
3919      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
3920      if( azCol[i+1] ){
3921        appendText(&sSelect, ",", 0);
3922      }
3923    }
3924    freeColumnList(azCol);
3925    appendText(&sSelect, " FROM ", 0);
3926    appendText(&sSelect, zTable, quoteChar(zTable));
3927
3928    savedDestTable = p->zDestTable;
3929    savedMode = p->mode;
3930    p->zDestTable = sTable.z;
3931    p->mode = p->cMode = MODE_Insert;
3932    rc = shell_exec(p, sSelect.z, 0);
3933    if( (rc&0xff)==SQLITE_CORRUPT ){
3934      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3935      toggleSelectOrder(p->db);
3936      shell_exec(p, sSelect.z, 0);
3937      toggleSelectOrder(p->db);
3938    }
3939    p->zDestTable = savedDestTable;
3940    p->mode = savedMode;
3941    freeText(&sTable);
3942    freeText(&sSelect);
3943    if( rc ) p->nErr++;
3944  }
3945  return 0;
3946}
3947
3948/*
3949** Run zQuery.  Use dump_callback() as the callback routine so that
3950** the contents of the query are output as SQL statements.
3951**
3952** If we get a SQLITE_CORRUPT error, rerun the query after appending
3953** "ORDER BY rowid DESC" to the end.
3954*/
3955static int run_schema_dump_query(
3956  ShellState *p,
3957  const char *zQuery
3958){
3959  int rc;
3960  char *zErr = 0;
3961  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
3962  if( rc==SQLITE_CORRUPT ){
3963    char *zQ2;
3964    int len = strlen30(zQuery);
3965    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3966    if( zErr ){
3967      utf8_printf(p->out, "/****** %s ******/\n", zErr);
3968      sqlite3_free(zErr);
3969      zErr = 0;
3970    }
3971    zQ2 = malloc( len+100 );
3972    if( zQ2==0 ) return rc;
3973    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
3974    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3975    if( rc ){
3976      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
3977    }else{
3978      rc = SQLITE_CORRUPT;
3979    }
3980    sqlite3_free(zErr);
3981    free(zQ2);
3982  }
3983  return rc;
3984}
3985
3986/*
3987** Text of help messages.
3988**
3989** The help text for each individual command begins with a line that starts
3990** with ".".  Subsequent lines are supplimental information.
3991**
3992** There must be two or more spaces between the end of the command and the
3993** start of the description of what that command does.
3994*/
3995static const char *(azHelp[]) = {
3996#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
3997  ".archive ...             Manage SQL archives",
3998  "   Each command must have exactly one of the following options:",
3999  "     -c, --create               Create a new archive",
4000  "     -u, --update               Add or update files with changed mtime",
4001  "     -i, --insert               Like -u but always add even if unchanged",
4002  "     -r, --remove               Remove files from archive",
4003  "     -t, --list                 List contents of archive",
4004  "     -x, --extract              Extract files from archive",
4005  "   Optional arguments:",
4006  "     -v, --verbose              Print each filename as it is processed",
4007  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
4008  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
4009  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
4010  "     -g, --glob                 Use glob matching for names in archive",
4011  "     -n, --dryrun               Show the SQL that would have occurred",
4012  "   Examples:",
4013  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
4014  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
4015  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
4016  "   See also:",
4017  "      http://sqlite.org/cli.html#sqlite_archive_support",
4018#endif
4019#ifndef SQLITE_OMIT_AUTHORIZATION
4020  ".auth ON|OFF             Show authorizer callbacks",
4021#endif
4022  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
4023  "       --append            Use the appendvfs",
4024  "       --async             Write to FILE without journal and fsync()",
4025  ".bail on|off             Stop after hitting an error.  Default OFF",
4026  ".binary on|off           Turn binary output on or off.  Default OFF",
4027  ".cd DIRECTORY            Change the working directory to DIRECTORY",
4028  ".changes on|off          Show number of rows changed by SQL",
4029  ".check GLOB              Fail if output since .testcase does not match",
4030  ".clone NEWDB             Clone data into NEWDB from the existing database",
4031  ".connection [close] [#]  Open or close an auxiliary database connection",
4032  ".databases               List names and files of attached databases",
4033  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
4034  ".dbinfo ?DB?             Show status information about the database",
4035  ".dump ?OBJECTS?          Render database content as SQL",
4036  "   Options:",
4037  "     --data-only            Output only INSERT statements",
4038  "     --newlines             Allow unescaped newline characters in output",
4039  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
4040  "     --preserve-rowids      Include ROWID values in the output",
4041  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
4042  "   Additional LIKE patterns can be given in subsequent arguments",
4043  ".echo on|off             Turn command echo on or off",
4044  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
4045  "   Other Modes:",
4046#ifdef SQLITE_DEBUG
4047  "      test                  Show raw EXPLAIN QUERY PLAN output",
4048  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4049#endif
4050  "      trigger               Like \"full\" but also show trigger bytecode",
4051  ".excel                   Display the output of next command in spreadsheet",
4052  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
4053  ".exit ?CODE?             Exit this program with return-code CODE",
4054  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
4055  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
4056  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
4057  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
4058  "   --help                  Show CMD details",
4059  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
4060  ".headers on|off          Turn display of headers on or off",
4061  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
4062  ".import FILE TABLE       Import data from FILE into TABLE",
4063  "   Options:",
4064  "     --ascii               Use \\037 and \\036 as column and row separators",
4065  "     --csv                 Use , and \\n as column and row separators",
4066  "     --skip N              Skip the first N rows of input",
4067  "     -v                    \"Verbose\" - increase auxiliary output",
4068  "   Notes:",
4069  "     *  If TABLE does not exist, it is created.  The first row of input",
4070  "        determines the column names.",
4071  "     *  If neither --csv or --ascii are used, the input mode is derived",
4072  "        from the \".mode\" output mode",
4073  "     *  If FILE begins with \"|\" then it is a command that generates the",
4074  "        input text.",
4075#ifndef SQLITE_OMIT_TEST_CONTROL
4076  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
4077#endif
4078  ".indexes ?TABLE?         Show names of indexes",
4079  "                           If TABLE is specified, only show indexes for",
4080  "                           tables matching TABLE using the LIKE operator.",
4081#ifdef SQLITE_ENABLE_IOTRACE
4082  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
4083#endif
4084  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
4085  ".lint OPTIONS            Report potential schema issues.",
4086  "     Options:",
4087  "        fkey-indexes     Find missing foreign key indexes",
4088#ifndef SQLITE_OMIT_LOAD_EXTENSION
4089  ".load FILE ?ENTRY?       Load an extension library",
4090#endif
4091  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
4092  ".mode MODE ?TABLE?       Set output mode",
4093  "   MODE is one of:",
4094  "     ascii     Columns/rows delimited by 0x1F and 0x1E",
4095  "     box       Tables using unicode box-drawing characters",
4096  "     csv       Comma-separated values",
4097  "     column    Output in columns.  (See .width)",
4098  "     html      HTML <table> code",
4099  "     insert    SQL insert statements for TABLE",
4100  "     json      Results in a JSON array",
4101  "     line      One value per line",
4102  "     list      Values delimited by \"|\"",
4103  "     markdown  Markdown table format",
4104  "     quote     Escape answers as for SQL",
4105  "     table     ASCII-art table",
4106  "     tabs      Tab-separated values",
4107  "     tcl       TCL list elements",
4108  ".nonce STRING            Disable safe mode for one command if the nonce matches",
4109  ".nullvalue STRING        Use STRING in place of NULL values",
4110  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
4111  "     If FILE begins with '|' then open as a pipe",
4112  "       --bom  Put a UTF8 byte-order mark at the beginning",
4113  "       -e     Send output to the system text editor",
4114  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
4115  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
4116  "     Options:",
4117  "        --append        Use appendvfs to append database to the end of FILE",
4118#ifndef SQLITE_OMIT_DESERIALIZE
4119  "        --deserialize   Load into memory using sqlite3_deserialize()",
4120  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
4121  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
4122#endif
4123  "        --new           Initialize FILE to an empty database",
4124  "        --nofollow      Do not follow symbolic links",
4125  "        --readonly      Open FILE readonly",
4126  "        --zip           FILE is a ZIP archive",
4127  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
4128  "   If FILE begins with '|' then open it as a pipe.",
4129  "   Options:",
4130  "     --bom                 Prefix output with a UTF8 byte-order mark",
4131  "     -e                    Send output to the system text editor",
4132  "     -x                    Send output as CSV to a spreadsheet",
4133  ".parameter CMD ...       Manage SQL parameter bindings",
4134  "   clear                   Erase all bindings",
4135  "   init                    Initialize the TEMP table that holds bindings",
4136  "   list                    List the current parameter bindings",
4137  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
4138  "                           PARAMETER should start with one of: $ : @ ?",
4139  "   unset PARAMETER         Remove PARAMETER from the binding table",
4140  ".print STRING...         Print literal STRING",
4141#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4142  ".progress N              Invoke progress handler after every N opcodes",
4143  "   --limit N                 Interrupt after N progress callbacks",
4144  "   --once                    Do no more than one progress interrupt",
4145  "   --quiet|-q                No output except at interrupts",
4146  "   --reset                   Reset the count for each input and interrupt",
4147#endif
4148  ".prompt MAIN CONTINUE    Replace the standard prompts",
4149  ".quit                    Exit this program",
4150  ".read FILE               Read input from FILE or command output",
4151  "    If FILE begins with \"|\", it is a command that generates the input.",
4152#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4153  ".recover                 Recover as much data as possible from corrupt db.",
4154  "   --freelist-corrupt       Assume the freelist is corrupt",
4155  "   --recovery-db NAME       Store recovery metadata in database file NAME",
4156  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
4157  "   --no-rowids              Do not attempt to recover rowid values",
4158  "                            that are not also INTEGER PRIMARY KEYs",
4159#endif
4160  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
4161  ".save FILE               Write in-memory database into FILE",
4162  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
4163  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
4164  "   Options:",
4165  "      --indent             Try to pretty-print the schema",
4166  "      --nosys              Omit objects whose names start with \"sqlite_\"",
4167  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
4168  "    Options:",
4169  "       --init               Create a new SELFTEST table",
4170  "       -v                   Verbose output",
4171  ".separator COL ?ROW?     Change the column and row separators",
4172#if defined(SQLITE_ENABLE_SESSION)
4173  ".session ?NAME? CMD ...  Create or control sessions",
4174  "   Subcommands:",
4175  "     attach TABLE             Attach TABLE",
4176  "     changeset FILE           Write a changeset into FILE",
4177  "     close                    Close one session",
4178  "     enable ?BOOLEAN?         Set or query the enable bit",
4179  "     filter GLOB...           Reject tables matching GLOBs",
4180  "     indirect ?BOOLEAN?       Mark or query the indirect status",
4181  "     isempty                  Query whether the session is empty",
4182  "     list                     List currently open session names",
4183  "     open DB NAME             Open a new session on DB",
4184  "     patchset FILE            Write a patchset into FILE",
4185  "   If ?NAME? is omitted, the first defined session is used.",
4186#endif
4187  ".sha3sum ...             Compute a SHA3 hash of database content",
4188  "    Options:",
4189  "      --schema              Also hash the sqlite_schema table",
4190  "      --sha3-224            Use the sha3-224 algorithm",
4191  "      --sha3-256            Use the sha3-256 algorithm (default)",
4192  "      --sha3-384            Use the sha3-384 algorithm",
4193  "      --sha3-512            Use the sha3-512 algorithm",
4194  "    Any other argument is a LIKE pattern for tables to hash",
4195#ifndef SQLITE_NOHAVE_SYSTEM
4196  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
4197#endif
4198  ".show                    Show the current values for various settings",
4199  ".stats ?ARG?             Show stats or turn stats on or off",
4200  "   off                      Turn off automatic stat display",
4201  "   on                       Turn on automatic stat display",
4202  "   stmt                     Show statement stats",
4203  "   vmstep                   Show the virtual machine step count only",
4204#ifndef SQLITE_NOHAVE_SYSTEM
4205  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
4206#endif
4207  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
4208  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
4209  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
4210  "                           Run \".testctrl\" with no arguments for details",
4211  ".timeout MS              Try opening locked tables for MS milliseconds",
4212  ".timer on|off            Turn SQL timer on or off",
4213#ifndef SQLITE_OMIT_TRACE
4214  ".trace ?OPTIONS?         Output each SQL statement as it is run",
4215  "    FILE                    Send output to FILE",
4216  "    stdout                  Send output to stdout",
4217  "    stderr                  Send output to stderr",
4218  "    off                     Disable tracing",
4219  "    --expanded              Expand query parameters",
4220#ifdef SQLITE_ENABLE_NORMALIZE
4221  "    --normalized            Normal the SQL statements",
4222#endif
4223  "    --plain                 Show SQL as it is input",
4224  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
4225  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
4226  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
4227  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
4228#endif /* SQLITE_OMIT_TRACE */
4229#ifdef SQLITE_DEBUG
4230  ".unmodule NAME ...       Unregister virtual table modules",
4231  "    --allexcept             Unregister everything except those named",
4232#endif
4233  ".vfsinfo ?AUX?           Information about the top-level VFS",
4234  ".vfslist                 List all available VFSes",
4235  ".vfsname ?AUX?           Print the name of the VFS stack",
4236  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
4237  "     Negative values right-justify",
4238};
4239
4240/*
4241** Output help text.
4242**
4243** zPattern describes the set of commands for which help text is provided.
4244** If zPattern is NULL, then show all commands, but only give a one-line
4245** description of each.
4246**
4247** Return the number of matches.
4248*/
4249static int showHelp(FILE *out, const char *zPattern){
4250  int i = 0;
4251  int j = 0;
4252  int n = 0;
4253  char *zPat;
4254  if( zPattern==0
4255   || zPattern[0]=='0'
4256   || strcmp(zPattern,"-a")==0
4257   || strcmp(zPattern,"-all")==0
4258   || strcmp(zPattern,"--all")==0
4259  ){
4260    /* Show all commands, but only one line per command */
4261    if( zPattern==0 ) zPattern = "";
4262    for(i=0; i<ArraySize(azHelp); i++){
4263      if( azHelp[i][0]=='.' || zPattern[0] ){
4264        utf8_printf(out, "%s\n", azHelp[i]);
4265        n++;
4266      }
4267    }
4268  }else{
4269    /* Look for commands that for which zPattern is an exact prefix */
4270    zPat = sqlite3_mprintf(".%s*", zPattern);
4271    shell_check_oom(zPat);
4272    for(i=0; i<ArraySize(azHelp); i++){
4273      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4274        utf8_printf(out, "%s\n", azHelp[i]);
4275        j = i+1;
4276        n++;
4277      }
4278    }
4279    sqlite3_free(zPat);
4280    if( n ){
4281      if( n==1 ){
4282        /* when zPattern is a prefix of exactly one command, then include the
4283        ** details of that command, which should begin at offset j */
4284        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4285          utf8_printf(out, "%s\n", azHelp[j]);
4286          j++;
4287        }
4288      }
4289      return n;
4290    }
4291    /* Look for commands that contain zPattern anywhere.  Show the complete
4292    ** text of all commands that match. */
4293    zPat = sqlite3_mprintf("%%%s%%", zPattern);
4294    shell_check_oom(zPat);
4295    for(i=0; i<ArraySize(azHelp); i++){
4296      if( azHelp[i][0]=='.' ) j = i;
4297      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4298        utf8_printf(out, "%s\n", azHelp[j]);
4299        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4300          j++;
4301          utf8_printf(out, "%s\n", azHelp[j]);
4302        }
4303        i = j;
4304        n++;
4305      }
4306    }
4307    sqlite3_free(zPat);
4308  }
4309  return n;
4310}
4311
4312/* Forward reference */
4313static int process_input(ShellState *p);
4314
4315/*
4316** Read the content of file zName into memory obtained from sqlite3_malloc64()
4317** and return a pointer to the buffer. The caller is responsible for freeing
4318** the memory.
4319**
4320** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4321** read.
4322**
4323** For convenience, a nul-terminator byte is always appended to the data read
4324** from the file before the buffer is returned. This byte is not included in
4325** the final value of (*pnByte), if applicable.
4326**
4327** NULL is returned if any error is encountered. The final value of *pnByte
4328** is undefined in this case.
4329*/
4330static char *readFile(const char *zName, int *pnByte){
4331  FILE *in = fopen(zName, "rb");
4332  long nIn;
4333  size_t nRead;
4334  char *pBuf;
4335  if( in==0 ) return 0;
4336  fseek(in, 0, SEEK_END);
4337  nIn = ftell(in);
4338  rewind(in);
4339  pBuf = sqlite3_malloc64( nIn+1 );
4340  if( pBuf==0 ){ fclose(in); return 0; }
4341  nRead = fread(pBuf, nIn, 1, in);
4342  fclose(in);
4343  if( nRead!=1 ){
4344    sqlite3_free(pBuf);
4345    return 0;
4346  }
4347  pBuf[nIn] = 0;
4348  if( pnByte ) *pnByte = nIn;
4349  return pBuf;
4350}
4351
4352#if defined(SQLITE_ENABLE_SESSION)
4353/*
4354** Close a single OpenSession object and release all of its associated
4355** resources.
4356*/
4357static void session_close(OpenSession *pSession){
4358  int i;
4359  sqlite3session_delete(pSession->p);
4360  sqlite3_free(pSession->zName);
4361  for(i=0; i<pSession->nFilter; i++){
4362    sqlite3_free(pSession->azFilter[i]);
4363  }
4364  sqlite3_free(pSession->azFilter);
4365  memset(pSession, 0, sizeof(OpenSession));
4366}
4367#endif
4368
4369/*
4370** Close all OpenSession objects and release all associated resources.
4371*/
4372#if defined(SQLITE_ENABLE_SESSION)
4373static void session_close_all(ShellState *p, int i){
4374  int j;
4375  struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4376  for(j=0; j<pAuxDb->nSession; j++){
4377    session_close(&pAuxDb->aSession[j]);
4378  }
4379  pAuxDb->nSession = 0;
4380}
4381#else
4382# define session_close_all(X,Y)
4383#endif
4384
4385/*
4386** Implementation of the xFilter function for an open session.  Omit
4387** any tables named by ".session filter" but let all other table through.
4388*/
4389#if defined(SQLITE_ENABLE_SESSION)
4390static int session_filter(void *pCtx, const char *zTab){
4391  OpenSession *pSession = (OpenSession*)pCtx;
4392  int i;
4393  for(i=0; i<pSession->nFilter; i++){
4394    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4395  }
4396  return 1;
4397}
4398#endif
4399
4400/*
4401** Try to deduce the type of file for zName based on its content.  Return
4402** one of the SHELL_OPEN_* constants.
4403**
4404** If the file does not exist or is empty but its name looks like a ZIP
4405** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4406** Otherwise, assume an ordinary database regardless of the filename if
4407** the type cannot be determined from content.
4408*/
4409int deduceDatabaseType(const char *zName, int dfltZip){
4410  FILE *f = fopen(zName, "rb");
4411  size_t n;
4412  int rc = SHELL_OPEN_UNSPEC;
4413  char zBuf[100];
4414  if( f==0 ){
4415    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4416       return SHELL_OPEN_ZIPFILE;
4417    }else{
4418       return SHELL_OPEN_NORMAL;
4419    }
4420  }
4421  n = fread(zBuf, 16, 1, f);
4422  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4423    fclose(f);
4424    return SHELL_OPEN_NORMAL;
4425  }
4426  fseek(f, -25, SEEK_END);
4427  n = fread(zBuf, 25, 1, f);
4428  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4429    rc = SHELL_OPEN_APPENDVFS;
4430  }else{
4431    fseek(f, -22, SEEK_END);
4432    n = fread(zBuf, 22, 1, f);
4433    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4434       && zBuf[3]==0x06 ){
4435      rc = SHELL_OPEN_ZIPFILE;
4436    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4437      rc = SHELL_OPEN_ZIPFILE;
4438    }
4439  }
4440  fclose(f);
4441  return rc;
4442}
4443
4444#ifndef SQLITE_OMIT_DESERIALIZE
4445/*
4446** Reconstruct an in-memory database using the output from the "dbtotxt"
4447** program.  Read content from the file in p->aAuxDb[].zDbFilename.
4448** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4449*/
4450static unsigned char *readHexDb(ShellState *p, int *pnData){
4451  unsigned char *a = 0;
4452  int nLine;
4453  int n = 0;
4454  int pgsz = 0;
4455  int iOffset = 0;
4456  int j, k;
4457  int rc;
4458  FILE *in;
4459  const char *zDbFilename = p->pAuxDb->zDbFilename;
4460  unsigned int x[16];
4461  char zLine[1000];
4462  if( zDbFilename ){
4463    in = fopen(zDbFilename, "r");
4464    if( in==0 ){
4465      utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4466      return 0;
4467    }
4468    nLine = 0;
4469  }else{
4470    in = p->in;
4471    nLine = p->lineno;
4472    if( in==0 ) in = stdin;
4473  }
4474  *pnData = 0;
4475  nLine++;
4476  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4477  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4478  if( rc!=2 ) goto readHexDb_error;
4479  if( n<0 ) goto readHexDb_error;
4480  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4481  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
4482  a = sqlite3_malloc( n ? n : 1 );
4483  shell_check_oom(a);
4484  memset(a, 0, n);
4485  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4486    utf8_printf(stderr, "invalid pagesize\n");
4487    goto readHexDb_error;
4488  }
4489  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4490    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4491    if( rc==2 ){
4492      iOffset = k;
4493      continue;
4494    }
4495    if( strncmp(zLine, "| end ", 6)==0 ){
4496      break;
4497    }
4498    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4499                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4500                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4501    if( rc==17 ){
4502      k = iOffset+j;
4503      if( k+16<=n && k>=0 ){
4504        int ii;
4505        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4506      }
4507    }
4508  }
4509  *pnData = n;
4510  if( in!=p->in ){
4511    fclose(in);
4512  }else{
4513    p->lineno = nLine;
4514  }
4515  return a;
4516
4517readHexDb_error:
4518  if( in!=p->in ){
4519    fclose(in);
4520  }else{
4521    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4522      nLine++;
4523      if(strncmp(zLine, "| end ", 6)==0 ) break;
4524    }
4525    p->lineno = nLine;
4526  }
4527  sqlite3_free(a);
4528  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4529  return 0;
4530}
4531#endif /* SQLITE_OMIT_DESERIALIZE */
4532
4533/*
4534** Scalar function "shell_int32". The first argument to this function
4535** must be a blob. The second a non-negative integer. This function
4536** reads and returns a 32-bit big-endian integer from byte
4537** offset (4*<arg2>) of the blob.
4538*/
4539static void shellInt32(
4540  sqlite3_context *context,
4541  int argc,
4542  sqlite3_value **argv
4543){
4544  const unsigned char *pBlob;
4545  int nBlob;
4546  int iInt;
4547
4548  UNUSED_PARAMETER(argc);
4549  nBlob = sqlite3_value_bytes(argv[0]);
4550  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4551  iInt = sqlite3_value_int(argv[1]);
4552
4553  if( iInt>=0 && (iInt+1)*4<=nBlob ){
4554    const unsigned char *a = &pBlob[iInt*4];
4555    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4556                       + ((sqlite3_int64)a[1]<<16)
4557                       + ((sqlite3_int64)a[2]<< 8)
4558                       + ((sqlite3_int64)a[3]<< 0);
4559    sqlite3_result_int64(context, iVal);
4560  }
4561}
4562
4563/*
4564** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4565** using "..." with internal double-quote characters doubled.
4566*/
4567static void shellIdQuote(
4568  sqlite3_context *context,
4569  int argc,
4570  sqlite3_value **argv
4571){
4572  const char *zName = (const char*)sqlite3_value_text(argv[0]);
4573  UNUSED_PARAMETER(argc);
4574  if( zName ){
4575    char *z = sqlite3_mprintf("\"%w\"", zName);
4576    sqlite3_result_text(context, z, -1, sqlite3_free);
4577  }
4578}
4579
4580/*
4581** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4582*/
4583static void shellUSleepFunc(
4584  sqlite3_context *context,
4585  int argcUnused,
4586  sqlite3_value **argv
4587){
4588  int sleep = sqlite3_value_int(argv[0]);
4589  (void)argcUnused;
4590  sqlite3_sleep(sleep/1000);
4591  sqlite3_result_int(context, sleep);
4592}
4593
4594/*
4595** Scalar function "shell_escape_crnl" used by the .recover command.
4596** The argument passed to this function is the output of built-in
4597** function quote(). If the first character of the input is "'",
4598** indicating that the value passed to quote() was a text value,
4599** then this function searches the input for "\n" and "\r" characters
4600** and adds a wrapper similar to the following:
4601**
4602**   replace(replace(<input>, '\n', char(10), '\r', char(13));
4603**
4604** Or, if the first character of the input is not "'", then a copy
4605** of the input is returned.
4606*/
4607static void shellEscapeCrnl(
4608  sqlite3_context *context,
4609  int argc,
4610  sqlite3_value **argv
4611){
4612  const char *zText = (const char*)sqlite3_value_text(argv[0]);
4613  UNUSED_PARAMETER(argc);
4614  if( zText && zText[0]=='\'' ){
4615    int nText = sqlite3_value_bytes(argv[0]);
4616    int i;
4617    char zBuf1[20];
4618    char zBuf2[20];
4619    const char *zNL = 0;
4620    const char *zCR = 0;
4621    int nCR = 0;
4622    int nNL = 0;
4623
4624    for(i=0; zText[i]; i++){
4625      if( zNL==0 && zText[i]=='\n' ){
4626        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4627        nNL = (int)strlen(zNL);
4628      }
4629      if( zCR==0 && zText[i]=='\r' ){
4630        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4631        nCR = (int)strlen(zCR);
4632      }
4633    }
4634
4635    if( zNL || zCR ){
4636      int iOut = 0;
4637      i64 nMax = (nNL > nCR) ? nNL : nCR;
4638      i64 nAlloc = nMax * nText + (nMax+64)*2;
4639      char *zOut = (char*)sqlite3_malloc64(nAlloc);
4640      if( zOut==0 ){
4641        sqlite3_result_error_nomem(context);
4642        return;
4643      }
4644
4645      if( zNL && zCR ){
4646        memcpy(&zOut[iOut], "replace(replace(", 16);
4647        iOut += 16;
4648      }else{
4649        memcpy(&zOut[iOut], "replace(", 8);
4650        iOut += 8;
4651      }
4652      for(i=0; zText[i]; i++){
4653        if( zText[i]=='\n' ){
4654          memcpy(&zOut[iOut], zNL, nNL);
4655          iOut += nNL;
4656        }else if( zText[i]=='\r' ){
4657          memcpy(&zOut[iOut], zCR, nCR);
4658          iOut += nCR;
4659        }else{
4660          zOut[iOut] = zText[i];
4661          iOut++;
4662        }
4663      }
4664
4665      if( zNL ){
4666        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4667        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
4668        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
4669      }
4670      if( zCR ){
4671        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4672        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
4673        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
4674      }
4675
4676      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
4677      sqlite3_free(zOut);
4678      return;
4679    }
4680  }
4681
4682  sqlite3_result_value(context, argv[0]);
4683}
4684
4685/* Flags for open_db().
4686**
4687** The default behavior of open_db() is to exit(1) if the database fails to
4688** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
4689** but still returns without calling exit.
4690**
4691** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
4692** ZIP archive if the file does not exist or is empty and its name matches
4693** the *.zip pattern.
4694*/
4695#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
4696#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
4697
4698/*
4699** Make sure the database is open.  If it is not, then open it.  If
4700** the database fails to open, print an error message and exit.
4701*/
4702static void open_db(ShellState *p, int openFlags){
4703  if( p->db==0 ){
4704    const char *zDbFilename = p->pAuxDb->zDbFilename;
4705    if( p->openMode==SHELL_OPEN_UNSPEC ){
4706      if( zDbFilename==0 || zDbFilename[0]==0 ){
4707        p->openMode = SHELL_OPEN_NORMAL;
4708      }else{
4709        p->openMode = (u8)deduceDatabaseType(zDbFilename,
4710                             (openFlags & OPEN_DB_ZIPFILE)!=0);
4711      }
4712    }
4713    switch( p->openMode ){
4714      case SHELL_OPEN_APPENDVFS: {
4715        sqlite3_open_v2(zDbFilename, &p->db,
4716           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
4717        break;
4718      }
4719      case SHELL_OPEN_HEXDB:
4720      case SHELL_OPEN_DESERIALIZE: {
4721        sqlite3_open(0, &p->db);
4722        break;
4723      }
4724      case SHELL_OPEN_ZIPFILE: {
4725        sqlite3_open(":memory:", &p->db);
4726        break;
4727      }
4728      case SHELL_OPEN_READONLY: {
4729        sqlite3_open_v2(zDbFilename, &p->db,
4730            SQLITE_OPEN_READONLY|p->openFlags, 0);
4731        break;
4732      }
4733      case SHELL_OPEN_UNSPEC:
4734      case SHELL_OPEN_NORMAL: {
4735        sqlite3_open_v2(zDbFilename, &p->db,
4736           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
4737        break;
4738      }
4739    }
4740    globalDb = p->db;
4741    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4742      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4743          zDbFilename, sqlite3_errmsg(p->db));
4744      if( openFlags & OPEN_DB_KEEPALIVE ){
4745        sqlite3_open(":memory:", &p->db);
4746        return;
4747      }
4748      exit(1);
4749    }
4750#ifndef SQLITE_OMIT_LOAD_EXTENSION
4751    sqlite3_enable_load_extension(p->db, 1);
4752#endif
4753    sqlite3_fileio_init(p->db, 0, 0);
4754    sqlite3_shathree_init(p->db, 0, 0);
4755    sqlite3_completion_init(p->db, 0, 0);
4756    sqlite3_uint_init(p->db, 0, 0);
4757    sqlite3_decimal_init(p->db, 0, 0);
4758    sqlite3_regexp_init(p->db, 0, 0);
4759    sqlite3_ieee_init(p->db, 0, 0);
4760    sqlite3_series_init(p->db, 0, 0);
4761#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4762    sqlite3_dbdata_init(p->db, 0, 0);
4763#endif
4764#ifdef SQLITE_HAVE_ZLIB
4765    sqlite3_zipfile_init(p->db, 0, 0);
4766    sqlite3_sqlar_init(p->db, 0, 0);
4767#endif
4768    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
4769                            shellAddSchemaName, 0, 0);
4770    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
4771                            shellModuleSchema, 0, 0);
4772    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
4773                            shellPutsFunc, 0, 0);
4774    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
4775                            shellEscapeCrnl, 0, 0);
4776    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
4777                            shellInt32, 0, 0);
4778    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
4779                            shellIdQuote, 0, 0);
4780    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
4781                            shellUSleepFunc, 0, 0);
4782#ifndef SQLITE_NOHAVE_SYSTEM
4783    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
4784                            editFunc, 0, 0);
4785    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
4786                            editFunc, 0, 0);
4787#endif
4788    if( p->openMode==SHELL_OPEN_ZIPFILE ){
4789      char *zSql = sqlite3_mprintf(
4790         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
4791      shell_check_oom(zSql);
4792      sqlite3_exec(p->db, zSql, 0, 0, 0);
4793      sqlite3_free(zSql);
4794    }
4795#ifndef SQLITE_OMIT_DESERIALIZE
4796    else
4797    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
4798      int rc;
4799      int nData = 0;
4800      unsigned char *aData;
4801      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
4802        aData = (unsigned char*)readFile(zDbFilename, &nData);
4803      }else{
4804        aData = readHexDb(p, &nData);
4805        if( aData==0 ){
4806          return;
4807        }
4808      }
4809      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
4810                   SQLITE_DESERIALIZE_RESIZEABLE |
4811                   SQLITE_DESERIALIZE_FREEONCLOSE);
4812      if( rc ){
4813        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
4814      }
4815      if( p->szMax>0 ){
4816        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
4817      }
4818    }
4819#endif
4820  }
4821  if( p->bSafeModePersist && p->db!=0 ){
4822    sqlite3_set_authorizer(p->db, safeModeAuth, p);
4823  }
4824}
4825
4826/*
4827** Attempt to close the databaes connection.  Report errors.
4828*/
4829void close_db(sqlite3 *db){
4830  int rc = sqlite3_close(db);
4831  if( rc ){
4832    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
4833        rc, sqlite3_errmsg(db));
4834  }
4835}
4836
4837#if HAVE_READLINE || HAVE_EDITLINE
4838/*
4839** Readline completion callbacks
4840*/
4841static char *readline_completion_generator(const char *text, int state){
4842  static sqlite3_stmt *pStmt = 0;
4843  char *zRet;
4844  if( state==0 ){
4845    char *zSql;
4846    sqlite3_finalize(pStmt);
4847    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4848                           "  FROM completion(%Q) ORDER BY 1", text);
4849    shell_check_oom(zSql);
4850    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4851    sqlite3_free(zSql);
4852  }
4853  if( sqlite3_step(pStmt)==SQLITE_ROW ){
4854    const char *z = (const char*)sqlite3_column_text(pStmt,0);
4855    zRet = z ? strdup(z) : 0;
4856  }else{
4857    sqlite3_finalize(pStmt);
4858    pStmt = 0;
4859    zRet = 0;
4860  }
4861  return zRet;
4862}
4863static char **readline_completion(const char *zText, int iStart, int iEnd){
4864  rl_attempted_completion_over = 1;
4865  return rl_completion_matches(zText, readline_completion_generator);
4866}
4867
4868#elif HAVE_LINENOISE
4869/*
4870** Linenoise completion callback
4871*/
4872static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
4873  int nLine = strlen30(zLine);
4874  int i, iStart;
4875  sqlite3_stmt *pStmt = 0;
4876  char *zSql;
4877  char zBuf[1000];
4878
4879  if( nLine>sizeof(zBuf)-30 ) return;
4880  if( zLine[0]=='.' || zLine[0]=='#') return;
4881  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
4882  if( i==nLine-1 ) return;
4883  iStart = i+1;
4884  memcpy(zBuf, zLine, iStart);
4885  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4886                         "  FROM completion(%Q,%Q) ORDER BY 1",
4887                         &zLine[iStart], zLine);
4888  shell_check_oom(zSql);
4889  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4890  sqlite3_free(zSql);
4891  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
4892  while( sqlite3_step(pStmt)==SQLITE_ROW ){
4893    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
4894    int nCompletion = sqlite3_column_bytes(pStmt, 0);
4895    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
4896      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
4897      linenoiseAddCompletion(lc, zBuf);
4898    }
4899  }
4900  sqlite3_finalize(pStmt);
4901}
4902#endif
4903
4904/*
4905** Do C-language style dequoting.
4906**
4907**    \a    -> alarm
4908**    \b    -> backspace
4909**    \t    -> tab
4910**    \n    -> newline
4911**    \v    -> vertical tab
4912**    \f    -> form feed
4913**    \r    -> carriage return
4914**    \s    -> space
4915**    \"    -> "
4916**    \'    -> '
4917**    \\    -> backslash
4918**    \NNN  -> ascii character NNN in octal
4919*/
4920static void resolve_backslashes(char *z){
4921  int i, j;
4922  char c;
4923  while( *z && *z!='\\' ) z++;
4924  for(i=j=0; (c = z[i])!=0; i++, j++){
4925    if( c=='\\' && z[i+1]!=0 ){
4926      c = z[++i];
4927      if( c=='a' ){
4928        c = '\a';
4929      }else if( c=='b' ){
4930        c = '\b';
4931      }else if( c=='t' ){
4932        c = '\t';
4933      }else if( c=='n' ){
4934        c = '\n';
4935      }else if( c=='v' ){
4936        c = '\v';
4937      }else if( c=='f' ){
4938        c = '\f';
4939      }else if( c=='r' ){
4940        c = '\r';
4941      }else if( c=='"' ){
4942        c = '"';
4943      }else if( c=='\'' ){
4944        c = '\'';
4945      }else if( c=='\\' ){
4946        c = '\\';
4947      }else if( c>='0' && c<='7' ){
4948        c -= '0';
4949        if( z[i+1]>='0' && z[i+1]<='7' ){
4950          i++;
4951          c = (c<<3) + z[i] - '0';
4952          if( z[i+1]>='0' && z[i+1]<='7' ){
4953            i++;
4954            c = (c<<3) + z[i] - '0';
4955          }
4956        }
4957      }
4958    }
4959    z[j] = c;
4960  }
4961  if( j<i ) z[j] = 0;
4962}
4963
4964/*
4965** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
4966** for TRUE and FALSE.  Return the integer value if appropriate.
4967*/
4968static int booleanValue(const char *zArg){
4969  int i;
4970  if( zArg[0]=='0' && zArg[1]=='x' ){
4971    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
4972  }else{
4973    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
4974  }
4975  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
4976  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
4977    return 1;
4978  }
4979  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
4980    return 0;
4981  }
4982  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
4983          zArg);
4984  return 0;
4985}
4986
4987/*
4988** Set or clear a shell flag according to a boolean value.
4989*/
4990static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
4991  if( booleanValue(zArg) ){
4992    ShellSetFlag(p, mFlag);
4993  }else{
4994    ShellClearFlag(p, mFlag);
4995  }
4996}
4997
4998/*
4999** Close an output file, assuming it is not stderr or stdout
5000*/
5001static void output_file_close(FILE *f){
5002  if( f && f!=stdout && f!=stderr ) fclose(f);
5003}
5004
5005/*
5006** Try to open an output file.   The names "stdout" and "stderr" are
5007** recognized and do the right thing.  NULL is returned if the output
5008** filename is "off".
5009*/
5010static FILE *output_file_open(const char *zFile, int bTextMode){
5011  FILE *f;
5012  if( strcmp(zFile,"stdout")==0 ){
5013    f = stdout;
5014  }else if( strcmp(zFile, "stderr")==0 ){
5015    f = stderr;
5016  }else if( strcmp(zFile, "off")==0 ){
5017    f = 0;
5018  }else{
5019    f = fopen(zFile, bTextMode ? "w" : "wb");
5020    if( f==0 ){
5021      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5022    }
5023  }
5024  return f;
5025}
5026
5027#ifndef SQLITE_OMIT_TRACE
5028/*
5029** A routine for handling output from sqlite3_trace().
5030*/
5031static int sql_trace_callback(
5032  unsigned mType,         /* The trace type */
5033  void *pArg,             /* The ShellState pointer */
5034  void *pP,               /* Usually a pointer to sqlite_stmt */
5035  void *pX                /* Auxiliary output */
5036){
5037  ShellState *p = (ShellState*)pArg;
5038  sqlite3_stmt *pStmt;
5039  const char *zSql;
5040  int nSql;
5041  if( p->traceOut==0 ) return 0;
5042  if( mType==SQLITE_TRACE_CLOSE ){
5043    utf8_printf(p->traceOut, "-- closing database connection\n");
5044    return 0;
5045  }
5046  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5047    zSql = (const char*)pX;
5048  }else{
5049    pStmt = (sqlite3_stmt*)pP;
5050    switch( p->eTraceType ){
5051      case SHELL_TRACE_EXPANDED: {
5052        zSql = sqlite3_expanded_sql(pStmt);
5053        break;
5054      }
5055#ifdef SQLITE_ENABLE_NORMALIZE
5056      case SHELL_TRACE_NORMALIZED: {
5057        zSql = sqlite3_normalized_sql(pStmt);
5058        break;
5059      }
5060#endif
5061      default: {
5062        zSql = sqlite3_sql(pStmt);
5063        break;
5064      }
5065    }
5066  }
5067  if( zSql==0 ) return 0;
5068  nSql = strlen30(zSql);
5069  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5070  switch( mType ){
5071    case SQLITE_TRACE_ROW:
5072    case SQLITE_TRACE_STMT: {
5073      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5074      break;
5075    }
5076    case SQLITE_TRACE_PROFILE: {
5077      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5078      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5079      break;
5080    }
5081  }
5082  return 0;
5083}
5084#endif
5085
5086/*
5087** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5088** a useful spot to set a debugger breakpoint.
5089*/
5090static void test_breakpoint(void){
5091  static int nCall = 0;
5092  nCall++;
5093}
5094
5095/*
5096** An object used to read a CSV and other files for import.
5097*/
5098typedef struct ImportCtx ImportCtx;
5099struct ImportCtx {
5100  const char *zFile;  /* Name of the input file */
5101  FILE *in;           /* Read the CSV text from this input stream */
5102  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5103  char *z;            /* Accumulated text for a field */
5104  int n;              /* Number of bytes in z */
5105  int nAlloc;         /* Space allocated for z[] */
5106  int nLine;          /* Current line number */
5107  int nRow;           /* Number of rows imported */
5108  int nErr;           /* Number of errors encountered */
5109  int bNotFirst;      /* True if one or more bytes already read */
5110  int cTerm;          /* Character that terminated the most recent field */
5111  int cColSep;        /* The column separator character.  (Usually ",") */
5112  int cRowSep;        /* The row separator character.  (Usually "\n") */
5113};
5114
5115/* Clean up resourced used by an ImportCtx */
5116static void import_cleanup(ImportCtx *p){
5117  if( p->in!=0 && p->xCloser!=0 ){
5118    p->xCloser(p->in);
5119    p->in = 0;
5120  }
5121  sqlite3_free(p->z);
5122  p->z = 0;
5123}
5124
5125/* Append a single byte to z[] */
5126static void import_append_char(ImportCtx *p, int c){
5127  if( p->n+1>=p->nAlloc ){
5128    p->nAlloc += p->nAlloc + 100;
5129    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5130    shell_check_oom(p->z);
5131  }
5132  p->z[p->n++] = (char)c;
5133}
5134
5135/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5136** with the option of having a separator other than ",".
5137**
5138**   +  Input comes from p->in.
5139**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5140**      from sqlite3_malloc64().
5141**   +  Use p->cSep as the column separator.  The default is ",".
5142**   +  Use p->rSep as the row separator.  The default is "\n".
5143**   +  Keep track of the line number in p->nLine.
5144**   +  Store the character that terminates the field in p->cTerm.  Store
5145**      EOF on end-of-file.
5146**   +  Report syntax errors on stderr
5147*/
5148static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5149  int c;
5150  int cSep = p->cColSep;
5151  int rSep = p->cRowSep;
5152  p->n = 0;
5153  c = fgetc(p->in);
5154  if( c==EOF || seenInterrupt ){
5155    p->cTerm = EOF;
5156    return 0;
5157  }
5158  if( c=='"' ){
5159    int pc, ppc;
5160    int startLine = p->nLine;
5161    int cQuote = c;
5162    pc = ppc = 0;
5163    while( 1 ){
5164      c = fgetc(p->in);
5165      if( c==rSep ) p->nLine++;
5166      if( c==cQuote ){
5167        if( pc==cQuote ){
5168          pc = 0;
5169          continue;
5170        }
5171      }
5172      if( (c==cSep && pc==cQuote)
5173       || (c==rSep && pc==cQuote)
5174       || (c==rSep && pc=='\r' && ppc==cQuote)
5175       || (c==EOF && pc==cQuote)
5176      ){
5177        do{ p->n--; }while( p->z[p->n]!=cQuote );
5178        p->cTerm = c;
5179        break;
5180      }
5181      if( pc==cQuote && c!='\r' ){
5182        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5183                p->zFile, p->nLine, cQuote);
5184      }
5185      if( c==EOF ){
5186        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5187                p->zFile, startLine, cQuote);
5188        p->cTerm = c;
5189        break;
5190      }
5191      import_append_char(p, c);
5192      ppc = pc;
5193      pc = c;
5194    }
5195  }else{
5196    /* If this is the first field being parsed and it begins with the
5197    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5198    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5199      import_append_char(p, c);
5200      c = fgetc(p->in);
5201      if( (c&0xff)==0xbb ){
5202        import_append_char(p, c);
5203        c = fgetc(p->in);
5204        if( (c&0xff)==0xbf ){
5205          p->bNotFirst = 1;
5206          p->n = 0;
5207          return csv_read_one_field(p);
5208        }
5209      }
5210    }
5211    while( c!=EOF && c!=cSep && c!=rSep ){
5212      import_append_char(p, c);
5213      c = fgetc(p->in);
5214    }
5215    if( c==rSep ){
5216      p->nLine++;
5217      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5218    }
5219    p->cTerm = c;
5220  }
5221  if( p->z ) p->z[p->n] = 0;
5222  p->bNotFirst = 1;
5223  return p->z;
5224}
5225
5226/* Read a single field of ASCII delimited text.
5227**
5228**   +  Input comes from p->in.
5229**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5230**      from sqlite3_malloc64().
5231**   +  Use p->cSep as the column separator.  The default is "\x1F".
5232**   +  Use p->rSep as the row separator.  The default is "\x1E".
5233**   +  Keep track of the row number in p->nLine.
5234**   +  Store the character that terminates the field in p->cTerm.  Store
5235**      EOF on end-of-file.
5236**   +  Report syntax errors on stderr
5237*/
5238static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5239  int c;
5240  int cSep = p->cColSep;
5241  int rSep = p->cRowSep;
5242  p->n = 0;
5243  c = fgetc(p->in);
5244  if( c==EOF || seenInterrupt ){
5245    p->cTerm = EOF;
5246    return 0;
5247  }
5248  while( c!=EOF && c!=cSep && c!=rSep ){
5249    import_append_char(p, c);
5250    c = fgetc(p->in);
5251  }
5252  if( c==rSep ){
5253    p->nLine++;
5254  }
5255  p->cTerm = c;
5256  if( p->z ) p->z[p->n] = 0;
5257  return p->z;
5258}
5259
5260/*
5261** Try to transfer data for table zTable.  If an error is seen while
5262** moving forward, try to go backwards.  The backwards movement won't
5263** work for WITHOUT ROWID tables.
5264*/
5265static void tryToCloneData(
5266  ShellState *p,
5267  sqlite3 *newDb,
5268  const char *zTable
5269){
5270  sqlite3_stmt *pQuery = 0;
5271  sqlite3_stmt *pInsert = 0;
5272  char *zQuery = 0;
5273  char *zInsert = 0;
5274  int rc;
5275  int i, j, n;
5276  int nTable = strlen30(zTable);
5277  int k = 0;
5278  int cnt = 0;
5279  const int spinRate = 10000;
5280
5281  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5282  shell_check_oom(zQuery);
5283  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5284  if( rc ){
5285    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5286            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5287            zQuery);
5288    goto end_data_xfer;
5289  }
5290  n = sqlite3_column_count(pQuery);
5291  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5292  shell_check_oom(zInsert);
5293  sqlite3_snprintf(200+nTable,zInsert,
5294                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5295  i = strlen30(zInsert);
5296  for(j=1; j<n; j++){
5297    memcpy(zInsert+i, ",?", 2);
5298    i += 2;
5299  }
5300  memcpy(zInsert+i, ");", 3);
5301  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5302  if( rc ){
5303    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5304            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5305            zQuery);
5306    goto end_data_xfer;
5307  }
5308  for(k=0; k<2; k++){
5309    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5310      for(i=0; i<n; i++){
5311        switch( sqlite3_column_type(pQuery, i) ){
5312          case SQLITE_NULL: {
5313            sqlite3_bind_null(pInsert, i+1);
5314            break;
5315          }
5316          case SQLITE_INTEGER: {
5317            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5318            break;
5319          }
5320          case SQLITE_FLOAT: {
5321            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5322            break;
5323          }
5324          case SQLITE_TEXT: {
5325            sqlite3_bind_text(pInsert, i+1,
5326                             (const char*)sqlite3_column_text(pQuery,i),
5327                             -1, SQLITE_STATIC);
5328            break;
5329          }
5330          case SQLITE_BLOB: {
5331            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5332                                            sqlite3_column_bytes(pQuery,i),
5333                                            SQLITE_STATIC);
5334            break;
5335          }
5336        }
5337      } /* End for */
5338      rc = sqlite3_step(pInsert);
5339      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5340        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5341                        sqlite3_errmsg(newDb));
5342      }
5343      sqlite3_reset(pInsert);
5344      cnt++;
5345      if( (cnt%spinRate)==0 ){
5346        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5347        fflush(stdout);
5348      }
5349    } /* End while */
5350    if( rc==SQLITE_DONE ) break;
5351    sqlite3_finalize(pQuery);
5352    sqlite3_free(zQuery);
5353    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5354                             zTable);
5355    shell_check_oom(zQuery);
5356    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5357    if( rc ){
5358      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5359      break;
5360    }
5361  } /* End for(k=0...) */
5362
5363end_data_xfer:
5364  sqlite3_finalize(pQuery);
5365  sqlite3_finalize(pInsert);
5366  sqlite3_free(zQuery);
5367  sqlite3_free(zInsert);
5368}
5369
5370
5371/*
5372** Try to transfer all rows of the schema that match zWhere.  For
5373** each row, invoke xForEach() on the object defined by that row.
5374** If an error is encountered while moving forward through the
5375** sqlite_schema table, try again moving backwards.
5376*/
5377static void tryToCloneSchema(
5378  ShellState *p,
5379  sqlite3 *newDb,
5380  const char *zWhere,
5381  void (*xForEach)(ShellState*,sqlite3*,const char*)
5382){
5383  sqlite3_stmt *pQuery = 0;
5384  char *zQuery = 0;
5385  int rc;
5386  const unsigned char *zName;
5387  const unsigned char *zSql;
5388  char *zErrMsg = 0;
5389
5390  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5391                           " WHERE %s", zWhere);
5392  shell_check_oom(zQuery);
5393  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5394  if( rc ){
5395    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5396                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5397                    zQuery);
5398    goto end_schema_xfer;
5399  }
5400  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5401    zName = sqlite3_column_text(pQuery, 0);
5402    zSql = sqlite3_column_text(pQuery, 1);
5403    if( zName==0 || zSql==0 ) continue;
5404    printf("%s... ", zName); fflush(stdout);
5405    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5406    if( zErrMsg ){
5407      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5408      sqlite3_free(zErrMsg);
5409      zErrMsg = 0;
5410    }
5411    if( xForEach ){
5412      xForEach(p, newDb, (const char*)zName);
5413    }
5414    printf("done\n");
5415  }
5416  if( rc!=SQLITE_DONE ){
5417    sqlite3_finalize(pQuery);
5418    sqlite3_free(zQuery);
5419    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5420                             " WHERE %s ORDER BY rowid DESC", zWhere);
5421    shell_check_oom(zQuery);
5422    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5423    if( rc ){
5424      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5425                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5426                      zQuery);
5427      goto end_schema_xfer;
5428    }
5429    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5430      zName = sqlite3_column_text(pQuery, 0);
5431      zSql = sqlite3_column_text(pQuery, 1);
5432      if( zName==0 || zSql==0 ) continue;
5433      printf("%s... ", zName); fflush(stdout);
5434      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5435      if( zErrMsg ){
5436        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5437        sqlite3_free(zErrMsg);
5438        zErrMsg = 0;
5439      }
5440      if( xForEach ){
5441        xForEach(p, newDb, (const char*)zName);
5442      }
5443      printf("done\n");
5444    }
5445  }
5446end_schema_xfer:
5447  sqlite3_finalize(pQuery);
5448  sqlite3_free(zQuery);
5449}
5450
5451/*
5452** Open a new database file named "zNewDb".  Try to recover as much information
5453** as possible out of the main database (which might be corrupt) and write it
5454** into zNewDb.
5455*/
5456static void tryToClone(ShellState *p, const char *zNewDb){
5457  int rc;
5458  sqlite3 *newDb = 0;
5459  if( access(zNewDb,0)==0 ){
5460    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5461    return;
5462  }
5463  rc = sqlite3_open(zNewDb, &newDb);
5464  if( rc ){
5465    utf8_printf(stderr, "Cannot create output database: %s\n",
5466            sqlite3_errmsg(newDb));
5467  }else{
5468    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5469    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5470    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5471    tryToCloneSchema(p, newDb, "type!='table'", 0);
5472    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5473    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5474  }
5475  close_db(newDb);
5476}
5477
5478/*
5479** Change the output file back to stdout.
5480**
5481** If the p->doXdgOpen flag is set, that means the output was being
5482** redirected to a temporary file named by p->zTempFile.  In that case,
5483** launch start/open/xdg-open on that temporary file.
5484*/
5485static void output_reset(ShellState *p){
5486  if( p->outfile[0]=='|' ){
5487#ifndef SQLITE_OMIT_POPEN
5488    pclose(p->out);
5489#endif
5490  }else{
5491    output_file_close(p->out);
5492#ifndef SQLITE_NOHAVE_SYSTEM
5493    if( p->doXdgOpen ){
5494      const char *zXdgOpenCmd =
5495#if defined(_WIN32)
5496      "start";
5497#elif defined(__APPLE__)
5498      "open";
5499#else
5500      "xdg-open";
5501#endif
5502      char *zCmd;
5503      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5504      if( system(zCmd) ){
5505        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5506      }else{
5507        /* Give the start/open/xdg-open command some time to get
5508        ** going before we continue, and potential delete the
5509        ** p->zTempFile data file out from under it */
5510        sqlite3_sleep(2000);
5511      }
5512      sqlite3_free(zCmd);
5513      outputModePop(p);
5514      p->doXdgOpen = 0;
5515    }
5516#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5517  }
5518  p->outfile[0] = 0;
5519  p->out = stdout;
5520}
5521
5522/*
5523** Run an SQL command and return the single integer result.
5524*/
5525static int db_int(ShellState *p, const char *zSql){
5526  sqlite3_stmt *pStmt;
5527  int res = 0;
5528  sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5529  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5530    res = sqlite3_column_int(pStmt,0);
5531  }
5532  sqlite3_finalize(pStmt);
5533  return res;
5534}
5535
5536/*
5537** Convert a 2-byte or 4-byte big-endian integer into a native integer
5538*/
5539static unsigned int get2byteInt(unsigned char *a){
5540  return (a[0]<<8) + a[1];
5541}
5542static unsigned int get4byteInt(unsigned char *a){
5543  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5544}
5545
5546/*
5547** Implementation of the ".dbinfo" command.
5548**
5549** Return 1 on error, 2 to exit, and 0 otherwise.
5550*/
5551static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5552  static const struct { const char *zName; int ofst; } aField[] = {
5553     { "file change counter:",  24  },
5554     { "database page count:",  28  },
5555     { "freelist page count:",  36  },
5556     { "schema cookie:",        40  },
5557     { "schema format:",        44  },
5558     { "default cache size:",   48  },
5559     { "autovacuum top root:",  52  },
5560     { "incremental vacuum:",   64  },
5561     { "text encoding:",        56  },
5562     { "user version:",         60  },
5563     { "application id:",       68  },
5564     { "software version:",     96  },
5565  };
5566  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5567     { "number of tables:",
5568       "SELECT count(*) FROM %s WHERE type='table'" },
5569     { "number of indexes:",
5570       "SELECT count(*) FROM %s WHERE type='index'" },
5571     { "number of triggers:",
5572       "SELECT count(*) FROM %s WHERE type='trigger'" },
5573     { "number of views:",
5574       "SELECT count(*) FROM %s WHERE type='view'" },
5575     { "schema size:",
5576       "SELECT total(length(sql)) FROM %s" },
5577  };
5578  int i, rc;
5579  unsigned iDataVersion;
5580  char *zSchemaTab;
5581  char *zDb = nArg>=2 ? azArg[1] : "main";
5582  sqlite3_stmt *pStmt = 0;
5583  unsigned char aHdr[100];
5584  open_db(p, 0);
5585  if( p->db==0 ) return 1;
5586  rc = sqlite3_prepare_v2(p->db,
5587             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5588             -1, &pStmt, 0);
5589  if( rc ){
5590    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5591    sqlite3_finalize(pStmt);
5592    return 1;
5593  }
5594  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5595  if( sqlite3_step(pStmt)==SQLITE_ROW
5596   && sqlite3_column_bytes(pStmt,0)>100
5597  ){
5598    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5599    sqlite3_finalize(pStmt);
5600  }else{
5601    raw_printf(stderr, "unable to read database header\n");
5602    sqlite3_finalize(pStmt);
5603    return 1;
5604  }
5605  i = get2byteInt(aHdr+16);
5606  if( i==1 ) i = 65536;
5607  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5608  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5609  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5610  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5611  for(i=0; i<ArraySize(aField); i++){
5612    int ofst = aField[i].ofst;
5613    unsigned int val = get4byteInt(aHdr + ofst);
5614    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5615    switch( ofst ){
5616      case 56: {
5617        if( val==1 ) raw_printf(p->out, " (utf8)");
5618        if( val==2 ) raw_printf(p->out, " (utf16le)");
5619        if( val==3 ) raw_printf(p->out, " (utf16be)");
5620      }
5621    }
5622    raw_printf(p->out, "\n");
5623  }
5624  if( zDb==0 ){
5625    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5626  }else if( strcmp(zDb,"temp")==0 ){
5627    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5628  }else{
5629    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5630  }
5631  for(i=0; i<ArraySize(aQuery); i++){
5632    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5633    int val = db_int(p, zSql);
5634    sqlite3_free(zSql);
5635    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5636  }
5637  sqlite3_free(zSchemaTab);
5638  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5639  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5640  return 0;
5641}
5642
5643/*
5644** Print the current sqlite3_errmsg() value to stderr and return 1.
5645*/
5646static int shellDatabaseError(sqlite3 *db){
5647  const char *zErr = sqlite3_errmsg(db);
5648  utf8_printf(stderr, "Error: %s\n", zErr);
5649  return 1;
5650}
5651
5652/*
5653** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
5654** if they match and FALSE (0) if they do not match.
5655**
5656** Globbing rules:
5657**
5658**      '*'       Matches any sequence of zero or more characters.
5659**
5660**      '?'       Matches exactly one character.
5661**
5662**     [...]      Matches one character from the enclosed list of
5663**                characters.
5664**
5665**     [^...]     Matches one character not in the enclosed list.
5666**
5667**      '#'       Matches any sequence of one or more digits with an
5668**                optional + or - sign in front
5669**
5670**      ' '       Any span of whitespace matches any other span of
5671**                whitespace.
5672**
5673** Extra whitespace at the end of z[] is ignored.
5674*/
5675static int testcase_glob(const char *zGlob, const char *z){
5676  int c, c2;
5677  int invert;
5678  int seen;
5679
5680  while( (c = (*(zGlob++)))!=0 ){
5681    if( IsSpace(c) ){
5682      if( !IsSpace(*z) ) return 0;
5683      while( IsSpace(*zGlob) ) zGlob++;
5684      while( IsSpace(*z) ) z++;
5685    }else if( c=='*' ){
5686      while( (c=(*(zGlob++))) == '*' || c=='?' ){
5687        if( c=='?' && (*(z++))==0 ) return 0;
5688      }
5689      if( c==0 ){
5690        return 1;
5691      }else if( c=='[' ){
5692        while( *z && testcase_glob(zGlob-1,z)==0 ){
5693          z++;
5694        }
5695        return (*z)!=0;
5696      }
5697      while( (c2 = (*(z++)))!=0 ){
5698        while( c2!=c ){
5699          c2 = *(z++);
5700          if( c2==0 ) return 0;
5701        }
5702        if( testcase_glob(zGlob,z) ) return 1;
5703      }
5704      return 0;
5705    }else if( c=='?' ){
5706      if( (*(z++))==0 ) return 0;
5707    }else if( c=='[' ){
5708      int prior_c = 0;
5709      seen = 0;
5710      invert = 0;
5711      c = *(z++);
5712      if( c==0 ) return 0;
5713      c2 = *(zGlob++);
5714      if( c2=='^' ){
5715        invert = 1;
5716        c2 = *(zGlob++);
5717      }
5718      if( c2==']' ){
5719        if( c==']' ) seen = 1;
5720        c2 = *(zGlob++);
5721      }
5722      while( c2 && c2!=']' ){
5723        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5724          c2 = *(zGlob++);
5725          if( c>=prior_c && c<=c2 ) seen = 1;
5726          prior_c = 0;
5727        }else{
5728          if( c==c2 ){
5729            seen = 1;
5730          }
5731          prior_c = c2;
5732        }
5733        c2 = *(zGlob++);
5734      }
5735      if( c2==0 || (seen ^ invert)==0 ) return 0;
5736    }else if( c=='#' ){
5737      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5738      if( !IsDigit(z[0]) ) return 0;
5739      z++;
5740      while( IsDigit(z[0]) ){ z++; }
5741    }else{
5742      if( c!=(*(z++)) ) return 0;
5743    }
5744  }
5745  while( IsSpace(*z) ){ z++; }
5746  return *z==0;
5747}
5748
5749
5750/*
5751** Compare the string as a command-line option with either one or two
5752** initial "-" characters.
5753*/
5754static int optionMatch(const char *zStr, const char *zOpt){
5755  if( zStr[0]!='-' ) return 0;
5756  zStr++;
5757  if( zStr[0]=='-' ) zStr++;
5758  return strcmp(zStr, zOpt)==0;
5759}
5760
5761/*
5762** Delete a file.
5763*/
5764int shellDeleteFile(const char *zFilename){
5765  int rc;
5766#ifdef _WIN32
5767  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
5768  rc = _wunlink(z);
5769  sqlite3_free(z);
5770#else
5771  rc = unlink(zFilename);
5772#endif
5773  return rc;
5774}
5775
5776/*
5777** Try to delete the temporary file (if there is one) and free the
5778** memory used to hold the name of the temp file.
5779*/
5780static void clearTempFile(ShellState *p){
5781  if( p->zTempFile==0 ) return;
5782  if( p->doXdgOpen ) return;
5783  if( shellDeleteFile(p->zTempFile) ) return;
5784  sqlite3_free(p->zTempFile);
5785  p->zTempFile = 0;
5786}
5787
5788/*
5789** Create a new temp file name with the given suffix.
5790*/
5791static void newTempFile(ShellState *p, const char *zSuffix){
5792  clearTempFile(p);
5793  sqlite3_free(p->zTempFile);
5794  p->zTempFile = 0;
5795  if( p->db ){
5796    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
5797  }
5798  if( p->zTempFile==0 ){
5799    /* If p->db is an in-memory database then the TEMPFILENAME file-control
5800    ** will not work and we will need to fallback to guessing */
5801    char *zTemp;
5802    sqlite3_uint64 r;
5803    sqlite3_randomness(sizeof(r), &r);
5804    zTemp = getenv("TEMP");
5805    if( zTemp==0 ) zTemp = getenv("TMP");
5806    if( zTemp==0 ){
5807#ifdef _WIN32
5808      zTemp = "\\tmp";
5809#else
5810      zTemp = "/tmp";
5811#endif
5812    }
5813    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
5814  }else{
5815    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
5816  }
5817  shell_check_oom(p->zTempFile);
5818}
5819
5820
5821/*
5822** The implementation of SQL scalar function fkey_collate_clause(), used
5823** by the ".lint fkey-indexes" command. This scalar function is always
5824** called with four arguments - the parent table name, the parent column name,
5825** the child table name and the child column name.
5826**
5827**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
5828**
5829** If either of the named tables or columns do not exist, this function
5830** returns an empty string. An empty string is also returned if both tables
5831** and columns exist but have the same default collation sequence. Or,
5832** if both exist but the default collation sequences are different, this
5833** function returns the string " COLLATE <parent-collation>", where
5834** <parent-collation> is the default collation sequence of the parent column.
5835*/
5836static void shellFkeyCollateClause(
5837  sqlite3_context *pCtx,
5838  int nVal,
5839  sqlite3_value **apVal
5840){
5841  sqlite3 *db = sqlite3_context_db_handle(pCtx);
5842  const char *zParent;
5843  const char *zParentCol;
5844  const char *zParentSeq;
5845  const char *zChild;
5846  const char *zChildCol;
5847  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
5848  int rc;
5849
5850  assert( nVal==4 );
5851  zParent = (const char*)sqlite3_value_text(apVal[0]);
5852  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
5853  zChild = (const char*)sqlite3_value_text(apVal[2]);
5854  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
5855
5856  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
5857  rc = sqlite3_table_column_metadata(
5858      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
5859  );
5860  if( rc==SQLITE_OK ){
5861    rc = sqlite3_table_column_metadata(
5862        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
5863    );
5864  }
5865
5866  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
5867    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
5868    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
5869    sqlite3_free(z);
5870  }
5871}
5872
5873
5874/*
5875** The implementation of dot-command ".lint fkey-indexes".
5876*/
5877static int lintFkeyIndexes(
5878  ShellState *pState,             /* Current shell tool state */
5879  char **azArg,                   /* Array of arguments passed to dot command */
5880  int nArg                        /* Number of entries in azArg[] */
5881){
5882  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
5883  FILE *out = pState->out;        /* Stream to write non-error output to */
5884  int bVerbose = 0;               /* If -verbose is present */
5885  int bGroupByParent = 0;         /* If -groupbyparent is present */
5886  int i;                          /* To iterate through azArg[] */
5887  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
5888  int rc;                         /* Return code */
5889  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
5890
5891  /*
5892  ** This SELECT statement returns one row for each foreign key constraint
5893  ** in the schema of the main database. The column values are:
5894  **
5895  ** 0. The text of an SQL statement similar to:
5896  **
5897  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
5898  **
5899  **    This SELECT is similar to the one that the foreign keys implementation
5900  **    needs to run internally on child tables. If there is an index that can
5901  **    be used to optimize this query, then it can also be used by the FK
5902  **    implementation to optimize DELETE or UPDATE statements on the parent
5903  **    table.
5904  **
5905  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
5906  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
5907  **    contains an index that can be used to optimize the query.
5908  **
5909  ** 2. Human readable text that describes the child table and columns. e.g.
5910  **
5911  **       "child_table(child_key1, child_key2)"
5912  **
5913  ** 3. Human readable text that describes the parent table and columns. e.g.
5914  **
5915  **       "parent_table(parent_key1, parent_key2)"
5916  **
5917  ** 4. A full CREATE INDEX statement for an index that could be used to
5918  **    optimize DELETE or UPDATE statements on the parent table. e.g.
5919  **
5920  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
5921  **
5922  ** 5. The name of the parent table.
5923  **
5924  ** These six values are used by the C logic below to generate the report.
5925  */
5926  const char *zSql =
5927  "SELECT "
5928    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
5929    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
5930    "  || fkey_collate_clause("
5931    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
5932    ", "
5933    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
5934    "  || group_concat('*=?', ' AND ') || ')'"
5935    ", "
5936    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
5937    ", "
5938    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
5939    ", "
5940    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
5941    "  || ' ON ' || quote(s.name) || '('"
5942    "  || group_concat(quote(f.[from]) ||"
5943    "        fkey_collate_clause("
5944    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
5945    "  || ');'"
5946    ", "
5947    "     f.[table] "
5948    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
5949    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
5950    "GROUP BY s.name, f.id "
5951    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
5952  ;
5953  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
5954
5955  for(i=2; i<nArg; i++){
5956    int n = strlen30(azArg[i]);
5957    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
5958      bVerbose = 1;
5959    }
5960    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
5961      bGroupByParent = 1;
5962      zIndent = "    ";
5963    }
5964    else{
5965      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
5966          azArg[0], azArg[1]
5967      );
5968      return SQLITE_ERROR;
5969    }
5970  }
5971
5972  /* Register the fkey_collate_clause() SQL function */
5973  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
5974      0, shellFkeyCollateClause, 0, 0
5975  );
5976
5977
5978  if( rc==SQLITE_OK ){
5979    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
5980  }
5981  if( rc==SQLITE_OK ){
5982    sqlite3_bind_int(pSql, 1, bGroupByParent);
5983  }
5984
5985  if( rc==SQLITE_OK ){
5986    int rc2;
5987    char *zPrev = 0;
5988    while( SQLITE_ROW==sqlite3_step(pSql) ){
5989      int res = -1;
5990      sqlite3_stmt *pExplain = 0;
5991      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
5992      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
5993      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
5994      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
5995      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
5996      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
5997
5998      if( zEQP==0 ) continue;
5999      if( zGlob==0 ) continue;
6000      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6001      if( rc!=SQLITE_OK ) break;
6002      if( SQLITE_ROW==sqlite3_step(pExplain) ){
6003        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6004        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
6005                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
6006      }
6007      rc = sqlite3_finalize(pExplain);
6008      if( rc!=SQLITE_OK ) break;
6009
6010      if( res<0 ){
6011        raw_printf(stderr, "Error: internal error");
6012        break;
6013      }else{
6014        if( bGroupByParent
6015        && (bVerbose || res==0)
6016        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6017        ){
6018          raw_printf(out, "-- Parent table %s\n", zParent);
6019          sqlite3_free(zPrev);
6020          zPrev = sqlite3_mprintf("%s", zParent);
6021        }
6022
6023        if( res==0 ){
6024          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6025        }else if( bVerbose ){
6026          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6027              zIndent, zFrom, zTarget
6028          );
6029        }
6030      }
6031    }
6032    sqlite3_free(zPrev);
6033
6034    if( rc!=SQLITE_OK ){
6035      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6036    }
6037
6038    rc2 = sqlite3_finalize(pSql);
6039    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6040      rc = rc2;
6041      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6042    }
6043  }else{
6044    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6045  }
6046
6047  return rc;
6048}
6049
6050/*
6051** Implementation of ".lint" dot command.
6052*/
6053static int lintDotCommand(
6054  ShellState *pState,             /* Current shell tool state */
6055  char **azArg,                   /* Array of arguments passed to dot command */
6056  int nArg                        /* Number of entries in azArg[] */
6057){
6058  int n;
6059  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6060  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6061  return lintFkeyIndexes(pState, azArg, nArg);
6062
6063 usage:
6064  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6065  raw_printf(stderr, "Where sub-commands are:\n");
6066  raw_printf(stderr, "    fkey-indexes\n");
6067  return SQLITE_ERROR;
6068}
6069
6070#if !defined SQLITE_OMIT_VIRTUALTABLE
6071static void shellPrepare(
6072  sqlite3 *db,
6073  int *pRc,
6074  const char *zSql,
6075  sqlite3_stmt **ppStmt
6076){
6077  *ppStmt = 0;
6078  if( *pRc==SQLITE_OK ){
6079    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6080    if( rc!=SQLITE_OK ){
6081      raw_printf(stderr, "sql error: %s (%d)\n",
6082          sqlite3_errmsg(db), sqlite3_errcode(db)
6083      );
6084      *pRc = rc;
6085    }
6086  }
6087}
6088
6089/*
6090** Create a prepared statement using printf-style arguments for the SQL.
6091**
6092** This routine is could be marked "static".  But it is not always used,
6093** depending on compile-time options.  By omitting the "static", we avoid
6094** nuisance compiler warnings about "defined but not used".
6095*/
6096void shellPreparePrintf(
6097  sqlite3 *db,
6098  int *pRc,
6099  sqlite3_stmt **ppStmt,
6100  const char *zFmt,
6101  ...
6102){
6103  *ppStmt = 0;
6104  if( *pRc==SQLITE_OK ){
6105    va_list ap;
6106    char *z;
6107    va_start(ap, zFmt);
6108    z = sqlite3_vmprintf(zFmt, ap);
6109    va_end(ap);
6110    if( z==0 ){
6111      *pRc = SQLITE_NOMEM;
6112    }else{
6113      shellPrepare(db, pRc, z, ppStmt);
6114      sqlite3_free(z);
6115    }
6116  }
6117}
6118
6119/* Finalize the prepared statement created using shellPreparePrintf().
6120**
6121** This routine is could be marked "static".  But it is not always used,
6122** depending on compile-time options.  By omitting the "static", we avoid
6123** nuisance compiler warnings about "defined but not used".
6124*/
6125void shellFinalize(
6126  int *pRc,
6127  sqlite3_stmt *pStmt
6128){
6129  if( pStmt ){
6130    sqlite3 *db = sqlite3_db_handle(pStmt);
6131    int rc = sqlite3_finalize(pStmt);
6132    if( *pRc==SQLITE_OK ){
6133      if( rc!=SQLITE_OK ){
6134        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6135      }
6136      *pRc = rc;
6137    }
6138  }
6139}
6140
6141/* Reset the prepared statement created using shellPreparePrintf().
6142**
6143** This routine is could be marked "static".  But it is not always used,
6144** depending on compile-time options.  By omitting the "static", we avoid
6145** nuisance compiler warnings about "defined but not used".
6146*/
6147void shellReset(
6148  int *pRc,
6149  sqlite3_stmt *pStmt
6150){
6151  int rc = sqlite3_reset(pStmt);
6152  if( *pRc==SQLITE_OK ){
6153    if( rc!=SQLITE_OK ){
6154      sqlite3 *db = sqlite3_db_handle(pStmt);
6155      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6156    }
6157    *pRc = rc;
6158  }
6159}
6160#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6161
6162#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6163/******************************************************************************
6164** The ".archive" or ".ar" command.
6165*/
6166/*
6167** Structure representing a single ".ar" command.
6168*/
6169typedef struct ArCommand ArCommand;
6170struct ArCommand {
6171  u8 eCmd;                        /* An AR_CMD_* value */
6172  u8 bVerbose;                    /* True if --verbose */
6173  u8 bZip;                        /* True if the archive is a ZIP */
6174  u8 bDryRun;                     /* True if --dry-run */
6175  u8 bAppend;                     /* True if --append */
6176  u8 bGlob;                       /* True if --glob */
6177  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6178  int nArg;                       /* Number of command arguments */
6179  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6180  const char *zFile;              /* --file argument, or NULL */
6181  const char *zDir;               /* --directory argument, or NULL */
6182  char **azArg;                   /* Array of command arguments */
6183  ShellState *p;                  /* Shell state */
6184  sqlite3 *db;                    /* Database containing the archive */
6185};
6186
6187/*
6188** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6189*/
6190static int arUsage(FILE *f){
6191  showHelp(f,"archive");
6192  return SQLITE_ERROR;
6193}
6194
6195/*
6196** Print an error message for the .ar command to stderr and return
6197** SQLITE_ERROR.
6198*/
6199static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6200  va_list ap;
6201  char *z;
6202  va_start(ap, zFmt);
6203  z = sqlite3_vmprintf(zFmt, ap);
6204  va_end(ap);
6205  utf8_printf(stderr, "Error: %s\n", z);
6206  if( pAr->fromCmdLine ){
6207    utf8_printf(stderr, "Use \"-A\" for more help\n");
6208  }else{
6209    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6210  }
6211  sqlite3_free(z);
6212  return SQLITE_ERROR;
6213}
6214
6215/*
6216** Values for ArCommand.eCmd.
6217*/
6218#define AR_CMD_CREATE       1
6219#define AR_CMD_UPDATE       2
6220#define AR_CMD_INSERT       3
6221#define AR_CMD_EXTRACT      4
6222#define AR_CMD_LIST         5
6223#define AR_CMD_HELP         6
6224#define AR_CMD_REMOVE       7
6225
6226/*
6227** Other (non-command) switches.
6228*/
6229#define AR_SWITCH_VERBOSE     8
6230#define AR_SWITCH_FILE        9
6231#define AR_SWITCH_DIRECTORY  10
6232#define AR_SWITCH_APPEND     11
6233#define AR_SWITCH_DRYRUN     12
6234#define AR_SWITCH_GLOB       13
6235
6236static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6237  switch( eSwitch ){
6238    case AR_CMD_CREATE:
6239    case AR_CMD_EXTRACT:
6240    case AR_CMD_LIST:
6241    case AR_CMD_REMOVE:
6242    case AR_CMD_UPDATE:
6243    case AR_CMD_INSERT:
6244    case AR_CMD_HELP:
6245      if( pAr->eCmd ){
6246        return arErrorMsg(pAr, "multiple command options");
6247      }
6248      pAr->eCmd = eSwitch;
6249      break;
6250
6251    case AR_SWITCH_DRYRUN:
6252      pAr->bDryRun = 1;
6253      break;
6254    case AR_SWITCH_GLOB:
6255      pAr->bGlob = 1;
6256      break;
6257    case AR_SWITCH_VERBOSE:
6258      pAr->bVerbose = 1;
6259      break;
6260    case AR_SWITCH_APPEND:
6261      pAr->bAppend = 1;
6262      /* Fall thru into --file */
6263    case AR_SWITCH_FILE:
6264      pAr->zFile = zArg;
6265      break;
6266    case AR_SWITCH_DIRECTORY:
6267      pAr->zDir = zArg;
6268      break;
6269  }
6270
6271  return SQLITE_OK;
6272}
6273
6274/*
6275** Parse the command line for an ".ar" command. The results are written into
6276** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6277** successfully, otherwise an error message is written to stderr and
6278** SQLITE_ERROR returned.
6279*/
6280static int arParseCommand(
6281  char **azArg,                   /* Array of arguments passed to dot command */
6282  int nArg,                       /* Number of entries in azArg[] */
6283  ArCommand *pAr                  /* Populate this object */
6284){
6285  struct ArSwitch {
6286    const char *zLong;
6287    char cShort;
6288    u8 eSwitch;
6289    u8 bArg;
6290  } aSwitch[] = {
6291    { "create",    'c', AR_CMD_CREATE,       0 },
6292    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6293    { "insert",    'i', AR_CMD_INSERT,       0 },
6294    { "list",      't', AR_CMD_LIST,         0 },
6295    { "remove",    'r', AR_CMD_REMOVE,       0 },
6296    { "update",    'u', AR_CMD_UPDATE,       0 },
6297    { "help",      'h', AR_CMD_HELP,         0 },
6298    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6299    { "file",      'f', AR_SWITCH_FILE,      1 },
6300    { "append",    'a', AR_SWITCH_APPEND,    1 },
6301    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6302    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6303    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6304  };
6305  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6306  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6307
6308  if( nArg<=1 ){
6309    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6310    return arUsage(stderr);
6311  }else{
6312    char *z = azArg[1];
6313    if( z[0]!='-' ){
6314      /* Traditional style [tar] invocation */
6315      int i;
6316      int iArg = 2;
6317      for(i=0; z[i]; i++){
6318        const char *zArg = 0;
6319        struct ArSwitch *pOpt;
6320        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6321          if( z[i]==pOpt->cShort ) break;
6322        }
6323        if( pOpt==pEnd ){
6324          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6325        }
6326        if( pOpt->bArg ){
6327          if( iArg>=nArg ){
6328            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6329          }
6330          zArg = azArg[iArg++];
6331        }
6332        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6333      }
6334      pAr->nArg = nArg-iArg;
6335      if( pAr->nArg>0 ){
6336        pAr->azArg = &azArg[iArg];
6337      }
6338    }else{
6339      /* Non-traditional invocation */
6340      int iArg;
6341      for(iArg=1; iArg<nArg; iArg++){
6342        int n;
6343        z = azArg[iArg];
6344        if( z[0]!='-' ){
6345          /* All remaining command line words are command arguments. */
6346          pAr->azArg = &azArg[iArg];
6347          pAr->nArg = nArg-iArg;
6348          break;
6349        }
6350        n = strlen30(z);
6351
6352        if( z[1]!='-' ){
6353          int i;
6354          /* One or more short options */
6355          for(i=1; i<n; i++){
6356            const char *zArg = 0;
6357            struct ArSwitch *pOpt;
6358            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6359              if( z[i]==pOpt->cShort ) break;
6360            }
6361            if( pOpt==pEnd ){
6362              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6363            }
6364            if( pOpt->bArg ){
6365              if( i<(n-1) ){
6366                zArg = &z[i+1];
6367                i = n;
6368              }else{
6369                if( iArg>=(nArg-1) ){
6370                  return arErrorMsg(pAr, "option requires an argument: %c",
6371                                    z[i]);
6372                }
6373                zArg = azArg[++iArg];
6374              }
6375            }
6376            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6377          }
6378        }else if( z[2]=='\0' ){
6379          /* A -- option, indicating that all remaining command line words
6380          ** are command arguments.  */
6381          pAr->azArg = &azArg[iArg+1];
6382          pAr->nArg = nArg-iArg-1;
6383          break;
6384        }else{
6385          /* A long option */
6386          const char *zArg = 0;             /* Argument for option, if any */
6387          struct ArSwitch *pMatch = 0;      /* Matching option */
6388          struct ArSwitch *pOpt;            /* Iterator */
6389          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6390            const char *zLong = pOpt->zLong;
6391            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6392              if( pMatch ){
6393                return arErrorMsg(pAr, "ambiguous option: %s",z);
6394              }else{
6395                pMatch = pOpt;
6396              }
6397            }
6398          }
6399
6400          if( pMatch==0 ){
6401            return arErrorMsg(pAr, "unrecognized option: %s", z);
6402          }
6403          if( pMatch->bArg ){
6404            if( iArg>=(nArg-1) ){
6405              return arErrorMsg(pAr, "option requires an argument: %s", z);
6406            }
6407            zArg = azArg[++iArg];
6408          }
6409          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6410        }
6411      }
6412    }
6413  }
6414
6415  return SQLITE_OK;
6416}
6417
6418/*
6419** This function assumes that all arguments within the ArCommand.azArg[]
6420** array refer to archive members, as for the --extract, --list or --remove
6421** commands. It checks that each of them are "present". If any specified
6422** file is not present in the archive, an error is printed to stderr and an
6423** error code returned. Otherwise, if all specified arguments are present
6424** in the archive, SQLITE_OK is returned. Here, "present" means either an
6425** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6426** when pAr->bGlob is true.
6427**
6428** This function strips any trailing '/' characters from each argument.
6429** This is consistent with the way the [tar] command seems to work on
6430** Linux.
6431*/
6432static int arCheckEntries(ArCommand *pAr){
6433  int rc = SQLITE_OK;
6434  if( pAr->nArg ){
6435    int i, j;
6436    sqlite3_stmt *pTest = 0;
6437    const char *zSel = (pAr->bGlob)
6438      ? "SELECT name FROM %s WHERE glob($name,name)"
6439      : "SELECT name FROM %s WHERE name=$name";
6440
6441    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6442    j = sqlite3_bind_parameter_index(pTest, "$name");
6443    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6444      char *z = pAr->azArg[i];
6445      int n = strlen30(z);
6446      int bOk = 0;
6447      while( n>0 && z[n-1]=='/' ) n--;
6448      z[n] = '\0';
6449      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6450      if( SQLITE_ROW==sqlite3_step(pTest) ){
6451        bOk = 1;
6452      }
6453      shellReset(&rc, pTest);
6454      if( rc==SQLITE_OK && bOk==0 ){
6455        utf8_printf(stderr, "not found in archive: %s\n", z);
6456        rc = SQLITE_ERROR;
6457      }
6458    }
6459    shellFinalize(&rc, pTest);
6460  }
6461  return rc;
6462}
6463
6464/*
6465** Format a WHERE clause that can be used against the "sqlar" table to
6466** identify all archive members that match the command arguments held
6467** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6468** The caller is responsible for eventually calling sqlite3_free() on
6469** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6470** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6471*/
6472static void arWhereClause(
6473  int *pRc,
6474  ArCommand *pAr,
6475  char **pzWhere                  /* OUT: New WHERE clause */
6476){
6477  char *zWhere = 0;
6478  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6479  if( *pRc==SQLITE_OK ){
6480    if( pAr->nArg==0 ){
6481      zWhere = sqlite3_mprintf("1");
6482    }else{
6483      int i;
6484      const char *zSep = "";
6485      for(i=0; i<pAr->nArg; i++){
6486        const char *z = pAr->azArg[i];
6487        zWhere = sqlite3_mprintf(
6488          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6489          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6490        );
6491        if( zWhere==0 ){
6492          *pRc = SQLITE_NOMEM;
6493          break;
6494        }
6495        zSep = " OR ";
6496      }
6497    }
6498  }
6499  *pzWhere = zWhere;
6500}
6501
6502/*
6503** Implementation of .ar "lisT" command.
6504*/
6505static int arListCommand(ArCommand *pAr){
6506  const char *zSql = "SELECT %s FROM %s WHERE %s";
6507  const char *azCols[] = {
6508    "name",
6509    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6510  };
6511
6512  char *zWhere = 0;
6513  sqlite3_stmt *pSql = 0;
6514  int rc;
6515
6516  rc = arCheckEntries(pAr);
6517  arWhereClause(&rc, pAr, &zWhere);
6518
6519  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6520                     pAr->zSrcTable, zWhere);
6521  if( pAr->bDryRun ){
6522    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6523  }else{
6524    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6525      if( pAr->bVerbose ){
6526        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6527            sqlite3_column_text(pSql, 0),
6528            sqlite3_column_int(pSql, 1),
6529            sqlite3_column_text(pSql, 2),
6530            sqlite3_column_text(pSql, 3)
6531        );
6532      }else{
6533        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6534      }
6535    }
6536  }
6537  shellFinalize(&rc, pSql);
6538  sqlite3_free(zWhere);
6539  return rc;
6540}
6541
6542
6543/*
6544** Implementation of .ar "Remove" command.
6545*/
6546static int arRemoveCommand(ArCommand *pAr){
6547  int rc = 0;
6548  char *zSql = 0;
6549  char *zWhere = 0;
6550
6551  if( pAr->nArg ){
6552    /* Verify that args actually exist within the archive before proceeding.
6553    ** And formulate a WHERE clause to match them.  */
6554    rc = arCheckEntries(pAr);
6555    arWhereClause(&rc, pAr, &zWhere);
6556  }
6557  if( rc==SQLITE_OK ){
6558    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6559                           pAr->zSrcTable, zWhere);
6560    if( pAr->bDryRun ){
6561      utf8_printf(pAr->p->out, "%s\n", zSql);
6562    }else{
6563      char *zErr = 0;
6564      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6565      if( rc==SQLITE_OK ){
6566        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6567        if( rc!=SQLITE_OK ){
6568          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6569        }else{
6570          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6571        }
6572      }
6573      if( zErr ){
6574        utf8_printf(stdout, "ERROR: %s\n", zErr);
6575        sqlite3_free(zErr);
6576      }
6577    }
6578  }
6579  sqlite3_free(zWhere);
6580  sqlite3_free(zSql);
6581  return rc;
6582}
6583
6584/*
6585** Implementation of .ar "eXtract" command.
6586*/
6587static int arExtractCommand(ArCommand *pAr){
6588  const char *zSql1 =
6589    "SELECT "
6590    " ($dir || name),"
6591    " writefile(($dir || name), %s, mode, mtime) "
6592    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6593    " AND name NOT GLOB '*..[/\\]*'";
6594
6595  const char *azExtraArg[] = {
6596    "sqlar_uncompress(data, sz)",
6597    "data"
6598  };
6599
6600  sqlite3_stmt *pSql = 0;
6601  int rc = SQLITE_OK;
6602  char *zDir = 0;
6603  char *zWhere = 0;
6604  int i, j;
6605
6606  /* If arguments are specified, check that they actually exist within
6607  ** the archive before proceeding. And formulate a WHERE clause to
6608  ** match them.  */
6609  rc = arCheckEntries(pAr);
6610  arWhereClause(&rc, pAr, &zWhere);
6611
6612  if( rc==SQLITE_OK ){
6613    if( pAr->zDir ){
6614      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6615    }else{
6616      zDir = sqlite3_mprintf("");
6617    }
6618    if( zDir==0 ) rc = SQLITE_NOMEM;
6619  }
6620
6621  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6622      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6623  );
6624
6625  if( rc==SQLITE_OK ){
6626    j = sqlite3_bind_parameter_index(pSql, "$dir");
6627    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6628
6629    /* Run the SELECT statement twice. The first time, writefile() is called
6630    ** for all archive members that should be extracted. The second time,
6631    ** only for the directories. This is because the timestamps for
6632    ** extracted directories must be reset after they are populated (as
6633    ** populating them changes the timestamp).  */
6634    for(i=0; i<2; i++){
6635      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6636      sqlite3_bind_int(pSql, j, i);
6637      if( pAr->bDryRun ){
6638        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6639      }else{
6640        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6641          if( i==0 && pAr->bVerbose ){
6642            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6643          }
6644        }
6645      }
6646      shellReset(&rc, pSql);
6647    }
6648    shellFinalize(&rc, pSql);
6649  }
6650
6651  sqlite3_free(zDir);
6652  sqlite3_free(zWhere);
6653  return rc;
6654}
6655
6656/*
6657** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
6658*/
6659static int arExecSql(ArCommand *pAr, const char *zSql){
6660  int rc;
6661  if( pAr->bDryRun ){
6662    utf8_printf(pAr->p->out, "%s\n", zSql);
6663    rc = SQLITE_OK;
6664  }else{
6665    char *zErr = 0;
6666    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6667    if( zErr ){
6668      utf8_printf(stdout, "ERROR: %s\n", zErr);
6669      sqlite3_free(zErr);
6670    }
6671  }
6672  return rc;
6673}
6674
6675
6676/*
6677** Implementation of .ar "create", "insert", and "update" commands.
6678**
6679**     create    ->     Create a new SQL archive
6680**     insert    ->     Insert or reinsert all files listed
6681**     update    ->     Insert files that have changed or that were not
6682**                      previously in the archive
6683**
6684** Create the "sqlar" table in the database if it does not already exist.
6685** Then add each file in the azFile[] array to the archive. Directories
6686** are added recursively. If argument bVerbose is non-zero, a message is
6687** printed on stdout for each file archived.
6688**
6689** The create command is the same as update, except that it drops
6690** any existing "sqlar" table before beginning.  The "insert" command
6691** always overwrites every file named on the command-line, where as
6692** "update" only overwrites if the size or mtime or mode has changed.
6693*/
6694static int arCreateOrUpdateCommand(
6695  ArCommand *pAr,                 /* Command arguments and options */
6696  int bUpdate,                    /* true for a --create. */
6697  int bOnlyIfChanged              /* Only update if file has changed */
6698){
6699  const char *zCreate =
6700      "CREATE TABLE IF NOT EXISTS sqlar(\n"
6701      "  name TEXT PRIMARY KEY,  -- name of the file\n"
6702      "  mode INT,               -- access permissions\n"
6703      "  mtime INT,              -- last modification time\n"
6704      "  sz INT,                 -- original file size\n"
6705      "  data BLOB               -- compressed content\n"
6706      ")";
6707  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6708  const char *zInsertFmt[2] = {
6709     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6710     "  SELECT\n"
6711     "    %s,\n"
6712     "    mode,\n"
6713     "    mtime,\n"
6714     "    CASE substr(lsmode(mode),1,1)\n"
6715     "      WHEN '-' THEN length(data)\n"
6716     "      WHEN 'd' THEN 0\n"
6717     "      ELSE -1 END,\n"
6718     "    sqlar_compress(data)\n"
6719     "  FROM fsdir(%Q,%Q) AS disk\n"
6720     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6721     ,
6722     "REPLACE INTO %s(name,mode,mtime,data)\n"
6723     "  SELECT\n"
6724     "    %s,\n"
6725     "    mode,\n"
6726     "    mtime,\n"
6727     "    data\n"
6728     "  FROM fsdir(%Q,%Q) AS disk\n"
6729     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6730  };
6731  int i;                          /* For iterating through azFile[] */
6732  int rc;                         /* Return code */
6733  const char *zTab = 0;           /* SQL table into which to insert */
6734  char *zSql;
6735  char zTemp[50];
6736  char *zExists = 0;
6737
6738  arExecSql(pAr, "PRAGMA page_size=512");
6739  rc = arExecSql(pAr, "SAVEPOINT ar;");
6740  if( rc!=SQLITE_OK ) return rc;
6741  zTemp[0] = 0;
6742  if( pAr->bZip ){
6743    /* Initialize the zipfile virtual table, if necessary */
6744    if( pAr->zFile ){
6745      sqlite3_uint64 r;
6746      sqlite3_randomness(sizeof(r),&r);
6747      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6748      zTab = zTemp;
6749      zSql = sqlite3_mprintf(
6750         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6751         zTab, pAr->zFile
6752      );
6753      rc = arExecSql(pAr, zSql);
6754      sqlite3_free(zSql);
6755    }else{
6756      zTab = "zip";
6757    }
6758  }else{
6759    /* Initialize the table for an SQLAR */
6760    zTab = "sqlar";
6761    if( bUpdate==0 ){
6762      rc = arExecSql(pAr, zDrop);
6763      if( rc!=SQLITE_OK ) goto end_ar_transaction;
6764    }
6765    rc = arExecSql(pAr, zCreate);
6766  }
6767  if( bOnlyIfChanged ){
6768    zExists = sqlite3_mprintf(
6769      " AND NOT EXISTS("
6770          "SELECT 1 FROM %s AS mem"
6771          " WHERE mem.name=disk.name"
6772          " AND mem.mtime=disk.mtime"
6773          " AND mem.mode=disk.mode)", zTab);
6774  }else{
6775    zExists = sqlite3_mprintf("");
6776  }
6777  if( zExists==0 ) rc = SQLITE_NOMEM;
6778  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6779    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
6780        pAr->bVerbose ? "shell_putsnl(name)" : "name",
6781        pAr->azArg[i], pAr->zDir, zExists);
6782    rc = arExecSql(pAr, zSql2);
6783    sqlite3_free(zSql2);
6784  }
6785end_ar_transaction:
6786  if( rc!=SQLITE_OK ){
6787    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6788  }else{
6789    rc = arExecSql(pAr, "RELEASE ar;");
6790    if( pAr->bZip && pAr->zFile ){
6791      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
6792      arExecSql(pAr, zSql);
6793      sqlite3_free(zSql);
6794    }
6795  }
6796  sqlite3_free(zExists);
6797  return rc;
6798}
6799
6800/*
6801** Implementation of ".ar" dot command.
6802*/
6803static int arDotCommand(
6804  ShellState *pState,          /* Current shell tool state */
6805  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
6806  char **azArg,                /* Array of arguments passed to dot command */
6807  int nArg                     /* Number of entries in azArg[] */
6808){
6809  ArCommand cmd;
6810  int rc;
6811  memset(&cmd, 0, sizeof(cmd));
6812  cmd.fromCmdLine = fromCmdLine;
6813  rc = arParseCommand(azArg, nArg, &cmd);
6814  if( rc==SQLITE_OK ){
6815    int eDbType = SHELL_OPEN_UNSPEC;
6816    cmd.p = pState;
6817    cmd.db = pState->db;
6818    if( cmd.zFile ){
6819      eDbType = deduceDatabaseType(cmd.zFile, 1);
6820    }else{
6821      eDbType = pState->openMode;
6822    }
6823    if( eDbType==SHELL_OPEN_ZIPFILE ){
6824      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
6825        if( cmd.zFile==0 ){
6826          cmd.zSrcTable = sqlite3_mprintf("zip");
6827        }else{
6828          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
6829        }
6830      }
6831      cmd.bZip = 1;
6832    }else if( cmd.zFile ){
6833      int flags;
6834      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
6835      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
6836           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
6837        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
6838      }else{
6839        flags = SQLITE_OPEN_READONLY;
6840      }
6841      cmd.db = 0;
6842      if( cmd.bDryRun ){
6843        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
6844             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
6845      }
6846      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
6847             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
6848      if( rc!=SQLITE_OK ){
6849        utf8_printf(stderr, "cannot open file: %s (%s)\n",
6850            cmd.zFile, sqlite3_errmsg(cmd.db)
6851        );
6852        goto end_ar_command;
6853      }
6854      sqlite3_fileio_init(cmd.db, 0, 0);
6855      sqlite3_sqlar_init(cmd.db, 0, 0);
6856      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
6857                              shellPutsFunc, 0, 0);
6858
6859    }
6860    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
6861      if( cmd.eCmd!=AR_CMD_CREATE
6862       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
6863      ){
6864        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
6865        rc = SQLITE_ERROR;
6866        goto end_ar_command;
6867      }
6868      cmd.zSrcTable = sqlite3_mprintf("sqlar");
6869    }
6870
6871    switch( cmd.eCmd ){
6872      case AR_CMD_CREATE:
6873        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
6874        break;
6875
6876      case AR_CMD_EXTRACT:
6877        rc = arExtractCommand(&cmd);
6878        break;
6879
6880      case AR_CMD_LIST:
6881        rc = arListCommand(&cmd);
6882        break;
6883
6884      case AR_CMD_HELP:
6885        arUsage(pState->out);
6886        break;
6887
6888      case AR_CMD_INSERT:
6889        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
6890        break;
6891
6892      case AR_CMD_REMOVE:
6893        rc = arRemoveCommand(&cmd);
6894        break;
6895
6896      default:
6897        assert( cmd.eCmd==AR_CMD_UPDATE );
6898        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
6899        break;
6900    }
6901  }
6902end_ar_command:
6903  if( cmd.db!=pState->db ){
6904    close_db(cmd.db);
6905  }
6906  sqlite3_free(cmd.zSrcTable);
6907
6908  return rc;
6909}
6910/* End of the ".archive" or ".ar" command logic
6911*******************************************************************************/
6912#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
6913
6914#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
6915/*
6916** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
6917** Otherwise, the SQL statement or statements in zSql are executed using
6918** database connection db and the error code written to *pRc before
6919** this function returns.
6920*/
6921static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
6922  int rc = *pRc;
6923  if( rc==SQLITE_OK ){
6924    char *zErr = 0;
6925    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
6926    if( rc!=SQLITE_OK ){
6927      raw_printf(stderr, "SQL error: %s\n", zErr);
6928    }
6929    sqlite3_free(zErr);
6930    *pRc = rc;
6931  }
6932}
6933
6934/*
6935** Like shellExec(), except that zFmt is a printf() style format string.
6936*/
6937static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
6938  char *z = 0;
6939  if( *pRc==SQLITE_OK ){
6940    va_list ap;
6941    va_start(ap, zFmt);
6942    z = sqlite3_vmprintf(zFmt, ap);
6943    va_end(ap);
6944    if( z==0 ){
6945      *pRc = SQLITE_NOMEM;
6946    }else{
6947      shellExec(db, pRc, z);
6948    }
6949    sqlite3_free(z);
6950  }
6951}
6952
6953/*
6954** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
6955** Otherwise, an attempt is made to allocate, zero and return a pointer
6956** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
6957** to SQLITE_NOMEM and NULL returned.
6958*/
6959static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
6960  void *pRet = 0;
6961  if( *pRc==SQLITE_OK ){
6962    pRet = sqlite3_malloc64(nByte);
6963    if( pRet==0 ){
6964      *pRc = SQLITE_NOMEM;
6965    }else{
6966      memset(pRet, 0, nByte);
6967    }
6968  }
6969  return pRet;
6970}
6971
6972/*
6973** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
6974** Otherwise, zFmt is treated as a printf() style string. The result of
6975** formatting it along with any trailing arguments is written into a
6976** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
6977** It is the responsibility of the caller to eventually free this buffer
6978** using a call to sqlite3_free().
6979**
6980** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
6981** pointer returned.
6982*/
6983static char *shellMPrintf(int *pRc, const char *zFmt, ...){
6984  char *z = 0;
6985  if( *pRc==SQLITE_OK ){
6986    va_list ap;
6987    va_start(ap, zFmt);
6988    z = sqlite3_vmprintf(zFmt, ap);
6989    va_end(ap);
6990    if( z==0 ){
6991      *pRc = SQLITE_NOMEM;
6992    }
6993  }
6994  return z;
6995}
6996
6997/*
6998** When running the ".recover" command, each output table, and the special
6999** orphaned row table if it is required, is represented by an instance
7000** of the following struct.
7001*/
7002typedef struct RecoverTable RecoverTable;
7003struct RecoverTable {
7004  char *zQuoted;                  /* Quoted version of table name */
7005  int nCol;                       /* Number of columns in table */
7006  char **azlCol;                  /* Array of column lists */
7007  int iPk;                        /* Index of IPK column */
7008};
7009
7010/*
7011** Free a RecoverTable object allocated by recoverFindTable() or
7012** recoverOrphanTable().
7013*/
7014static void recoverFreeTable(RecoverTable *pTab){
7015  if( pTab ){
7016    sqlite3_free(pTab->zQuoted);
7017    if( pTab->azlCol ){
7018      int i;
7019      for(i=0; i<=pTab->nCol; i++){
7020        sqlite3_free(pTab->azlCol[i]);
7021      }
7022      sqlite3_free(pTab->azlCol);
7023    }
7024    sqlite3_free(pTab);
7025  }
7026}
7027
7028/*
7029** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
7030** Otherwise, it allocates and returns a RecoverTable object based on the
7031** final four arguments passed to this function. It is the responsibility
7032** of the caller to eventually free the returned object using
7033** recoverFreeTable().
7034*/
7035static RecoverTable *recoverNewTable(
7036  int *pRc,                       /* IN/OUT: Error code */
7037  const char *zName,              /* Name of table */
7038  const char *zSql,               /* CREATE TABLE statement */
7039  int bIntkey,
7040  int nCol
7041){
7042  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
7043  int rc = *pRc;
7044  RecoverTable *pTab = 0;
7045
7046  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
7047  if( rc==SQLITE_OK ){
7048    int nSqlCol = 0;
7049    int bSqlIntkey = 0;
7050    sqlite3_stmt *pStmt = 0;
7051
7052    rc = sqlite3_open("", &dbtmp);
7053    if( rc==SQLITE_OK ){
7054      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7055                              shellIdQuote, 0, 0);
7056    }
7057    if( rc==SQLITE_OK ){
7058      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7059    }
7060    if( rc==SQLITE_OK ){
7061      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7062      if( rc==SQLITE_ERROR ){
7063        rc = SQLITE_OK;
7064        goto finished;
7065      }
7066    }
7067    shellPreparePrintf(dbtmp, &rc, &pStmt,
7068        "SELECT count(*) FROM pragma_table_info(%Q)", zName
7069    );
7070    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7071      nSqlCol = sqlite3_column_int(pStmt, 0);
7072    }
7073    shellFinalize(&rc, pStmt);
7074
7075    if( rc!=SQLITE_OK || nSqlCol<nCol ){
7076      goto finished;
7077    }
7078
7079    shellPreparePrintf(dbtmp, &rc, &pStmt,
7080      "SELECT ("
7081      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7082      ") FROM sqlite_schema WHERE name = %Q", zName
7083    );
7084    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7085      bSqlIntkey = sqlite3_column_int(pStmt, 0);
7086    }
7087    shellFinalize(&rc, pStmt);
7088
7089    if( bIntkey==bSqlIntkey ){
7090      int i;
7091      const char *zPk = "_rowid_";
7092      sqlite3_stmt *pPkFinder = 0;
7093
7094      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7095      ** set zPk to the name of the PK column, and pTab->iPk to the index
7096      ** of the column, where columns are 0-numbered from left to right.
7097      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7098      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
7099      pTab->iPk = -2;
7100      if( bIntkey ){
7101        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7102          "SELECT cid, name FROM pragma_table_info(%Q) "
7103          "  WHERE pk=1 AND type='integer' COLLATE nocase"
7104          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7105          , zName, zName
7106        );
7107        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7108          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7109          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7110          if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
7111        }
7112      }
7113
7114      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7115      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7116      pTab->nCol = nSqlCol;
7117
7118      if( bIntkey ){
7119        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7120      }else{
7121        pTab->azlCol[0] = shellMPrintf(&rc, "");
7122      }
7123      i = 1;
7124      shellPreparePrintf(dbtmp, &rc, &pStmt,
7125          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7126          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7127          "FROM pragma_table_info(%Q)",
7128          bIntkey ? ", " : "", pTab->iPk,
7129          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7130          zName
7131      );
7132      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7133        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7134        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7135        i++;
7136      }
7137      shellFinalize(&rc, pStmt);
7138
7139      shellFinalize(&rc, pPkFinder);
7140    }
7141  }
7142
7143 finished:
7144  sqlite3_close(dbtmp);
7145  *pRc = rc;
7146  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7147    recoverFreeTable(pTab);
7148    pTab = 0;
7149  }
7150  return pTab;
7151}
7152
7153/*
7154** This function is called to search the schema recovered from the
7155** sqlite_schema table of the (possibly) corrupt database as part
7156** of a ".recover" command. Specifically, for a table with root page
7157** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7158** table must be a WITHOUT ROWID table, or if non-zero, not one of
7159** those.
7160**
7161** If a table is found, a (RecoverTable*) object is returned. Or, if
7162** no such table is found, but bIntkey is false and iRoot is the
7163** root page of an index in the recovered schema, then (*pbNoop) is
7164** set to true and NULL returned. Or, if there is no such table or
7165** index, NULL is returned and (*pbNoop) set to 0, indicating that
7166** the caller should write data to the orphans table.
7167*/
7168static RecoverTable *recoverFindTable(
7169  ShellState *pState,             /* Shell state object */
7170  int *pRc,                       /* IN/OUT: Error code */
7171  int iRoot,                      /* Root page of table */
7172  int bIntkey,                    /* True for an intkey table */
7173  int nCol,                       /* Number of columns in table */
7174  int *pbNoop                     /* OUT: True if iRoot is root of index */
7175){
7176  sqlite3_stmt *pStmt = 0;
7177  RecoverTable *pRet = 0;
7178  int bNoop = 0;
7179  const char *zSql = 0;
7180  const char *zName = 0;
7181
7182  /* Search the recovered schema for an object with root page iRoot. */
7183  shellPreparePrintf(pState->db, pRc, &pStmt,
7184      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7185  );
7186  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7187    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7188    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7189      bNoop = 1;
7190      break;
7191    }
7192    if( sqlite3_stricmp(zType, "table")==0 ){
7193      zName = (const char*)sqlite3_column_text(pStmt, 1);
7194      zSql = (const char*)sqlite3_column_text(pStmt, 2);
7195      if( zName!=0 && zSql!=0 ){
7196        pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7197        break;
7198      }
7199    }
7200  }
7201
7202  shellFinalize(pRc, pStmt);
7203  *pbNoop = bNoop;
7204  return pRet;
7205}
7206
7207/*
7208** Return a RecoverTable object representing the orphans table.
7209*/
7210static RecoverTable *recoverOrphanTable(
7211  ShellState *pState,             /* Shell state object */
7212  int *pRc,                       /* IN/OUT: Error code */
7213  const char *zLostAndFound,      /* Base name for orphans table */
7214  int nCol                        /* Number of user data columns */
7215){
7216  RecoverTable *pTab = 0;
7217  if( nCol>=0 && *pRc==SQLITE_OK ){
7218    int i;
7219
7220    /* This block determines the name of the orphan table. The prefered
7221    ** name is zLostAndFound. But if that clashes with another name
7222    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7223    ** and so on until a non-clashing name is found.  */
7224    int iTab = 0;
7225    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7226    sqlite3_stmt *pTest = 0;
7227    shellPrepare(pState->db, pRc,
7228        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7229    );
7230    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7231    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7232      shellReset(pRc, pTest);
7233      sqlite3_free(zTab);
7234      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7235      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7236    }
7237    shellFinalize(pRc, pTest);
7238
7239    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7240    if( pTab ){
7241      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7242      pTab->nCol = nCol;
7243      pTab->iPk = -2;
7244      if( nCol>0 ){
7245        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7246        if( pTab->azlCol ){
7247          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7248          for(i=nCol-1; i>=0; i--){
7249            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7250          }
7251        }
7252      }
7253
7254      if( *pRc!=SQLITE_OK ){
7255        recoverFreeTable(pTab);
7256        pTab = 0;
7257      }else{
7258        raw_printf(pState->out,
7259            "CREATE TABLE %s(rootpgno INTEGER, "
7260            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7261        );
7262        for(i=0; i<nCol; i++){
7263          raw_printf(pState->out, ", c%d", i);
7264        }
7265        raw_printf(pState->out, ");\n");
7266      }
7267    }
7268    sqlite3_free(zTab);
7269  }
7270  return pTab;
7271}
7272
7273/*
7274** This function is called to recover data from the database. A script
7275** to construct a new database containing all recovered data is output
7276** on stream pState->out.
7277*/
7278static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7279  int rc = SQLITE_OK;
7280  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
7281  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
7282  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
7283  const char *zRecoveryDb = "";   /* Name of "recovery" database */
7284  const char *zLostAndFound = "lost_and_found";
7285  int i;
7286  int nOrphan = -1;
7287  RecoverTable *pOrphan = 0;
7288
7289  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
7290  int bRowids = 1;                /* 0 if --no-rowids */
7291  for(i=1; i<nArg; i++){
7292    char *z = azArg[i];
7293    int n;
7294    if( z[0]=='-' && z[1]=='-' ) z++;
7295    n = strlen30(z);
7296    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7297      bFreelist = 0;
7298    }else
7299    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7300      i++;
7301      zRecoveryDb = azArg[i];
7302    }else
7303    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7304      i++;
7305      zLostAndFound = azArg[i];
7306    }else
7307    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7308      bRowids = 0;
7309    }
7310    else{
7311      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7312      showHelp(pState->out, azArg[0]);
7313      return 1;
7314    }
7315  }
7316
7317  shellExecPrintf(pState->db, &rc,
7318    /* Attach an in-memory database named 'recovery'. Create an indexed
7319    ** cache of the sqlite_dbptr virtual table. */
7320    "PRAGMA writable_schema = on;"
7321    "ATTACH %Q AS recovery;"
7322    "DROP TABLE IF EXISTS recovery.dbptr;"
7323    "DROP TABLE IF EXISTS recovery.freelist;"
7324    "DROP TABLE IF EXISTS recovery.map;"
7325    "DROP TABLE IF EXISTS recovery.schema;"
7326    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7327  );
7328
7329  if( bFreelist ){
7330    shellExec(pState->db, &rc,
7331      "WITH trunk(pgno) AS ("
7332      "  SELECT shell_int32("
7333      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7334      "      WHERE x>0"
7335      "    UNION"
7336      "  SELECT shell_int32("
7337      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7338      "      FROM trunk WHERE x>0"
7339      "),"
7340      "freelist(data, n, freepgno) AS ("
7341      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7342      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7343      "    UNION ALL"
7344      "  SELECT data, n-1, shell_int32(data, 2+n) "
7345      "      FROM freelist WHERE n>=0"
7346      ")"
7347      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7348    );
7349  }
7350
7351  /* If this is an auto-vacuum database, add all pointer-map pages to
7352  ** the freelist table. Do this regardless of whether or not
7353  ** --freelist-corrupt was specified.  */
7354  shellExec(pState->db, &rc,
7355    "WITH ptrmap(pgno) AS ("
7356    "  SELECT 2 WHERE shell_int32("
7357    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7358    "  )"
7359    "    UNION ALL "
7360    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7361    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7362    ")"
7363    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7364  );
7365
7366  shellExec(pState->db, &rc,
7367    "CREATE TABLE recovery.dbptr("
7368    "      pgno, child, PRIMARY KEY(child, pgno)"
7369    ") WITHOUT ROWID;"
7370    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7371    "    SELECT * FROM sqlite_dbptr"
7372    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7373
7374    /* Delete any pointer to page 1. This ensures that page 1 is considered
7375    ** a root page, regardless of how corrupt the db is. */
7376    "DELETE FROM recovery.dbptr WHERE child = 1;"
7377
7378    /* Delete all pointers to any pages that have more than one pointer
7379    ** to them. Such pages will be treated as root pages when recovering
7380    ** data.  */
7381    "DELETE FROM recovery.dbptr WHERE child IN ("
7382    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7383    ");"
7384
7385    /* Create the "map" table that will (eventually) contain instructions
7386    ** for dealing with each page in the db that contains one or more
7387    ** records. */
7388    "CREATE TABLE recovery.map("
7389      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7390    ");"
7391
7392    /* Populate table [map]. If there are circular loops of pages in the
7393    ** database, the following adds all pages in such a loop to the map
7394    ** as individual root pages. This could be handled better.  */
7395    "WITH pages(i, maxlen) AS ("
7396    "  SELECT page_count, ("
7397    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7398    "  ) FROM pragma_page_count WHERE page_count>0"
7399    "    UNION ALL"
7400    "  SELECT i-1, ("
7401    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7402    "  ) FROM pages WHERE i>=2"
7403    ")"
7404    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7405    "  SELECT i, maxlen, NULL, ("
7406    "    WITH p(orig, pgno, parent) AS ("
7407    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7408    "        UNION "
7409    "      SELECT i, p.parent, "
7410    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7411    "    )"
7412    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7413    ") "
7414    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7415    "UPDATE recovery.map AS o SET intkey = ("
7416    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7417    ");"
7418
7419    /* Extract data from page 1 and any linked pages into table
7420    ** recovery.schema. With the same schema as an sqlite_schema table.  */
7421    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7422    "INSERT INTO recovery.schema SELECT "
7423    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
7424    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
7425    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
7426    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
7427    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
7428    "FROM sqlite_dbdata WHERE pgno IN ("
7429    "  SELECT pgno FROM recovery.map WHERE root=1"
7430    ")"
7431    "GROUP BY pgno, cell;"
7432    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7433  );
7434
7435  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7436  ** CREATE TABLE statements that extracted from the existing schema.  */
7437  if( rc==SQLITE_OK ){
7438    sqlite3_stmt *pStmt = 0;
7439    /* ".recover" might output content in an order which causes immediate
7440    ** foreign key constraints to be violated. So disable foreign-key
7441    ** constraint enforcement to prevent problems when running the output
7442    ** script. */
7443    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7444    raw_printf(pState->out, "BEGIN;\n");
7445    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7446    shellPrepare(pState->db, &rc,
7447        "SELECT sql FROM recovery.schema "
7448        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7449    );
7450    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7451      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7452      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7453          &zCreateTable[12]
7454      );
7455    }
7456    shellFinalize(&rc, pStmt);
7457  }
7458
7459  /* Figure out if an orphan table will be required. And if so, how many
7460  ** user columns it should contain */
7461  shellPrepare(pState->db, &rc,
7462      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7463      , &pLoop
7464  );
7465  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7466    nOrphan = sqlite3_column_int(pLoop, 0);
7467  }
7468  shellFinalize(&rc, pLoop);
7469  pLoop = 0;
7470
7471  shellPrepare(pState->db, &rc,
7472      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7473  );
7474
7475  shellPrepare(pState->db, &rc,
7476      "SELECT max(field), group_concat(shell_escape_crnl(quote"
7477      "(case when (? AND field<0) then NULL else value end)"
7478      "), ', ')"
7479      ", min(field) "
7480      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7481      "GROUP BY cell", &pCells
7482  );
7483
7484  /* Loop through each root page. */
7485  shellPrepare(pState->db, &rc,
7486      "SELECT root, intkey, max(maxlen) FROM recovery.map"
7487      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7488      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7489      ")", &pLoop
7490  );
7491  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7492    int iRoot = sqlite3_column_int(pLoop, 0);
7493    int bIntkey = sqlite3_column_int(pLoop, 1);
7494    int nCol = sqlite3_column_int(pLoop, 2);
7495    int bNoop = 0;
7496    RecoverTable *pTab;
7497
7498    assert( bIntkey==0 || bIntkey==1 );
7499    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7500    if( bNoop || rc ) continue;
7501    if( pTab==0 ){
7502      if( pOrphan==0 ){
7503        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7504      }
7505      pTab = pOrphan;
7506      if( pTab==0 ) break;
7507    }
7508
7509    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7510      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7511    }
7512    sqlite3_bind_int(pPages, 1, iRoot);
7513    if( bRowids==0 && pTab->iPk<0 ){
7514      sqlite3_bind_int(pCells, 1, 1);
7515    }else{
7516      sqlite3_bind_int(pCells, 1, 0);
7517    }
7518    sqlite3_bind_int(pCells, 3, pTab->iPk);
7519
7520    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7521      int iPgno = sqlite3_column_int(pPages, 0);
7522      sqlite3_bind_int(pCells, 2, iPgno);
7523      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7524        int nField = sqlite3_column_int(pCells, 0);
7525        int iMin = sqlite3_column_int(pCells, 2);
7526        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7527
7528        RecoverTable *pTab2 = pTab;
7529        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7530          if( pOrphan==0 ){
7531            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7532          }
7533          pTab2 = pOrphan;
7534          if( pTab2==0 ) break;
7535        }
7536
7537        nField = nField+1;
7538        if( pTab2==pOrphan ){
7539          raw_printf(pState->out,
7540              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7541              pTab2->zQuoted, iRoot, iPgno, nField,
7542              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7543          );
7544        }else{
7545          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7546              pTab2->zQuoted, pTab2->azlCol[nField], zVal
7547          );
7548        }
7549      }
7550      shellReset(&rc, pCells);
7551    }
7552    shellReset(&rc, pPages);
7553    if( pTab!=pOrphan ) recoverFreeTable(pTab);
7554  }
7555  shellFinalize(&rc, pLoop);
7556  shellFinalize(&rc, pPages);
7557  shellFinalize(&rc, pCells);
7558  recoverFreeTable(pOrphan);
7559
7560  /* The rest of the schema */
7561  if( rc==SQLITE_OK ){
7562    sqlite3_stmt *pStmt = 0;
7563    shellPrepare(pState->db, &rc,
7564        "SELECT sql, name FROM recovery.schema "
7565        "WHERE sql NOT LIKE 'create table%'", &pStmt
7566    );
7567    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7568      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7569      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7570        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7571        char *zPrint = shellMPrintf(&rc,
7572          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7573          zName, zName, zSql
7574        );
7575        raw_printf(pState->out, "%s;\n", zPrint);
7576        sqlite3_free(zPrint);
7577      }else{
7578        raw_printf(pState->out, "%s;\n", zSql);
7579      }
7580    }
7581    shellFinalize(&rc, pStmt);
7582  }
7583
7584  if( rc==SQLITE_OK ){
7585    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7586    raw_printf(pState->out, "COMMIT;\n");
7587  }
7588  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7589  return rc;
7590}
7591#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7592
7593/*
7594** If an input line begins with "." then invoke this routine to
7595** process that line.
7596**
7597** Return 1 on error, 2 to exit, and 0 otherwise.
7598*/
7599static int do_meta_command(char *zLine, ShellState *p){
7600  int h = 1;
7601  int nArg = 0;
7602  int n, c;
7603  int rc = 0;
7604  char *azArg[52];
7605
7606#ifndef SQLITE_OMIT_VIRTUALTABLE
7607  if( p->expert.pExpert ){
7608    expertFinish(p, 1, 0);
7609  }
7610#endif
7611
7612  /* Parse the input line into tokens.
7613  */
7614  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
7615    while( IsSpace(zLine[h]) ){ h++; }
7616    if( zLine[h]==0 ) break;
7617    if( zLine[h]=='\'' || zLine[h]=='"' ){
7618      int delim = zLine[h++];
7619      azArg[nArg++] = &zLine[h];
7620      while( zLine[h] && zLine[h]!=delim ){
7621        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
7622        h++;
7623      }
7624      if( zLine[h]==delim ){
7625        zLine[h++] = 0;
7626      }
7627      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
7628    }else{
7629      azArg[nArg++] = &zLine[h];
7630      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
7631      if( zLine[h] ) zLine[h++] = 0;
7632      resolve_backslashes(azArg[nArg-1]);
7633    }
7634  }
7635  azArg[nArg] = 0;
7636
7637  /* Process the input line.
7638  */
7639  if( nArg==0 ) return 0; /* no tokens, no error */
7640  n = strlen30(azArg[0]);
7641  c = azArg[0][0];
7642  clearTempFile(p);
7643
7644#ifndef SQLITE_OMIT_AUTHORIZATION
7645  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
7646    if( nArg!=2 ){
7647      raw_printf(stderr, "Usage: .auth ON|OFF\n");
7648      rc = 1;
7649      goto meta_command_exit;
7650    }
7651    open_db(p, 0);
7652    if( booleanValue(azArg[1]) ){
7653      sqlite3_set_authorizer(p->db, shellAuth, p);
7654    }else if( p->bSafeModePersist ){
7655      sqlite3_set_authorizer(p->db, safeModeAuth, p);
7656    }else{
7657      sqlite3_set_authorizer(p->db, 0, 0);
7658    }
7659  }else
7660#endif
7661
7662#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
7663  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
7664    open_db(p, 0);
7665    failIfSafeMode(p, "cannot run .archive in safe mode");
7666    rc = arDotCommand(p, 0, azArg, nArg);
7667  }else
7668#endif
7669
7670  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
7671   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
7672  ){
7673    const char *zDestFile = 0;
7674    const char *zDb = 0;
7675    sqlite3 *pDest;
7676    sqlite3_backup *pBackup;
7677    int j;
7678    int bAsync = 0;
7679    const char *zVfs = 0;
7680    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
7681    for(j=1; j<nArg; j++){
7682      const char *z = azArg[j];
7683      if( z[0]=='-' ){
7684        if( z[1]=='-' ) z++;
7685        if( strcmp(z, "-append")==0 ){
7686          zVfs = "apndvfs";
7687        }else
7688        if( strcmp(z, "-async")==0 ){
7689          bAsync = 1;
7690        }else
7691        {
7692          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
7693          return 1;
7694        }
7695      }else if( zDestFile==0 ){
7696        zDestFile = azArg[j];
7697      }else if( zDb==0 ){
7698        zDb = zDestFile;
7699        zDestFile = azArg[j];
7700      }else{
7701        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
7702        return 1;
7703      }
7704    }
7705    if( zDestFile==0 ){
7706      raw_printf(stderr, "missing FILENAME argument on .backup\n");
7707      return 1;
7708    }
7709    if( zDb==0 ) zDb = "main";
7710    rc = sqlite3_open_v2(zDestFile, &pDest,
7711                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
7712    if( rc!=SQLITE_OK ){
7713      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
7714      close_db(pDest);
7715      return 1;
7716    }
7717    if( bAsync ){
7718      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
7719                   0, 0, 0);
7720    }
7721    open_db(p, 0);
7722    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
7723    if( pBackup==0 ){
7724      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7725      close_db(pDest);
7726      return 1;
7727    }
7728    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
7729    sqlite3_backup_finish(pBackup);
7730    if( rc==SQLITE_DONE ){
7731      rc = 0;
7732    }else{
7733      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7734      rc = 1;
7735    }
7736    close_db(pDest);
7737  }else
7738
7739  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
7740    if( nArg==2 ){
7741      bail_on_error = booleanValue(azArg[1]);
7742    }else{
7743      raw_printf(stderr, "Usage: .bail on|off\n");
7744      rc = 1;
7745    }
7746  }else
7747
7748  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
7749    if( nArg==2 ){
7750      if( booleanValue(azArg[1]) ){
7751        setBinaryMode(p->out, 1);
7752      }else{
7753        setTextMode(p->out, 1);
7754      }
7755    }else{
7756      raw_printf(stderr, "Usage: .binary on|off\n");
7757      rc = 1;
7758    }
7759  }else
7760
7761  /* The undocumented ".breakpoint" command causes a call to the no-op
7762  ** routine named test_breakpoint().
7763  */
7764  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
7765    test_breakpoint();
7766  }else
7767
7768  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
7769    failIfSafeMode(p, "cannot run .cd in safe mode");
7770    if( nArg==2 ){
7771#if defined(_WIN32) || defined(WIN32)
7772      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
7773      rc = !SetCurrentDirectoryW(z);
7774      sqlite3_free(z);
7775#else
7776      rc = chdir(azArg[1]);
7777#endif
7778      if( rc ){
7779        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
7780        rc = 1;
7781      }
7782    }else{
7783      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
7784      rc = 1;
7785    }
7786  }else
7787
7788  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
7789    if( nArg==2 ){
7790      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
7791    }else{
7792      raw_printf(stderr, "Usage: .changes on|off\n");
7793      rc = 1;
7794    }
7795  }else
7796
7797  /* Cancel output redirection, if it is currently set (by .testcase)
7798  ** Then read the content of the testcase-out.txt file and compare against
7799  ** azArg[1].  If there are differences, report an error and exit.
7800  */
7801  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
7802    char *zRes = 0;
7803    output_reset(p);
7804    if( nArg!=2 ){
7805      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
7806      rc = 2;
7807    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
7808      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
7809      rc = 2;
7810    }else if( testcase_glob(azArg[1],zRes)==0 ){
7811      utf8_printf(stderr,
7812                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
7813                 p->zTestcase, azArg[1], zRes);
7814      rc = 1;
7815    }else{
7816      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
7817      p->nCheck++;
7818    }
7819    sqlite3_free(zRes);
7820  }else
7821
7822  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
7823    failIfSafeMode(p, "cannot run .clone in safe mode");
7824    if( nArg==2 ){
7825      tryToClone(p, azArg[1]);
7826    }else{
7827      raw_printf(stderr, "Usage: .clone FILENAME\n");
7828      rc = 1;
7829    }
7830  }else
7831
7832  if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
7833    if( nArg==1 ){
7834      /* List available connections */
7835      int i;
7836      for(i=0; i<ArraySize(p->aAuxDb); i++){
7837        const char *zFile = p->aAuxDb[i].zDbFilename;
7838        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
7839          zFile = "(not open)";
7840        }else if( zFile==0 ){
7841          zFile = "(memory)";
7842        }else if( zFile[0]==0 ){
7843          zFile = "(temporary-file)";
7844        }
7845        if( p->pAuxDb == &p->aAuxDb[i] ){
7846          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
7847        }else if( p->aAuxDb[i].db!=0 ){
7848          utf8_printf(stdout, "       %d: %s\n", i, zFile);
7849        }
7850      }
7851    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
7852      int i = azArg[1][0] - '0';
7853      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
7854        p->pAuxDb->db = p->db;
7855        p->pAuxDb = &p->aAuxDb[i];
7856        globalDb = p->db = p->pAuxDb->db;
7857        p->pAuxDb->db = 0;
7858      }
7859    }else if( nArg==3 && strcmp(azArg[1], "close")==0
7860           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
7861      int i = azArg[2][0] - '0';
7862      if( i<0 || i>=ArraySize(p->aAuxDb) ){
7863        /* No-op */
7864      }else if( p->pAuxDb == &p->aAuxDb[i] ){
7865        raw_printf(stderr, "cannot close the active database connection\n");
7866        rc = 1;
7867      }else if( p->aAuxDb[i].db ){
7868        session_close_all(p, i);
7869        close_db(p->aAuxDb[i].db);
7870        p->aAuxDb[i].db = 0;
7871      }
7872    }else{
7873      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
7874      rc = 1;
7875    }
7876  }else
7877
7878  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
7879    char **azName = 0;
7880    int nName = 0;
7881    sqlite3_stmt *pStmt;
7882    int i;
7883    open_db(p, 0);
7884    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
7885    if( rc ){
7886      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
7887      rc = 1;
7888    }else{
7889      while( sqlite3_step(pStmt)==SQLITE_ROW ){
7890        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
7891        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
7892        if( zSchema==0 || zFile==0 ) continue;
7893        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
7894        shell_check_oom(azName);
7895        azName[nName*2] = strdup(zSchema);
7896        azName[nName*2+1] = strdup(zFile);
7897        nName++;
7898      }
7899    }
7900    sqlite3_finalize(pStmt);
7901    for(i=0; i<nName; i++){
7902      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
7903      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
7904      const char *z = azName[i*2+1];
7905      utf8_printf(p->out, "%s: %s %s%s\n",
7906         azName[i*2],
7907         z && z[0] ? z : "\"\"",
7908         bRdonly ? "r/o" : "r/w",
7909         eTxn==SQLITE_TXN_NONE ? "" :
7910            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
7911      free(azName[i*2]);
7912      free(azName[i*2+1]);
7913    }
7914    sqlite3_free(azName);
7915  }else
7916
7917  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
7918    static const struct DbConfigChoices {
7919      const char *zName;
7920      int op;
7921    } aDbConfig[] = {
7922        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
7923        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
7924        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
7925        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
7926        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
7927        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
7928        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
7929        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
7930        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
7931        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
7932        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
7933        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
7934        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
7935        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
7936        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
7937        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
7938    };
7939    int ii, v;
7940    open_db(p, 0);
7941    for(ii=0; ii<ArraySize(aDbConfig); ii++){
7942      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
7943      if( nArg>=3 ){
7944        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
7945      }
7946      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
7947      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
7948      if( nArg>1 ) break;
7949    }
7950    if( nArg>1 && ii==ArraySize(aDbConfig) ){
7951      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
7952      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
7953    }
7954  }else
7955
7956  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
7957    rc = shell_dbinfo_command(p, nArg, azArg);
7958  }else
7959
7960#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7961  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
7962    open_db(p, 0);
7963    rc = recoverDatabaseCmd(p, nArg, azArg);
7964  }else
7965#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7966
7967  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
7968    char *zLike = 0;
7969    char *zSql;
7970    int i;
7971    int savedShowHeader = p->showHeader;
7972    int savedShellFlags = p->shellFlgs;
7973    ShellClearFlag(p,
7974       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
7975       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
7976    for(i=1; i<nArg; i++){
7977      if( azArg[i][0]=='-' ){
7978        const char *z = azArg[i]+1;
7979        if( z[0]=='-' ) z++;
7980        if( strcmp(z,"preserve-rowids")==0 ){
7981#ifdef SQLITE_OMIT_VIRTUALTABLE
7982          raw_printf(stderr, "The --preserve-rowids option is not compatible"
7983                             " with SQLITE_OMIT_VIRTUALTABLE\n");
7984          rc = 1;
7985          sqlite3_free(zLike);
7986          goto meta_command_exit;
7987#else
7988          ShellSetFlag(p, SHFLG_PreserveRowid);
7989#endif
7990        }else
7991        if( strcmp(z,"newlines")==0 ){
7992          ShellSetFlag(p, SHFLG_Newlines);
7993        }else
7994        if( strcmp(z,"data-only")==0 ){
7995          ShellSetFlag(p, SHFLG_DumpDataOnly);
7996        }else
7997        if( strcmp(z,"nosys")==0 ){
7998          ShellSetFlag(p, SHFLG_DumpNoSys);
7999        }else
8000        {
8001          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8002          rc = 1;
8003          sqlite3_free(zLike);
8004          goto meta_command_exit;
8005        }
8006      }else{
8007        /* azArg[i] contains a LIKE pattern. This ".dump" request should
8008        ** only dump data for tables for which either the table name matches
8009        ** the LIKE pattern, or the table appears to be a shadow table of
8010        ** a virtual table for which the name matches the LIKE pattern.
8011        */
8012        char *zExpr = sqlite3_mprintf(
8013            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8014            "  SELECT 1 FROM sqlite_schema WHERE "
8015            "    name LIKE %Q ESCAPE '\\' AND"
8016            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8017            "    substr(o.name, 1, length(name)+1) == (name||'_')"
8018            ")", azArg[i], azArg[i]
8019        );
8020
8021        if( zLike ){
8022          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8023        }else{
8024          zLike = zExpr;
8025        }
8026      }
8027    }
8028
8029    open_db(p, 0);
8030
8031    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8032      /* When playing back a "dump", the content might appear in an order
8033      ** which causes immediate foreign key constraints to be violated.
8034      ** So disable foreign-key constraint enforcement to prevent problems. */
8035      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8036      raw_printf(p->out, "BEGIN TRANSACTION;\n");
8037    }
8038    p->writableSchema = 0;
8039    p->showHeader = 0;
8040    /* Set writable_schema=ON since doing so forces SQLite to initialize
8041    ** as much of the schema as it can even if the sqlite_schema table is
8042    ** corrupt. */
8043    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8044    p->nErr = 0;
8045    if( zLike==0 ) zLike = sqlite3_mprintf("true");
8046    zSql = sqlite3_mprintf(
8047      "SELECT name, type, sql FROM sqlite_schema AS o "
8048      "WHERE (%s) AND type=='table'"
8049      "  AND sql NOT NULL"
8050      " ORDER BY tbl_name='sqlite_sequence', rowid",
8051      zLike
8052    );
8053    run_schema_dump_query(p,zSql);
8054    sqlite3_free(zSql);
8055    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8056      zSql = sqlite3_mprintf(
8057        "SELECT sql FROM sqlite_schema AS o "
8058        "WHERE (%s) AND sql NOT NULL"
8059        "  AND type IN ('index','trigger','view')",
8060        zLike
8061      );
8062      run_table_dump_query(p, zSql);
8063      sqlite3_free(zSql);
8064    }
8065    sqlite3_free(zLike);
8066    if( p->writableSchema ){
8067      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8068      p->writableSchema = 0;
8069    }
8070    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8071    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8072    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8073      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8074    }
8075    p->showHeader = savedShowHeader;
8076    p->shellFlgs = savedShellFlags;
8077  }else
8078
8079  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8080    if( nArg==2 ){
8081      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8082    }else{
8083      raw_printf(stderr, "Usage: .echo on|off\n");
8084      rc = 1;
8085    }
8086  }else
8087
8088  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8089    if( nArg==2 ){
8090      p->autoEQPtest = 0;
8091      if( p->autoEQPtrace ){
8092        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8093        p->autoEQPtrace = 0;
8094      }
8095      if( strcmp(azArg[1],"full")==0 ){
8096        p->autoEQP = AUTOEQP_full;
8097      }else if( strcmp(azArg[1],"trigger")==0 ){
8098        p->autoEQP = AUTOEQP_trigger;
8099#ifdef SQLITE_DEBUG
8100      }else if( strcmp(azArg[1],"test")==0 ){
8101        p->autoEQP = AUTOEQP_on;
8102        p->autoEQPtest = 1;
8103      }else if( strcmp(azArg[1],"trace")==0 ){
8104        p->autoEQP = AUTOEQP_full;
8105        p->autoEQPtrace = 1;
8106        open_db(p, 0);
8107        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8108        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8109#endif
8110      }else{
8111        p->autoEQP = (u8)booleanValue(azArg[1]);
8112      }
8113    }else{
8114      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8115      rc = 1;
8116    }
8117  }else
8118
8119  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8120    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8121    rc = 2;
8122  }else
8123
8124  /* The ".explain" command is automatic now.  It is largely pointless.  It
8125  ** retained purely for backwards compatibility */
8126  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8127    int val = 1;
8128    if( nArg>=2 ){
8129      if( strcmp(azArg[1],"auto")==0 ){
8130        val = 99;
8131      }else{
8132        val =  booleanValue(azArg[1]);
8133      }
8134    }
8135    if( val==1 && p->mode!=MODE_Explain ){
8136      p->normalMode = p->mode;
8137      p->mode = MODE_Explain;
8138      p->autoExplain = 0;
8139    }else if( val==0 ){
8140      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8141      p->autoExplain = 0;
8142    }else if( val==99 ){
8143      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8144      p->autoExplain = 1;
8145    }
8146  }else
8147
8148#ifndef SQLITE_OMIT_VIRTUALTABLE
8149  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8150    if( p->bSafeMode ){
8151      raw_printf(stderr,
8152        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8153        azArg[0]);
8154      rc = 1;
8155    }else{
8156      open_db(p, 0);
8157      expertDotCommand(p, azArg, nArg);
8158    }
8159  }else
8160#endif
8161
8162  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8163    static const struct {
8164       const char *zCtrlName;   /* Name of a test-control option */
8165       int ctrlCode;            /* Integer code for that option */
8166       const char *zUsage;      /* Usage notes */
8167    } aCtrl[] = {
8168      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8169      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8170      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8171      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8172      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8173   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8174      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8175      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8176      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8177      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8178   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8179    };
8180    int filectrl = -1;
8181    int iCtrl = -1;
8182    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8183    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8184    int n2, i;
8185    const char *zCmd = 0;
8186    const char *zSchema = 0;
8187
8188    open_db(p, 0);
8189    zCmd = nArg>=2 ? azArg[1] : "help";
8190
8191    if( zCmd[0]=='-'
8192     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8193     && nArg>=4
8194    ){
8195      zSchema = azArg[2];
8196      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8197      nArg -= 2;
8198      zCmd = azArg[1];
8199    }
8200
8201    /* The argument can optionally begin with "-" or "--" */
8202    if( zCmd[0]=='-' && zCmd[1] ){
8203      zCmd++;
8204      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8205    }
8206
8207    /* --help lists all file-controls */
8208    if( strcmp(zCmd,"help")==0 ){
8209      utf8_printf(p->out, "Available file-controls:\n");
8210      for(i=0; i<ArraySize(aCtrl); i++){
8211        utf8_printf(p->out, "  .filectrl %s %s\n",
8212                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8213      }
8214      rc = 1;
8215      goto meta_command_exit;
8216    }
8217
8218    /* convert filectrl text option to value. allow any unique prefix
8219    ** of the option name, or a numerical value. */
8220    n2 = strlen30(zCmd);
8221    for(i=0; i<ArraySize(aCtrl); i++){
8222      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8223        if( filectrl<0 ){
8224          filectrl = aCtrl[i].ctrlCode;
8225          iCtrl = i;
8226        }else{
8227          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8228                              "Use \".filectrl --help\" for help\n", zCmd);
8229          rc = 1;
8230          goto meta_command_exit;
8231        }
8232      }
8233    }
8234    if( filectrl<0 ){
8235      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8236                         "Use \".filectrl --help\" for help\n", zCmd);
8237    }else{
8238      switch(filectrl){
8239        case SQLITE_FCNTL_SIZE_LIMIT: {
8240          if( nArg!=2 && nArg!=3 ) break;
8241          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8242          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8243          isOk = 1;
8244          break;
8245        }
8246        case SQLITE_FCNTL_LOCK_TIMEOUT:
8247        case SQLITE_FCNTL_CHUNK_SIZE: {
8248          int x;
8249          if( nArg!=3 ) break;
8250          x = (int)integerValue(azArg[2]);
8251          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8252          isOk = 2;
8253          break;
8254        }
8255        case SQLITE_FCNTL_PERSIST_WAL:
8256        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8257          int x;
8258          if( nArg!=2 && nArg!=3 ) break;
8259          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8260          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8261          iRes = x;
8262          isOk = 1;
8263          break;
8264        }
8265        case SQLITE_FCNTL_DATA_VERSION:
8266        case SQLITE_FCNTL_HAS_MOVED: {
8267          int x;
8268          if( nArg!=2 ) break;
8269          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8270          iRes = x;
8271          isOk = 1;
8272          break;
8273        }
8274        case SQLITE_FCNTL_TEMPFILENAME: {
8275          char *z = 0;
8276          if( nArg!=2 ) break;
8277          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8278          if( z ){
8279            utf8_printf(p->out, "%s\n", z);
8280            sqlite3_free(z);
8281          }
8282          isOk = 2;
8283          break;
8284        }
8285        case SQLITE_FCNTL_RESERVE_BYTES: {
8286          int x;
8287          if( nArg>=3 ){
8288            x = atoi(azArg[2]);
8289            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8290          }
8291          x = -1;
8292          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8293          utf8_printf(p->out,"%d\n", x);
8294          isOk = 2;
8295          break;
8296        }
8297      }
8298    }
8299    if( isOk==0 && iCtrl>=0 ){
8300      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8301      rc = 1;
8302    }else if( isOk==1 ){
8303      char zBuf[100];
8304      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8305      raw_printf(p->out, "%s\n", zBuf);
8306    }
8307  }else
8308
8309  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8310    ShellState data;
8311    int doStats = 0;
8312    memcpy(&data, p, sizeof(data));
8313    data.showHeader = 0;
8314    data.cMode = data.mode = MODE_Semi;
8315    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8316      data.cMode = data.mode = MODE_Pretty;
8317      nArg = 1;
8318    }
8319    if( nArg!=1 ){
8320      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8321      rc = 1;
8322      goto meta_command_exit;
8323    }
8324    open_db(p, 0);
8325    rc = sqlite3_exec(p->db,
8326       "SELECT sql FROM"
8327       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8328       "     FROM sqlite_schema UNION ALL"
8329       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8330       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8331       "ORDER BY x",
8332       callback, &data, 0
8333    );
8334    if( rc==SQLITE_OK ){
8335      sqlite3_stmt *pStmt;
8336      rc = sqlite3_prepare_v2(p->db,
8337               "SELECT rowid FROM sqlite_schema"
8338               " WHERE name GLOB 'sqlite_stat[134]'",
8339               -1, &pStmt, 0);
8340      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8341      sqlite3_finalize(pStmt);
8342    }
8343    if( doStats==0 ){
8344      raw_printf(p->out, "/* No STAT tables available */\n");
8345    }else{
8346      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8347      data.cMode = data.mode = MODE_Insert;
8348      data.zDestTable = "sqlite_stat1";
8349      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8350      data.zDestTable = "sqlite_stat4";
8351      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8352      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8353    }
8354  }else
8355
8356  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8357    if( nArg==2 ){
8358      p->showHeader = booleanValue(azArg[1]);
8359      p->shellFlgs |= SHFLG_HeaderSet;
8360    }else{
8361      raw_printf(stderr, "Usage: .headers on|off\n");
8362      rc = 1;
8363    }
8364  }else
8365
8366  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8367    if( nArg>=2 ){
8368      n = showHelp(p->out, azArg[1]);
8369      if( n==0 ){
8370        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8371      }
8372    }else{
8373      showHelp(p->out, 0);
8374    }
8375  }else
8376
8377  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8378    char *zTable = 0;           /* Insert data into this table */
8379    char *zFile = 0;            /* Name of file to extra content from */
8380    sqlite3_stmt *pStmt = NULL; /* A statement */
8381    int nCol;                   /* Number of columns in the table */
8382    int nByte;                  /* Number of bytes in an SQL string */
8383    int i, j;                   /* Loop counters */
8384    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8385    int nSep;                   /* Number of bytes in p->colSeparator[] */
8386    char *zSql;                 /* An SQL statement */
8387    ImportCtx sCtx;             /* Reader context */
8388    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8389    int eVerbose = 0;           /* Larger for more console output */
8390    int nSkip = 0;              /* Initial lines to skip */
8391    int useOutputMode = 1;      /* Use output mode to determine separators */
8392
8393    failIfSafeMode(p, "cannot run .import in safe mode");
8394    memset(&sCtx, 0, sizeof(sCtx));
8395    sCtx.z = sqlite3_malloc64(120);
8396    if( sCtx.z==0 ){
8397      import_cleanup(&sCtx);
8398      shell_out_of_memory();
8399    }
8400    if( p->mode==MODE_Ascii ){
8401      xRead = ascii_read_one_field;
8402    }else{
8403      xRead = csv_read_one_field;
8404    }
8405    for(i=1; i<nArg; i++){
8406      char *z = azArg[i];
8407      if( z[0]=='-' && z[1]=='-' ) z++;
8408      if( z[0]!='-' ){
8409        if( zFile==0 ){
8410          zFile = z;
8411        }else if( zTable==0 ){
8412          zTable = z;
8413        }else{
8414          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8415          showHelp(p->out, "import");
8416          rc = 1;
8417          goto meta_command_exit;
8418        }
8419      }else if( strcmp(z,"-v")==0 ){
8420        eVerbose++;
8421      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8422        nSkip = integerValue(azArg[++i]);
8423      }else if( strcmp(z,"-ascii")==0 ){
8424        sCtx.cColSep = SEP_Unit[0];
8425        sCtx.cRowSep = SEP_Record[0];
8426        xRead = ascii_read_one_field;
8427        useOutputMode = 0;
8428      }else if( strcmp(z,"-csv")==0 ){
8429        sCtx.cColSep = ',';
8430        sCtx.cRowSep = '\n';
8431        xRead = csv_read_one_field;
8432        useOutputMode = 0;
8433      }else{
8434        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8435        showHelp(p->out, "import");
8436        rc = 1;
8437        goto meta_command_exit;
8438      }
8439    }
8440    if( zTable==0 ){
8441      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8442                  zFile==0 ? "FILE" : "TABLE");
8443      showHelp(p->out, "import");
8444      rc = 1;
8445      goto meta_command_exit;
8446    }
8447    seenInterrupt = 0;
8448    open_db(p, 0);
8449    if( useOutputMode ){
8450      /* If neither the --csv or --ascii options are specified, then set
8451      ** the column and row separator characters from the output mode. */
8452      nSep = strlen30(p->colSeparator);
8453      if( nSep==0 ){
8454        raw_printf(stderr,
8455                   "Error: non-null column separator required for import\n");
8456        rc = 1;
8457        goto meta_command_exit;
8458      }
8459      if( nSep>1 ){
8460        raw_printf(stderr,
8461              "Error: multi-character column separators not allowed"
8462              " for import\n");
8463        rc = 1;
8464        goto meta_command_exit;
8465      }
8466      nSep = strlen30(p->rowSeparator);
8467      if( nSep==0 ){
8468        raw_printf(stderr,
8469            "Error: non-null row separator required for import\n");
8470        rc = 1;
8471        goto meta_command_exit;
8472      }
8473      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8474        /* When importing CSV (only), if the row separator is set to the
8475        ** default output row separator, change it to the default input
8476        ** row separator.  This avoids having to maintain different input
8477        ** and output row separators. */
8478        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8479        nSep = strlen30(p->rowSeparator);
8480      }
8481      if( nSep>1 ){
8482        raw_printf(stderr, "Error: multi-character row separators not allowed"
8483                           " for import\n");
8484        rc = 1;
8485        goto meta_command_exit;
8486      }
8487      sCtx.cColSep = p->colSeparator[0];
8488      sCtx.cRowSep = p->rowSeparator[0];
8489    }
8490    sCtx.zFile = zFile;
8491    sCtx.nLine = 1;
8492    if( sCtx.zFile[0]=='|' ){
8493#ifdef SQLITE_OMIT_POPEN
8494      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8495      rc = 1;
8496      goto meta_command_exit;
8497#else
8498      sCtx.in = popen(sCtx.zFile+1, "r");
8499      sCtx.zFile = "<pipe>";
8500      sCtx.xCloser = pclose;
8501#endif
8502    }else{
8503      sCtx.in = fopen(sCtx.zFile, "rb");
8504      sCtx.xCloser = fclose;
8505    }
8506    if( sCtx.in==0 ){
8507      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8508      rc = 1;
8509      import_cleanup(&sCtx);
8510      goto meta_command_exit;
8511    }
8512    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8513      char zSep[2];
8514      zSep[1] = 0;
8515      zSep[0] = sCtx.cColSep;
8516      utf8_printf(p->out, "Column separator ");
8517      output_c_string(p->out, zSep);
8518      utf8_printf(p->out, ", row separator ");
8519      zSep[0] = sCtx.cRowSep;
8520      output_c_string(p->out, zSep);
8521      utf8_printf(p->out, "\n");
8522    }
8523    while( (nSkip--)>0 ){
8524      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8525    }
8526    zSql = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
8527    if( zSql==0 ){
8528      import_cleanup(&sCtx);
8529      shell_out_of_memory();
8530    }
8531    nByte = strlen30(zSql);
8532    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8533    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8534    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8535      char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\"", zTable);
8536      char cSep = '(';
8537      while( xRead(&sCtx) ){
8538        zCreate = sqlite3_mprintf("%z%c\n  \"%w\" TEXT", zCreate, cSep, sCtx.z);
8539        cSep = ',';
8540        if( sCtx.cTerm!=sCtx.cColSep ) break;
8541      }
8542      if( cSep=='(' ){
8543        sqlite3_free(zCreate);
8544        import_cleanup(&sCtx);
8545        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
8546        rc = 1;
8547        goto meta_command_exit;
8548      }
8549      zCreate = sqlite3_mprintf("%z\n)", zCreate);
8550      if( eVerbose>=1 ){
8551        utf8_printf(p->out, "%s\n", zCreate);
8552      }
8553      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
8554      sqlite3_free(zCreate);
8555      if( rc ){
8556        utf8_printf(stderr, "CREATE TABLE \"%s\"(...) failed: %s\n", zTable,
8557                sqlite3_errmsg(p->db));
8558        import_cleanup(&sCtx);
8559        rc = 1;
8560        goto meta_command_exit;
8561      }
8562      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8563    }
8564    sqlite3_free(zSql);
8565    if( rc ){
8566      if (pStmt) sqlite3_finalize(pStmt);
8567      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
8568      import_cleanup(&sCtx);
8569      rc = 1;
8570      goto meta_command_exit;
8571    }
8572    nCol = sqlite3_column_count(pStmt);
8573    sqlite3_finalize(pStmt);
8574    pStmt = 0;
8575    if( nCol==0 ) return 0; /* no columns, no error */
8576    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
8577    if( zSql==0 ){
8578      import_cleanup(&sCtx);
8579      shell_out_of_memory();
8580    }
8581    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
8582    j = strlen30(zSql);
8583    for(i=1; i<nCol; i++){
8584      zSql[j++] = ',';
8585      zSql[j++] = '?';
8586    }
8587    zSql[j++] = ')';
8588    zSql[j] = 0;
8589    if( eVerbose>=2 ){
8590      utf8_printf(p->out, "Insert using: %s\n", zSql);
8591    }
8592    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8593    sqlite3_free(zSql);
8594    if( rc ){
8595      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8596      if (pStmt) sqlite3_finalize(pStmt);
8597      import_cleanup(&sCtx);
8598      rc = 1;
8599      goto meta_command_exit;
8600    }
8601    needCommit = sqlite3_get_autocommit(p->db);
8602    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
8603    do{
8604      int startLine = sCtx.nLine;
8605      for(i=0; i<nCol; i++){
8606        char *z = xRead(&sCtx);
8607        /*
8608        ** Did we reach end-of-file before finding any columns?
8609        ** If so, stop instead of NULL filling the remaining columns.
8610        */
8611        if( z==0 && i==0 ) break;
8612        /*
8613        ** Did we reach end-of-file OR end-of-line before finding any
8614        ** columns in ASCII mode?  If so, stop instead of NULL filling
8615        ** the remaining columns.
8616        */
8617        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
8618        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
8619        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
8620          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8621                          "filling the rest with NULL\n",
8622                          sCtx.zFile, startLine, nCol, i+1);
8623          i += 2;
8624          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
8625        }
8626      }
8627      if( sCtx.cTerm==sCtx.cColSep ){
8628        do{
8629          xRead(&sCtx);
8630          i++;
8631        }while( sCtx.cTerm==sCtx.cColSep );
8632        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8633                        "extras ignored\n",
8634                        sCtx.zFile, startLine, nCol, i);
8635      }
8636      if( i>=nCol ){
8637        sqlite3_step(pStmt);
8638        rc = sqlite3_reset(pStmt);
8639        if( rc!=SQLITE_OK ){
8640          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
8641                      startLine, sqlite3_errmsg(p->db));
8642          sCtx.nErr++;
8643        }else{
8644          sCtx.nRow++;
8645        }
8646      }
8647    }while( sCtx.cTerm!=EOF );
8648
8649    import_cleanup(&sCtx);
8650    sqlite3_finalize(pStmt);
8651    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
8652    if( eVerbose>0 ){
8653      utf8_printf(p->out,
8654          "Added %d rows with %d errors using %d lines of input\n",
8655          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
8656    }
8657  }else
8658
8659#ifndef SQLITE_UNTESTABLE
8660  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
8661    char *zSql;
8662    char *zCollist = 0;
8663    sqlite3_stmt *pStmt;
8664    int tnum = 0;
8665    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
8666    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
8667    int i;
8668    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
8669      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
8670                          "       .imposter off\n");
8671      /* Also allowed, but not documented:
8672      **
8673      **    .imposter TABLE IMPOSTER
8674      **
8675      ** where TABLE is a WITHOUT ROWID table.  In that case, the
8676      ** imposter is another WITHOUT ROWID table with the columns in
8677      ** storage order. */
8678      rc = 1;
8679      goto meta_command_exit;
8680    }
8681    open_db(p, 0);
8682    if( nArg==2 ){
8683      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
8684      goto meta_command_exit;
8685    }
8686    zSql = sqlite3_mprintf(
8687      "SELECT rootpage, 0 FROM sqlite_schema"
8688      " WHERE name='%q' AND type='index'"
8689      "UNION ALL "
8690      "SELECT rootpage, 1 FROM sqlite_schema"
8691      " WHERE name='%q' AND type='table'"
8692      "   AND sql LIKE '%%without%%rowid%%'",
8693      azArg[1], azArg[1]
8694    );
8695    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8696    sqlite3_free(zSql);
8697    if( sqlite3_step(pStmt)==SQLITE_ROW ){
8698      tnum = sqlite3_column_int(pStmt, 0);
8699      isWO = sqlite3_column_int(pStmt, 1);
8700    }
8701    sqlite3_finalize(pStmt);
8702    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
8703    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8704    sqlite3_free(zSql);
8705    i = 0;
8706    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
8707      char zLabel[20];
8708      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
8709      i++;
8710      if( zCol==0 ){
8711        if( sqlite3_column_int(pStmt,1)==-1 ){
8712          zCol = "_ROWID_";
8713        }else{
8714          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
8715          zCol = zLabel;
8716        }
8717      }
8718      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
8719        lenPK = (int)strlen(zCollist);
8720      }
8721      if( zCollist==0 ){
8722        zCollist = sqlite3_mprintf("\"%w\"", zCol);
8723      }else{
8724        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
8725      }
8726    }
8727    sqlite3_finalize(pStmt);
8728    if( i==0 || tnum==0 ){
8729      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
8730      rc = 1;
8731      sqlite3_free(zCollist);
8732      goto meta_command_exit;
8733    }
8734    if( lenPK==0 ) lenPK = 100000;
8735    zSql = sqlite3_mprintf(
8736          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
8737          azArg[2], zCollist, lenPK, zCollist);
8738    sqlite3_free(zCollist);
8739    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
8740    if( rc==SQLITE_OK ){
8741      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
8742      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
8743      if( rc ){
8744        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
8745      }else{
8746        utf8_printf(stdout, "%s;\n", zSql);
8747        raw_printf(stdout,
8748          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
8749          azArg[1], isWO ? "table" : "index"
8750        );
8751      }
8752    }else{
8753      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
8754      rc = 1;
8755    }
8756    sqlite3_free(zSql);
8757  }else
8758#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
8759
8760#ifdef SQLITE_ENABLE_IOTRACE
8761  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
8762    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
8763    if( iotrace && iotrace!=stdout ) fclose(iotrace);
8764    iotrace = 0;
8765    if( nArg<2 ){
8766      sqlite3IoTrace = 0;
8767    }else if( strcmp(azArg[1], "-")==0 ){
8768      sqlite3IoTrace = iotracePrintf;
8769      iotrace = stdout;
8770    }else{
8771      iotrace = fopen(azArg[1], "w");
8772      if( iotrace==0 ){
8773        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
8774        sqlite3IoTrace = 0;
8775        rc = 1;
8776      }else{
8777        sqlite3IoTrace = iotracePrintf;
8778      }
8779    }
8780  }else
8781#endif
8782
8783  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
8784    static const struct {
8785       const char *zLimitName;   /* Name of a limit */
8786       int limitCode;            /* Integer code for that limit */
8787    } aLimit[] = {
8788      { "length",                SQLITE_LIMIT_LENGTH                    },
8789      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
8790      { "column",                SQLITE_LIMIT_COLUMN                    },
8791      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
8792      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
8793      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
8794      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
8795      { "attached",              SQLITE_LIMIT_ATTACHED                  },
8796      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
8797      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
8798      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
8799      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
8800    };
8801    int i, n2;
8802    open_db(p, 0);
8803    if( nArg==1 ){
8804      for(i=0; i<ArraySize(aLimit); i++){
8805        printf("%20s %d\n", aLimit[i].zLimitName,
8806               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
8807      }
8808    }else if( nArg>3 ){
8809      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
8810      rc = 1;
8811      goto meta_command_exit;
8812    }else{
8813      int iLimit = -1;
8814      n2 = strlen30(azArg[1]);
8815      for(i=0; i<ArraySize(aLimit); i++){
8816        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
8817          if( iLimit<0 ){
8818            iLimit = i;
8819          }else{
8820            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
8821            rc = 1;
8822            goto meta_command_exit;
8823          }
8824        }
8825      }
8826      if( iLimit<0 ){
8827        utf8_printf(stderr, "unknown limit: \"%s\"\n"
8828                        "enter \".limits\" with no arguments for a list.\n",
8829                         azArg[1]);
8830        rc = 1;
8831        goto meta_command_exit;
8832      }
8833      if( nArg==3 ){
8834        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
8835                      (int)integerValue(azArg[2]));
8836      }
8837      printf("%20s %d\n", aLimit[iLimit].zLimitName,
8838             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
8839    }
8840  }else
8841
8842  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
8843    open_db(p, 0);
8844    lintDotCommand(p, azArg, nArg);
8845  }else
8846
8847#ifndef SQLITE_OMIT_LOAD_EXTENSION
8848  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
8849    const char *zFile, *zProc;
8850    char *zErrMsg = 0;
8851    failIfSafeMode(p, "cannot run .load in safe mode");
8852    if( nArg<2 ){
8853      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
8854      rc = 1;
8855      goto meta_command_exit;
8856    }
8857    zFile = azArg[1];
8858    zProc = nArg>=3 ? azArg[2] : 0;
8859    open_db(p, 0);
8860    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
8861    if( rc!=SQLITE_OK ){
8862      utf8_printf(stderr, "Error: %s\n", zErrMsg);
8863      sqlite3_free(zErrMsg);
8864      rc = 1;
8865    }
8866  }else
8867#endif
8868
8869  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
8870    failIfSafeMode(p, "cannot run .log in safe mode");
8871    if( nArg!=2 ){
8872      raw_printf(stderr, "Usage: .log FILENAME\n");
8873      rc = 1;
8874    }else{
8875      const char *zFile = azArg[1];
8876      output_file_close(p->pLog);
8877      p->pLog = output_file_open(zFile, 0);
8878    }
8879  }else
8880
8881  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
8882    const char *zMode = nArg>=2 ? azArg[1] : "";
8883    int n2 = strlen30(zMode);
8884    int c2 = zMode[0];
8885    if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
8886      p->mode = MODE_Line;
8887      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8888    }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
8889      p->mode = MODE_Column;
8890      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
8891        p->showHeader = 1;
8892      }
8893      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8894    }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
8895      p->mode = MODE_List;
8896      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
8897      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8898    }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
8899      p->mode = MODE_Html;
8900    }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
8901      p->mode = MODE_Tcl;
8902      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
8903      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8904    }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
8905      p->mode = MODE_Csv;
8906      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8907      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
8908    }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
8909      p->mode = MODE_List;
8910      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
8911    }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
8912      p->mode = MODE_Insert;
8913      set_table_name(p, nArg>=3 ? azArg[2] : "table");
8914    }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
8915      p->mode = MODE_Quote;
8916      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8917      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8918    }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
8919      p->mode = MODE_Ascii;
8920      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
8921      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
8922    }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){
8923      p->mode = MODE_Markdown;
8924    }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){
8925      p->mode = MODE_Table;
8926    }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){
8927      p->mode = MODE_Box;
8928    }else if( c2=='c' && strncmp(azArg[1],"count",n2)==0 ){
8929      p->mode = MODE_Count;
8930    }else if( c2=='o' && strncmp(azArg[1],"off",n2)==0 ){
8931      p->mode = MODE_Off;
8932    }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){
8933      p->mode = MODE_Json;
8934    }else if( nArg==1 ){
8935      raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
8936    }else{
8937      raw_printf(stderr, "Error: mode should be one of: "
8938         "ascii box column csv html insert json line list markdown "
8939         "quote table tabs tcl\n");
8940      rc = 1;
8941    }
8942    p->cMode = p->mode;
8943  }else
8944
8945  if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
8946    if( nArg!=2 ){
8947      raw_printf(stderr, "Usage: .nonce NONCE\n");
8948      rc = 1;
8949    }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
8950      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
8951                 p->lineno, azArg[1]);
8952      exit(1);
8953    }else{
8954      p->bSafeMode = 0;
8955      return 0;  /* Return immediately to bypass the safe mode reset
8956                 ** at the end of this procedure */
8957    }
8958  }else
8959
8960  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
8961    if( nArg==2 ){
8962      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
8963                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
8964    }else{
8965      raw_printf(stderr, "Usage: .nullvalue STRING\n");
8966      rc = 1;
8967    }
8968  }else
8969
8970  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
8971    const char *zFN = 0;     /* Pointer to constant filename */
8972    char *zNewFilename = 0;  /* Name of the database file to open */
8973    int iName = 1;           /* Index in azArg[] of the filename */
8974    int newFlag = 0;         /* True to delete file before opening */
8975    int openMode = SHELL_OPEN_UNSPEC;
8976
8977    /* Check for command-line arguments */
8978    for(iName=1; iName<nArg; iName++){
8979      const char *z = azArg[iName];
8980      if( optionMatch(z,"new") ){
8981        newFlag = 1;
8982#ifdef SQLITE_HAVE_ZLIB
8983      }else if( optionMatch(z, "zip") ){
8984        openMode = SHELL_OPEN_ZIPFILE;
8985#endif
8986      }else if( optionMatch(z, "append") ){
8987        openMode = SHELL_OPEN_APPENDVFS;
8988      }else if( optionMatch(z, "readonly") ){
8989        openMode = SHELL_OPEN_READONLY;
8990      }else if( optionMatch(z, "nofollow") ){
8991        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
8992#ifndef SQLITE_OMIT_DESERIALIZE
8993      }else if( optionMatch(z, "deserialize") ){
8994        openMode = SHELL_OPEN_DESERIALIZE;
8995      }else if( optionMatch(z, "hexdb") ){
8996        openMode = SHELL_OPEN_HEXDB;
8997      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
8998        p->szMax = integerValue(azArg[++iName]);
8999#endif /* SQLITE_OMIT_DESERIALIZE */
9000      }else if( z[0]=='-' ){
9001        utf8_printf(stderr, "unknown option: %s\n", z);
9002        rc = 1;
9003        goto meta_command_exit;
9004      }else if( zFN ){
9005        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9006        rc = 1;
9007        goto meta_command_exit;
9008      }else{
9009        zFN = z;
9010      }
9011    }
9012
9013    /* Close the existing database */
9014    session_close_all(p, -1);
9015    close_db(p->db);
9016    p->db = 0;
9017    p->pAuxDb->zDbFilename = 0;
9018    sqlite3_free(p->pAuxDb->zFreeOnClose);
9019    p->pAuxDb->zFreeOnClose = 0;
9020    p->openMode = openMode;
9021    p->openFlags = 0;
9022    p->szMax = 0;
9023
9024    /* If a filename is specified, try to open it first */
9025    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9026      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9027      if( p->bSafeMode
9028       && p->openMode!=SHELL_OPEN_HEXDB
9029       && zFN
9030       && strcmp(zFN,":memory:")!=0
9031      ){
9032        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9033      }
9034      if( zFN ){
9035        zNewFilename = sqlite3_mprintf("%s", zFN);
9036        shell_check_oom(zNewFilename);
9037      }else{
9038        zNewFilename = 0;
9039      }
9040      p->pAuxDb->zDbFilename = zNewFilename;
9041      open_db(p, OPEN_DB_KEEPALIVE);
9042      if( p->db==0 ){
9043        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9044        sqlite3_free(zNewFilename);
9045      }else{
9046        p->pAuxDb->zFreeOnClose = zNewFilename;
9047      }
9048    }
9049    if( p->db==0 ){
9050      /* As a fall-back open a TEMP database */
9051      p->pAuxDb->zDbFilename = 0;
9052      open_db(p, 0);
9053    }
9054  }else
9055
9056  if( (c=='o'
9057        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9058   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9059  ){
9060    char *zFile = 0;
9061    int bTxtMode = 0;
9062    int i;
9063    int eMode = 0;
9064    int bBOM = 0;
9065    int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
9066
9067    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9068    if( c=='e' ){
9069      eMode = 'x';
9070      bOnce = 2;
9071    }else if( strncmp(azArg[0],"once",n)==0 ){
9072      bOnce = 1;
9073    }
9074    for(i=1; i<nArg; i++){
9075      char *z = azArg[i];
9076      if( z[0]=='-' ){
9077        if( z[1]=='-' ) z++;
9078        if( strcmp(z,"-bom")==0 ){
9079          bBOM = 1;
9080        }else if( c!='e' && strcmp(z,"-x")==0 ){
9081          eMode = 'x';  /* spreadsheet */
9082        }else if( c!='e' && strcmp(z,"-e")==0 ){
9083          eMode = 'e';  /* text editor */
9084        }else{
9085          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9086                      azArg[i]);
9087          showHelp(p->out, azArg[0]);
9088          rc = 1;
9089          goto meta_command_exit;
9090        }
9091      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9092        zFile = sqlite3_mprintf("%s", z);
9093        if( zFile && zFile[0]=='|' ){
9094          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9095          break;
9096        }
9097      }else{
9098        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9099                    azArg[i]);
9100        showHelp(p->out, azArg[0]);
9101        rc = 1;
9102        sqlite3_free(zFile);
9103        goto meta_command_exit;
9104      }
9105    }
9106    if( zFile==0 ){
9107      zFile = sqlite3_mprintf("stdout");
9108    }
9109    if( bOnce ){
9110      p->outCount = 2;
9111    }else{
9112      p->outCount = 0;
9113    }
9114    output_reset(p);
9115#ifndef SQLITE_NOHAVE_SYSTEM
9116    if( eMode=='e' || eMode=='x' ){
9117      p->doXdgOpen = 1;
9118      outputModePush(p);
9119      if( eMode=='x' ){
9120        /* spreadsheet mode.  Output as CSV. */
9121        newTempFile(p, "csv");
9122        ShellClearFlag(p, SHFLG_Echo);
9123        p->mode = MODE_Csv;
9124        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9125        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9126      }else{
9127        /* text editor mode */
9128        newTempFile(p, "txt");
9129        bTxtMode = 1;
9130      }
9131      sqlite3_free(zFile);
9132      zFile = sqlite3_mprintf("%s", p->zTempFile);
9133    }
9134#endif /* SQLITE_NOHAVE_SYSTEM */
9135    shell_check_oom(zFile);
9136    if( zFile[0]=='|' ){
9137#ifdef SQLITE_OMIT_POPEN
9138      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9139      rc = 1;
9140      p->out = stdout;
9141#else
9142      p->out = popen(zFile + 1, "w");
9143      if( p->out==0 ){
9144        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9145        p->out = stdout;
9146        rc = 1;
9147      }else{
9148        if( bBOM ) fprintf(p->out,"\357\273\277");
9149        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9150      }
9151#endif
9152    }else{
9153      p->out = output_file_open(zFile, bTxtMode);
9154      if( p->out==0 ){
9155        if( strcmp(zFile,"off")!=0 ){
9156          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9157        }
9158        p->out = stdout;
9159        rc = 1;
9160      } else {
9161        if( bBOM ) fprintf(p->out,"\357\273\277");
9162        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9163      }
9164    }
9165    sqlite3_free(zFile);
9166  }else
9167
9168  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9169    open_db(p,0);
9170    if( nArg<=1 ) goto parameter_syntax_error;
9171
9172    /* .parameter clear
9173    ** Clear all bind parameters by dropping the TEMP table that holds them.
9174    */
9175    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9176      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9177                   0, 0, 0);
9178    }else
9179
9180    /* .parameter list
9181    ** List all bind parameters.
9182    */
9183    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9184      sqlite3_stmt *pStmt = 0;
9185      int rx;
9186      int len = 0;
9187      rx = sqlite3_prepare_v2(p->db,
9188             "SELECT max(length(key)) "
9189             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9190      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9191        len = sqlite3_column_int(pStmt, 0);
9192        if( len>40 ) len = 40;
9193      }
9194      sqlite3_finalize(pStmt);
9195      pStmt = 0;
9196      if( len ){
9197        rx = sqlite3_prepare_v2(p->db,
9198             "SELECT key, quote(value) "
9199             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9200        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9201          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9202                      sqlite3_column_text(pStmt,1));
9203        }
9204        sqlite3_finalize(pStmt);
9205      }
9206    }else
9207
9208    /* .parameter init
9209    ** Make sure the TEMP table used to hold bind parameters exists.
9210    ** Create it if necessary.
9211    */
9212    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9213      bind_table_init(p);
9214    }else
9215
9216    /* .parameter set NAME VALUE
9217    ** Set or reset a bind parameter.  NAME should be the full parameter
9218    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9219    ** VALUE can be in either SQL literal notation, or if not it will be
9220    ** understood to be a text string.
9221    */
9222    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9223      int rx;
9224      char *zSql;
9225      sqlite3_stmt *pStmt;
9226      const char *zKey = azArg[2];
9227      const char *zValue = azArg[3];
9228      bind_table_init(p);
9229      zSql = sqlite3_mprintf(
9230                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9231                  "VALUES(%Q,%s);", zKey, zValue);
9232      shell_check_oom(zSql);
9233      pStmt = 0;
9234      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9235      sqlite3_free(zSql);
9236      if( rx!=SQLITE_OK ){
9237        sqlite3_finalize(pStmt);
9238        pStmt = 0;
9239        zSql = sqlite3_mprintf(
9240                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9241                   "VALUES(%Q,%Q);", zKey, zValue);
9242        shell_check_oom(zSql);
9243        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9244        sqlite3_free(zSql);
9245        if( rx!=SQLITE_OK ){
9246          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9247          sqlite3_finalize(pStmt);
9248          pStmt = 0;
9249          rc = 1;
9250        }
9251      }
9252      sqlite3_step(pStmt);
9253      sqlite3_finalize(pStmt);
9254    }else
9255
9256    /* .parameter unset NAME
9257    ** Remove the NAME binding from the parameter binding table, if it
9258    ** exists.
9259    */
9260    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9261      char *zSql = sqlite3_mprintf(
9262          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9263      shell_check_oom(zSql);
9264      sqlite3_exec(p->db, zSql, 0, 0, 0);
9265      sqlite3_free(zSql);
9266    }else
9267    /* If no command name matches, show a syntax error */
9268    parameter_syntax_error:
9269    showHelp(p->out, "parameter");
9270  }else
9271
9272  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9273    int i;
9274    for(i=1; i<nArg; i++){
9275      if( i>1 ) raw_printf(p->out, " ");
9276      utf8_printf(p->out, "%s", azArg[i]);
9277    }
9278    raw_printf(p->out, "\n");
9279  }else
9280
9281#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9282  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9283    int i;
9284    int nn = 0;
9285    p->flgProgress = 0;
9286    p->mxProgress = 0;
9287    p->nProgress = 0;
9288    for(i=1; i<nArg; i++){
9289      const char *z = azArg[i];
9290      if( z[0]=='-' ){
9291        z++;
9292        if( z[0]=='-' ) z++;
9293        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9294          p->flgProgress |= SHELL_PROGRESS_QUIET;
9295          continue;
9296        }
9297        if( strcmp(z,"reset")==0 ){
9298          p->flgProgress |= SHELL_PROGRESS_RESET;
9299          continue;
9300        }
9301        if( strcmp(z,"once")==0 ){
9302          p->flgProgress |= SHELL_PROGRESS_ONCE;
9303          continue;
9304        }
9305        if( strcmp(z,"limit")==0 ){
9306          if( i+1>=nArg ){
9307            utf8_printf(stderr, "Error: missing argument on --limit\n");
9308            rc = 1;
9309            goto meta_command_exit;
9310          }else{
9311            p->mxProgress = (int)integerValue(azArg[++i]);
9312          }
9313          continue;
9314        }
9315        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9316        rc = 1;
9317        goto meta_command_exit;
9318      }else{
9319        nn = (int)integerValue(z);
9320      }
9321    }
9322    open_db(p, 0);
9323    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9324  }else
9325#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9326
9327  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9328    if( nArg >= 2) {
9329      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9330    }
9331    if( nArg >= 3) {
9332      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9333    }
9334  }else
9335
9336  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9337    rc = 2;
9338  }else
9339
9340  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9341    FILE *inSaved = p->in;
9342    int savedLineno = p->lineno;
9343    failIfSafeMode(p, "cannot run .read in safe mode");
9344    if( nArg!=2 ){
9345      raw_printf(stderr, "Usage: .read FILE\n");
9346      rc = 1;
9347      goto meta_command_exit;
9348    }
9349    if( azArg[1][0]=='|' ){
9350#ifdef SQLITE_OMIT_POPEN
9351      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9352      rc = 1;
9353      p->out = stdout;
9354#else
9355      p->in = popen(azArg[1]+1, "r");
9356      if( p->in==0 ){
9357        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9358        rc = 1;
9359      }else{
9360        rc = process_input(p);
9361        pclose(p->in);
9362      }
9363#endif
9364    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9365      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9366      rc = 1;
9367    }else{
9368      rc = process_input(p);
9369      fclose(p->in);
9370    }
9371    p->in = inSaved;
9372    p->lineno = savedLineno;
9373  }else
9374
9375  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9376    const char *zSrcFile;
9377    const char *zDb;
9378    sqlite3 *pSrc;
9379    sqlite3_backup *pBackup;
9380    int nTimeout = 0;
9381
9382    failIfSafeMode(p, "cannot run .restore in safe mode");
9383    if( nArg==2 ){
9384      zSrcFile = azArg[1];
9385      zDb = "main";
9386    }else if( nArg==3 ){
9387      zSrcFile = azArg[2];
9388      zDb = azArg[1];
9389    }else{
9390      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9391      rc = 1;
9392      goto meta_command_exit;
9393    }
9394    rc = sqlite3_open(zSrcFile, &pSrc);
9395    if( rc!=SQLITE_OK ){
9396      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9397      close_db(pSrc);
9398      return 1;
9399    }
9400    open_db(p, 0);
9401    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9402    if( pBackup==0 ){
9403      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9404      close_db(pSrc);
9405      return 1;
9406    }
9407    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9408          || rc==SQLITE_BUSY  ){
9409      if( rc==SQLITE_BUSY ){
9410        if( nTimeout++ >= 3 ) break;
9411        sqlite3_sleep(100);
9412      }
9413    }
9414    sqlite3_backup_finish(pBackup);
9415    if( rc==SQLITE_DONE ){
9416      rc = 0;
9417    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9418      raw_printf(stderr, "Error: source database is busy\n");
9419      rc = 1;
9420    }else{
9421      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9422      rc = 1;
9423    }
9424    close_db(pSrc);
9425  }else
9426
9427  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9428    if( nArg==2 ){
9429      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9430#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9431      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9432#endif
9433    }else{
9434      raw_printf(stderr, "Usage: .scanstats on|off\n");
9435      rc = 1;
9436    }
9437  }else
9438
9439  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9440    ShellText sSelect;
9441    ShellState data;
9442    char *zErrMsg = 0;
9443    const char *zDiv = "(";
9444    const char *zName = 0;
9445    int iSchema = 0;
9446    int bDebug = 0;
9447    int bNoSystemTabs = 0;
9448    int ii;
9449
9450    open_db(p, 0);
9451    memcpy(&data, p, sizeof(data));
9452    data.showHeader = 0;
9453    data.cMode = data.mode = MODE_Semi;
9454    initText(&sSelect);
9455    for(ii=1; ii<nArg; ii++){
9456      if( optionMatch(azArg[ii],"indent") ){
9457        data.cMode = data.mode = MODE_Pretty;
9458      }else if( optionMatch(azArg[ii],"debug") ){
9459        bDebug = 1;
9460      }else if( optionMatch(azArg[ii],"nosys") ){
9461        bNoSystemTabs = 1;
9462      }else if( azArg[ii][0]=='-' ){
9463        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9464        rc = 1;
9465        goto meta_command_exit;
9466      }else if( zName==0 ){
9467        zName = azArg[ii];
9468      }else{
9469        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9470        rc = 1;
9471        goto meta_command_exit;
9472      }
9473    }
9474    if( zName!=0 ){
9475      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
9476                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
9477                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
9478                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
9479      if( isSchema ){
9480        char *new_argv[2], *new_colv[2];
9481        new_argv[0] = sqlite3_mprintf(
9482                      "CREATE TABLE %s (\n"
9483                      "  type text,\n"
9484                      "  name text,\n"
9485                      "  tbl_name text,\n"
9486                      "  rootpage integer,\n"
9487                      "  sql text\n"
9488                      ")", zName);
9489        shell_check_oom(new_argv[0]);
9490        new_argv[1] = 0;
9491        new_colv[0] = "sql";
9492        new_colv[1] = 0;
9493        callback(&data, 1, new_argv, new_colv);
9494        sqlite3_free(new_argv[0]);
9495      }
9496    }
9497    if( zDiv ){
9498      sqlite3_stmt *pStmt = 0;
9499      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
9500                              -1, &pStmt, 0);
9501      if( rc ){
9502        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9503        sqlite3_finalize(pStmt);
9504        rc = 1;
9505        goto meta_command_exit;
9506      }
9507      appendText(&sSelect, "SELECT sql FROM", 0);
9508      iSchema = 0;
9509      while( sqlite3_step(pStmt)==SQLITE_ROW ){
9510        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
9511        char zScNum[30];
9512        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
9513        appendText(&sSelect, zDiv, 0);
9514        zDiv = " UNION ALL ";
9515        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
9516        if( sqlite3_stricmp(zDb, "main")!=0 ){
9517          appendText(&sSelect, zDb, '\'');
9518        }else{
9519          appendText(&sSelect, "NULL", 0);
9520        }
9521        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
9522        appendText(&sSelect, zScNum, 0);
9523        appendText(&sSelect, " AS snum, ", 0);
9524        appendText(&sSelect, zDb, '\'');
9525        appendText(&sSelect, " AS sname FROM ", 0);
9526        appendText(&sSelect, zDb, quoteChar(zDb));
9527        appendText(&sSelect, ".sqlite_schema", 0);
9528      }
9529      sqlite3_finalize(pStmt);
9530#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
9531      if( zName ){
9532        appendText(&sSelect,
9533           " UNION ALL SELECT shell_module_schema(name),"
9534           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
9535        0);
9536      }
9537#endif
9538      appendText(&sSelect, ") WHERE ", 0);
9539      if( zName ){
9540        char *zQarg = sqlite3_mprintf("%Q", zName);
9541        shell_check_oom(zQarg);
9542        int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
9543                    strchr(zName, '[') != 0;
9544        if( strchr(zName, '.') ){
9545          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
9546        }else{
9547          appendText(&sSelect, "lower(tbl_name)", 0);
9548        }
9549        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
9550        appendText(&sSelect, zQarg, 0);
9551        if( !bGlob ){
9552          appendText(&sSelect, " ESCAPE '\\' ", 0);
9553        }
9554        appendText(&sSelect, " AND ", 0);
9555        sqlite3_free(zQarg);
9556      }
9557      if( bNoSystemTabs ){
9558        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
9559      }
9560      appendText(&sSelect, "sql IS NOT NULL"
9561                           " ORDER BY snum, rowid", 0);
9562      if( bDebug ){
9563        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
9564      }else{
9565        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
9566      }
9567      freeText(&sSelect);
9568    }
9569    if( zErrMsg ){
9570      utf8_printf(stderr,"Error: %s\n", zErrMsg);
9571      sqlite3_free(zErrMsg);
9572      rc = 1;
9573    }else if( rc != SQLITE_OK ){
9574      raw_printf(stderr,"Error: querying schema information\n");
9575      rc = 1;
9576    }else{
9577      rc = 0;
9578    }
9579  }else
9580
9581  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
9582    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
9583    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
9584  }else
9585
9586#if defined(SQLITE_ENABLE_SESSION)
9587  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
9588    struct AuxDb *pAuxDb = p->pAuxDb;
9589    OpenSession *pSession = &pAuxDb->aSession[0];
9590    char **azCmd = &azArg[1];
9591    int iSes = 0;
9592    int nCmd = nArg - 1;
9593    int i;
9594    if( nArg<=1 ) goto session_syntax_error;
9595    open_db(p, 0);
9596    if( nArg>=3 ){
9597      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
9598        if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
9599      }
9600      if( iSes<pAuxDb->nSession ){
9601        pSession = &pAuxDb->aSession[iSes];
9602        azCmd++;
9603        nCmd--;
9604      }else{
9605        pSession = &pAuxDb->aSession[0];
9606        iSes = 0;
9607      }
9608    }
9609
9610    /* .session attach TABLE
9611    ** Invoke the sqlite3session_attach() interface to attach a particular
9612    ** table so that it is never filtered.
9613    */
9614    if( strcmp(azCmd[0],"attach")==0 ){
9615      if( nCmd!=2 ) goto session_syntax_error;
9616      if( pSession->p==0 ){
9617        session_not_open:
9618        raw_printf(stderr, "ERROR: No sessions are open\n");
9619      }else{
9620        rc = sqlite3session_attach(pSession->p, azCmd[1]);
9621        if( rc ){
9622          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
9623          rc = 0;
9624        }
9625      }
9626    }else
9627
9628    /* .session changeset FILE
9629    ** .session patchset FILE
9630    ** Write a changeset or patchset into a file.  The file is overwritten.
9631    */
9632    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
9633      FILE *out = 0;
9634      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
9635      if( nCmd!=2 ) goto session_syntax_error;
9636      if( pSession->p==0 ) goto session_not_open;
9637      out = fopen(azCmd[1], "wb");
9638      if( out==0 ){
9639        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
9640                    azCmd[1]);
9641      }else{
9642        int szChng;
9643        void *pChng;
9644        if( azCmd[0][0]=='c' ){
9645          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
9646        }else{
9647          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
9648        }
9649        if( rc ){
9650          printf("Error: error code %d\n", rc);
9651          rc = 0;
9652        }
9653        if( pChng
9654          && fwrite(pChng, szChng, 1, out)!=1 ){
9655          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
9656                  szChng);
9657        }
9658        sqlite3_free(pChng);
9659        fclose(out);
9660      }
9661    }else
9662
9663    /* .session close
9664    ** Close the identified session
9665    */
9666    if( strcmp(azCmd[0], "close")==0 ){
9667      if( nCmd!=1 ) goto session_syntax_error;
9668      if( pAuxDb->nSession ){
9669        session_close(pSession);
9670        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
9671      }
9672    }else
9673
9674    /* .session enable ?BOOLEAN?
9675    ** Query or set the enable flag
9676    */
9677    if( strcmp(azCmd[0], "enable")==0 ){
9678      int ii;
9679      if( nCmd>2 ) goto session_syntax_error;
9680      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9681      if( pAuxDb->nSession ){
9682        ii = sqlite3session_enable(pSession->p, ii);
9683        utf8_printf(p->out, "session %s enable flag = %d\n",
9684                    pSession->zName, ii);
9685      }
9686    }else
9687
9688    /* .session filter GLOB ....
9689    ** Set a list of GLOB patterns of table names to be excluded.
9690    */
9691    if( strcmp(azCmd[0], "filter")==0 ){
9692      int ii, nByte;
9693      if( nCmd<2 ) goto session_syntax_error;
9694      if( pAuxDb->nSession ){
9695        for(ii=0; ii<pSession->nFilter; ii++){
9696          sqlite3_free(pSession->azFilter[ii]);
9697        }
9698        sqlite3_free(pSession->azFilter);
9699        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
9700        pSession->azFilter = sqlite3_malloc( nByte );
9701        if( pSession->azFilter==0 ){
9702          raw_printf(stderr, "Error: out or memory\n");
9703          exit(1);
9704        }
9705        for(ii=1; ii<nCmd; ii++){
9706          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
9707          shell_check_oom(x);
9708        }
9709        pSession->nFilter = ii-1;
9710      }
9711    }else
9712
9713    /* .session indirect ?BOOLEAN?
9714    ** Query or set the indirect flag
9715    */
9716    if( strcmp(azCmd[0], "indirect")==0 ){
9717      int ii;
9718      if( nCmd>2 ) goto session_syntax_error;
9719      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9720      if( pAuxDb->nSession ){
9721        ii = sqlite3session_indirect(pSession->p, ii);
9722        utf8_printf(p->out, "session %s indirect flag = %d\n",
9723                    pSession->zName, ii);
9724      }
9725    }else
9726
9727    /* .session isempty
9728    ** Determine if the session is empty
9729    */
9730    if( strcmp(azCmd[0], "isempty")==0 ){
9731      int ii;
9732      if( nCmd!=1 ) goto session_syntax_error;
9733      if( pAuxDb->nSession ){
9734        ii = sqlite3session_isempty(pSession->p);
9735        utf8_printf(p->out, "session %s isempty flag = %d\n",
9736                    pSession->zName, ii);
9737      }
9738    }else
9739
9740    /* .session list
9741    ** List all currently open sessions
9742    */
9743    if( strcmp(azCmd[0],"list")==0 ){
9744      for(i=0; i<pAuxDb->nSession; i++){
9745        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
9746      }
9747    }else
9748
9749    /* .session open DB NAME
9750    ** Open a new session called NAME on the attached database DB.
9751    ** DB is normally "main".
9752    */
9753    if( strcmp(azCmd[0],"open")==0 ){
9754      char *zName;
9755      if( nCmd!=3 ) goto session_syntax_error;
9756      zName = azCmd[2];
9757      if( zName[0]==0 ) goto session_syntax_error;
9758      for(i=0; i<pAuxDb->nSession; i++){
9759        if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
9760          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
9761          goto meta_command_exit;
9762        }
9763      }
9764      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
9765        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
9766        goto meta_command_exit;
9767      }
9768      pSession = &pAuxDb->aSession[pAuxDb->nSession];
9769      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
9770      if( rc ){
9771        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
9772        rc = 0;
9773        goto meta_command_exit;
9774      }
9775      pSession->nFilter = 0;
9776      sqlite3session_table_filter(pSession->p, session_filter, pSession);
9777      pAuxDb->nSession++;
9778      pSession->zName = sqlite3_mprintf("%s", zName);
9779      shell_check_oom(pSession->zName);
9780    }else
9781    /* If no command name matches, show a syntax error */
9782    session_syntax_error:
9783    showHelp(p->out, "session");
9784  }else
9785#endif
9786
9787#ifdef SQLITE_DEBUG
9788  /* Undocumented commands for internal testing.  Subject to change
9789  ** without notice. */
9790  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
9791    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
9792      int i, v;
9793      for(i=1; i<nArg; i++){
9794        v = booleanValue(azArg[i]);
9795        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
9796      }
9797    }
9798    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
9799      int i; sqlite3_int64 v;
9800      for(i=1; i<nArg; i++){
9801        char zBuf[200];
9802        v = integerValue(azArg[i]);
9803        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
9804        utf8_printf(p->out, "%s", zBuf);
9805      }
9806    }
9807  }else
9808#endif
9809
9810  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
9811    int bIsInit = 0;         /* True to initialize the SELFTEST table */
9812    int bVerbose = 0;        /* Verbose output */
9813    int bSelftestExists;     /* True if SELFTEST already exists */
9814    int i, k;                /* Loop counters */
9815    int nTest = 0;           /* Number of tests runs */
9816    int nErr = 0;            /* Number of errors seen */
9817    ShellText str;           /* Answer for a query */
9818    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
9819
9820    open_db(p,0);
9821    for(i=1; i<nArg; i++){
9822      const char *z = azArg[i];
9823      if( z[0]=='-' && z[1]=='-' ) z++;
9824      if( strcmp(z,"-init")==0 ){
9825        bIsInit = 1;
9826      }else
9827      if( strcmp(z,"-v")==0 ){
9828        bVerbose++;
9829      }else
9830      {
9831        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
9832                    azArg[i], azArg[0]);
9833        raw_printf(stderr, "Should be one of: --init -v\n");
9834        rc = 1;
9835        goto meta_command_exit;
9836      }
9837    }
9838    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
9839           != SQLITE_OK ){
9840      bSelftestExists = 0;
9841    }else{
9842      bSelftestExists = 1;
9843    }
9844    if( bIsInit ){
9845      createSelftestTable(p);
9846      bSelftestExists = 1;
9847    }
9848    initText(&str);
9849    appendText(&str, "x", 0);
9850    for(k=bSelftestExists; k>=0; k--){
9851      if( k==1 ){
9852        rc = sqlite3_prepare_v2(p->db,
9853            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
9854            -1, &pStmt, 0);
9855      }else{
9856        rc = sqlite3_prepare_v2(p->db,
9857          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
9858          "      (1,'run','PRAGMA integrity_check','ok')",
9859          -1, &pStmt, 0);
9860      }
9861      if( rc ){
9862        raw_printf(stderr, "Error querying the selftest table\n");
9863        rc = 1;
9864        sqlite3_finalize(pStmt);
9865        goto meta_command_exit;
9866      }
9867      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
9868        int tno = sqlite3_column_int(pStmt, 0);
9869        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
9870        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
9871        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
9872
9873        if( zOp==0 ) continue;
9874        if( zSql==0 ) continue;
9875        if( zAns==0 ) continue;
9876        k = 0;
9877        if( bVerbose>0 ){
9878          printf("%d: %s %s\n", tno, zOp, zSql);
9879        }
9880        if( strcmp(zOp,"memo")==0 ){
9881          utf8_printf(p->out, "%s\n", zSql);
9882        }else
9883        if( strcmp(zOp,"run")==0 ){
9884          char *zErrMsg = 0;
9885          str.n = 0;
9886          str.z[0] = 0;
9887          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
9888          nTest++;
9889          if( bVerbose ){
9890            utf8_printf(p->out, "Result: %s\n", str.z);
9891          }
9892          if( rc || zErrMsg ){
9893            nErr++;
9894            rc = 1;
9895            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
9896            sqlite3_free(zErrMsg);
9897          }else if( strcmp(zAns,str.z)!=0 ){
9898            nErr++;
9899            rc = 1;
9900            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
9901            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
9902          }
9903        }else
9904        {
9905          utf8_printf(stderr,
9906            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
9907          rc = 1;
9908          break;
9909        }
9910      } /* End loop over rows of content from SELFTEST */
9911      sqlite3_finalize(pStmt);
9912    } /* End loop over k */
9913    freeText(&str);
9914    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
9915  }else
9916
9917  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
9918    if( nArg<2 || nArg>3 ){
9919      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
9920      rc = 1;
9921    }
9922    if( nArg>=2 ){
9923      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
9924                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
9925    }
9926    if( nArg>=3 ){
9927      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
9928                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
9929    }
9930  }else
9931
9932  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
9933    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
9934    int i;                   /* Loop counter */
9935    int bSchema = 0;         /* Also hash the schema */
9936    int bSeparate = 0;       /* Hash each table separately */
9937    int iSize = 224;         /* Hash algorithm to use */
9938    int bDebug = 0;          /* Only show the query that would have run */
9939    sqlite3_stmt *pStmt;     /* For querying tables names */
9940    char *zSql;              /* SQL to be run */
9941    char *zSep;              /* Separator */
9942    ShellText sSql;          /* Complete SQL for the query to run the hash */
9943    ShellText sQuery;        /* Set of queries used to read all content */
9944    open_db(p, 0);
9945    for(i=1; i<nArg; i++){
9946      const char *z = azArg[i];
9947      if( z[0]=='-' ){
9948        z++;
9949        if( z[0]=='-' ) z++;
9950        if( strcmp(z,"schema")==0 ){
9951          bSchema = 1;
9952        }else
9953        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
9954         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
9955        ){
9956          iSize = atoi(&z[5]);
9957        }else
9958        if( strcmp(z,"debug")==0 ){
9959          bDebug = 1;
9960        }else
9961        {
9962          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
9963                      azArg[i], azArg[0]);
9964          showHelp(p->out, azArg[0]);
9965          rc = 1;
9966          goto meta_command_exit;
9967        }
9968      }else if( zLike ){
9969        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
9970        rc = 1;
9971        goto meta_command_exit;
9972      }else{
9973        zLike = z;
9974        bSeparate = 1;
9975        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
9976      }
9977    }
9978    if( bSchema ){
9979      zSql = "SELECT lower(name) FROM sqlite_schema"
9980             " WHERE type='table' AND coalesce(rootpage,0)>1"
9981             " UNION ALL SELECT 'sqlite_schema'"
9982             " ORDER BY 1 collate nocase";
9983    }else{
9984      zSql = "SELECT lower(name) FROM sqlite_schema"
9985             " WHERE type='table' AND coalesce(rootpage,0)>1"
9986             " AND name NOT LIKE 'sqlite_%'"
9987             " ORDER BY 1 collate nocase";
9988    }
9989    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9990    initText(&sQuery);
9991    initText(&sSql);
9992    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
9993    zSep = "VALUES(";
9994    while( SQLITE_ROW==sqlite3_step(pStmt) ){
9995      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
9996      if( zTab==0 ) continue;
9997      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
9998      if( strncmp(zTab, "sqlite_",7)!=0 ){
9999        appendText(&sQuery,"SELECT * FROM ", 0);
10000        appendText(&sQuery,zTab,'"');
10001        appendText(&sQuery," NOT INDEXED;", 0);
10002      }else if( strcmp(zTab, "sqlite_schema")==0 ){
10003        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10004                           " ORDER BY name;", 0);
10005      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
10006        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10007                           " ORDER BY name;", 0);
10008      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
10009        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10010                           " ORDER BY tbl,idx;", 0);
10011      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
10012        appendText(&sQuery, "SELECT * FROM ", 0);
10013        appendText(&sQuery, zTab, 0);
10014        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10015      }
10016      appendText(&sSql, zSep, 0);
10017      appendText(&sSql, sQuery.z, '\'');
10018      sQuery.n = 0;
10019      appendText(&sSql, ",", 0);
10020      appendText(&sSql, zTab, '\'');
10021      zSep = "),(";
10022    }
10023    sqlite3_finalize(pStmt);
10024    if( bSeparate ){
10025      zSql = sqlite3_mprintf(
10026          "%s))"
10027          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10028          "   FROM [sha3sum$query]",
10029          sSql.z, iSize);
10030    }else{
10031      zSql = sqlite3_mprintf(
10032          "%s))"
10033          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10034          "   FROM [sha3sum$query]",
10035          sSql.z, iSize);
10036    }
10037    shell_check_oom(zSql);
10038    freeText(&sQuery);
10039    freeText(&sSql);
10040    if( bDebug ){
10041      utf8_printf(p->out, "%s\n", zSql);
10042    }else{
10043      shell_exec(p, zSql, 0);
10044    }
10045    sqlite3_free(zSql);
10046  }else
10047
10048#ifndef SQLITE_NOHAVE_SYSTEM
10049  if( c=='s'
10050   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10051  ){
10052    char *zCmd;
10053    int i, x;
10054    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10055    if( nArg<2 ){
10056      raw_printf(stderr, "Usage: .system COMMAND\n");
10057      rc = 1;
10058      goto meta_command_exit;
10059    }
10060    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10061    for(i=2; i<nArg && zCmd!=0; i++){
10062      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10063                             zCmd, azArg[i]);
10064    }
10065    x = zCmd!=0 ? system(zCmd) : 1;
10066    sqlite3_free(zCmd);
10067    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10068  }else
10069#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10070
10071  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10072    static const char *azBool[] = { "off", "on", "trigger", "full"};
10073    const char *zOut;
10074    int i;
10075    if( nArg!=1 ){
10076      raw_printf(stderr, "Usage: .show\n");
10077      rc = 1;
10078      goto meta_command_exit;
10079    }
10080    utf8_printf(p->out, "%12.12s: %s\n","echo",
10081                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
10082    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10083    utf8_printf(p->out, "%12.12s: %s\n","explain",
10084         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10085    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10086    utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10087    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10088      output_c_string(p->out, p->nullValue);
10089      raw_printf(p->out, "\n");
10090    utf8_printf(p->out,"%12.12s: %s\n","output",
10091            strlen30(p->outfile) ? p->outfile : "stdout");
10092    utf8_printf(p->out,"%12.12s: ", "colseparator");
10093      output_c_string(p->out, p->colSeparator);
10094      raw_printf(p->out, "\n");
10095    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10096      output_c_string(p->out, p->rowSeparator);
10097      raw_printf(p->out, "\n");
10098    switch( p->statsOn ){
10099      case 0:  zOut = "off";     break;
10100      default: zOut = "on";      break;
10101      case 2:  zOut = "stmt";    break;
10102      case 3:  zOut = "vmstep";  break;
10103    }
10104    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10105    utf8_printf(p->out, "%12.12s: ", "width");
10106    for (i=0;i<p->nWidth;i++) {
10107      raw_printf(p->out, "%d ", p->colWidth[i]);
10108    }
10109    raw_printf(p->out, "\n");
10110    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10111                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10112  }else
10113
10114  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10115    if( nArg==2 ){
10116      if( strcmp(azArg[1],"stmt")==0 ){
10117        p->statsOn = 2;
10118      }else if( strcmp(azArg[1],"vmstep")==0 ){
10119        p->statsOn = 3;
10120      }else{
10121        p->statsOn = (u8)booleanValue(azArg[1]);
10122      }
10123    }else if( nArg==1 ){
10124      display_stats(p->db, p, 0);
10125    }else{
10126      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10127      rc = 1;
10128    }
10129  }else
10130
10131  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10132   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10133                 || strncmp(azArg[0], "indexes", n)==0) )
10134  ){
10135    sqlite3_stmt *pStmt;
10136    char **azResult;
10137    int nRow, nAlloc;
10138    int ii;
10139    ShellText s;
10140    initText(&s);
10141    open_db(p, 0);
10142    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10143    if( rc ){
10144      sqlite3_finalize(pStmt);
10145      return shellDatabaseError(p->db);
10146    }
10147
10148    if( nArg>2 && c=='i' ){
10149      /* It is an historical accident that the .indexes command shows an error
10150      ** when called with the wrong number of arguments whereas the .tables
10151      ** command does not. */
10152      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10153      rc = 1;
10154      sqlite3_finalize(pStmt);
10155      goto meta_command_exit;
10156    }
10157    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10158      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10159      if( zDbName==0 ) continue;
10160      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10161      if( sqlite3_stricmp(zDbName, "main")==0 ){
10162        appendText(&s, "SELECT name FROM ", 0);
10163      }else{
10164        appendText(&s, "SELECT ", 0);
10165        appendText(&s, zDbName, '\'');
10166        appendText(&s, "||'.'||name FROM ", 0);
10167      }
10168      appendText(&s, zDbName, '"');
10169      appendText(&s, ".sqlite_schema ", 0);
10170      if( c=='t' ){
10171        appendText(&s," WHERE type IN ('table','view')"
10172                      "   AND name NOT LIKE 'sqlite_%'"
10173                      "   AND name LIKE ?1", 0);
10174      }else{
10175        appendText(&s," WHERE type='index'"
10176                      "   AND tbl_name LIKE ?1", 0);
10177      }
10178    }
10179    rc = sqlite3_finalize(pStmt);
10180    if( rc==SQLITE_OK ){
10181      appendText(&s, " ORDER BY 1", 0);
10182      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10183    }
10184    freeText(&s);
10185    if( rc ) return shellDatabaseError(p->db);
10186
10187    /* Run the SQL statement prepared by the above block. Store the results
10188    ** as an array of nul-terminated strings in azResult[].  */
10189    nRow = nAlloc = 0;
10190    azResult = 0;
10191    if( nArg>1 ){
10192      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10193    }else{
10194      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10195    }
10196    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10197      if( nRow>=nAlloc ){
10198        char **azNew;
10199        int n2 = nAlloc*2 + 10;
10200        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10201        shell_check_oom(azNew);
10202        nAlloc = n2;
10203        azResult = azNew;
10204      }
10205      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10206      shell_check_oom(azResult[nRow]);
10207      nRow++;
10208    }
10209    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10210      rc = shellDatabaseError(p->db);
10211    }
10212
10213    /* Pretty-print the contents of array azResult[] to the output */
10214    if( rc==0 && nRow>0 ){
10215      int len, maxlen = 0;
10216      int i, j;
10217      int nPrintCol, nPrintRow;
10218      for(i=0; i<nRow; i++){
10219        len = strlen30(azResult[i]);
10220        if( len>maxlen ) maxlen = len;
10221      }
10222      nPrintCol = 80/(maxlen+2);
10223      if( nPrintCol<1 ) nPrintCol = 1;
10224      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10225      for(i=0; i<nPrintRow; i++){
10226        for(j=i; j<nRow; j+=nPrintRow){
10227          char *zSp = j<nPrintRow ? "" : "  ";
10228          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10229                      azResult[j] ? azResult[j]:"");
10230        }
10231        raw_printf(p->out, "\n");
10232      }
10233    }
10234
10235    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10236    sqlite3_free(azResult);
10237  }else
10238
10239  /* Begin redirecting output to the file "testcase-out.txt" */
10240  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10241    output_reset(p);
10242    p->out = output_file_open("testcase-out.txt", 0);
10243    if( p->out==0 ){
10244      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10245    }
10246    if( nArg>=2 ){
10247      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10248    }else{
10249      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10250    }
10251  }else
10252
10253#ifndef SQLITE_UNTESTABLE
10254  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10255    static const struct {
10256       const char *zCtrlName;   /* Name of a test-control option */
10257       int ctrlCode;            /* Integer code for that option */
10258       int unSafe;              /* Not valid for --safe mode */
10259       const char *zUsage;      /* Usage notes */
10260    } aCtrl[] = {
10261      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10262      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10263    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10264    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10265      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10266      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10267    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10268      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10269      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10270      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10271      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10272      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10273#ifdef YYCOVERAGE
10274      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10275#endif
10276      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10277      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10278      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10279      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10280      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10281      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10282      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10283    };
10284    int testctrl = -1;
10285    int iCtrl = -1;
10286    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10287    int isOk = 0;
10288    int i, n2;
10289    const char *zCmd = 0;
10290
10291    open_db(p, 0);
10292    zCmd = nArg>=2 ? azArg[1] : "help";
10293
10294    /* The argument can optionally begin with "-" or "--" */
10295    if( zCmd[0]=='-' && zCmd[1] ){
10296      zCmd++;
10297      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10298    }
10299
10300    /* --help lists all test-controls */
10301    if( strcmp(zCmd,"help")==0 ){
10302      utf8_printf(p->out, "Available test-controls:\n");
10303      for(i=0; i<ArraySize(aCtrl); i++){
10304        utf8_printf(p->out, "  .testctrl %s %s\n",
10305                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10306      }
10307      rc = 1;
10308      goto meta_command_exit;
10309    }
10310
10311    /* convert testctrl text option to value. allow any unique prefix
10312    ** of the option name, or a numerical value. */
10313    n2 = strlen30(zCmd);
10314    for(i=0; i<ArraySize(aCtrl); i++){
10315      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10316        if( testctrl<0 ){
10317          testctrl = aCtrl[i].ctrlCode;
10318          iCtrl = i;
10319        }else{
10320          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10321                              "Use \".testctrl --help\" for help\n", zCmd);
10322          rc = 1;
10323          goto meta_command_exit;
10324        }
10325      }
10326    }
10327    if( testctrl<0 ){
10328      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10329                         "Use \".testctrl --help\" for help\n", zCmd);
10330    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10331      utf8_printf(stderr,
10332         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10333         p->lineno, aCtrl[iCtrl].zCtrlName);
10334      exit(1);
10335    }else{
10336      switch(testctrl){
10337
10338        /* sqlite3_test_control(int, db, int) */
10339        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10340          if( nArg==3 ){
10341            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10342            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10343            isOk = 3;
10344          }
10345          break;
10346
10347        /* sqlite3_test_control(int) */
10348        case SQLITE_TESTCTRL_PRNG_SAVE:
10349        case SQLITE_TESTCTRL_PRNG_RESTORE:
10350        case SQLITE_TESTCTRL_BYTEORDER:
10351          if( nArg==2 ){
10352            rc2 = sqlite3_test_control(testctrl);
10353            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10354          }
10355          break;
10356
10357        /* sqlite3_test_control(int, uint) */
10358        case SQLITE_TESTCTRL_PENDING_BYTE:
10359          if( nArg==3 ){
10360            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10361            rc2 = sqlite3_test_control(testctrl, opt);
10362            isOk = 3;
10363          }
10364          break;
10365
10366        /* sqlite3_test_control(int, int, sqlite3*) */
10367        case SQLITE_TESTCTRL_PRNG_SEED:
10368          if( nArg==3 || nArg==4 ){
10369            int ii = (int)integerValue(azArg[2]);
10370            sqlite3 *db;
10371            if( ii==0 && strcmp(azArg[2],"random")==0 ){
10372              sqlite3_randomness(sizeof(ii),&ii);
10373              printf("-- random seed: %d\n", ii);
10374            }
10375            if( nArg==3 ){
10376              db = 0;
10377            }else{
10378              db = p->db;
10379              /* Make sure the schema has been loaded */
10380              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10381            }
10382            rc2 = sqlite3_test_control(testctrl, ii, db);
10383            isOk = 3;
10384          }
10385          break;
10386
10387        /* sqlite3_test_control(int, int) */
10388        case SQLITE_TESTCTRL_ASSERT:
10389        case SQLITE_TESTCTRL_ALWAYS:
10390          if( nArg==3 ){
10391            int opt = booleanValue(azArg[2]);
10392            rc2 = sqlite3_test_control(testctrl, opt);
10393            isOk = 1;
10394          }
10395          break;
10396
10397        /* sqlite3_test_control(int, int) */
10398        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10399        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10400          if( nArg==3 ){
10401            int opt = booleanValue(azArg[2]);
10402            rc2 = sqlite3_test_control(testctrl, opt);
10403            isOk = 3;
10404          }
10405          break;
10406
10407        /* sqlite3_test_control(sqlite3*) */
10408        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10409          rc2 = sqlite3_test_control(testctrl, p->db);
10410          isOk = 3;
10411          break;
10412
10413        case SQLITE_TESTCTRL_IMPOSTER:
10414          if( nArg==5 ){
10415            rc2 = sqlite3_test_control(testctrl, p->db,
10416                          azArg[2],
10417                          integerValue(azArg[3]),
10418                          integerValue(azArg[4]));
10419            isOk = 3;
10420          }
10421          break;
10422
10423        case SQLITE_TESTCTRL_SEEK_COUNT: {
10424          u64 x = 0;
10425          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10426          utf8_printf(p->out, "%llu\n", x);
10427          isOk = 3;
10428          break;
10429        }
10430
10431#ifdef YYCOVERAGE
10432        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10433          if( nArg==2 ){
10434            sqlite3_test_control(testctrl, p->out);
10435            isOk = 3;
10436          }
10437          break;
10438        }
10439#endif
10440#ifdef SQLITE_DEBUG
10441        case SQLITE_TESTCTRL_TUNE: {
10442          if( nArg==4 ){
10443            int id = (int)integerValue(azArg[2]);
10444            int val = (int)integerValue(azArg[3]);
10445            sqlite3_test_control(testctrl, id, &val);
10446            isOk = 3;
10447          }else if( nArg==3 ){
10448            int id = (int)integerValue(azArg[2]);
10449            sqlite3_test_control(testctrl, -id, &rc2);
10450            isOk = 1;
10451          }else if( nArg==2 ){
10452            int id = 1;
10453            while(1){
10454              int val = 0;
10455              rc2 = sqlite3_test_control(testctrl, -id, &val);
10456              if( rc2!=SQLITE_OK ) break;
10457              if( id>1 ) utf8_printf(p->out, "  ");
10458              utf8_printf(p->out, "%d: %d", id, val);
10459              id++;
10460            }
10461            if( id>1 ) utf8_printf(p->out, "\n");
10462            isOk = 3;
10463          }
10464          break;
10465        }
10466#endif
10467        case SQLITE_TESTCTRL_SORTER_MMAP:
10468          if( nArg==3 ){
10469            int opt = (unsigned int)integerValue(azArg[2]);
10470            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10471            isOk = 3;
10472          }
10473          break;
10474      }
10475    }
10476    if( isOk==0 && iCtrl>=0 ){
10477      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
10478      rc = 1;
10479    }else if( isOk==1 ){
10480      raw_printf(p->out, "%d\n", rc2);
10481    }else if( isOk==2 ){
10482      raw_printf(p->out, "0x%08x\n", rc2);
10483    }
10484  }else
10485#endif /* !defined(SQLITE_UNTESTABLE) */
10486
10487  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
10488    open_db(p, 0);
10489    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
10490  }else
10491
10492  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
10493    if( nArg==2 ){
10494      enableTimer = booleanValue(azArg[1]);
10495      if( enableTimer && !HAS_TIMER ){
10496        raw_printf(stderr, "Error: timer not available on this system.\n");
10497        enableTimer = 0;
10498      }
10499    }else{
10500      raw_printf(stderr, "Usage: .timer on|off\n");
10501      rc = 1;
10502    }
10503  }else
10504
10505#ifndef SQLITE_OMIT_TRACE
10506  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
10507    int mType = 0;
10508    int jj;
10509    open_db(p, 0);
10510    for(jj=1; jj<nArg; jj++){
10511      const char *z = azArg[jj];
10512      if( z[0]=='-' ){
10513        if( optionMatch(z, "expanded") ){
10514          p->eTraceType = SHELL_TRACE_EXPANDED;
10515        }
10516#ifdef SQLITE_ENABLE_NORMALIZE
10517        else if( optionMatch(z, "normalized") ){
10518          p->eTraceType = SHELL_TRACE_NORMALIZED;
10519        }
10520#endif
10521        else if( optionMatch(z, "plain") ){
10522          p->eTraceType = SHELL_TRACE_PLAIN;
10523        }
10524        else if( optionMatch(z, "profile") ){
10525          mType |= SQLITE_TRACE_PROFILE;
10526        }
10527        else if( optionMatch(z, "row") ){
10528          mType |= SQLITE_TRACE_ROW;
10529        }
10530        else if( optionMatch(z, "stmt") ){
10531          mType |= SQLITE_TRACE_STMT;
10532        }
10533        else if( optionMatch(z, "close") ){
10534          mType |= SQLITE_TRACE_CLOSE;
10535        }
10536        else {
10537          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
10538          rc = 1;
10539          goto meta_command_exit;
10540        }
10541      }else{
10542        output_file_close(p->traceOut);
10543        p->traceOut = output_file_open(azArg[1], 0);
10544      }
10545    }
10546    if( p->traceOut==0 ){
10547      sqlite3_trace_v2(p->db, 0, 0, 0);
10548    }else{
10549      if( mType==0 ) mType = SQLITE_TRACE_STMT;
10550      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
10551    }
10552  }else
10553#endif /* !defined(SQLITE_OMIT_TRACE) */
10554
10555#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
10556  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
10557    int ii;
10558    int lenOpt;
10559    char *zOpt;
10560    if( nArg<2 ){
10561      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
10562      rc = 1;
10563      goto meta_command_exit;
10564    }
10565    open_db(p, 0);
10566    zOpt = azArg[1];
10567    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
10568    lenOpt = (int)strlen(zOpt);
10569    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
10570      assert( azArg[nArg]==0 );
10571      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
10572    }else{
10573      for(ii=1; ii<nArg; ii++){
10574        sqlite3_create_module(p->db, azArg[ii], 0, 0);
10575      }
10576    }
10577  }else
10578#endif
10579
10580#if SQLITE_USER_AUTHENTICATION
10581  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
10582    if( nArg<2 ){
10583      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
10584      rc = 1;
10585      goto meta_command_exit;
10586    }
10587    open_db(p, 0);
10588    if( strcmp(azArg[1],"login")==0 ){
10589      if( nArg!=4 ){
10590        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
10591        rc = 1;
10592        goto meta_command_exit;
10593      }
10594      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
10595                                     strlen30(azArg[3]));
10596      if( rc ){
10597        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
10598        rc = 1;
10599      }
10600    }else if( strcmp(azArg[1],"add")==0 ){
10601      if( nArg!=5 ){
10602        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
10603        rc = 1;
10604        goto meta_command_exit;
10605      }
10606      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10607                            booleanValue(azArg[4]));
10608      if( rc ){
10609        raw_printf(stderr, "User-Add failed: %d\n", rc);
10610        rc = 1;
10611      }
10612    }else if( strcmp(azArg[1],"edit")==0 ){
10613      if( nArg!=5 ){
10614        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
10615        rc = 1;
10616        goto meta_command_exit;
10617      }
10618      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10619                              booleanValue(azArg[4]));
10620      if( rc ){
10621        raw_printf(stderr, "User-Edit failed: %d\n", rc);
10622        rc = 1;
10623      }
10624    }else if( strcmp(azArg[1],"delete")==0 ){
10625      if( nArg!=3 ){
10626        raw_printf(stderr, "Usage: .user delete USER\n");
10627        rc = 1;
10628        goto meta_command_exit;
10629      }
10630      rc = sqlite3_user_delete(p->db, azArg[2]);
10631      if( rc ){
10632        raw_printf(stderr, "User-Delete failed: %d\n", rc);
10633        rc = 1;
10634      }
10635    }else{
10636      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
10637      rc = 1;
10638      goto meta_command_exit;
10639    }
10640  }else
10641#endif /* SQLITE_USER_AUTHENTICATION */
10642
10643  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
10644    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
10645        sqlite3_libversion(), sqlite3_sourceid());
10646#if SQLITE_HAVE_ZLIB
10647    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
10648#endif
10649#define CTIMEOPT_VAL_(opt) #opt
10650#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
10651#if defined(__clang__) && defined(__clang_major__)
10652    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
10653                    CTIMEOPT_VAL(__clang_minor__) "."
10654                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
10655#elif defined(_MSC_VER)
10656    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
10657#elif defined(__GNUC__) && defined(__VERSION__)
10658    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
10659#endif
10660  }else
10661
10662  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
10663    const char *zDbName = nArg==2 ? azArg[1] : "main";
10664    sqlite3_vfs *pVfs = 0;
10665    if( p->db ){
10666      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
10667      if( pVfs ){
10668        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
10669        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10670        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10671        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10672      }
10673    }
10674  }else
10675
10676  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
10677    sqlite3_vfs *pVfs;
10678    sqlite3_vfs *pCurrent = 0;
10679    if( p->db ){
10680      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
10681    }
10682    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
10683      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
10684           pVfs==pCurrent ? "  <--- CURRENT" : "");
10685      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10686      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10687      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10688      if( pVfs->pNext ){
10689        raw_printf(p->out, "-----------------------------------\n");
10690      }
10691    }
10692  }else
10693
10694  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
10695    const char *zDbName = nArg==2 ? azArg[1] : "main";
10696    char *zVfsName = 0;
10697    if( p->db ){
10698      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
10699      if( zVfsName ){
10700        utf8_printf(p->out, "%s\n", zVfsName);
10701        sqlite3_free(zVfsName);
10702      }
10703    }
10704  }else
10705
10706  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
10707    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10708    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
10709  }else
10710
10711  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
10712    int j;
10713    assert( nArg<=ArraySize(azArg) );
10714    p->nWidth = nArg-1;
10715    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
10716    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
10717    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
10718    for(j=1; j<nArg; j++){
10719      p->colWidth[j-1] = (int)integerValue(azArg[j]);
10720    }
10721  }else
10722
10723  {
10724    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
10725      " \"%s\". Enter \".help\" for help\n", azArg[0]);
10726    rc = 1;
10727  }
10728
10729meta_command_exit:
10730  if( p->outCount ){
10731    p->outCount--;
10732    if( p->outCount==0 ) output_reset(p);
10733  }
10734  p->bSafeMode = p->bSafeModePersist;
10735  return rc;
10736}
10737
10738/* Line scan result and intermediate states (supporting scan resumption)
10739*/
10740#ifndef CHAR_BIT
10741# define CHAR_BIT 8
10742#endif
10743typedef enum {
10744  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
10745  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
10746  QSS_Start = 0
10747} QuickScanState;
10748#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
10749#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
10750#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
10751#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
10752#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
10753
10754/*
10755** Scan line for classification to guide shell's handling.
10756** The scan is resumable for subsequent lines when prior
10757** return values are passed as the 2nd argument.
10758*/
10759static QuickScanState quickscan(char *zLine, QuickScanState qss){
10760  char cin;
10761  char cWait = (char)qss; /* intentional narrowing loss */
10762  if( cWait==0 ){
10763  PlainScan:
10764    assert( cWait==0 );
10765    while( (cin = *zLine++)!=0 ){
10766      if( IsSpace(cin) )
10767        continue;
10768      switch (cin){
10769      case '-':
10770        if( *zLine!='-' )
10771          break;
10772        while((cin = *++zLine)!=0 )
10773          if( cin=='\n')
10774            goto PlainScan;
10775        return qss;
10776      case ';':
10777        qss |= QSS_EndingSemi;
10778        continue;
10779      case '/':
10780        if( *zLine=='*' ){
10781          ++zLine;
10782          cWait = '*';
10783          qss = QSS_SETV(qss, cWait);
10784          goto TermScan;
10785        }
10786        break;
10787      case '[':
10788        cin = ']';
10789        /* fall thru */
10790      case '`': case '\'': case '"':
10791        cWait = cin;
10792        qss = QSS_HasDark | cWait;
10793        goto TermScan;
10794      default:
10795        break;
10796      }
10797      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
10798    }
10799  }else{
10800  TermScan:
10801    while( (cin = *zLine++)!=0 ){
10802      if( cin==cWait ){
10803        switch( cWait ){
10804        case '*':
10805          if( *zLine != '/' )
10806            continue;
10807          ++zLine;
10808          cWait = 0;
10809          qss = QSS_SETV(qss, 0);
10810          goto PlainScan;
10811        case '`': case '\'': case '"':
10812          if(*zLine==cWait){
10813            ++zLine;
10814            continue;
10815          }
10816          /* fall thru */
10817        case ']':
10818          cWait = 0;
10819          qss = QSS_SETV(qss, 0);
10820          goto PlainScan;
10821        default: assert(0);
10822        }
10823      }
10824    }
10825  }
10826  return qss;
10827}
10828
10829/*
10830** Return TRUE if the line typed in is an SQL command terminator other
10831** than a semi-colon.  The SQL Server style "go" command is understood
10832** as is the Oracle "/".
10833*/
10834static int line_is_command_terminator(char *zLine){
10835  while( IsSpace(zLine[0]) ){ zLine++; };
10836  if( zLine[0]=='/' )
10837    zLine += 1; /* Oracle */
10838  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
10839    zLine += 2; /* SQL Server */
10840  else
10841    return 0;
10842  return quickscan(zLine,QSS_Start)==QSS_Start;
10843}
10844
10845/*
10846** We need a default sqlite3_complete() implementation to use in case
10847** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
10848** any arbitrary text is a complete SQL statement.  This is not very
10849** user-friendly, but it does seem to work.
10850*/
10851#ifdef SQLITE_OMIT_COMPLETE
10852#define sqlite3_complete(x) 1
10853#endif
10854
10855/*
10856** Return true if zSql is a complete SQL statement.  Return false if it
10857** ends in the middle of a string literal or C-style comment.
10858*/
10859static int line_is_complete(char *zSql, int nSql){
10860  int rc;
10861  if( zSql==0 ) return 1;
10862  zSql[nSql] = ';';
10863  zSql[nSql+1] = 0;
10864  rc = sqlite3_complete(zSql);
10865  zSql[nSql] = 0;
10866  return rc;
10867}
10868
10869/*
10870** Run a single line of SQL.  Return the number of errors.
10871*/
10872static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
10873  int rc;
10874  char *zErrMsg = 0;
10875
10876  open_db(p, 0);
10877  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
10878  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
10879  BEGIN_TIMER;
10880  rc = shell_exec(p, zSql, &zErrMsg);
10881  END_TIMER;
10882  if( rc || zErrMsg ){
10883    char zPrefix[100];
10884    if( in!=0 || !stdin_is_interactive ){
10885      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
10886                       "Error: near line %d:", startline);
10887    }else{
10888      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
10889    }
10890    if( zErrMsg!=0 ){
10891      utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
10892      sqlite3_free(zErrMsg);
10893      zErrMsg = 0;
10894    }else{
10895      utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
10896    }
10897    return 1;
10898  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
10899    char zLineBuf[2000];
10900    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
10901            "changes: %lld   total_changes: %lld",
10902            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
10903    raw_printf(p->out, "%s\n", zLineBuf);
10904  }
10905  return 0;
10906}
10907
10908
10909/*
10910** Read input from *in and process it.  If *in==0 then input
10911** is interactive - the user is typing it it.  Otherwise, input
10912** is coming from a file or device.  A prompt is issued and history
10913** is saved only if input is interactive.  An interrupt signal will
10914** cause this routine to exit immediately, unless input is interactive.
10915**
10916** Return the number of errors.
10917*/
10918static int process_input(ShellState *p){
10919  char *zLine = 0;          /* A single input line */
10920  char *zSql = 0;           /* Accumulated SQL text */
10921  int nLine;                /* Length of current line */
10922  int nSql = 0;             /* Bytes of zSql[] used */
10923  int nAlloc = 0;           /* Allocated zSql[] space */
10924  int rc;                   /* Error code */
10925  int errCnt = 0;           /* Number of errors seen */
10926  int startline = 0;        /* Line number for start of current input */
10927  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
10928
10929  p->lineno = 0;
10930  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
10931    fflush(p->out);
10932    zLine = one_input_line(p->in, zLine, nSql>0);
10933    if( zLine==0 ){
10934      /* End of input */
10935      if( p->in==0 && stdin_is_interactive ) printf("\n");
10936      break;
10937    }
10938    if( seenInterrupt ){
10939      if( p->in!=0 ) break;
10940      seenInterrupt = 0;
10941    }
10942    p->lineno++;
10943    if( QSS_INPLAIN(qss)
10944        && line_is_command_terminator(zLine)
10945        && line_is_complete(zSql, nSql) ){
10946      memcpy(zLine,";",2);
10947    }
10948    qss = quickscan(zLine, qss);
10949    if( QSS_PLAINWHITE(qss) && nSql==0 ){
10950      if( ShellHasFlag(p, SHFLG_Echo) )
10951        printf("%s\n", zLine);
10952      /* Just swallow single-line whitespace */
10953      qss = QSS_Start;
10954      continue;
10955    }
10956    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
10957      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
10958      if( zLine[0]=='.' ){
10959        rc = do_meta_command(zLine, p);
10960        if( rc==2 ){ /* exit requested */
10961          break;
10962        }else if( rc ){
10963          errCnt++;
10964        }
10965      }
10966      qss = QSS_Start;
10967      continue;
10968    }
10969    /* No single-line dispositions remain; accumulate line(s). */
10970    nLine = strlen30(zLine);
10971    if( nSql+nLine+2>=nAlloc ){
10972      /* Grow buffer by half-again increments when big. */
10973      nAlloc = nSql+(nSql>>1)+nLine+100;
10974      zSql = realloc(zSql, nAlloc);
10975      shell_check_oom(zSql);
10976    }
10977    if( nSql==0 ){
10978      int i;
10979      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
10980      assert( nAlloc>0 && zSql!=0 );
10981      memcpy(zSql, zLine+i, nLine+1-i);
10982      startline = p->lineno;
10983      nSql = nLine-i;
10984    }else{
10985      zSql[nSql++] = '\n';
10986      memcpy(zSql+nSql, zLine, nLine+1);
10987      nSql += nLine;
10988    }
10989    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
10990      errCnt += runOneSqlLine(p, zSql, p->in, startline);
10991      nSql = 0;
10992      if( p->outCount ){
10993        output_reset(p);
10994        p->outCount = 0;
10995      }else{
10996        clearTempFile(p);
10997      }
10998      p->bSafeMode = p->bSafeModePersist;
10999      qss = QSS_Start;
11000    }else if( nSql && QSS_PLAINWHITE(qss) ){
11001      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
11002      nSql = 0;
11003      qss = QSS_Start;
11004    }
11005  }
11006  if( nSql && QSS_PLAINDARK(qss) ){
11007    errCnt += runOneSqlLine(p, zSql, p->in, startline);
11008  }
11009  free(zSql);
11010  free(zLine);
11011  return errCnt>0;
11012}
11013
11014/*
11015** Return a pathname which is the user's home directory.  A
11016** 0 return indicates an error of some kind.
11017*/
11018static char *find_home_dir(int clearFlag){
11019  static char *home_dir = NULL;
11020  if( clearFlag ){
11021    free(home_dir);
11022    home_dir = 0;
11023    return 0;
11024  }
11025  if( home_dir ) return home_dir;
11026
11027#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11028     && !defined(__RTP__) && !defined(_WRS_KERNEL)
11029  {
11030    struct passwd *pwent;
11031    uid_t uid = getuid();
11032    if( (pwent=getpwuid(uid)) != NULL) {
11033      home_dir = pwent->pw_dir;
11034    }
11035  }
11036#endif
11037
11038#if defined(_WIN32_WCE)
11039  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11040   */
11041  home_dir = "/";
11042#else
11043
11044#if defined(_WIN32) || defined(WIN32)
11045  if (!home_dir) {
11046    home_dir = getenv("USERPROFILE");
11047  }
11048#endif
11049
11050  if (!home_dir) {
11051    home_dir = getenv("HOME");
11052  }
11053
11054#if defined(_WIN32) || defined(WIN32)
11055  if (!home_dir) {
11056    char *zDrive, *zPath;
11057    int n;
11058    zDrive = getenv("HOMEDRIVE");
11059    zPath = getenv("HOMEPATH");
11060    if( zDrive && zPath ){
11061      n = strlen30(zDrive) + strlen30(zPath) + 1;
11062      home_dir = malloc( n );
11063      if( home_dir==0 ) return 0;
11064      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11065      return home_dir;
11066    }
11067    home_dir = "c:\\";
11068  }
11069#endif
11070
11071#endif /* !_WIN32_WCE */
11072
11073  if( home_dir ){
11074    int n = strlen30(home_dir) + 1;
11075    char *z = malloc( n );
11076    if( z ) memcpy(z, home_dir, n);
11077    home_dir = z;
11078  }
11079
11080  return home_dir;
11081}
11082
11083/*
11084** Read input from the file given by sqliterc_override.  Or if that
11085** parameter is NULL, take input from ~/.sqliterc
11086**
11087** Returns the number of errors.
11088*/
11089static void process_sqliterc(
11090  ShellState *p,                  /* Configuration data */
11091  const char *sqliterc_override   /* Name of config file. NULL to use default */
11092){
11093  char *home_dir = NULL;
11094  const char *sqliterc = sqliterc_override;
11095  char *zBuf = 0;
11096  FILE *inSaved = p->in;
11097  int savedLineno = p->lineno;
11098
11099  if (sqliterc == NULL) {
11100    home_dir = find_home_dir(0);
11101    if( home_dir==0 ){
11102      raw_printf(stderr, "-- warning: cannot find home directory;"
11103                      " cannot read ~/.sqliterc\n");
11104      return;
11105    }
11106    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11107    shell_check_oom(zBuf);
11108    sqliterc = zBuf;
11109  }
11110  p->in = fopen(sqliterc,"rb");
11111  if( p->in ){
11112    if( stdin_is_interactive ){
11113      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11114    }
11115    if( process_input(p) && bail_on_error ) exit(1);
11116    fclose(p->in);
11117  }else if( sqliterc_override!=0 ){
11118    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11119    if( bail_on_error ) exit(1);
11120  }
11121  p->in = inSaved;
11122  p->lineno = savedLineno;
11123  sqlite3_free(zBuf);
11124}
11125
11126/*
11127** Show available command line options
11128*/
11129static const char zOptions[] =
11130#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11131  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11132#endif
11133  "   -append              append the database to the end of the file\n"
11134  "   -ascii               set output mode to 'ascii'\n"
11135  "   -bail                stop after hitting an error\n"
11136  "   -batch               force batch I/O\n"
11137  "   -box                 set output mode to 'box'\n"
11138  "   -column              set output mode to 'column'\n"
11139  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11140  "   -csv                 set output mode to 'csv'\n"
11141#if !defined(SQLITE_OMIT_DESERIALIZE)
11142  "   -deserialize         open the database using sqlite3_deserialize()\n"
11143#endif
11144  "   -echo                print commands before execution\n"
11145  "   -init FILENAME       read/process named file\n"
11146  "   -[no]header          turn headers on or off\n"
11147#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11148  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11149#endif
11150  "   -help                show this message\n"
11151  "   -html                set output mode to HTML\n"
11152  "   -interactive         force interactive I/O\n"
11153  "   -json                set output mode to 'json'\n"
11154  "   -line                set output mode to 'line'\n"
11155  "   -list                set output mode to 'list'\n"
11156  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11157  "   -markdown            set output mode to 'markdown'\n"
11158#if !defined(SQLITE_OMIT_DESERIALIZE)
11159  "   -maxsize N           maximum size for a --deserialize database\n"
11160#endif
11161  "   -memtrace            trace all memory allocations and deallocations\n"
11162  "   -mmap N              default mmap size set to N\n"
11163#ifdef SQLITE_ENABLE_MULTIPLEX
11164  "   -multiplex           enable the multiplexor VFS\n"
11165#endif
11166  "   -newline SEP         set output row separator. Default: '\\n'\n"
11167  "   -nofollow            refuse to open symbolic links to database files\n"
11168  "   -nonce STRING        set the safe-mode escape nonce\n"
11169  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11170  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11171  "   -quote               set output mode to 'quote'\n"
11172  "   -readonly            open the database read-only\n"
11173  "   -safe                enable safe-mode\n"
11174  "   -separator SEP       set output column separator. Default: '|'\n"
11175#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11176  "   -sorterref SIZE      sorter references threshold size\n"
11177#endif
11178  "   -stats               print memory stats before each finalize\n"
11179  "   -table               set output mode to 'table'\n"
11180  "   -tabs                set output mode to 'tabs'\n"
11181  "   -version             show SQLite version\n"
11182  "   -vfs NAME            use NAME as the default VFS\n"
11183#ifdef SQLITE_ENABLE_VFSTRACE
11184  "   -vfstrace            enable tracing of all VFS calls\n"
11185#endif
11186#ifdef SQLITE_HAVE_ZLIB
11187  "   -zip                 open the file as a ZIP Archive\n"
11188#endif
11189;
11190static void usage(int showDetail){
11191  utf8_printf(stderr,
11192      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11193      "FILENAME is the name of an SQLite database. A new database is created\n"
11194      "if the file does not previously exist.\n", Argv0);
11195  if( showDetail ){
11196    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11197  }else{
11198    raw_printf(stderr, "Use the -help option for additional information\n");
11199  }
11200  exit(1);
11201}
11202
11203/*
11204** Internal check:  Verify that the SQLite is uninitialized.  Print a
11205** error message if it is initialized.
11206*/
11207static void verify_uninitialized(void){
11208  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11209    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11210                        " initialization.\n");
11211  }
11212}
11213
11214/*
11215** Initialize the state information in data
11216*/
11217static void main_init(ShellState *data) {
11218  memset(data, 0, sizeof(*data));
11219  data->normalMode = data->cMode = data->mode = MODE_List;
11220  data->autoExplain = 1;
11221  data->pAuxDb = &data->aAuxDb[0];
11222  memcpy(data->colSeparator,SEP_Column, 2);
11223  memcpy(data->rowSeparator,SEP_Row, 2);
11224  data->showHeader = 0;
11225  data->shellFlgs = SHFLG_Lookaside;
11226  verify_uninitialized();
11227  sqlite3_config(SQLITE_CONFIG_URI, 1);
11228  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11229  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11230  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11231  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11232}
11233
11234/*
11235** Output text to the console in a font that attracts extra attention.
11236*/
11237#ifdef _WIN32
11238static void printBold(const char *zText){
11239#if !SQLITE_OS_WINRT
11240  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11241  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11242  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11243  SetConsoleTextAttribute(out,
11244         FOREGROUND_RED|FOREGROUND_INTENSITY
11245  );
11246#endif
11247  printf("%s", zText);
11248#if !SQLITE_OS_WINRT
11249  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11250#endif
11251}
11252#else
11253static void printBold(const char *zText){
11254  printf("\033[1m%s\033[0m", zText);
11255}
11256#endif
11257
11258/*
11259** Get the argument to an --option.  Throw an error and die if no argument
11260** is available.
11261*/
11262static char *cmdline_option_value(int argc, char **argv, int i){
11263  if( i==argc ){
11264    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11265            argv[0], argv[argc-1]);
11266    exit(1);
11267  }
11268  return argv[i];
11269}
11270
11271#ifndef SQLITE_SHELL_IS_UTF8
11272#  if (defined(_WIN32) || defined(WIN32)) \
11273   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11274#    define SQLITE_SHELL_IS_UTF8          (0)
11275#  else
11276#    define SQLITE_SHELL_IS_UTF8          (1)
11277#  endif
11278#endif
11279
11280#if SQLITE_SHELL_IS_UTF8
11281int SQLITE_CDECL main(int argc, char **argv){
11282#else
11283int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11284  char **argv;
11285#endif
11286  char *zErrMsg = 0;
11287  ShellState data;
11288  const char *zInitFile = 0;
11289  int i;
11290  int rc = 0;
11291  int warnInmemoryDb = 0;
11292  int readStdin = 1;
11293  int nCmd = 0;
11294  char **azCmd = 0;
11295  const char *zVfs = 0;           /* Value of -vfs command-line option */
11296#if !SQLITE_SHELL_IS_UTF8
11297  char **argvToFree = 0;
11298  int argcToFree = 0;
11299#endif
11300
11301  setBinaryMode(stdin, 0);
11302  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11303  stdin_is_interactive = isatty(0);
11304  stdout_is_console = isatty(1);
11305
11306#if !defined(_WIN32_WCE)
11307  if( getenv("SQLITE_DEBUG_BREAK") ){
11308    if( isatty(0) && isatty(2) ){
11309      fprintf(stderr,
11310          "attach debugger to process %d and press any key to continue.\n",
11311          GETPID());
11312      fgetc(stdin);
11313    }else{
11314#if defined(_WIN32) || defined(WIN32)
11315#if SQLITE_OS_WINRT
11316      __debugbreak();
11317#else
11318      DebugBreak();
11319#endif
11320#elif defined(SIGTRAP)
11321      raise(SIGTRAP);
11322#endif
11323    }
11324  }
11325#endif
11326
11327#if USE_SYSTEM_SQLITE+0!=1
11328  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11329    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11330            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11331    exit(1);
11332  }
11333#endif
11334  main_init(&data);
11335
11336  /* On Windows, we must translate command-line arguments into UTF-8.
11337  ** The SQLite memory allocator subsystem has to be enabled in order to
11338  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11339  ** subsequent sqlite3_config() calls will work.  So copy all results into
11340  ** memory that does not come from the SQLite memory allocator.
11341  */
11342#if !SQLITE_SHELL_IS_UTF8
11343  sqlite3_initialize();
11344  argvToFree = malloc(sizeof(argv[0])*argc*2);
11345  shell_check_oom(argvToFree);
11346  argcToFree = argc;
11347  argv = argvToFree + argc;
11348  for(i=0; i<argc; i++){
11349    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11350    int n;
11351    shell_check_oom(z);
11352    n = (int)strlen(z);
11353    argv[i] = malloc( n+1 );
11354    shell_check_oom(argv[i]);
11355    memcpy(argv[i], z, n+1);
11356    argvToFree[i] = argv[i];
11357    sqlite3_free(z);
11358  }
11359  sqlite3_shutdown();
11360#endif
11361
11362  assert( argc>=1 && argv && argv[0] );
11363  Argv0 = argv[0];
11364
11365  /* Make sure we have a valid signal handler early, before anything
11366  ** else is done.
11367  */
11368#ifdef SIGINT
11369  signal(SIGINT, interrupt_handler);
11370#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11371  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11372#endif
11373
11374#ifdef SQLITE_SHELL_DBNAME_PROC
11375  {
11376    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11377    ** of a C-function that will provide the name of the database file.  Use
11378    ** this compile-time option to embed this shell program in larger
11379    ** applications. */
11380    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11381    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11382    warnInmemoryDb = 0;
11383  }
11384#endif
11385
11386  /* Do an initial pass through the command-line argument to locate
11387  ** the name of the database file, the name of the initialization file,
11388  ** the size of the alternative malloc heap,
11389  ** and the first command to execute.
11390  */
11391  verify_uninitialized();
11392  for(i=1; i<argc; i++){
11393    char *z;
11394    z = argv[i];
11395    if( z[0]!='-' ){
11396      if( data.aAuxDb->zDbFilename==0 ){
11397        data.aAuxDb->zDbFilename = z;
11398      }else{
11399        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11400        ** mean that nothing is read from stdin */
11401        readStdin = 0;
11402        nCmd++;
11403        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11404        shell_check_oom(azCmd);
11405        azCmd[nCmd-1] = z;
11406      }
11407    }
11408    if( z[1]=='-' ) z++;
11409    if( strcmp(z,"-separator")==0
11410     || strcmp(z,"-nullvalue")==0
11411     || strcmp(z,"-newline")==0
11412     || strcmp(z,"-cmd")==0
11413    ){
11414      (void)cmdline_option_value(argc, argv, ++i);
11415    }else if( strcmp(z,"-init")==0 ){
11416      zInitFile = cmdline_option_value(argc, argv, ++i);
11417    }else if( strcmp(z,"-batch")==0 ){
11418      /* Need to check for batch mode here to so we can avoid printing
11419      ** informational messages (like from process_sqliterc) before
11420      ** we do the actual processing of arguments later in a second pass.
11421      */
11422      stdin_is_interactive = 0;
11423    }else if( strcmp(z,"-heap")==0 ){
11424#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11425      const char *zSize;
11426      sqlite3_int64 szHeap;
11427
11428      zSize = cmdline_option_value(argc, argv, ++i);
11429      szHeap = integerValue(zSize);
11430      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11431      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11432#else
11433      (void)cmdline_option_value(argc, argv, ++i);
11434#endif
11435    }else if( strcmp(z,"-pagecache")==0 ){
11436      sqlite3_int64 n, sz;
11437      sz = integerValue(cmdline_option_value(argc,argv,++i));
11438      if( sz>70000 ) sz = 70000;
11439      if( sz<0 ) sz = 0;
11440      n = integerValue(cmdline_option_value(argc,argv,++i));
11441      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
11442        n = 0xffffffffffffLL/sz;
11443      }
11444      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
11445                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
11446      data.shellFlgs |= SHFLG_Pagecache;
11447    }else if( strcmp(z,"-lookaside")==0 ){
11448      int n, sz;
11449      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
11450      if( sz<0 ) sz = 0;
11451      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11452      if( n<0 ) n = 0;
11453      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
11454      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
11455    }else if( strcmp(z,"-threadsafe")==0 ){
11456      int n;
11457      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11458      switch( n ){
11459         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
11460         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
11461         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
11462      }
11463#ifdef SQLITE_ENABLE_VFSTRACE
11464    }else if( strcmp(z,"-vfstrace")==0 ){
11465      extern int vfstrace_register(
11466         const char *zTraceName,
11467         const char *zOldVfsName,
11468         int (*xOut)(const char*,void*),
11469         void *pOutArg,
11470         int makeDefault
11471      );
11472      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
11473#endif
11474#ifdef SQLITE_ENABLE_MULTIPLEX
11475    }else if( strcmp(z,"-multiplex")==0 ){
11476      extern int sqlite3_multiple_initialize(const char*,int);
11477      sqlite3_multiplex_initialize(0, 1);
11478#endif
11479    }else if( strcmp(z,"-mmap")==0 ){
11480      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11481      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
11482#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11483    }else if( strcmp(z,"-sorterref")==0 ){
11484      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11485      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
11486#endif
11487    }else if( strcmp(z,"-vfs")==0 ){
11488      zVfs = cmdline_option_value(argc, argv, ++i);
11489#ifdef SQLITE_HAVE_ZLIB
11490    }else if( strcmp(z,"-zip")==0 ){
11491      data.openMode = SHELL_OPEN_ZIPFILE;
11492#endif
11493    }else if( strcmp(z,"-append")==0 ){
11494      data.openMode = SHELL_OPEN_APPENDVFS;
11495#ifndef SQLITE_OMIT_DESERIALIZE
11496    }else if( strcmp(z,"-deserialize")==0 ){
11497      data.openMode = SHELL_OPEN_DESERIALIZE;
11498    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
11499      data.szMax = integerValue(argv[++i]);
11500#endif
11501    }else if( strcmp(z,"-readonly")==0 ){
11502      data.openMode = SHELL_OPEN_READONLY;
11503    }else if( strcmp(z,"-nofollow")==0 ){
11504      data.openFlags = SQLITE_OPEN_NOFOLLOW;
11505#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11506    }else if( strncmp(z, "-A",2)==0 ){
11507      /* All remaining command-line arguments are passed to the ".archive"
11508      ** command, so ignore them */
11509      break;
11510#endif
11511    }else if( strcmp(z, "-memtrace")==0 ){
11512      sqlite3MemTraceActivate(stderr);
11513    }else if( strcmp(z,"-bail")==0 ){
11514      bail_on_error = 1;
11515    }else if( strcmp(z,"-nonce")==0 ){
11516      free(data.zNonce);
11517      data.zNonce = strdup(argv[++i]);
11518    }else if( strcmp(z,"-safe")==0 ){
11519      /* no-op - catch this on the second pass */
11520    }
11521  }
11522  verify_uninitialized();
11523
11524
11525#ifdef SQLITE_SHELL_INIT_PROC
11526  {
11527    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
11528    ** of a C-function that will perform initialization actions on SQLite that
11529    ** occur just before or after sqlite3_initialize(). Use this compile-time
11530    ** option to embed this shell program in larger applications. */
11531    extern void SQLITE_SHELL_INIT_PROC(void);
11532    SQLITE_SHELL_INIT_PROC();
11533  }
11534#else
11535  /* All the sqlite3_config() calls have now been made. So it is safe
11536  ** to call sqlite3_initialize() and process any command line -vfs option. */
11537  sqlite3_initialize();
11538#endif
11539
11540  if( zVfs ){
11541    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
11542    if( pVfs ){
11543      sqlite3_vfs_register(pVfs, 1);
11544    }else{
11545      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
11546      exit(1);
11547    }
11548  }
11549
11550  if( data.pAuxDb->zDbFilename==0 ){
11551#ifndef SQLITE_OMIT_MEMORYDB
11552    data.pAuxDb->zDbFilename = ":memory:";
11553    warnInmemoryDb = argc==1;
11554#else
11555    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
11556    return 1;
11557#endif
11558  }
11559  data.out = stdout;
11560  sqlite3_appendvfs_init(0,0,0);
11561
11562  /* Go ahead and open the database file if it already exists.  If the
11563  ** file does not exist, delay opening it.  This prevents empty database
11564  ** files from being created if a user mistypes the database name argument
11565  ** to the sqlite command-line tool.
11566  */
11567  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
11568    open_db(&data, 0);
11569  }
11570
11571  /* Process the initialization file if there is one.  If no -init option
11572  ** is given on the command line, look for a file named ~/.sqliterc and
11573  ** try to process it.
11574  */
11575  process_sqliterc(&data,zInitFile);
11576
11577  /* Make a second pass through the command-line argument and set
11578  ** options.  This second pass is delayed until after the initialization
11579  ** file is processed so that the command-line arguments will override
11580  ** settings in the initialization file.
11581  */
11582  for(i=1; i<argc; i++){
11583    char *z = argv[i];
11584    if( z[0]!='-' ) continue;
11585    if( z[1]=='-' ){ z++; }
11586    if( strcmp(z,"-init")==0 ){
11587      i++;
11588    }else if( strcmp(z,"-html")==0 ){
11589      data.mode = MODE_Html;
11590    }else if( strcmp(z,"-list")==0 ){
11591      data.mode = MODE_List;
11592    }else if( strcmp(z,"-quote")==0 ){
11593      data.mode = MODE_Quote;
11594      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
11595      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11596    }else if( strcmp(z,"-line")==0 ){
11597      data.mode = MODE_Line;
11598    }else if( strcmp(z,"-column")==0 ){
11599      data.mode = MODE_Column;
11600    }else if( strcmp(z,"-json")==0 ){
11601      data.mode = MODE_Json;
11602    }else if( strcmp(z,"-markdown")==0 ){
11603      data.mode = MODE_Markdown;
11604    }else if( strcmp(z,"-table")==0 ){
11605      data.mode = MODE_Table;
11606    }else if( strcmp(z,"-box")==0 ){
11607      data.mode = MODE_Box;
11608    }else if( strcmp(z,"-csv")==0 ){
11609      data.mode = MODE_Csv;
11610      memcpy(data.colSeparator,",",2);
11611#ifdef SQLITE_HAVE_ZLIB
11612    }else if( strcmp(z,"-zip")==0 ){
11613      data.openMode = SHELL_OPEN_ZIPFILE;
11614#endif
11615    }else if( strcmp(z,"-append")==0 ){
11616      data.openMode = SHELL_OPEN_APPENDVFS;
11617#ifndef SQLITE_OMIT_DESERIALIZE
11618    }else if( strcmp(z,"-deserialize")==0 ){
11619      data.openMode = SHELL_OPEN_DESERIALIZE;
11620    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
11621      data.szMax = integerValue(argv[++i]);
11622#endif
11623    }else if( strcmp(z,"-readonly")==0 ){
11624      data.openMode = SHELL_OPEN_READONLY;
11625    }else if( strcmp(z,"-nofollow")==0 ){
11626      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
11627    }else if( strcmp(z,"-ascii")==0 ){
11628      data.mode = MODE_Ascii;
11629      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
11630      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
11631    }else if( strcmp(z,"-tabs")==0 ){
11632      data.mode = MODE_List;
11633      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
11634      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11635    }else if( strcmp(z,"-separator")==0 ){
11636      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
11637                       "%s",cmdline_option_value(argc,argv,++i));
11638    }else if( strcmp(z,"-newline")==0 ){
11639      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
11640                       "%s",cmdline_option_value(argc,argv,++i));
11641    }else if( strcmp(z,"-nullvalue")==0 ){
11642      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
11643                       "%s",cmdline_option_value(argc,argv,++i));
11644    }else if( strcmp(z,"-header")==0 ){
11645      data.showHeader = 1;
11646      ShellSetFlag(&data, SHFLG_HeaderSet);
11647     }else if( strcmp(z,"-noheader")==0 ){
11648      data.showHeader = 0;
11649      ShellSetFlag(&data, SHFLG_HeaderSet);
11650    }else if( strcmp(z,"-echo")==0 ){
11651      ShellSetFlag(&data, SHFLG_Echo);
11652    }else if( strcmp(z,"-eqp")==0 ){
11653      data.autoEQP = AUTOEQP_on;
11654    }else if( strcmp(z,"-eqpfull")==0 ){
11655      data.autoEQP = AUTOEQP_full;
11656    }else if( strcmp(z,"-stats")==0 ){
11657      data.statsOn = 1;
11658    }else if( strcmp(z,"-scanstats")==0 ){
11659      data.scanstatsOn = 1;
11660    }else if( strcmp(z,"-backslash")==0 ){
11661      /* Undocumented command-line option: -backslash
11662      ** Causes C-style backslash escapes to be evaluated in SQL statements
11663      ** prior to sending the SQL into SQLite.  Useful for injecting
11664      ** crazy bytes in the middle of SQL statements for testing and debugging.
11665      */
11666      ShellSetFlag(&data, SHFLG_Backslash);
11667    }else if( strcmp(z,"-bail")==0 ){
11668      /* No-op.  The bail_on_error flag should already be set. */
11669    }else if( strcmp(z,"-version")==0 ){
11670      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
11671      return 0;
11672    }else if( strcmp(z,"-interactive")==0 ){
11673      stdin_is_interactive = 1;
11674    }else if( strcmp(z,"-batch")==0 ){
11675      stdin_is_interactive = 0;
11676    }else if( strcmp(z,"-heap")==0 ){
11677      i++;
11678    }else if( strcmp(z,"-pagecache")==0 ){
11679      i+=2;
11680    }else if( strcmp(z,"-lookaside")==0 ){
11681      i+=2;
11682    }else if( strcmp(z,"-threadsafe")==0 ){
11683      i+=2;
11684    }else if( strcmp(z,"-nonce")==0 ){
11685      i += 2;
11686    }else if( strcmp(z,"-mmap")==0 ){
11687      i++;
11688    }else if( strcmp(z,"-memtrace")==0 ){
11689      i++;
11690#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11691    }else if( strcmp(z,"-sorterref")==0 ){
11692      i++;
11693#endif
11694    }else if( strcmp(z,"-vfs")==0 ){
11695      i++;
11696#ifdef SQLITE_ENABLE_VFSTRACE
11697    }else if( strcmp(z,"-vfstrace")==0 ){
11698      i++;
11699#endif
11700#ifdef SQLITE_ENABLE_MULTIPLEX
11701    }else if( strcmp(z,"-multiplex")==0 ){
11702      i++;
11703#endif
11704    }else if( strcmp(z,"-help")==0 ){
11705      usage(1);
11706    }else if( strcmp(z,"-cmd")==0 ){
11707      /* Run commands that follow -cmd first and separately from commands
11708      ** that simply appear on the command-line.  This seems goofy.  It would
11709      ** be better if all commands ran in the order that they appear.  But
11710      ** we retain the goofy behavior for historical compatibility. */
11711      if( i==argc-1 ) break;
11712      z = cmdline_option_value(argc,argv,++i);
11713      if( z[0]=='.' ){
11714        rc = do_meta_command(z, &data);
11715        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
11716      }else{
11717        open_db(&data, 0);
11718        rc = shell_exec(&data, z, &zErrMsg);
11719        if( zErrMsg!=0 ){
11720          utf8_printf(stderr,"Error: %s\n", zErrMsg);
11721          if( bail_on_error ) return rc!=0 ? rc : 1;
11722        }else if( rc!=0 ){
11723          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
11724          if( bail_on_error ) return rc;
11725        }
11726      }
11727#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11728    }else if( strncmp(z, "-A", 2)==0 ){
11729      if( nCmd>0 ){
11730        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
11731                            " with \"%s\"\n", z);
11732        return 1;
11733      }
11734      open_db(&data, OPEN_DB_ZIPFILE);
11735      if( z[2] ){
11736        argv[i] = &z[2];
11737        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
11738      }else{
11739        arDotCommand(&data, 1, argv+i, argc-i);
11740      }
11741      readStdin = 0;
11742      break;
11743#endif
11744    }else if( strcmp(z,"-safe")==0 ){
11745      data.bSafeMode = data.bSafeModePersist = 1;
11746    }else{
11747      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
11748      raw_printf(stderr,"Use -help for a list of options.\n");
11749      return 1;
11750    }
11751    data.cMode = data.mode;
11752  }
11753
11754  if( !readStdin ){
11755    /* Run all arguments that do not begin with '-' as if they were separate
11756    ** command-line inputs, except for the argToSkip argument which contains
11757    ** the database filename.
11758    */
11759    for(i=0; i<nCmd; i++){
11760      if( azCmd[i][0]=='.' ){
11761        rc = do_meta_command(azCmd[i], &data);
11762        if( rc ){
11763          free(azCmd);
11764          return rc==2 ? 0 : rc;
11765        }
11766      }else{
11767        open_db(&data, 0);
11768        rc = shell_exec(&data, azCmd[i], &zErrMsg);
11769        if( zErrMsg || rc ){
11770          if( zErrMsg!=0 ){
11771            utf8_printf(stderr,"Error: %s\n", zErrMsg);
11772          }else{
11773            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
11774          }
11775          sqlite3_free(zErrMsg);
11776          free(azCmd);
11777          return rc!=0 ? rc : 1;
11778        }
11779      }
11780    }
11781  }else{
11782    /* Run commands received from standard input
11783    */
11784    if( stdin_is_interactive ){
11785      char *zHome;
11786      char *zHistory;
11787      int nHistory;
11788      printf(
11789        "SQLite version %s %.19s\n" /*extra-version-info*/
11790        "Enter \".help\" for usage hints.\n",
11791        sqlite3_libversion(), sqlite3_sourceid()
11792      );
11793      if( warnInmemoryDb ){
11794        printf("Connected to a ");
11795        printBold("transient in-memory database");
11796        printf(".\nUse \".open FILENAME\" to reopen on a "
11797               "persistent database.\n");
11798      }
11799      zHistory = getenv("SQLITE_HISTORY");
11800      if( zHistory ){
11801        zHistory = strdup(zHistory);
11802      }else if( (zHome = find_home_dir(0))!=0 ){
11803        nHistory = strlen30(zHome) + 20;
11804        if( (zHistory = malloc(nHistory))!=0 ){
11805          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
11806        }
11807      }
11808      if( zHistory ){ shell_read_history(zHistory); }
11809#if HAVE_READLINE || HAVE_EDITLINE
11810      rl_attempted_completion_function = readline_completion;
11811#elif HAVE_LINENOISE
11812      linenoiseSetCompletionCallback(linenoise_completion);
11813#endif
11814      data.in = 0;
11815      rc = process_input(&data);
11816      if( zHistory ){
11817        shell_stifle_history(2000);
11818        shell_write_history(zHistory);
11819        free(zHistory);
11820      }
11821    }else{
11822      data.in = stdin;
11823      rc = process_input(&data);
11824    }
11825  }
11826  free(azCmd);
11827  set_table_name(&data, 0);
11828  if( data.db ){
11829    session_close_all(&data, -1);
11830    close_db(data.db);
11831  }
11832  for(i=0; i<ArraySize(data.aAuxDb); i++){
11833    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
11834    if( data.aAuxDb[i].db ){
11835      session_close_all(&data, i);
11836      close_db(data.aAuxDb[i].db);
11837    }
11838  }
11839  find_home_dir(1);
11840  output_reset(&data);
11841  data.doXdgOpen = 0;
11842  clearTempFile(&data);
11843#if !SQLITE_SHELL_IS_UTF8
11844  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
11845  free(argvToFree);
11846#endif
11847  free(data.colWidth);
11848  free(data.zNonce);
11849  /* Clear the global data structure so that valgrind will detect memory
11850  ** leaks */
11851  memset(&data, 0, sizeof(data));
11852  return rc;
11853}
11854