xref: /sqlite-3.40.0/src/shell.c.in (revision dedd51ae)
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# define SHELL_STRINGIFY_(f) #f
27# define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
28#ifdef SQLITE_CUSTOM_INCLUDE
29# include SHELL_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/* Parameters affecting columnar mode result display (defaulting together) */
1070typedef struct ColModeOpts {
1071  int iWrap;            /* In columnar modes, wrap lines reaching this limit */
1072  u8 bQuote;            /* Quote results for .mode box and table */
1073  u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
1074} ColModeOpts;
1075#define ColModeOpts_default { 60, 0, 0 }
1076#define ColModeOpts_default_qbox { 60, 1, 0 }
1077
1078/*
1079** State information about the database connection is contained in an
1080** instance of the following structure.
1081*/
1082typedef struct ShellState ShellState;
1083struct ShellState {
1084  sqlite3 *db;           /* The database */
1085  u8 autoExplain;        /* Automatically turn on .explain mode */
1086  u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1087  u8 autoEQPtest;        /* autoEQP is in test mode */
1088  u8 autoEQPtrace;       /* autoEQP is in trace mode */
1089  u8 scanstatsOn;        /* True to display scan stats before each finalize */
1090  u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1091  u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
1092  u8 nEqpLevel;          /* Depth of the EQP output graph */
1093  u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
1094  u8 bSafeMode;          /* True to prohibit unsafe operations */
1095  u8 bSafeModePersist;   /* The long-term value of bSafeMode */
1096  ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
1097  unsigned statsOn;      /* True to display memory stats before each finalize */
1098  unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
1099  int inputNesting;      /* Track nesting level of .read and other redirects */
1100  int outCount;          /* Revert to stdout when reaching zero */
1101  int cnt;               /* Number of records displayed so far */
1102  int lineno;            /* Line number of last line read from in */
1103  int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
1104  FILE *in;              /* Read commands from this stream */
1105  FILE *out;             /* Write results here */
1106  FILE *traceOut;        /* Output for sqlite3_trace() */
1107  int nErr;              /* Number of errors seen */
1108  int mode;              /* An output mode setting */
1109  int modePrior;         /* Saved mode */
1110  int cMode;             /* temporary output mode for the current query */
1111  int normalMode;        /* Output mode before ".explain on" */
1112  int writableSchema;    /* True if PRAGMA writable_schema=ON */
1113  int showHeader;        /* True to show column names in List or Column mode */
1114  int nCheck;            /* Number of ".check" commands run */
1115  unsigned nProgress;    /* Number of progress callbacks encountered */
1116  unsigned mxProgress;   /* Maximum progress callbacks before failing */
1117  unsigned flgProgress;  /* Flags for the progress callback */
1118  unsigned shellFlgs;    /* Various flags */
1119  unsigned priorShFlgs;  /* Saved copy of flags */
1120  sqlite3_int64 szMax;   /* --maxsize argument to .open */
1121  char *zDestTable;      /* Name of destination table when MODE_Insert */
1122  char *zTempFile;       /* Temporary file that might need deleting */
1123  char zTestcase[30];    /* Name of current test case */
1124  char colSeparator[20]; /* Column separator character for several modes */
1125  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1126  char colSepPrior[20];  /* Saved column separator */
1127  char rowSepPrior[20];  /* Saved row separator */
1128  int *colWidth;         /* Requested width of each column in columnar modes */
1129  int *actualWidth;      /* Actual width of each column */
1130  int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
1131  char nullValue[20];    /* The text to print when a NULL comes back from
1132                         ** the database */
1133  char outfile[FILENAME_MAX]; /* Filename for *out */
1134  sqlite3_stmt *pStmt;   /* Current statement if any. */
1135  FILE *pLog;            /* Write log output here */
1136  struct AuxDb {         /* Storage space for auxiliary database connections */
1137    sqlite3 *db;               /* Connection pointer */
1138    const char *zDbFilename;   /* Filename used to open the connection */
1139    char *zFreeOnClose;        /* Free this memory allocation on close */
1140#if defined(SQLITE_ENABLE_SESSION)
1141    int nSession;              /* Number of active sessions */
1142    OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
1143#endif
1144  } aAuxDb[5],           /* Array of all database connections */
1145    *pAuxDb;             /* Currently active database connection */
1146  int *aiIndent;         /* Array of indents used in MODE_Explain */
1147  int nIndent;           /* Size of array aiIndent[] */
1148  int iIndent;           /* Index of current op in aiIndent[] */
1149  char *zNonce;          /* Nonce for temporary safe-mode excapes */
1150  EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
1151  ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
1152};
1153
1154
1155/* Allowed values for ShellState.autoEQP
1156*/
1157#define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
1158#define AUTOEQP_on       1           /* Automatic EQP is on */
1159#define AUTOEQP_trigger  2           /* On and also show plans for triggers */
1160#define AUTOEQP_full     3           /* Show full EXPLAIN */
1161
1162/* Allowed values for ShellState.openMode
1163*/
1164#define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
1165#define SHELL_OPEN_NORMAL      1      /* Normal database file */
1166#define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
1167#define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
1168#define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
1169#define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
1170#define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
1171
1172/* Allowed values for ShellState.eTraceType
1173*/
1174#define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
1175#define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
1176#define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
1177
1178/* Bits in the ShellState.flgProgress variable */
1179#define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
1180#define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
1181                                   ** callback limit is reached, and for each
1182                                   ** top-level SQL statement */
1183#define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
1184
1185/*
1186** These are the allowed shellFlgs values
1187*/
1188#define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
1189#define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
1190#define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
1191#define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
1192#define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
1193#define SHFLG_CountChanges   0x00000020 /* .changes setting */
1194#define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
1195#define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
1196#define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
1197#define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
1198
1199/*
1200** Macros for testing and setting shellFlgs
1201*/
1202#define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
1203#define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
1204#define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
1205
1206/*
1207** These are the allowed modes.
1208*/
1209#define MODE_Line     0  /* One column per line.  Blank line between records */
1210#define MODE_Column   1  /* One record per line in neat columns */
1211#define MODE_List     2  /* One record per line with a separator */
1212#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
1213#define MODE_Html     4  /* Generate an XHTML table */
1214#define MODE_Insert   5  /* Generate SQL "insert" statements */
1215#define MODE_Quote    6  /* Quote values as for SQL */
1216#define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
1217#define MODE_Csv      8  /* Quote strings, numbers are plain */
1218#define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
1219#define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
1220#define MODE_Pretty  11  /* Pretty-print schemas */
1221#define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
1222#define MODE_Json    13  /* Output JSON */
1223#define MODE_Markdown 14 /* Markdown formatting */
1224#define MODE_Table   15  /* MySQL-style table formatting */
1225#define MODE_Box     16  /* Unicode box-drawing characters */
1226#define MODE_Count   17  /* Output only a count of the rows of output */
1227#define MODE_Off     18  /* No query output shown */
1228
1229static const char *modeDescr[] = {
1230  "line",
1231  "column",
1232  "list",
1233  "semi",
1234  "html",
1235  "insert",
1236  "quote",
1237  "tcl",
1238  "csv",
1239  "explain",
1240  "ascii",
1241  "prettyprint",
1242  "eqp",
1243  "json",
1244  "markdown",
1245  "table",
1246  "box",
1247  "count",
1248  "off"
1249};
1250
1251/*
1252** These are the column/row/line separators used by the various
1253** import/export modes.
1254*/
1255#define SEP_Column    "|"
1256#define SEP_Row       "\n"
1257#define SEP_Tab       "\t"
1258#define SEP_Space     " "
1259#define SEP_Comma     ","
1260#define SEP_CrLf      "\r\n"
1261#define SEP_Unit      "\x1F"
1262#define SEP_Record    "\x1E"
1263
1264/*
1265** Limit input nesting via .read or any other input redirect.
1266** It's not too expensive, so a generous allowance can be made.
1267*/
1268#define MAX_INPUT_NESTING 25
1269
1270/*
1271** A callback for the sqlite3_log() interface.
1272*/
1273static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1274  ShellState *p = (ShellState*)pArg;
1275  if( p->pLog==0 ) return;
1276  utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1277  fflush(p->pLog);
1278}
1279
1280/*
1281** SQL function:  shell_putsnl(X)
1282**
1283** Write the text X to the screen (or whatever output is being directed)
1284** adding a newline at the end, and then return X.
1285*/
1286static void shellPutsFunc(
1287  sqlite3_context *pCtx,
1288  int nVal,
1289  sqlite3_value **apVal
1290){
1291  ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1292  (void)nVal;
1293  utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1294  sqlite3_result_value(pCtx, apVal[0]);
1295}
1296
1297/*
1298** If in safe mode, print an error message described by the arguments
1299** and exit immediately.
1300*/
1301static void failIfSafeMode(
1302  ShellState *p,
1303  const char *zErrMsg,
1304  ...
1305){
1306  if( p->bSafeMode ){
1307    va_list ap;
1308    char *zMsg;
1309    va_start(ap, zErrMsg);
1310    zMsg = sqlite3_vmprintf(zErrMsg, ap);
1311    va_end(ap);
1312    raw_printf(stderr, "line %d: ", p->lineno);
1313    utf8_printf(stderr, "%s\n", zMsg);
1314    exit(1);
1315  }
1316}
1317
1318/*
1319** SQL function:   edit(VALUE)
1320**                 edit(VALUE,EDITOR)
1321**
1322** These steps:
1323**
1324**     (1) Write VALUE into a temporary file.
1325**     (2) Run program EDITOR on that temporary file.
1326**     (3) Read the temporary file back and return its content as the result.
1327**     (4) Delete the temporary file
1328**
1329** If the EDITOR argument is omitted, use the value in the VISUAL
1330** environment variable.  If still there is no EDITOR, through an error.
1331**
1332** Also throw an error if the EDITOR program returns a non-zero exit code.
1333*/
1334#ifndef SQLITE_NOHAVE_SYSTEM
1335static void editFunc(
1336  sqlite3_context *context,
1337  int argc,
1338  sqlite3_value **argv
1339){
1340  const char *zEditor;
1341  char *zTempFile = 0;
1342  sqlite3 *db;
1343  char *zCmd = 0;
1344  int bBin;
1345  int rc;
1346  int hasCRNL = 0;
1347  FILE *f = 0;
1348  sqlite3_int64 sz;
1349  sqlite3_int64 x;
1350  unsigned char *p = 0;
1351
1352  if( argc==2 ){
1353    zEditor = (const char*)sqlite3_value_text(argv[1]);
1354  }else{
1355    zEditor = getenv("VISUAL");
1356  }
1357  if( zEditor==0 ){
1358    sqlite3_result_error(context, "no editor for edit()", -1);
1359    return;
1360  }
1361  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1362    sqlite3_result_error(context, "NULL input to edit()", -1);
1363    return;
1364  }
1365  db = sqlite3_context_db_handle(context);
1366  zTempFile = 0;
1367  sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1368  if( zTempFile==0 ){
1369    sqlite3_uint64 r = 0;
1370    sqlite3_randomness(sizeof(r), &r);
1371    zTempFile = sqlite3_mprintf("temp%llx", r);
1372    if( zTempFile==0 ){
1373      sqlite3_result_error_nomem(context);
1374      return;
1375    }
1376  }
1377  bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1378  /* When writing the file to be edited, do \n to \r\n conversions on systems
1379  ** that want \r\n line endings */
1380  f = fopen(zTempFile, bBin ? "wb" : "w");
1381  if( f==0 ){
1382    sqlite3_result_error(context, "edit() cannot open temp file", -1);
1383    goto edit_func_end;
1384  }
1385  sz = sqlite3_value_bytes(argv[0]);
1386  if( bBin ){
1387    x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
1388  }else{
1389    const char *z = (const char*)sqlite3_value_text(argv[0]);
1390    /* Remember whether or not the value originally contained \r\n */
1391    if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
1392    x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
1393  }
1394  fclose(f);
1395  f = 0;
1396  if( x!=sz ){
1397    sqlite3_result_error(context, "edit() could not write the whole file", -1);
1398    goto edit_func_end;
1399  }
1400  zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1401  if( zCmd==0 ){
1402    sqlite3_result_error_nomem(context);
1403    goto edit_func_end;
1404  }
1405  rc = system(zCmd);
1406  sqlite3_free(zCmd);
1407  if( rc ){
1408    sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1409    goto edit_func_end;
1410  }
1411  f = fopen(zTempFile, "rb");
1412  if( f==0 ){
1413    sqlite3_result_error(context,
1414      "edit() cannot reopen temp file after edit", -1);
1415    goto edit_func_end;
1416  }
1417  fseek(f, 0, SEEK_END);
1418  sz = ftell(f);
1419  rewind(f);
1420  p = sqlite3_malloc64( sz+1 );
1421  if( p==0 ){
1422    sqlite3_result_error_nomem(context);
1423    goto edit_func_end;
1424  }
1425  x = fread(p, 1, (size_t)sz, f);
1426  fclose(f);
1427  f = 0;
1428  if( x!=sz ){
1429    sqlite3_result_error(context, "could not read back the whole file", -1);
1430    goto edit_func_end;
1431  }
1432  if( bBin ){
1433    sqlite3_result_blob64(context, p, sz, sqlite3_free);
1434  }else{
1435    sqlite3_int64 i, j;
1436    if( hasCRNL ){
1437      /* If the original contains \r\n then do no conversions back to \n */
1438    }else{
1439      /* If the file did not originally contain \r\n then convert any new
1440      ** \r\n back into \n */
1441      for(i=j=0; i<sz; i++){
1442        if( p[i]=='\r' && p[i+1]=='\n' ) i++;
1443        p[j++] = p[i];
1444      }
1445      sz = j;
1446      p[sz] = 0;
1447    }
1448    sqlite3_result_text64(context, (const char*)p, sz,
1449                          sqlite3_free, SQLITE_UTF8);
1450  }
1451  p = 0;
1452
1453edit_func_end:
1454  if( f ) fclose(f);
1455  unlink(zTempFile);
1456  sqlite3_free(zTempFile);
1457  sqlite3_free(p);
1458}
1459#endif /* SQLITE_NOHAVE_SYSTEM */
1460
1461/*
1462** Save or restore the current output mode
1463*/
1464static void outputModePush(ShellState *p){
1465  p->modePrior = p->mode;
1466  p->priorShFlgs = p->shellFlgs;
1467  memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1468  memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1469}
1470static void outputModePop(ShellState *p){
1471  p->mode = p->modePrior;
1472  p->shellFlgs = p->priorShFlgs;
1473  memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1474  memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1475}
1476
1477/*
1478** Output the given string as a hex-encoded blob (eg. X'1234' )
1479*/
1480static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1481  int i;
1482  char *zBlob = (char *)pBlob;
1483  raw_printf(out,"X'");
1484  for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1485  raw_printf(out,"'");
1486}
1487
1488/*
1489** Find a string that is not found anywhere in z[].  Return a pointer
1490** to that string.
1491**
1492** Try to use zA and zB first.  If both of those are already found in z[]
1493** then make up some string and store it in the buffer zBuf.
1494*/
1495static const char *unused_string(
1496  const char *z,                    /* Result must not appear anywhere in z */
1497  const char *zA, const char *zB,   /* Try these first */
1498  char *zBuf                        /* Space to store a generated string */
1499){
1500  unsigned i = 0;
1501  if( strstr(z, zA)==0 ) return zA;
1502  if( strstr(z, zB)==0 ) return zB;
1503  do{
1504    sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1505  }while( strstr(z,zBuf)!=0 );
1506  return zBuf;
1507}
1508
1509/*
1510** Output the given string as a quoted string using SQL quoting conventions.
1511**
1512** See also: output_quoted_escaped_string()
1513*/
1514static void output_quoted_string(FILE *out, const char *z){
1515  int i;
1516  char c;
1517  setBinaryMode(out, 1);
1518  for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1519  if( c==0 ){
1520    utf8_printf(out,"'%s'",z);
1521  }else{
1522    raw_printf(out, "'");
1523    while( *z ){
1524      for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1525      if( c=='\'' ) i++;
1526      if( i ){
1527        utf8_printf(out, "%.*s", i, z);
1528        z += i;
1529      }
1530      if( c=='\'' ){
1531        raw_printf(out, "'");
1532        continue;
1533      }
1534      if( c==0 ){
1535        break;
1536      }
1537      z++;
1538    }
1539    raw_printf(out, "'");
1540  }
1541  setTextMode(out, 1);
1542}
1543
1544/*
1545** Output the given string as a quoted string using SQL quoting conventions.
1546** Additionallly , escape the "\n" and "\r" characters so that they do not
1547** get corrupted by end-of-line translation facilities in some operating
1548** systems.
1549**
1550** This is like output_quoted_string() but with the addition of the \r\n
1551** escape mechanism.
1552*/
1553static void output_quoted_escaped_string(FILE *out, const char *z){
1554  int i;
1555  char c;
1556  setBinaryMode(out, 1);
1557  for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1558  if( c==0 ){
1559    utf8_printf(out,"'%s'",z);
1560  }else{
1561    const char *zNL = 0;
1562    const char *zCR = 0;
1563    int nNL = 0;
1564    int nCR = 0;
1565    char zBuf1[20], zBuf2[20];
1566    for(i=0; z[i]; i++){
1567      if( z[i]=='\n' ) nNL++;
1568      if( z[i]=='\r' ) nCR++;
1569    }
1570    if( nNL ){
1571      raw_printf(out, "replace(");
1572      zNL = unused_string(z, "\\n", "\\012", zBuf1);
1573    }
1574    if( nCR ){
1575      raw_printf(out, "replace(");
1576      zCR = unused_string(z, "\\r", "\\015", zBuf2);
1577    }
1578    raw_printf(out, "'");
1579    while( *z ){
1580      for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1581      if( c=='\'' ) i++;
1582      if( i ){
1583        utf8_printf(out, "%.*s", i, z);
1584        z += i;
1585      }
1586      if( c=='\'' ){
1587        raw_printf(out, "'");
1588        continue;
1589      }
1590      if( c==0 ){
1591        break;
1592      }
1593      z++;
1594      if( c=='\n' ){
1595        raw_printf(out, "%s", zNL);
1596        continue;
1597      }
1598      raw_printf(out, "%s", zCR);
1599    }
1600    raw_printf(out, "'");
1601    if( nCR ){
1602      raw_printf(out, ",'%s',char(13))", zCR);
1603    }
1604    if( nNL ){
1605      raw_printf(out, ",'%s',char(10))", zNL);
1606    }
1607  }
1608  setTextMode(out, 1);
1609}
1610
1611/*
1612** Output the given string as a quoted according to C or TCL quoting rules.
1613*/
1614static void output_c_string(FILE *out, const char *z){
1615  unsigned int c;
1616  fputc('"', out);
1617  while( (c = *(z++))!=0 ){
1618    if( c=='\\' ){
1619      fputc(c, out);
1620      fputc(c, out);
1621    }else if( c=='"' ){
1622      fputc('\\', out);
1623      fputc('"', out);
1624    }else if( c=='\t' ){
1625      fputc('\\', out);
1626      fputc('t', out);
1627    }else if( c=='\n' ){
1628      fputc('\\', out);
1629      fputc('n', out);
1630    }else if( c=='\r' ){
1631      fputc('\\', out);
1632      fputc('r', out);
1633    }else if( !isprint(c&0xff) ){
1634      raw_printf(out, "\\%03o", c&0xff);
1635    }else{
1636      fputc(c, out);
1637    }
1638  }
1639  fputc('"', out);
1640}
1641
1642/*
1643** Output the given string as a quoted according to JSON quoting rules.
1644*/
1645static void output_json_string(FILE *out, const char *z, int n){
1646  unsigned int c;
1647  if( n<0 ) n = (int)strlen(z);
1648  fputc('"', out);
1649  while( n-- ){
1650    c = *(z++);
1651    if( c=='\\' || c=='"' ){
1652      fputc('\\', out);
1653      fputc(c, out);
1654    }else if( c<=0x1f ){
1655      fputc('\\', out);
1656      if( c=='\b' ){
1657        fputc('b', out);
1658      }else if( c=='\f' ){
1659        fputc('f', out);
1660      }else if( c=='\n' ){
1661        fputc('n', out);
1662      }else if( c=='\r' ){
1663        fputc('r', out);
1664      }else if( c=='\t' ){
1665        fputc('t', out);
1666      }else{
1667         raw_printf(out, "u%04x",c);
1668      }
1669    }else{
1670      fputc(c, out);
1671    }
1672  }
1673  fputc('"', out);
1674}
1675
1676/*
1677** Output the given string with characters that are special to
1678** HTML escaped.
1679*/
1680static void output_html_string(FILE *out, const char *z){
1681  int i;
1682  if( z==0 ) z = "";
1683  while( *z ){
1684    for(i=0;   z[i]
1685            && z[i]!='<'
1686            && z[i]!='&'
1687            && z[i]!='>'
1688            && z[i]!='\"'
1689            && z[i]!='\'';
1690        i++){}
1691    if( i>0 ){
1692      utf8_printf(out,"%.*s",i,z);
1693    }
1694    if( z[i]=='<' ){
1695      raw_printf(out,"&lt;");
1696    }else if( z[i]=='&' ){
1697      raw_printf(out,"&amp;");
1698    }else if( z[i]=='>' ){
1699      raw_printf(out,"&gt;");
1700    }else if( z[i]=='\"' ){
1701      raw_printf(out,"&quot;");
1702    }else if( z[i]=='\'' ){
1703      raw_printf(out,"&#39;");
1704    }else{
1705      break;
1706    }
1707    z += i + 1;
1708  }
1709}
1710
1711/*
1712** If a field contains any character identified by a 1 in the following
1713** array, then the string must be quoted for CSV.
1714*/
1715static const char needCsvQuote[] = {
1716  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1717  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1718  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
1719  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1720  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1721  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1722  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1723  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
1724  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1725  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1726  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1727  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1728  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1729  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1730  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1731  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1732};
1733
1734/*
1735** Output a single term of CSV.  Actually, p->colSeparator is used for
1736** the separator, which may or may not be a comma.  p->nullValue is
1737** the null value.  Strings are quoted if necessary.  The separator
1738** is only issued if bSep is true.
1739*/
1740static void output_csv(ShellState *p, const char *z, int bSep){
1741  FILE *out = p->out;
1742  if( z==0 ){
1743    utf8_printf(out,"%s",p->nullValue);
1744  }else{
1745    unsigned i;
1746    for(i=0; z[i]; i++){
1747      if( needCsvQuote[((unsigned char*)z)[i]] ){
1748        i = 0;
1749        break;
1750      }
1751    }
1752    if( i==0 || strstr(z, p->colSeparator)!=0 ){
1753      char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1754      shell_check_oom(zQuoted);
1755      utf8_printf(out, "%s", zQuoted);
1756      sqlite3_free(zQuoted);
1757    }else{
1758      utf8_printf(out, "%s", z);
1759    }
1760  }
1761  if( bSep ){
1762    utf8_printf(p->out, "%s", p->colSeparator);
1763  }
1764}
1765
1766/*
1767** This routine runs when the user presses Ctrl-C
1768*/
1769static void interrupt_handler(int NotUsed){
1770  UNUSED_PARAMETER(NotUsed);
1771  seenInterrupt++;
1772  if( seenInterrupt>2 ) exit(1);
1773  if( globalDb ) sqlite3_interrupt(globalDb);
1774}
1775
1776#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1777/*
1778** This routine runs for console events (e.g. Ctrl-C) on Win32
1779*/
1780static BOOL WINAPI ConsoleCtrlHandler(
1781  DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1782){
1783  if( dwCtrlType==CTRL_C_EVENT ){
1784    interrupt_handler(0);
1785    return TRUE;
1786  }
1787  return FALSE;
1788}
1789#endif
1790
1791#ifndef SQLITE_OMIT_AUTHORIZATION
1792/*
1793** This authorizer runs in safe mode.
1794*/
1795static int safeModeAuth(
1796  void *pClientData,
1797  int op,
1798  const char *zA1,
1799  const char *zA2,
1800  const char *zA3,
1801  const char *zA4
1802){
1803  ShellState *p = (ShellState*)pClientData;
1804  static const char *azProhibitedFunctions[] = {
1805    "edit",
1806    "fts3_tokenizer",
1807    "load_extension",
1808    "readfile",
1809    "writefile",
1810    "zipfile",
1811    "zipfile_cds",
1812  };
1813  UNUSED_PARAMETER(zA2);
1814  UNUSED_PARAMETER(zA3);
1815  UNUSED_PARAMETER(zA4);
1816  switch( op ){
1817    case SQLITE_ATTACH: {
1818      failIfSafeMode(p, "cannot run ATTACH in safe mode");
1819      break;
1820    }
1821    case SQLITE_FUNCTION: {
1822      int i;
1823      for(i=0; i<ArraySize(azProhibitedFunctions); i++){
1824        if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
1825          failIfSafeMode(p, "cannot use the %s() function in safe mode",
1826                         azProhibitedFunctions[i]);
1827        }
1828      }
1829      break;
1830    }
1831  }
1832  return SQLITE_OK;
1833}
1834
1835/*
1836** When the ".auth ON" is set, the following authorizer callback is
1837** invoked.  It always returns SQLITE_OK.
1838*/
1839static int shellAuth(
1840  void *pClientData,
1841  int op,
1842  const char *zA1,
1843  const char *zA2,
1844  const char *zA3,
1845  const char *zA4
1846){
1847  ShellState *p = (ShellState*)pClientData;
1848  static const char *azAction[] = { 0,
1849     "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
1850     "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
1851     "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
1852     "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
1853     "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
1854     "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
1855     "PRAGMA",               "READ",                 "SELECT",
1856     "TRANSACTION",          "UPDATE",               "ATTACH",
1857     "DETACH",               "ALTER_TABLE",          "REINDEX",
1858     "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
1859     "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
1860  };
1861  int i;
1862  const char *az[4];
1863  az[0] = zA1;
1864  az[1] = zA2;
1865  az[2] = zA3;
1866  az[3] = zA4;
1867  utf8_printf(p->out, "authorizer: %s", azAction[op]);
1868  for(i=0; i<4; i++){
1869    raw_printf(p->out, " ");
1870    if( az[i] ){
1871      output_c_string(p->out, az[i]);
1872    }else{
1873      raw_printf(p->out, "NULL");
1874    }
1875  }
1876  raw_printf(p->out, "\n");
1877  if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
1878  return SQLITE_OK;
1879}
1880#endif
1881
1882/*
1883** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
1884**
1885** This routine converts some CREATE TABLE statements for shadow tables
1886** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1887*/
1888static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1889  if( z==0 ) return;
1890  if( zTail==0 ) return;
1891  if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1892    utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1893  }else{
1894    utf8_printf(out, "%s%s", z, zTail);
1895  }
1896}
1897static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1898  char c = z[n];
1899  z[n] = 0;
1900  printSchemaLine(out, z, zTail);
1901  z[n] = c;
1902}
1903
1904/*
1905** Return true if string z[] has nothing but whitespace and comments to the
1906** end of the first line.
1907*/
1908static int wsToEol(const char *z){
1909  int i;
1910  for(i=0; z[i]; i++){
1911    if( z[i]=='\n' ) return 1;
1912    if( IsSpace(z[i]) ) continue;
1913    if( z[i]=='-' && z[i+1]=='-' ) return 1;
1914    return 0;
1915  }
1916  return 1;
1917}
1918
1919/*
1920** Add a new entry to the EXPLAIN QUERY PLAN data
1921*/
1922static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
1923  EQPGraphRow *pNew;
1924  int nText = strlen30(zText);
1925  if( p->autoEQPtest ){
1926    utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1927  }
1928  pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1929  shell_check_oom(pNew);
1930  pNew->iEqpId = iEqpId;
1931  pNew->iParentId = p2;
1932  memcpy(pNew->zText, zText, nText+1);
1933  pNew->pNext = 0;
1934  if( p->sGraph.pLast ){
1935    p->sGraph.pLast->pNext = pNew;
1936  }else{
1937    p->sGraph.pRow = pNew;
1938  }
1939  p->sGraph.pLast = pNew;
1940}
1941
1942/*
1943** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1944** in p->sGraph.
1945*/
1946static void eqp_reset(ShellState *p){
1947  EQPGraphRow *pRow, *pNext;
1948  for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1949    pNext = pRow->pNext;
1950    sqlite3_free(pRow);
1951  }
1952  memset(&p->sGraph, 0, sizeof(p->sGraph));
1953}
1954
1955/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
1956** pOld, or return the first such line if pOld is NULL
1957*/
1958static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
1959  EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
1960  while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
1961  return pRow;
1962}
1963
1964/* Render a single level of the graph that has iEqpId as its parent.  Called
1965** recursively to render sublevels.
1966*/
1967static void eqp_render_level(ShellState *p, int iEqpId){
1968  EQPGraphRow *pRow, *pNext;
1969  int n = strlen30(p->sGraph.zPrefix);
1970  char *z;
1971  for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1972    pNext = eqp_next_row(p, iEqpId, pRow);
1973    z = pRow->zText;
1974    utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
1975                pNext ? "|--" : "`--", z);
1976    if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
1977      memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
1978      eqp_render_level(p, pRow->iEqpId);
1979      p->sGraph.zPrefix[n] = 0;
1980    }
1981  }
1982}
1983
1984/*
1985** Display and reset the EXPLAIN QUERY PLAN data
1986*/
1987static void eqp_render(ShellState *p){
1988  EQPGraphRow *pRow = p->sGraph.pRow;
1989  if( pRow ){
1990    if( pRow->zText[0]=='-' ){
1991      if( pRow->pNext==0 ){
1992        eqp_reset(p);
1993        return;
1994      }
1995      utf8_printf(p->out, "%s\n", pRow->zText+3);
1996      p->sGraph.pRow = pRow->pNext;
1997      sqlite3_free(pRow);
1998    }else{
1999      utf8_printf(p->out, "QUERY PLAN\n");
2000    }
2001    p->sGraph.zPrefix[0] = 0;
2002    eqp_render_level(p, 0);
2003    eqp_reset(p);
2004  }
2005}
2006
2007#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
2008/*
2009** Progress handler callback.
2010*/
2011static int progress_handler(void *pClientData) {
2012  ShellState *p = (ShellState*)pClientData;
2013  p->nProgress++;
2014  if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
2015    raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
2016    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
2017    if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
2018    return 1;
2019  }
2020  if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
2021    raw_printf(p->out, "Progress %u\n", p->nProgress);
2022  }
2023  return 0;
2024}
2025#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
2026
2027/*
2028** Print N dashes
2029*/
2030static void print_dashes(FILE *out, int N){
2031  const char zDash[] = "--------------------------------------------------";
2032  const int nDash = sizeof(zDash) - 1;
2033  while( N>nDash ){
2034    fputs(zDash, out);
2035    N -= nDash;
2036  }
2037  raw_printf(out, "%.*s", N, zDash);
2038}
2039
2040/*
2041** Print a markdown or table-style row separator using ascii-art
2042*/
2043static void print_row_separator(
2044  ShellState *p,
2045  int nArg,
2046  const char *zSep
2047){
2048  int i;
2049  if( nArg>0 ){
2050    fputs(zSep, p->out);
2051    print_dashes(p->out, p->actualWidth[0]+2);
2052    for(i=1; i<nArg; i++){
2053      fputs(zSep, p->out);
2054      print_dashes(p->out, p->actualWidth[i]+2);
2055    }
2056    fputs(zSep, p->out);
2057  }
2058  fputs("\n", p->out);
2059}
2060
2061/*
2062** This is the callback routine that the shell
2063** invokes for each row of a query result.
2064*/
2065static int shell_callback(
2066  void *pArg,
2067  int nArg,        /* Number of result columns */
2068  char **azArg,    /* Text of each result column */
2069  char **azCol,    /* Column names */
2070  int *aiType      /* Column types.  Might be NULL */
2071){
2072  int i;
2073  ShellState *p = (ShellState*)pArg;
2074
2075  if( azArg==0 ) return 0;
2076  switch( p->cMode ){
2077    case MODE_Count:
2078    case MODE_Off: {
2079      break;
2080    }
2081    case MODE_Line: {
2082      int w = 5;
2083      if( azArg==0 ) break;
2084      for(i=0; i<nArg; i++){
2085        int len = strlen30(azCol[i] ? azCol[i] : "");
2086        if( len>w ) w = len;
2087      }
2088      if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2089      for(i=0; i<nArg; i++){
2090        utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2091                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2092      }
2093      break;
2094    }
2095    case MODE_Explain: {
2096      static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
2097      if( nArg>ArraySize(aExplainWidth) ){
2098        nArg = ArraySize(aExplainWidth);
2099      }
2100      if( p->cnt++==0 ){
2101        for(i=0; i<nArg; i++){
2102          int w = aExplainWidth[i];
2103          utf8_width_print(p->out, w, azCol[i]);
2104          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2105        }
2106        for(i=0; i<nArg; i++){
2107          int w = aExplainWidth[i];
2108          print_dashes(p->out, w);
2109          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2110        }
2111      }
2112      if( azArg==0 ) break;
2113      for(i=0; i<nArg; i++){
2114        int w = aExplainWidth[i];
2115        if( i==nArg-1 ) w = 0;
2116        if( azArg[i] && strlenChar(azArg[i])>w ){
2117          w = strlenChar(azArg[i]);
2118        }
2119        if( i==1 && p->aiIndent && p->pStmt ){
2120          if( p->iIndent<p->nIndent ){
2121            utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2122          }
2123          p->iIndent++;
2124        }
2125        utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2126        fputs(i==nArg-1 ? "\n" : "  ", p->out);
2127      }
2128      break;
2129    }
2130    case MODE_Semi: {   /* .schema and .fullschema output */
2131      printSchemaLine(p->out, azArg[0], ";\n");
2132      break;
2133    }
2134    case MODE_Pretty: {  /* .schema and .fullschema with --indent */
2135      char *z;
2136      int j;
2137      int nParen = 0;
2138      char cEnd = 0;
2139      char c;
2140      int nLine = 0;
2141      assert( nArg==1 );
2142      if( azArg[0]==0 ) break;
2143      if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2144       || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2145      ){
2146        utf8_printf(p->out, "%s;\n", azArg[0]);
2147        break;
2148      }
2149      z = sqlite3_mprintf("%s", azArg[0]);
2150      shell_check_oom(z);
2151      j = 0;
2152      for(i=0; IsSpace(z[i]); i++){}
2153      for(; (c = z[i])!=0; i++){
2154        if( IsSpace(c) ){
2155          if( z[j-1]=='\r' ) z[j-1] = '\n';
2156          if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2157        }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2158          j--;
2159        }
2160        z[j++] = c;
2161      }
2162      while( j>0 && IsSpace(z[j-1]) ){ j--; }
2163      z[j] = 0;
2164      if( strlen30(z)>=79 ){
2165        for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
2166          if( c==cEnd ){
2167            cEnd = 0;
2168          }else if( c=='"' || c=='\'' || c=='`' ){
2169            cEnd = c;
2170          }else if( c=='[' ){
2171            cEnd = ']';
2172          }else if( c=='-' && z[i+1]=='-' ){
2173            cEnd = '\n';
2174          }else if( c=='(' ){
2175            nParen++;
2176          }else if( c==')' ){
2177            nParen--;
2178            if( nLine>0 && nParen==0 && j>0 ){
2179              printSchemaLineN(p->out, z, j, "\n");
2180              j = 0;
2181            }
2182          }
2183          z[j++] = c;
2184          if( nParen==1 && cEnd==0
2185           && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
2186          ){
2187            if( c=='\n' ) j--;
2188            printSchemaLineN(p->out, z, j, "\n  ");
2189            j = 0;
2190            nLine++;
2191            while( IsSpace(z[i+1]) ){ i++; }
2192          }
2193        }
2194        z[j] = 0;
2195      }
2196      printSchemaLine(p->out, z, ";\n");
2197      sqlite3_free(z);
2198      break;
2199    }
2200    case MODE_List: {
2201      if( p->cnt++==0 && p->showHeader ){
2202        for(i=0; i<nArg; i++){
2203          utf8_printf(p->out,"%s%s",azCol[i],
2204                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
2205        }
2206      }
2207      if( azArg==0 ) break;
2208      for(i=0; i<nArg; i++){
2209        char *z = azArg[i];
2210        if( z==0 ) z = p->nullValue;
2211        utf8_printf(p->out, "%s", z);
2212        if( i<nArg-1 ){
2213          utf8_printf(p->out, "%s", p->colSeparator);
2214        }else{
2215          utf8_printf(p->out, "%s", p->rowSeparator);
2216        }
2217      }
2218      break;
2219    }
2220    case MODE_Html: {
2221      if( p->cnt++==0 && p->showHeader ){
2222        raw_printf(p->out,"<TR>");
2223        for(i=0; i<nArg; i++){
2224          raw_printf(p->out,"<TH>");
2225          output_html_string(p->out, azCol[i]);
2226          raw_printf(p->out,"</TH>\n");
2227        }
2228        raw_printf(p->out,"</TR>\n");
2229      }
2230      if( azArg==0 ) break;
2231      raw_printf(p->out,"<TR>");
2232      for(i=0; i<nArg; i++){
2233        raw_printf(p->out,"<TD>");
2234        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2235        raw_printf(p->out,"</TD>\n");
2236      }
2237      raw_printf(p->out,"</TR>\n");
2238      break;
2239    }
2240    case MODE_Tcl: {
2241      if( p->cnt++==0 && p->showHeader ){
2242        for(i=0; i<nArg; i++){
2243          output_c_string(p->out,azCol[i] ? azCol[i] : "");
2244          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2245        }
2246        utf8_printf(p->out, "%s", p->rowSeparator);
2247      }
2248      if( azArg==0 ) break;
2249      for(i=0; i<nArg; i++){
2250        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2251        if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2252      }
2253      utf8_printf(p->out, "%s", p->rowSeparator);
2254      break;
2255    }
2256    case MODE_Csv: {
2257      setBinaryMode(p->out, 1);
2258      if( p->cnt++==0 && p->showHeader ){
2259        for(i=0; i<nArg; i++){
2260          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2261        }
2262        utf8_printf(p->out, "%s", p->rowSeparator);
2263      }
2264      if( nArg>0 ){
2265        for(i=0; i<nArg; i++){
2266          output_csv(p, azArg[i], i<nArg-1);
2267        }
2268        utf8_printf(p->out, "%s", p->rowSeparator);
2269      }
2270      setTextMode(p->out, 1);
2271      break;
2272    }
2273    case MODE_Insert: {
2274      if( azArg==0 ) break;
2275      utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2276      if( p->showHeader ){
2277        raw_printf(p->out,"(");
2278        for(i=0; i<nArg; i++){
2279          if( i>0 ) raw_printf(p->out, ",");
2280          if( quoteChar(azCol[i]) ){
2281            char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2282            shell_check_oom(z);
2283            utf8_printf(p->out, "%s", z);
2284            sqlite3_free(z);
2285          }else{
2286            raw_printf(p->out, "%s", azCol[i]);
2287          }
2288        }
2289        raw_printf(p->out,")");
2290      }
2291      p->cnt++;
2292      for(i=0; i<nArg; i++){
2293        raw_printf(p->out, i>0 ? "," : " VALUES(");
2294        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2295          utf8_printf(p->out,"NULL");
2296        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2297          if( ShellHasFlag(p, SHFLG_Newlines) ){
2298            output_quoted_string(p->out, azArg[i]);
2299          }else{
2300            output_quoted_escaped_string(p->out, azArg[i]);
2301          }
2302        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2303          utf8_printf(p->out,"%s", azArg[i]);
2304        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2305          char z[50];
2306          double r = sqlite3_column_double(p->pStmt, i);
2307          sqlite3_uint64 ur;
2308          memcpy(&ur,&r,sizeof(r));
2309          if( ur==0x7ff0000000000000LL ){
2310            raw_printf(p->out, "1e999");
2311          }else if( ur==0xfff0000000000000LL ){
2312            raw_printf(p->out, "-1e999");
2313          }else{
2314            sqlite3_int64 ir = (sqlite3_int64)r;
2315            if( r==(double)ir ){
2316              sqlite3_snprintf(50,z,"%lld.0", ir);
2317            }else{
2318              sqlite3_snprintf(50,z,"%!.20g", r);
2319            }
2320            raw_printf(p->out, "%s", z);
2321          }
2322        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2323          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2324          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2325          output_hex_blob(p->out, pBlob, nBlob);
2326        }else if( isNumber(azArg[i], 0) ){
2327          utf8_printf(p->out,"%s", azArg[i]);
2328        }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2329          output_quoted_string(p->out, azArg[i]);
2330        }else{
2331          output_quoted_escaped_string(p->out, azArg[i]);
2332        }
2333      }
2334      raw_printf(p->out,");\n");
2335      break;
2336    }
2337    case MODE_Json: {
2338      if( azArg==0 ) break;
2339      if( p->cnt==0 ){
2340        fputs("[{", p->out);
2341      }else{
2342        fputs(",\n{", p->out);
2343      }
2344      p->cnt++;
2345      for(i=0; i<nArg; i++){
2346        output_json_string(p->out, azCol[i], -1);
2347        putc(':', p->out);
2348        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2349          fputs("null",p->out);
2350        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2351          char z[50];
2352          double r = sqlite3_column_double(p->pStmt, i);
2353          sqlite3_uint64 ur;
2354          memcpy(&ur,&r,sizeof(r));
2355          if( ur==0x7ff0000000000000LL ){
2356            raw_printf(p->out, "1e999");
2357          }else if( ur==0xfff0000000000000LL ){
2358            raw_printf(p->out, "-1e999");
2359          }else{
2360            sqlite3_snprintf(50,z,"%!.20g", r);
2361            raw_printf(p->out, "%s", z);
2362          }
2363        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2364          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2365          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2366          output_json_string(p->out, pBlob, nBlob);
2367        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2368          output_json_string(p->out, azArg[i], -1);
2369        }else{
2370          utf8_printf(p->out,"%s", azArg[i]);
2371        }
2372        if( i<nArg-1 ){
2373          putc(',', p->out);
2374        }
2375      }
2376      putc('}', p->out);
2377      break;
2378    }
2379    case MODE_Quote: {
2380      if( azArg==0 ) break;
2381      if( p->cnt==0 && p->showHeader ){
2382        for(i=0; i<nArg; i++){
2383          if( i>0 ) fputs(p->colSeparator, p->out);
2384          output_quoted_string(p->out, azCol[i]);
2385        }
2386        fputs(p->rowSeparator, p->out);
2387      }
2388      p->cnt++;
2389      for(i=0; i<nArg; i++){
2390        if( i>0 ) fputs(p->colSeparator, p->out);
2391        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2392          utf8_printf(p->out,"NULL");
2393        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2394          output_quoted_string(p->out, azArg[i]);
2395        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2396          utf8_printf(p->out,"%s", azArg[i]);
2397        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2398          char z[50];
2399          double r = sqlite3_column_double(p->pStmt, i);
2400          sqlite3_snprintf(50,z,"%!.20g", r);
2401          raw_printf(p->out, "%s", z);
2402        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2403          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2404          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2405          output_hex_blob(p->out, pBlob, nBlob);
2406        }else if( isNumber(azArg[i], 0) ){
2407          utf8_printf(p->out,"%s", azArg[i]);
2408        }else{
2409          output_quoted_string(p->out, azArg[i]);
2410        }
2411      }
2412      fputs(p->rowSeparator, p->out);
2413      break;
2414    }
2415    case MODE_Ascii: {
2416      if( p->cnt++==0 && p->showHeader ){
2417        for(i=0; i<nArg; i++){
2418          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2419          utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2420        }
2421        utf8_printf(p->out, "%s", p->rowSeparator);
2422      }
2423      if( azArg==0 ) break;
2424      for(i=0; i<nArg; i++){
2425        if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2426        utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2427      }
2428      utf8_printf(p->out, "%s", p->rowSeparator);
2429      break;
2430    }
2431    case MODE_EQP: {
2432      eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2433      break;
2434    }
2435  }
2436  return 0;
2437}
2438
2439/*
2440** This is the callback routine that the SQLite library
2441** invokes for each row of a query result.
2442*/
2443static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2444  /* since we don't have type info, call the shell_callback with a NULL value */
2445  return shell_callback(pArg, nArg, azArg, azCol, NULL);
2446}
2447
2448/*
2449** This is the callback routine from sqlite3_exec() that appends all
2450** output onto the end of a ShellText object.
2451*/
2452static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2453  ShellText *p = (ShellText*)pArg;
2454  int i;
2455  UNUSED_PARAMETER(az);
2456  if( azArg==0 ) return 0;
2457  if( p->n ) appendText(p, "|", 0);
2458  for(i=0; i<nArg; i++){
2459    if( i ) appendText(p, ",", 0);
2460    if( azArg[i] ) appendText(p, azArg[i], 0);
2461  }
2462  return 0;
2463}
2464
2465/*
2466** Generate an appropriate SELFTEST table in the main database.
2467*/
2468static void createSelftestTable(ShellState *p){
2469  char *zErrMsg = 0;
2470  sqlite3_exec(p->db,
2471    "SAVEPOINT selftest_init;\n"
2472    "CREATE TABLE IF NOT EXISTS selftest(\n"
2473    "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
2474    "  op TEXT,\n"                   /* Operator:  memo run */
2475    "  cmd TEXT,\n"                  /* Command text */
2476    "  ans TEXT\n"                   /* Desired answer */
2477    ");"
2478    "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2479    "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2480    "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2481    "         'memo','Tests generated by --init');\n"
2482    "INSERT INTO [_shell$self]\n"
2483    "  SELECT 'run',\n"
2484    "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2485                                 "FROM sqlite_schema ORDER BY 2'',224))',\n"
2486    "    hex(sha3_query('SELECT type,name,tbl_name,sql "
2487                          "FROM sqlite_schema ORDER BY 2',224));\n"
2488    "INSERT INTO [_shell$self]\n"
2489    "  SELECT 'run',"
2490    "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2491    "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2492    "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2493    "  FROM (\n"
2494    "    SELECT name FROM sqlite_schema\n"
2495    "     WHERE type='table'\n"
2496    "       AND name<>'selftest'\n"
2497    "       AND coalesce(rootpage,0)>0\n"
2498    "  )\n"
2499    " ORDER BY name;\n"
2500    "INSERT INTO [_shell$self]\n"
2501    "  VALUES('run','PRAGMA integrity_check','ok');\n"
2502    "INSERT INTO selftest(tno,op,cmd,ans)"
2503    "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2504    "DROP TABLE [_shell$self];"
2505    ,0,0,&zErrMsg);
2506  if( zErrMsg ){
2507    utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2508    sqlite3_free(zErrMsg);
2509  }
2510  sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2511}
2512
2513
2514/*
2515** Set the destination table field of the ShellState structure to
2516** the name of the table given.  Escape any quote characters in the
2517** table name.
2518*/
2519static void set_table_name(ShellState *p, const char *zName){
2520  int i, n;
2521  char cQuote;
2522  char *z;
2523
2524  if( p->zDestTable ){
2525    free(p->zDestTable);
2526    p->zDestTable = 0;
2527  }
2528  if( zName==0 ) return;
2529  cQuote = quoteChar(zName);
2530  n = strlen30(zName);
2531  if( cQuote ) n += n+2;
2532  z = p->zDestTable = malloc( n+1 );
2533  shell_check_oom(z);
2534  n = 0;
2535  if( cQuote ) z[n++] = cQuote;
2536  for(i=0; zName[i]; i++){
2537    z[n++] = zName[i];
2538    if( zName[i]==cQuote ) z[n++] = cQuote;
2539  }
2540  if( cQuote ) z[n++] = cQuote;
2541  z[n] = 0;
2542}
2543
2544/*
2545** Maybe construct two lines of text that point out the position of a
2546** syntax error.  Return a pointer to the text, in memory obtained from
2547** sqlite3_malloc().  Or, if the most recent error does not involve a
2548** specific token that we can point to, return an empty string.
2549**
2550** In all cases, the memory returned is obtained from sqlite3_malloc64()
2551** and should be released by the caller invoking sqlite3_free().
2552*/
2553static char *shell_error_context(const char *zSql, sqlite3 *db){
2554  int iOffset;
2555  size_t len;
2556  char *zCode;
2557  char *zMsg;
2558  int i;
2559  if( db==0
2560   || zSql==0
2561   || (iOffset = sqlite3_error_offset(db))<0
2562  ){
2563    return sqlite3_mprintf("");
2564  }
2565  while( iOffset>50 ){
2566    iOffset--;
2567    zSql++;
2568    while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
2569  }
2570  len = strlen(zSql);
2571  if( len>78 ){
2572    len = 78;
2573    while( (zSql[len]&0xc0)==0x80 ) len--;
2574  }
2575  zCode = sqlite3_mprintf("%.*s", len, zSql);
2576  for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
2577  if( iOffset<25 ){
2578    zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode, iOffset, "");
2579  }else{
2580    zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode, iOffset-14, "");
2581  }
2582  return zMsg;
2583}
2584
2585
2586/*
2587** Execute a query statement that will generate SQL output.  Print
2588** the result columns, comma-separated, on a line and then add a
2589** semicolon terminator to the end of that line.
2590**
2591** If the number of columns is 1 and that column contains text "--"
2592** then write the semicolon on a separate line.  That way, if a
2593** "--" comment occurs at the end of the statement, the comment
2594** won't consume the semicolon terminator.
2595*/
2596static int run_table_dump_query(
2597  ShellState *p,           /* Query context */
2598  const char *zSelect      /* SELECT statement to extract content */
2599){
2600  sqlite3_stmt *pSelect;
2601  int rc;
2602  int nResult;
2603  int i;
2604  const char *z;
2605  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2606  if( rc!=SQLITE_OK || !pSelect ){
2607    char *zContext = shell_error_context(zSelect, p->db);
2608    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
2609                sqlite3_errmsg(p->db), zContext);
2610    sqlite3_free(zContext);
2611    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2612    return rc;
2613  }
2614  rc = sqlite3_step(pSelect);
2615  nResult = sqlite3_column_count(pSelect);
2616  while( rc==SQLITE_ROW ){
2617    z = (const char*)sqlite3_column_text(pSelect, 0);
2618    utf8_printf(p->out, "%s", z);
2619    for(i=1; i<nResult; i++){
2620      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2621    }
2622    if( z==0 ) z = "";
2623    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2624    if( z[0] ){
2625      raw_printf(p->out, "\n;\n");
2626    }else{
2627      raw_printf(p->out, ";\n");
2628    }
2629    rc = sqlite3_step(pSelect);
2630  }
2631  rc = sqlite3_finalize(pSelect);
2632  if( rc!=SQLITE_OK ){
2633    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2634                sqlite3_errmsg(p->db));
2635    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2636  }
2637  return rc;
2638}
2639
2640/*
2641** Allocate space and save off string indicating current error.
2642*/
2643static char *save_err_msg(
2644  sqlite3 *db,           /* Database to query */
2645  const char *zPhase,    /* When the error occcurs */
2646  int rc,                /* Error code returned from API */
2647  const char *zSql       /* SQL string, or NULL */
2648){
2649  char *zErr;
2650  char *zContext;
2651  sqlite3_str *pStr = sqlite3_str_new(0);
2652  sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
2653  if( rc>1 ){
2654    sqlite3_str_appendf(pStr, " (%d)", rc);
2655  }
2656  zContext = shell_error_context(zSql, db);
2657  if( zContext ){
2658    sqlite3_str_appendall(pStr, zContext);
2659    sqlite3_free(zContext);
2660  }
2661  zErr = sqlite3_str_finish(pStr);
2662  shell_check_oom(zErr);
2663  return zErr;
2664}
2665
2666#ifdef __linux__
2667/*
2668** Attempt to display I/O stats on Linux using /proc/PID/io
2669*/
2670static void displayLinuxIoStats(FILE *out){
2671  FILE *in;
2672  char z[200];
2673  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2674  in = fopen(z, "rb");
2675  if( in==0 ) return;
2676  while( fgets(z, sizeof(z), in)!=0 ){
2677    static const struct {
2678      const char *zPattern;
2679      const char *zDesc;
2680    } aTrans[] = {
2681      { "rchar: ",                  "Bytes received by read():" },
2682      { "wchar: ",                  "Bytes sent to write():"    },
2683      { "syscr: ",                  "Read() system calls:"      },
2684      { "syscw: ",                  "Write() system calls:"     },
2685      { "read_bytes: ",             "Bytes read from storage:"  },
2686      { "write_bytes: ",            "Bytes written to storage:" },
2687      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
2688    };
2689    int i;
2690    for(i=0; i<ArraySize(aTrans); i++){
2691      int n = strlen30(aTrans[i].zPattern);
2692      if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2693        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2694        break;
2695      }
2696    }
2697  }
2698  fclose(in);
2699}
2700#endif
2701
2702/*
2703** Display a single line of status using 64-bit values.
2704*/
2705static void displayStatLine(
2706  ShellState *p,            /* The shell context */
2707  char *zLabel,             /* Label for this one line */
2708  char *zFormat,            /* Format for the result */
2709  int iStatusCtrl,          /* Which status to display */
2710  int bReset                /* True to reset the stats */
2711){
2712  sqlite3_int64 iCur = -1;
2713  sqlite3_int64 iHiwtr = -1;
2714  int i, nPercent;
2715  char zLine[200];
2716  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2717  for(i=0, nPercent=0; zFormat[i]; i++){
2718    if( zFormat[i]=='%' ) nPercent++;
2719  }
2720  if( nPercent>1 ){
2721    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2722  }else{
2723    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2724  }
2725  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2726}
2727
2728/*
2729** Display memory stats.
2730*/
2731static int display_stats(
2732  sqlite3 *db,                /* Database to query */
2733  ShellState *pArg,           /* Pointer to ShellState */
2734  int bReset                  /* True to reset the stats */
2735){
2736  int iCur;
2737  int iHiwtr;
2738  FILE *out;
2739  if( pArg==0 || pArg->out==0 ) return 0;
2740  out = pArg->out;
2741
2742  if( pArg->pStmt && pArg->statsOn==2 ){
2743    int nCol, i, x;
2744    sqlite3_stmt *pStmt = pArg->pStmt;
2745    char z[100];
2746    nCol = sqlite3_column_count(pStmt);
2747    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2748    for(i=0; i<nCol; i++){
2749      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2750      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2751#ifndef SQLITE_OMIT_DECLTYPE
2752      sqlite3_snprintf(30, z+x, "declared type:");
2753      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2754#endif
2755#ifdef SQLITE_ENABLE_COLUMN_METADATA
2756      sqlite3_snprintf(30, z+x, "database name:");
2757      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2758      sqlite3_snprintf(30, z+x, "table name:");
2759      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2760      sqlite3_snprintf(30, z+x, "origin name:");
2761      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2762#endif
2763    }
2764  }
2765
2766  if( pArg->statsOn==3 ){
2767    if( pArg->pStmt ){
2768      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2769      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2770    }
2771    return 0;
2772  }
2773
2774  displayStatLine(pArg, "Memory Used:",
2775     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2776  displayStatLine(pArg, "Number of Outstanding Allocations:",
2777     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2778  if( pArg->shellFlgs & SHFLG_Pagecache ){
2779    displayStatLine(pArg, "Number of Pcache Pages Used:",
2780       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2781  }
2782  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2783     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2784  displayStatLine(pArg, "Largest Allocation:",
2785     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2786  displayStatLine(pArg, "Largest Pcache Allocation:",
2787     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2788#ifdef YYTRACKMAXSTACKDEPTH
2789  displayStatLine(pArg, "Deepest Parser Stack:",
2790     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2791#endif
2792
2793  if( db ){
2794    if( pArg->shellFlgs & SHFLG_Lookaside ){
2795      iHiwtr = iCur = -1;
2796      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2797                        &iCur, &iHiwtr, bReset);
2798      raw_printf(pArg->out,
2799              "Lookaside Slots Used:                %d (max %d)\n",
2800              iCur, iHiwtr);
2801      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2802                        &iCur, &iHiwtr, bReset);
2803      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
2804              iHiwtr);
2805      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2806                        &iCur, &iHiwtr, bReset);
2807      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
2808              iHiwtr);
2809      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2810                        &iCur, &iHiwtr, bReset);
2811      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
2812              iHiwtr);
2813    }
2814    iHiwtr = iCur = -1;
2815    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2816    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
2817            iCur);
2818    iHiwtr = iCur = -1;
2819    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2820    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
2821    iHiwtr = iCur = -1;
2822    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2823    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
2824    iHiwtr = iCur = -1;
2825    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2826    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
2827    iHiwtr = iCur = -1;
2828    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2829    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
2830    iHiwtr = iCur = -1;
2831    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2832    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
2833            iCur);
2834    iHiwtr = iCur = -1;
2835    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2836    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
2837            iCur);
2838  }
2839
2840  if( pArg->pStmt ){
2841    int iHit, iMiss;
2842    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2843                               bReset);
2844    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
2845    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2846    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
2847    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2848    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
2849    iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2850    iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2851    if( iHit || iMiss ){
2852      raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
2853            iHit, iHit+iMiss);
2854    }
2855    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2856    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
2857    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2858    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
2859    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2860    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
2861    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2862    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
2863  }
2864
2865#ifdef __linux__
2866  displayLinuxIoStats(pArg->out);
2867#endif
2868
2869  /* Do not remove this machine readable comment: extra-stats-output-here */
2870
2871  return 0;
2872}
2873
2874/*
2875** Display scan stats.
2876*/
2877static void display_scanstats(
2878  sqlite3 *db,                    /* Database to query */
2879  ShellState *pArg                /* Pointer to ShellState */
2880){
2881#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2882  UNUSED_PARAMETER(db);
2883  UNUSED_PARAMETER(pArg);
2884#else
2885  int i, k, n, mx;
2886  raw_printf(pArg->out, "-------- scanstats --------\n");
2887  mx = 0;
2888  for(k=0; k<=mx; k++){
2889    double rEstLoop = 1.0;
2890    for(i=n=0; 1; i++){
2891      sqlite3_stmt *p = pArg->pStmt;
2892      sqlite3_int64 nLoop, nVisit;
2893      double rEst;
2894      int iSid;
2895      const char *zExplain;
2896      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2897        break;
2898      }
2899      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2900      if( iSid>mx ) mx = iSid;
2901      if( iSid!=k ) continue;
2902      if( n==0 ){
2903        rEstLoop = (double)nLoop;
2904        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2905      }
2906      n++;
2907      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2908      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2909      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2910      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2911      rEstLoop *= rEst;
2912      raw_printf(pArg->out,
2913          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2914          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2915      );
2916    }
2917  }
2918  raw_printf(pArg->out, "---------------------------\n");
2919#endif
2920}
2921
2922/*
2923** Parameter azArray points to a zero-terminated array of strings. zStr
2924** points to a single nul-terminated string. Return non-zero if zStr
2925** is equal, according to strcmp(), to any of the strings in the array.
2926** Otherwise, return zero.
2927*/
2928static int str_in_array(const char *zStr, const char **azArray){
2929  int i;
2930  for(i=0; azArray[i]; i++){
2931    if( 0==strcmp(zStr, azArray[i]) ) return 1;
2932  }
2933  return 0;
2934}
2935
2936/*
2937** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2938** and populate the ShellState.aiIndent[] array with the number of
2939** spaces each opcode should be indented before it is output.
2940**
2941** The indenting rules are:
2942**
2943**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2944**       all opcodes that occur between the p2 jump destination and the opcode
2945**       itself by 2 spaces.
2946**
2947**     * For each "Goto", if the jump destination is earlier in the program
2948**       and ends on one of:
2949**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
2950**       or if the P1 parameter is one instead of zero,
2951**       then indent all opcodes between the earlier instruction
2952**       and "Goto" by 2 spaces.
2953*/
2954static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2955  const char *zSql;               /* The text of the SQL statement */
2956  const char *z;                  /* Used to check if this is an EXPLAIN */
2957  int *abYield = 0;               /* True if op is an OP_Yield */
2958  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
2959  int iOp;                        /* Index of operation in p->aiIndent[] */
2960
2961  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
2962  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2963                            "Rewind", 0 };
2964  const char *azGoto[] = { "Goto", 0 };
2965
2966  /* Try to figure out if this is really an EXPLAIN statement. If this
2967  ** cannot be verified, return early.  */
2968  if( sqlite3_column_count(pSql)!=8 ){
2969    p->cMode = p->mode;
2970    return;
2971  }
2972  zSql = sqlite3_sql(pSql);
2973  if( zSql==0 ) return;
2974  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2975  if( sqlite3_strnicmp(z, "explain", 7) ){
2976    p->cMode = p->mode;
2977    return;
2978  }
2979
2980  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2981    int i;
2982    int iAddr = sqlite3_column_int(pSql, 0);
2983    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2984
2985    /* Set p2 to the P2 field of the current opcode. Then, assuming that
2986    ** p2 is an instruction address, set variable p2op to the index of that
2987    ** instruction in the aiIndent[] array. p2 and p2op may be different if
2988    ** the current instruction is part of a sub-program generated by an
2989    ** SQL trigger or foreign key.  */
2990    int p2 = sqlite3_column_int(pSql, 3);
2991    int p2op = (p2 + (iOp-iAddr));
2992
2993    /* Grow the p->aiIndent array as required */
2994    if( iOp>=nAlloc ){
2995      if( iOp==0 ){
2996        /* Do further verfication that this is explain output.  Abort if
2997        ** it is not */
2998        static const char *explainCols[] = {
2999           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3000        int jj;
3001        for(jj=0; jj<ArraySize(explainCols); jj++){
3002          if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3003            p->cMode = p->mode;
3004            sqlite3_reset(pSql);
3005            return;
3006          }
3007        }
3008      }
3009      nAlloc += 100;
3010      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3011      shell_check_oom(p->aiIndent);
3012      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
3013      shell_check_oom(abYield);
3014    }
3015    abYield[iOp] = str_in_array(zOp, azYield);
3016    p->aiIndent[iOp] = 0;
3017    p->nIndent = iOp+1;
3018
3019    if( str_in_array(zOp, azNext) ){
3020      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3021    }
3022    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3023     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3024    ){
3025      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3026    }
3027  }
3028
3029  p->iIndent = 0;
3030  sqlite3_free(abYield);
3031  sqlite3_reset(pSql);
3032}
3033
3034/*
3035** Free the array allocated by explain_data_prepare().
3036*/
3037static void explain_data_delete(ShellState *p){
3038  sqlite3_free(p->aiIndent);
3039  p->aiIndent = 0;
3040  p->nIndent = 0;
3041  p->iIndent = 0;
3042}
3043
3044/*
3045** Disable and restore .wheretrace and .selecttrace settings.
3046*/
3047static unsigned int savedSelectTrace;
3048static unsigned int savedWhereTrace;
3049static void disable_debug_trace_modes(void){
3050  unsigned int zero = 0;
3051  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
3052  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
3053  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
3054  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
3055}
3056static void restore_debug_trace_modes(void){
3057  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
3058  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
3059}
3060
3061/* Create the TEMP table used to store parameter bindings */
3062static void bind_table_init(ShellState *p){
3063  int wrSchema = 0;
3064  int defensiveMode = 0;
3065  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
3066  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
3067  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
3068  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
3069  sqlite3_exec(p->db,
3070    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
3071    "  key TEXT PRIMARY KEY,\n"
3072    "  value\n"
3073    ") WITHOUT ROWID;",
3074    0, 0, 0);
3075  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3076  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3077}
3078
3079/*
3080** Bind parameters on a prepared statement.
3081**
3082** Parameter bindings are taken from a TEMP table of the form:
3083**
3084**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3085**    WITHOUT ROWID;
3086**
3087** No bindings occur if this table does not exist.  The name of the table
3088** begins with "sqlite_" so that it will not collide with ordinary application
3089** tables.  The table must be in the TEMP schema.
3090*/
3091static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3092  int nVar;
3093  int i;
3094  int rc;
3095  sqlite3_stmt *pQ = 0;
3096
3097  nVar = sqlite3_bind_parameter_count(pStmt);
3098  if( nVar==0 ) return;  /* Nothing to do */
3099  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3100                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3101    return; /* Parameter table does not exist */
3102  }
3103  rc = sqlite3_prepare_v2(pArg->db,
3104          "SELECT value FROM temp.sqlite_parameters"
3105          " WHERE key=?1", -1, &pQ, 0);
3106  if( rc || pQ==0 ) return;
3107  for(i=1; i<=nVar; i++){
3108    char zNum[30];
3109    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3110    if( zVar==0 ){
3111      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3112      zVar = zNum;
3113    }
3114    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3115    if( sqlite3_step(pQ)==SQLITE_ROW ){
3116      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3117    }else{
3118      sqlite3_bind_null(pStmt, i);
3119    }
3120    sqlite3_reset(pQ);
3121  }
3122  sqlite3_finalize(pQ);
3123}
3124
3125/*
3126** UTF8 box-drawing characters.  Imagine box lines like this:
3127**
3128**           1
3129**           |
3130**       4 --+-- 2
3131**           |
3132**           3
3133**
3134** Each box characters has between 2 and 4 of the lines leading from
3135** the center.  The characters are here identified by the numbers of
3136** their corresponding lines.
3137*/
3138#define BOX_24   "\342\224\200"  /* U+2500 --- */
3139#define BOX_13   "\342\224\202"  /* U+2502  |  */
3140#define BOX_23   "\342\224\214"  /* U+250c  ,- */
3141#define BOX_34   "\342\224\220"  /* U+2510 -,  */
3142#define BOX_12   "\342\224\224"  /* U+2514  '- */
3143#define BOX_14   "\342\224\230"  /* U+2518 -'  */
3144#define BOX_123  "\342\224\234"  /* U+251c  |- */
3145#define BOX_134  "\342\224\244"  /* U+2524 -|  */
3146#define BOX_234  "\342\224\254"  /* U+252c -,- */
3147#define BOX_124  "\342\224\264"  /* U+2534 -'- */
3148#define BOX_1234 "\342\224\274"  /* U+253c -|- */
3149
3150/* Draw horizontal line N characters long using unicode box
3151** characters
3152*/
3153static void print_box_line(FILE *out, int N){
3154  const char zDash[] =
3155      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3156      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3157  const int nDash = sizeof(zDash) - 1;
3158  N *= 3;
3159  while( N>nDash ){
3160    utf8_printf(out, zDash);
3161    N -= nDash;
3162  }
3163  utf8_printf(out, "%.*s", N, zDash);
3164}
3165
3166/*
3167** Draw a horizontal separator for a MODE_Box table.
3168*/
3169static void print_box_row_separator(
3170  ShellState *p,
3171  int nArg,
3172  const char *zSep1,
3173  const char *zSep2,
3174  const char *zSep3
3175){
3176  int i;
3177  if( nArg>0 ){
3178    utf8_printf(p->out, "%s", zSep1);
3179    print_box_line(p->out, p->actualWidth[0]+2);
3180    for(i=1; i<nArg; i++){
3181      utf8_printf(p->out, "%s", zSep2);
3182      print_box_line(p->out, p->actualWidth[i]+2);
3183    }
3184    utf8_printf(p->out, "%s", zSep3);
3185  }
3186  fputs("\n", p->out);
3187}
3188
3189/*
3190** z[] is a line of text that is to be displayed the .mode box or table or
3191** similar tabular formats.  z[] might contain control characters such
3192** as \n, \t, \f, or \r.
3193**
3194** Compute characters to display on the first line of z[].  Stop at the
3195** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
3196** from malloc()) of that first line, which caller should free sometime.
3197** Write anything to display on the next line into *pzTail.  If this is
3198** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
3199*/
3200static char *translateForDisplayAndDup(
3201  const unsigned char *z,            /* Input text to be transformed */
3202  const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
3203  int mxWidth,                       /* Max width.  0 means no limit */
3204  u8 bWordWrap                       /* If true, avoid breaking mid-word */
3205){
3206  int i;                 /* Input bytes consumed */
3207  int j;                 /* Output bytes generated */
3208  int k;                 /* Input bytes to be displayed */
3209  int n;                 /* Output column number */
3210  unsigned char *zOut;   /* Output text */
3211
3212  if( z==0 ){
3213    *pzTail = 0;
3214    return 0;
3215  }
3216  if( mxWidth<0 ) mxWidth = -mxWidth;
3217  if( mxWidth==0 ) mxWidth = 1000000;
3218  i = j = n = 0;
3219  while( n<mxWidth ){
3220    if( z[i]>=' ' ){
3221      n++;
3222      do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
3223      continue;
3224    }
3225    if( z[i]=='\t' ){
3226      do{
3227        n++;
3228        j++;
3229      }while( (n&7)!=0 && n<mxWidth );
3230      i++;
3231      continue;
3232    }
3233    break;
3234  }
3235  if( n>=mxWidth && bWordWrap  ){
3236    /* Perhaps try to back up to a better place to break the line */
3237    for(k=i; k>i/2; k--){
3238      if( isspace(z[k-1]) ) break;
3239    }
3240    if( k<=i/2 ){
3241      for(k=i; k>i/2; k--){
3242        if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
3243      }
3244    }
3245    if( k<=i/2 ){
3246      k = i;
3247    }else{
3248      i = k;
3249      while( z[i]==' ' ) i++;
3250    }
3251  }else{
3252    k = i;
3253  }
3254  if( n>=mxWidth && z[i]>=' ' ){
3255   *pzTail = &z[i];
3256  }else if( z[i]=='\r' && z[i+1]=='\n' ){
3257    *pzTail = z[i+2] ? &z[i+2] : 0;
3258  }else if( z[i]==0 || z[i+1]==0 ){
3259    *pzTail = 0;
3260  }else{
3261    *pzTail = &z[i+1];
3262  }
3263  zOut = malloc( j+1 );
3264  shell_check_oom(zOut);
3265  i = j = n = 0;
3266  while( i<k ){
3267    if( z[i]>=' ' ){
3268      n++;
3269      do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
3270      continue;
3271    }
3272    if( z[i]=='\t' ){
3273      do{
3274        n++;
3275        zOut[j++] = ' ';
3276      }while( (n&7)!=0 && n<mxWidth );
3277      i++;
3278      continue;
3279    }
3280    break;
3281  }
3282  zOut[j] = 0;
3283  return (char*)zOut;
3284}
3285
3286/* Extract the value of the i-th current column for pStmt as an SQL literal
3287** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
3288** the caller.
3289*/
3290static char *quoted_column(sqlite3_stmt *pStmt, int i){
3291  switch( sqlite3_column_type(pStmt, i) ){
3292    case SQLITE_NULL: {
3293      return sqlite3_mprintf("NULL");
3294    }
3295    case SQLITE_INTEGER:
3296    case SQLITE_FLOAT: {
3297      return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
3298    }
3299    case SQLITE_TEXT: {
3300      return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
3301    }
3302    case SQLITE_BLOB: {
3303      int j;
3304      sqlite3_str *pStr = sqlite3_str_new(0);
3305      const unsigned char *a = sqlite3_column_blob(pStmt,i);
3306      int n = sqlite3_column_bytes(pStmt,i);
3307      sqlite3_str_append(pStr, "x'", 2);
3308      for(j=0; j<n; j++){
3309        sqlite3_str_appendf(pStr, "%02x", a[j]);
3310      }
3311      sqlite3_str_append(pStr, "'", 1);
3312      return sqlite3_str_finish(pStr);
3313    }
3314  }
3315  return 0; /* Not reached */
3316}
3317
3318/*
3319** Run a prepared statement and output the result in one of the
3320** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3321** or MODE_Box.
3322**
3323** This is different from ordinary exec_prepared_stmt() in that
3324** it has to run the entire query and gather the results into memory
3325** first, in order to determine column widths, before providing
3326** any output.
3327*/
3328static void exec_prepared_stmt_columnar(
3329  ShellState *p,                        /* Pointer to ShellState */
3330  sqlite3_stmt *pStmt                   /* Statment to run */
3331){
3332  sqlite3_int64 nRow = 0;
3333  int nColumn = 0;
3334  char **azData = 0;
3335  sqlite3_int64 nAlloc = 0;
3336  char *abRowDiv = 0;
3337  const unsigned char *uz;
3338  const char *z;
3339  char **azQuoted = 0;
3340  int rc;
3341  sqlite3_int64 i, nData;
3342  int j, nTotal, w, n;
3343  const char *colSep = 0;
3344  const char *rowSep = 0;
3345  const unsigned char **azNextLine = 0;
3346  int bNextLine = 0;
3347  int bMultiLineRowExists = 0;
3348  int bw = p->cmOpts.bWordWrap;
3349
3350  rc = sqlite3_step(pStmt);
3351  if( rc!=SQLITE_ROW ) return;
3352  nColumn = sqlite3_column_count(pStmt);
3353  nAlloc = nColumn*4;
3354  if( nAlloc<=0 ) nAlloc = 1;
3355  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3356  shell_check_oom(azData);
3357  azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
3358  shell_check_oom((void*)azNextLine);
3359  memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
3360  if( p->cmOpts.bQuote ){
3361    azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
3362    shell_check_oom(azQuoted);
3363    memset(azQuoted, 0, nColumn*sizeof(char*) );
3364  }
3365  abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
3366  shell_check_oom(abRowDiv);
3367  if( nColumn>p->nWidth ){
3368    p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3369    shell_check_oom(p->colWidth);
3370    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3371    p->nWidth = nColumn;
3372    p->actualWidth = &p->colWidth[nColumn];
3373  }
3374  memset(p->actualWidth, 0, nColumn*sizeof(int));
3375  for(i=0; i<nColumn; i++){
3376    w = p->colWidth[i];
3377    if( w<0 ) w = -w;
3378    p->actualWidth[i] = w;
3379  }
3380  for(i=0; i<nColumn; i++){
3381    const unsigned char *zNotUsed;
3382    int wx = p->colWidth[i];
3383    if( wx==0 ){
3384      wx = p->cmOpts.iWrap;
3385    }
3386    if( wx<0 ) wx = -wx;
3387    uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
3388    azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
3389  }
3390  do{
3391    int useNextLine = bNextLine;
3392    bNextLine = 0;
3393    if( (nRow+2)*nColumn >= nAlloc ){
3394      nAlloc *= 2;
3395      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3396      shell_check_oom(azData);
3397      abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
3398      shell_check_oom(abRowDiv);
3399    }
3400    abRowDiv[nRow] = 1;
3401    nRow++;
3402    for(i=0; i<nColumn; i++){
3403      int wx = p->colWidth[i];
3404      if( wx==0 ){
3405        wx = p->cmOpts.iWrap;
3406      }
3407      if( wx<0 ) wx = -wx;
3408      if( useNextLine ){
3409        uz = azNextLine[i];
3410      }else if( p->cmOpts.bQuote ){
3411        sqlite3_free(azQuoted[i]);
3412        azQuoted[i] = quoted_column(pStmt,i);
3413        uz = (const unsigned char*)azQuoted[i];
3414      }else{
3415        uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
3416      }
3417      azData[nRow*nColumn + i]
3418        = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
3419      if( azNextLine[i] ){
3420        bNextLine = 1;
3421        abRowDiv[nRow-1] = 0;
3422        bMultiLineRowExists = 1;
3423      }
3424    }
3425  }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
3426  nTotal = nColumn*(nRow+1);
3427  for(i=0; i<nTotal; i++){
3428    z = azData[i];
3429    if( z==0 ) z = p->nullValue;
3430    n = strlenChar(z);
3431    j = i%nColumn;
3432    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3433  }
3434  if( seenInterrupt ) goto columnar_end;
3435  if( nColumn==0 ) goto columnar_end;
3436  switch( p->cMode ){
3437    case MODE_Column: {
3438      colSep = "  ";
3439      rowSep = "\n";
3440      if( p->showHeader ){
3441        for(i=0; i<nColumn; i++){
3442          w = p->actualWidth[i];
3443          if( p->colWidth[i]<0 ) w = -w;
3444          utf8_width_print(p->out, w, azData[i]);
3445          fputs(i==nColumn-1?"\n":"  ", p->out);
3446        }
3447        for(i=0; i<nColumn; i++){
3448          print_dashes(p->out, p->actualWidth[i]);
3449          fputs(i==nColumn-1?"\n":"  ", p->out);
3450        }
3451      }
3452      break;
3453    }
3454    case MODE_Table: {
3455      colSep = " | ";
3456      rowSep = " |\n";
3457      print_row_separator(p, nColumn, "+");
3458      fputs("| ", p->out);
3459      for(i=0; i<nColumn; i++){
3460        w = p->actualWidth[i];
3461        n = strlenChar(azData[i]);
3462        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3463        fputs(i==nColumn-1?" |\n":" | ", p->out);
3464      }
3465      print_row_separator(p, nColumn, "+");
3466      break;
3467    }
3468    case MODE_Markdown: {
3469      colSep = " | ";
3470      rowSep = " |\n";
3471      fputs("| ", p->out);
3472      for(i=0; i<nColumn; i++){
3473        w = p->actualWidth[i];
3474        n = strlenChar(azData[i]);
3475        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3476        fputs(i==nColumn-1?" |\n":" | ", p->out);
3477      }
3478      print_row_separator(p, nColumn, "|");
3479      break;
3480    }
3481    case MODE_Box: {
3482      colSep = " " BOX_13 " ";
3483      rowSep = " " BOX_13 "\n";
3484      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3485      utf8_printf(p->out, BOX_13 " ");
3486      for(i=0; i<nColumn; i++){
3487        w = p->actualWidth[i];
3488        n = strlenChar(azData[i]);
3489        utf8_printf(p->out, "%*s%s%*s%s",
3490            (w-n)/2, "", azData[i], (w-n+1)/2, "",
3491            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3492      }
3493      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3494      break;
3495    }
3496  }
3497  for(i=nColumn, j=0; i<nTotal; i++, j++){
3498    if( j==0 && p->cMode!=MODE_Column ){
3499      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3500    }
3501    z = azData[i];
3502    if( z==0 ) z = p->nullValue;
3503    w = p->actualWidth[j];
3504    if( p->colWidth[j]<0 ) w = -w;
3505    utf8_width_print(p->out, w, z);
3506    if( j==nColumn-1 ){
3507      utf8_printf(p->out, "%s", rowSep);
3508      if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
3509        if( p->cMode==MODE_Table ){
3510          print_row_separator(p, nColumn, "+");
3511        }else if( p->cMode==MODE_Box ){
3512          print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3513        }else if( p->cMode==MODE_Column ){
3514          raw_printf(p->out, "\n");
3515        }
3516      }
3517      j = -1;
3518      if( seenInterrupt ) goto columnar_end;
3519    }else{
3520      utf8_printf(p->out, "%s", colSep);
3521    }
3522  }
3523  if( p->cMode==MODE_Table ){
3524    print_row_separator(p, nColumn, "+");
3525  }else if( p->cMode==MODE_Box ){
3526    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3527  }
3528columnar_end:
3529  if( seenInterrupt ){
3530    utf8_printf(p->out, "Interrupt\n");
3531  }
3532  nData = (nRow+1)*nColumn;
3533  for(i=0; i<nData; i++) free(azData[i]);
3534  sqlite3_free(azData);
3535  sqlite3_free((void*)azNextLine);
3536  sqlite3_free(abRowDiv);
3537  if( azQuoted ){
3538    for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
3539    sqlite3_free(azQuoted);
3540  }
3541}
3542
3543/*
3544** Run a prepared statement
3545*/
3546static void exec_prepared_stmt(
3547  ShellState *pArg,                                /* Pointer to ShellState */
3548  sqlite3_stmt *pStmt                              /* Statment to run */
3549){
3550  int rc;
3551  sqlite3_uint64 nRow = 0;
3552
3553  if( pArg->cMode==MODE_Column
3554   || pArg->cMode==MODE_Table
3555   || pArg->cMode==MODE_Box
3556   || pArg->cMode==MODE_Markdown
3557  ){
3558    exec_prepared_stmt_columnar(pArg, pStmt);
3559    return;
3560  }
3561
3562  /* perform the first step.  this will tell us if we
3563  ** have a result set or not and how wide it is.
3564  */
3565  rc = sqlite3_step(pStmt);
3566  /* if we have a result set... */
3567  if( SQLITE_ROW == rc ){
3568    /* allocate space for col name ptr, value ptr, and type */
3569    int nCol = sqlite3_column_count(pStmt);
3570    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3571    if( !pData ){
3572      shell_out_of_memory();
3573    }else{
3574      char **azCols = (char **)pData;      /* Names of result columns */
3575      char **azVals = &azCols[nCol];       /* Results */
3576      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3577      int i, x;
3578      assert(sizeof(int) <= sizeof(char *));
3579      /* save off ptrs to column names */
3580      for(i=0; i<nCol; i++){
3581        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3582      }
3583      do{
3584        nRow++;
3585        /* extract the data and data types */
3586        for(i=0; i<nCol; i++){
3587          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3588          if( x==SQLITE_BLOB
3589           && pArg
3590           && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
3591          ){
3592            azVals[i] = "";
3593          }else{
3594            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3595          }
3596          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3597            rc = SQLITE_NOMEM;
3598            break; /* from for */
3599          }
3600        } /* end for */
3601
3602        /* if data and types extracted successfully... */
3603        if( SQLITE_ROW == rc ){
3604          /* call the supplied callback with the result row data */
3605          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3606            rc = SQLITE_ABORT;
3607          }else{
3608            rc = sqlite3_step(pStmt);
3609          }
3610        }
3611      } while( SQLITE_ROW == rc );
3612      sqlite3_free(pData);
3613      if( pArg->cMode==MODE_Json ){
3614        fputs("]\n", pArg->out);
3615      }else if( pArg->cMode==MODE_Count ){
3616        char zBuf[200];
3617        sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
3618                         nRow, nRow!=1 ? "s" : "");
3619        printf("%s", zBuf);
3620      }
3621    }
3622  }
3623}
3624
3625#ifndef SQLITE_OMIT_VIRTUALTABLE
3626/*
3627** This function is called to process SQL if the previous shell command
3628** was ".expert". It passes the SQL in the second argument directly to
3629** the sqlite3expert object.
3630**
3631** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3632** code. In this case, (*pzErr) may be set to point to a buffer containing
3633** an English language error message. It is the responsibility of the
3634** caller to eventually free this buffer using sqlite3_free().
3635*/
3636static int expertHandleSQL(
3637  ShellState *pState,
3638  const char *zSql,
3639  char **pzErr
3640){
3641  assert( pState->expert.pExpert );
3642  assert( pzErr==0 || *pzErr==0 );
3643  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3644}
3645
3646/*
3647** This function is called either to silently clean up the object
3648** created by the ".expert" command (if bCancel==1), or to generate a
3649** report from it and then clean it up (if bCancel==0).
3650**
3651** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3652** code. In this case, (*pzErr) may be set to point to a buffer containing
3653** an English language error message. It is the responsibility of the
3654** caller to eventually free this buffer using sqlite3_free().
3655*/
3656static int expertFinish(
3657  ShellState *pState,
3658  int bCancel,
3659  char **pzErr
3660){
3661  int rc = SQLITE_OK;
3662  sqlite3expert *p = pState->expert.pExpert;
3663  assert( p );
3664  assert( bCancel || pzErr==0 || *pzErr==0 );
3665  if( bCancel==0 ){
3666    FILE *out = pState->out;
3667    int bVerbose = pState->expert.bVerbose;
3668
3669    rc = sqlite3_expert_analyze(p, pzErr);
3670    if( rc==SQLITE_OK ){
3671      int nQuery = sqlite3_expert_count(p);
3672      int i;
3673
3674      if( bVerbose ){
3675        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3676        raw_printf(out, "-- Candidates -----------------------------\n");
3677        raw_printf(out, "%s\n", zCand);
3678      }
3679      for(i=0; i<nQuery; i++){
3680        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3681        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3682        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3683        if( zIdx==0 ) zIdx = "(no new indexes)\n";
3684        if( bVerbose ){
3685          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3686          raw_printf(out, "%s\n\n", zSql);
3687        }
3688        raw_printf(out, "%s\n", zIdx);
3689        raw_printf(out, "%s\n", zEQP);
3690      }
3691    }
3692  }
3693  sqlite3_expert_destroy(p);
3694  pState->expert.pExpert = 0;
3695  return rc;
3696}
3697
3698/*
3699** Implementation of ".expert" dot command.
3700*/
3701static int expertDotCommand(
3702  ShellState *pState,             /* Current shell tool state */
3703  char **azArg,                   /* Array of arguments passed to dot command */
3704  int nArg                        /* Number of entries in azArg[] */
3705){
3706  int rc = SQLITE_OK;
3707  char *zErr = 0;
3708  int i;
3709  int iSample = 0;
3710
3711  assert( pState->expert.pExpert==0 );
3712  memset(&pState->expert, 0, sizeof(ExpertInfo));
3713
3714  for(i=1; rc==SQLITE_OK && i<nArg; i++){
3715    char *z = azArg[i];
3716    int n;
3717    if( z[0]=='-' && z[1]=='-' ) z++;
3718    n = strlen30(z);
3719    if( n>=2 && 0==strncmp(z, "-verbose", n) ){
3720      pState->expert.bVerbose = 1;
3721    }
3722    else if( n>=2 && 0==strncmp(z, "-sample", n) ){
3723      if( i==(nArg-1) ){
3724        raw_printf(stderr, "option requires an argument: %s\n", z);
3725        rc = SQLITE_ERROR;
3726      }else{
3727        iSample = (int)integerValue(azArg[++i]);
3728        if( iSample<0 || iSample>100 ){
3729          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3730          rc = SQLITE_ERROR;
3731        }
3732      }
3733    }
3734    else{
3735      raw_printf(stderr, "unknown option: %s\n", z);
3736      rc = SQLITE_ERROR;
3737    }
3738  }
3739
3740  if( rc==SQLITE_OK ){
3741    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3742    if( pState->expert.pExpert==0 ){
3743      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3744      rc = SQLITE_ERROR;
3745    }else{
3746      sqlite3_expert_config(
3747          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3748      );
3749    }
3750  }
3751  sqlite3_free(zErr);
3752
3753  return rc;
3754}
3755#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3756
3757/*
3758** Execute a statement or set of statements.  Print
3759** any result rows/columns depending on the current mode
3760** set via the supplied callback.
3761**
3762** This is very similar to SQLite's built-in sqlite3_exec()
3763** function except it takes a slightly different callback
3764** and callback data argument.
3765*/
3766static int shell_exec(
3767  ShellState *pArg,                         /* Pointer to ShellState */
3768  const char *zSql,                         /* SQL to be evaluated */
3769  char **pzErrMsg                           /* Error msg written here */
3770){
3771  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
3772  int rc = SQLITE_OK;             /* Return Code */
3773  int rc2;
3774  const char *zLeftover;          /* Tail of unprocessed SQL */
3775  sqlite3 *db = pArg->db;
3776
3777  if( pzErrMsg ){
3778    *pzErrMsg = NULL;
3779  }
3780
3781#ifndef SQLITE_OMIT_VIRTUALTABLE
3782  if( pArg->expert.pExpert ){
3783    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3784    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3785  }
3786#endif
3787
3788  while( zSql[0] && (SQLITE_OK == rc) ){
3789    static const char *zStmtSql;
3790    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3791    if( SQLITE_OK != rc ){
3792      if( pzErrMsg ){
3793        *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
3794      }
3795    }else{
3796      if( !pStmt ){
3797        /* this happens for a comment or white-space */
3798        zSql = zLeftover;
3799        while( IsSpace(zSql[0]) ) zSql++;
3800        continue;
3801      }
3802      zStmtSql = sqlite3_sql(pStmt);
3803      if( zStmtSql==0 ) zStmtSql = "";
3804      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3805
3806      /* save off the prepared statment handle and reset row count */
3807      if( pArg ){
3808        pArg->pStmt = pStmt;
3809        pArg->cnt = 0;
3810      }
3811
3812      /* echo the sql statement if echo on */
3813      if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3814        utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3815      }
3816
3817      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3818      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3819        sqlite3_stmt *pExplain;
3820        char *zEQP;
3821        int triggerEQP = 0;
3822        disable_debug_trace_modes();
3823        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3824        if( pArg->autoEQP>=AUTOEQP_trigger ){
3825          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3826        }
3827        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3828        shell_check_oom(zEQP);
3829        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3830        if( rc==SQLITE_OK ){
3831          while( sqlite3_step(pExplain)==SQLITE_ROW ){
3832            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3833            int iEqpId = sqlite3_column_int(pExplain, 0);
3834            int iParentId = sqlite3_column_int(pExplain, 1);
3835            if( zEQPLine==0 ) zEQPLine = "";
3836            if( zEQPLine[0]=='-' ) eqp_render(pArg);
3837            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3838          }
3839          eqp_render(pArg);
3840        }
3841        sqlite3_finalize(pExplain);
3842        sqlite3_free(zEQP);
3843        if( pArg->autoEQP>=AUTOEQP_full ){
3844          /* Also do an EXPLAIN for ".eqp full" mode */
3845          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3846          shell_check_oom(zEQP);
3847          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3848          if( rc==SQLITE_OK ){
3849            pArg->cMode = MODE_Explain;
3850            explain_data_prepare(pArg, pExplain);
3851            exec_prepared_stmt(pArg, pExplain);
3852            explain_data_delete(pArg);
3853          }
3854          sqlite3_finalize(pExplain);
3855          sqlite3_free(zEQP);
3856        }
3857        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3858          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3859          /* Reprepare pStmt before reactiving trace modes */
3860          sqlite3_finalize(pStmt);
3861          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3862          if( pArg ) pArg->pStmt = pStmt;
3863        }
3864        restore_debug_trace_modes();
3865      }
3866
3867      if( pArg ){
3868        pArg->cMode = pArg->mode;
3869        if( pArg->autoExplain ){
3870          if( sqlite3_stmt_isexplain(pStmt)==1 ){
3871            pArg->cMode = MODE_Explain;
3872          }
3873          if( sqlite3_stmt_isexplain(pStmt)==2 ){
3874            pArg->cMode = MODE_EQP;
3875          }
3876        }
3877
3878        /* If the shell is currently in ".explain" mode, gather the extra
3879        ** data required to add indents to the output.*/
3880        if( pArg->cMode==MODE_Explain ){
3881          explain_data_prepare(pArg, pStmt);
3882        }
3883      }
3884
3885      bind_prepared_stmt(pArg, pStmt);
3886      exec_prepared_stmt(pArg, pStmt);
3887      explain_data_delete(pArg);
3888      eqp_render(pArg);
3889
3890      /* print usage stats if stats on */
3891      if( pArg && pArg->statsOn ){
3892        display_stats(db, pArg, 0);
3893      }
3894
3895      /* print loop-counters if required */
3896      if( pArg && pArg->scanstatsOn ){
3897        display_scanstats(db, pArg);
3898      }
3899
3900      /* Finalize the statement just executed. If this fails, save a
3901      ** copy of the error message. Otherwise, set zSql to point to the
3902      ** next statement to execute. */
3903      rc2 = sqlite3_finalize(pStmt);
3904      if( rc!=SQLITE_NOMEM ) rc = rc2;
3905      if( rc==SQLITE_OK ){
3906        zSql = zLeftover;
3907        while( IsSpace(zSql[0]) ) zSql++;
3908      }else if( pzErrMsg ){
3909        *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
3910      }
3911
3912      /* clear saved stmt handle */
3913      if( pArg ){
3914        pArg->pStmt = NULL;
3915      }
3916    }
3917  } /* end while */
3918
3919  return rc;
3920}
3921
3922/*
3923** Release memory previously allocated by tableColumnList().
3924*/
3925static void freeColumnList(char **azCol){
3926  int i;
3927  for(i=1; azCol[i]; i++){
3928    sqlite3_free(azCol[i]);
3929  }
3930  /* azCol[0] is a static string */
3931  sqlite3_free(azCol);
3932}
3933
3934/*
3935** Return a list of pointers to strings which are the names of all
3936** columns in table zTab.   The memory to hold the names is dynamically
3937** allocated and must be released by the caller using a subsequent call
3938** to freeColumnList().
3939**
3940** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
3941** value that needs to be preserved, then azCol[0] is filled in with the
3942** name of the rowid column.
3943**
3944** The first regular column in the table is azCol[1].  The list is terminated
3945** by an entry with azCol[i]==0.
3946*/
3947static char **tableColumnList(ShellState *p, const char *zTab){
3948  char **azCol = 0;
3949  sqlite3_stmt *pStmt;
3950  char *zSql;
3951  int nCol = 0;
3952  int nAlloc = 0;
3953  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
3954  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
3955  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3956  int rc;
3957
3958  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3959  shell_check_oom(zSql);
3960  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3961  sqlite3_free(zSql);
3962  if( rc ) return 0;
3963  while( sqlite3_step(pStmt)==SQLITE_ROW ){
3964    if( nCol>=nAlloc-2 ){
3965      nAlloc = nAlloc*2 + nCol + 10;
3966      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3967      shell_check_oom(azCol);
3968    }
3969    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3970    shell_check_oom(azCol[nCol]);
3971    if( sqlite3_column_int(pStmt, 5) ){
3972      nPK++;
3973      if( nPK==1
3974       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3975                          "INTEGER")==0
3976      ){
3977        isIPK = 1;
3978      }else{
3979        isIPK = 0;
3980      }
3981    }
3982  }
3983  sqlite3_finalize(pStmt);
3984  if( azCol==0 ) return 0;
3985  azCol[0] = 0;
3986  azCol[nCol+1] = 0;
3987
3988  /* The decision of whether or not a rowid really needs to be preserved
3989  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
3990  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
3991  ** rowids on tables where the rowid is inaccessible because there are other
3992  ** columns in the table named "rowid", "_rowid_", and "oid".
3993  */
3994  if( preserveRowid && isIPK ){
3995    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3996    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
3997    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3998    ** ROWID aliases.  To distinguish these cases, check to see if
3999    ** there is a "pk" entry in "PRAGMA index_list".  There will be
4000    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
4001    */
4002    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
4003                           " WHERE origin='pk'", zTab);
4004    shell_check_oom(zSql);
4005    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4006    sqlite3_free(zSql);
4007    if( rc ){
4008      freeColumnList(azCol);
4009      return 0;
4010    }
4011    rc = sqlite3_step(pStmt);
4012    sqlite3_finalize(pStmt);
4013    preserveRowid = rc==SQLITE_ROW;
4014  }
4015  if( preserveRowid ){
4016    /* Only preserve the rowid if we can find a name to use for the
4017    ** rowid */
4018    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
4019    int i, j;
4020    for(j=0; j<3; j++){
4021      for(i=1; i<=nCol; i++){
4022        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
4023      }
4024      if( i>nCol ){
4025        /* At this point, we know that azRowid[j] is not the name of any
4026        ** ordinary column in the table.  Verify that azRowid[j] is a valid
4027        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
4028        ** tables will fail this last check */
4029        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
4030        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
4031        break;
4032      }
4033    }
4034  }
4035  return azCol;
4036}
4037
4038/*
4039** Toggle the reverse_unordered_selects setting.
4040*/
4041static void toggleSelectOrder(sqlite3 *db){
4042  sqlite3_stmt *pStmt = 0;
4043  int iSetting = 0;
4044  char zStmt[100];
4045  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
4046  if( sqlite3_step(pStmt)==SQLITE_ROW ){
4047    iSetting = sqlite3_column_int(pStmt, 0);
4048  }
4049  sqlite3_finalize(pStmt);
4050  sqlite3_snprintf(sizeof(zStmt), zStmt,
4051       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
4052  sqlite3_exec(db, zStmt, 0, 0, 0);
4053}
4054
4055/*
4056** This is a different callback routine used for dumping the database.
4057** Each row received by this callback consists of a table name,
4058** the table type ("index" or "table") and SQL to create the table.
4059** This routine should print text sufficient to recreate the table.
4060*/
4061static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
4062  int rc;
4063  const char *zTable;
4064  const char *zType;
4065  const char *zSql;
4066  ShellState *p = (ShellState *)pArg;
4067  int dataOnly;
4068  int noSys;
4069
4070  UNUSED_PARAMETER(azNotUsed);
4071  if( nArg!=3 || azArg==0 ) return 0;
4072  zTable = azArg[0];
4073  zType = azArg[1];
4074  zSql = azArg[2];
4075  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
4076  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
4077
4078  if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
4079    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
4080  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
4081    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
4082  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
4083    return 0;
4084  }else if( dataOnly ){
4085    /* no-op */
4086  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
4087    char *zIns;
4088    if( !p->writableSchema ){
4089      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
4090      p->writableSchema = 1;
4091    }
4092    zIns = sqlite3_mprintf(
4093       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
4094       "VALUES('table','%q','%q',0,'%q');",
4095       zTable, zTable, zSql);
4096    shell_check_oom(zIns);
4097    utf8_printf(p->out, "%s\n", zIns);
4098    sqlite3_free(zIns);
4099    return 0;
4100  }else{
4101    printSchemaLine(p->out, zSql, ";\n");
4102  }
4103
4104  if( strcmp(zType, "table")==0 ){
4105    ShellText sSelect;
4106    ShellText sTable;
4107    char **azCol;
4108    int i;
4109    char *savedDestTable;
4110    int savedMode;
4111
4112    azCol = tableColumnList(p, zTable);
4113    if( azCol==0 ){
4114      p->nErr++;
4115      return 0;
4116    }
4117
4118    /* Always quote the table name, even if it appears to be pure ascii,
4119    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
4120    initText(&sTable);
4121    appendText(&sTable, zTable, quoteChar(zTable));
4122    /* If preserving the rowid, add a column list after the table name.
4123    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
4124    ** instead of the usual "INSERT INTO tab VALUES(...)".
4125    */
4126    if( azCol[0] ){
4127      appendText(&sTable, "(", 0);
4128      appendText(&sTable, azCol[0], 0);
4129      for(i=1; azCol[i]; i++){
4130        appendText(&sTable, ",", 0);
4131        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
4132      }
4133      appendText(&sTable, ")", 0);
4134    }
4135
4136    /* Build an appropriate SELECT statement */
4137    initText(&sSelect);
4138    appendText(&sSelect, "SELECT ", 0);
4139    if( azCol[0] ){
4140      appendText(&sSelect, azCol[0], 0);
4141      appendText(&sSelect, ",", 0);
4142    }
4143    for(i=1; azCol[i]; i++){
4144      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
4145      if( azCol[i+1] ){
4146        appendText(&sSelect, ",", 0);
4147      }
4148    }
4149    freeColumnList(azCol);
4150    appendText(&sSelect, " FROM ", 0);
4151    appendText(&sSelect, zTable, quoteChar(zTable));
4152
4153    savedDestTable = p->zDestTable;
4154    savedMode = p->mode;
4155    p->zDestTable = sTable.z;
4156    p->mode = p->cMode = MODE_Insert;
4157    rc = shell_exec(p, sSelect.z, 0);
4158    if( (rc&0xff)==SQLITE_CORRUPT ){
4159      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4160      toggleSelectOrder(p->db);
4161      shell_exec(p, sSelect.z, 0);
4162      toggleSelectOrder(p->db);
4163    }
4164    p->zDestTable = savedDestTable;
4165    p->mode = savedMode;
4166    freeText(&sTable);
4167    freeText(&sSelect);
4168    if( rc ) p->nErr++;
4169  }
4170  return 0;
4171}
4172
4173/*
4174** Run zQuery.  Use dump_callback() as the callback routine so that
4175** the contents of the query are output as SQL statements.
4176**
4177** If we get a SQLITE_CORRUPT error, rerun the query after appending
4178** "ORDER BY rowid DESC" to the end.
4179*/
4180static int run_schema_dump_query(
4181  ShellState *p,
4182  const char *zQuery
4183){
4184  int rc;
4185  char *zErr = 0;
4186  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
4187  if( rc==SQLITE_CORRUPT ){
4188    char *zQ2;
4189    int len = strlen30(zQuery);
4190    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4191    if( zErr ){
4192      utf8_printf(p->out, "/****** %s ******/\n", zErr);
4193      sqlite3_free(zErr);
4194      zErr = 0;
4195    }
4196    zQ2 = malloc( len+100 );
4197    if( zQ2==0 ) return rc;
4198    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
4199    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4200    if( rc ){
4201      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
4202    }else{
4203      rc = SQLITE_CORRUPT;
4204    }
4205    sqlite3_free(zErr);
4206    free(zQ2);
4207  }
4208  return rc;
4209}
4210
4211/*
4212** Text of help messages.
4213**
4214** The help text for each individual command begins with a line that starts
4215** with ".".  Subsequent lines are supplimental information.
4216**
4217** There must be two or more spaces between the end of the command and the
4218** start of the description of what that command does.
4219*/
4220static const char *(azHelp[]) = {
4221#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
4222  ".archive ...             Manage SQL archives",
4223  "   Each command must have exactly one of the following options:",
4224  "     -c, --create               Create a new archive",
4225  "     -u, --update               Add or update files with changed mtime",
4226  "     -i, --insert               Like -u but always add even if unchanged",
4227  "     -r, --remove               Remove files from archive",
4228  "     -t, --list                 List contents of archive",
4229  "     -x, --extract              Extract files from archive",
4230  "   Optional arguments:",
4231  "     -v, --verbose              Print each filename as it is processed",
4232  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
4233  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
4234  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
4235  "     -g, --glob                 Use glob matching for names in archive",
4236  "     -n, --dryrun               Show the SQL that would have occurred",
4237  "   Examples:",
4238  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
4239  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
4240  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
4241  "   See also:",
4242  "      http://sqlite.org/cli.html#sqlite_archive_support",
4243#endif
4244#ifndef SQLITE_OMIT_AUTHORIZATION
4245  ".auth ON|OFF             Show authorizer callbacks",
4246#endif
4247  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
4248  "       --append            Use the appendvfs",
4249  "       --async             Write to FILE without journal and fsync()",
4250  ".bail on|off             Stop after hitting an error.  Default OFF",
4251  ".binary on|off           Turn binary output on or off.  Default OFF",
4252  ".cd DIRECTORY            Change the working directory to DIRECTORY",
4253  ".changes on|off          Show number of rows changed by SQL",
4254  ".check GLOB              Fail if output since .testcase does not match",
4255  ".clone NEWDB             Clone data into NEWDB from the existing database",
4256  ".connection [close] [#]  Open or close an auxiliary database connection",
4257  ".databases               List names and files of attached databases",
4258  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
4259  ".dbinfo ?DB?             Show status information about the database",
4260  ".dump ?OBJECTS?          Render database content as SQL",
4261  "   Options:",
4262  "     --data-only            Output only INSERT statements",
4263  "     --newlines             Allow unescaped newline characters in output",
4264  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
4265  "     --preserve-rowids      Include ROWID values in the output",
4266  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
4267  "   Additional LIKE patterns can be given in subsequent arguments",
4268  ".echo on|off             Turn command echo on or off",
4269  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
4270  "   Other Modes:",
4271#ifdef SQLITE_DEBUG
4272  "      test                  Show raw EXPLAIN QUERY PLAN output",
4273  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4274#endif
4275  "      trigger               Like \"full\" but also show trigger bytecode",
4276  ".excel                   Display the output of next command in spreadsheet",
4277  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
4278  ".exit ?CODE?             Exit this program with return-code CODE",
4279  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
4280  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
4281  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
4282  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
4283  "   --help                  Show CMD details",
4284  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
4285  ".headers on|off          Turn display of headers on or off",
4286  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
4287  ".import FILE TABLE       Import data from FILE into TABLE",
4288  "   Options:",
4289  "     --ascii               Use \\037 and \\036 as column and row separators",
4290  "     --csv                 Use , and \\n as column and row separators",
4291  "     --skip N              Skip the first N rows of input",
4292  "     --schema S            Target table to be S.TABLE",
4293  "     -v                    \"Verbose\" - increase auxiliary output",
4294  "   Notes:",
4295  "     *  If TABLE does not exist, it is created.  The first row of input",
4296  "        determines the column names.",
4297  "     *  If neither --csv or --ascii are used, the input mode is derived",
4298  "        from the \".mode\" output mode",
4299  "     *  If FILE begins with \"|\" then it is a command that generates the",
4300  "        input text.",
4301#ifndef SQLITE_OMIT_TEST_CONTROL
4302  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
4303#endif
4304  ".indexes ?TABLE?         Show names of indexes",
4305  "                           If TABLE is specified, only show indexes for",
4306  "                           tables matching TABLE using the LIKE operator.",
4307#ifdef SQLITE_ENABLE_IOTRACE
4308  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
4309#endif
4310  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
4311  ".lint OPTIONS            Report potential schema issues.",
4312  "     Options:",
4313  "        fkey-indexes     Find missing foreign key indexes",
4314#ifndef SQLITE_OMIT_LOAD_EXTENSION
4315  ".load FILE ?ENTRY?       Load an extension library",
4316#endif
4317  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
4318  ".mode MODE ?OPTIONS?     Set output mode",
4319  "   MODE is one of:",
4320  "     ascii       Columns/rows delimited by 0x1F and 0x1E",
4321  "     box         Tables using unicode box-drawing characters",
4322  "     csv         Comma-separated values",
4323  "     column      Output in columns.  (See .width)",
4324  "     html        HTML <table> code",
4325  "     insert      SQL insert statements for TABLE",
4326  "     json        Results in a JSON array",
4327  "     line        One value per line",
4328  "     list        Values delimited by \"|\"",
4329  "     markdown    Markdown table format",
4330  "     qbox        Shorthand for \"box --width 60 --quote\"",
4331  "     quote       Escape answers as for SQL",
4332  "     table       ASCII-art table",
4333  "     tabs        Tab-separated values",
4334  "     tcl         TCL list elements",
4335  "   OPTIONS: (for columnar modes or insert mode):",
4336  "     --wrap N       Wrap output lines to no longer than N characters",
4337  "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
4338  "     --ww           Shorthand for \"--wordwrap 1\"",
4339  "     --quote        Quote output text as SQL literals",
4340  "     --noquote      Do not quote output text",
4341  "     TABLE          The name of SQL table used for \"insert\" mode",
4342  ".nonce STRING            Suspend safe mode for one command if nonce matches",
4343  ".nullvalue STRING        Use STRING in place of NULL values",
4344  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
4345  "     If FILE begins with '|' then open as a pipe",
4346  "       --bom  Put a UTF8 byte-order mark at the beginning",
4347  "       -e     Send output to the system text editor",
4348  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
4349  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
4350  "     Options:",
4351  "        --append        Use appendvfs to append database to the end of FILE",
4352#ifndef SQLITE_OMIT_DESERIALIZE
4353  "        --deserialize   Load into memory using sqlite3_deserialize()",
4354  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
4355  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
4356#endif
4357  "        --new           Initialize FILE to an empty database",
4358  "        --nofollow      Do not follow symbolic links",
4359  "        --readonly      Open FILE readonly",
4360  "        --zip           FILE is a ZIP archive",
4361  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
4362  "   If FILE begins with '|' then open it as a pipe.",
4363  "   Options:",
4364  "     --bom                 Prefix output with a UTF8 byte-order mark",
4365  "     -e                    Send output to the system text editor",
4366  "     -x                    Send output as CSV to a spreadsheet",
4367  ".parameter CMD ...       Manage SQL parameter bindings",
4368  "   clear                   Erase all bindings",
4369  "   init                    Initialize the TEMP table that holds bindings",
4370  "   list                    List the current parameter bindings",
4371  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
4372  "                           PARAMETER should start with one of: $ : @ ?",
4373  "   unset PARAMETER         Remove PARAMETER from the binding table",
4374  ".print STRING...         Print literal STRING",
4375#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4376  ".progress N              Invoke progress handler after every N opcodes",
4377  "   --limit N                 Interrupt after N progress callbacks",
4378  "   --once                    Do no more than one progress interrupt",
4379  "   --quiet|-q                No output except at interrupts",
4380  "   --reset                   Reset the count for each input and interrupt",
4381#endif
4382  ".prompt MAIN CONTINUE    Replace the standard prompts",
4383  ".quit                    Exit this program",
4384  ".read FILE               Read input from FILE or command output",
4385  "    If FILE begins with \"|\", it is a command that generates the input.",
4386#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4387  ".recover                 Recover as much data as possible from corrupt db.",
4388  "   --freelist-corrupt       Assume the freelist is corrupt",
4389  "   --recovery-db NAME       Store recovery metadata in database file NAME",
4390  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
4391  "   --no-rowids              Do not attempt to recover rowid values",
4392  "                            that are not also INTEGER PRIMARY KEYs",
4393#endif
4394  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
4395  ".save FILE               Write in-memory database into FILE",
4396  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
4397  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
4398  "   Options:",
4399  "      --indent             Try to pretty-print the schema",
4400  "      --nosys              Omit objects whose names start with \"sqlite_\"",
4401  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
4402  "    Options:",
4403  "       --init               Create a new SELFTEST table",
4404  "       -v                   Verbose output",
4405  ".separator COL ?ROW?     Change the column and row separators",
4406#if defined(SQLITE_ENABLE_SESSION)
4407  ".session ?NAME? CMD ...  Create or control sessions",
4408  "   Subcommands:",
4409  "     attach TABLE             Attach TABLE",
4410  "     changeset FILE           Write a changeset into FILE",
4411  "     close                    Close one session",
4412  "     enable ?BOOLEAN?         Set or query the enable bit",
4413  "     filter GLOB...           Reject tables matching GLOBs",
4414  "     indirect ?BOOLEAN?       Mark or query the indirect status",
4415  "     isempty                  Query whether the session is empty",
4416  "     list                     List currently open session names",
4417  "     open DB NAME             Open a new session on DB",
4418  "     patchset FILE            Write a patchset into FILE",
4419  "   If ?NAME? is omitted, the first defined session is used.",
4420#endif
4421  ".sha3sum ...             Compute a SHA3 hash of database content",
4422  "    Options:",
4423  "      --schema              Also hash the sqlite_schema table",
4424  "      --sha3-224            Use the sha3-224 algorithm",
4425  "      --sha3-256            Use the sha3-256 algorithm (default)",
4426  "      --sha3-384            Use the sha3-384 algorithm",
4427  "      --sha3-512            Use the sha3-512 algorithm",
4428  "    Any other argument is a LIKE pattern for tables to hash",
4429#ifndef SQLITE_NOHAVE_SYSTEM
4430  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
4431#endif
4432  ".show                    Show the current values for various settings",
4433  ".stats ?ARG?             Show stats or turn stats on or off",
4434  "   off                      Turn off automatic stat display",
4435  "   on                       Turn on automatic stat display",
4436  "   stmt                     Show statement stats",
4437  "   vmstep                   Show the virtual machine step count only",
4438#ifndef SQLITE_NOHAVE_SYSTEM
4439  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
4440#endif
4441  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
4442  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
4443  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
4444  "                           Run \".testctrl\" with no arguments for details",
4445  ".timeout MS              Try opening locked tables for MS milliseconds",
4446  ".timer on|off            Turn SQL timer on or off",
4447#ifndef SQLITE_OMIT_TRACE
4448  ".trace ?OPTIONS?         Output each SQL statement as it is run",
4449  "    FILE                    Send output to FILE",
4450  "    stdout                  Send output to stdout",
4451  "    stderr                  Send output to stderr",
4452  "    off                     Disable tracing",
4453  "    --expanded              Expand query parameters",
4454#ifdef SQLITE_ENABLE_NORMALIZE
4455  "    --normalized            Normal the SQL statements",
4456#endif
4457  "    --plain                 Show SQL as it is input",
4458  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
4459  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
4460  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
4461  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
4462#endif /* SQLITE_OMIT_TRACE */
4463#ifdef SQLITE_DEBUG
4464  ".unmodule NAME ...       Unregister virtual table modules",
4465  "    --allexcept             Unregister everything except those named",
4466#endif
4467  ".vfsinfo ?AUX?           Information about the top-level VFS",
4468  ".vfslist                 List all available VFSes",
4469  ".vfsname ?AUX?           Print the name of the VFS stack",
4470  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
4471  "     Negative values right-justify",
4472};
4473
4474/*
4475** Output help text.
4476**
4477** zPattern describes the set of commands for which help text is provided.
4478** If zPattern is NULL, then show all commands, but only give a one-line
4479** description of each.
4480**
4481** Return the number of matches.
4482*/
4483static int showHelp(FILE *out, const char *zPattern){
4484  int i = 0;
4485  int j = 0;
4486  int n = 0;
4487  char *zPat;
4488  if( zPattern==0
4489   || zPattern[0]=='0'
4490   || strcmp(zPattern,"-a")==0
4491   || strcmp(zPattern,"-all")==0
4492   || strcmp(zPattern,"--all")==0
4493  ){
4494    /* Show all commands, but only one line per command */
4495    if( zPattern==0 ) zPattern = "";
4496    for(i=0; i<ArraySize(azHelp); i++){
4497      if( azHelp[i][0]=='.' || zPattern[0] ){
4498        utf8_printf(out, "%s\n", azHelp[i]);
4499        n++;
4500      }
4501    }
4502  }else{
4503    /* Look for commands that for which zPattern is an exact prefix */
4504    zPat = sqlite3_mprintf(".%s*", zPattern);
4505    shell_check_oom(zPat);
4506    for(i=0; i<ArraySize(azHelp); i++){
4507      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4508        utf8_printf(out, "%s\n", azHelp[i]);
4509        j = i+1;
4510        n++;
4511      }
4512    }
4513    sqlite3_free(zPat);
4514    if( n ){
4515      if( n==1 ){
4516        /* when zPattern is a prefix of exactly one command, then include the
4517        ** details of that command, which should begin at offset j */
4518        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4519          utf8_printf(out, "%s\n", azHelp[j]);
4520          j++;
4521        }
4522      }
4523      return n;
4524    }
4525    /* Look for commands that contain zPattern anywhere.  Show the complete
4526    ** text of all commands that match. */
4527    zPat = sqlite3_mprintf("%%%s%%", zPattern);
4528    shell_check_oom(zPat);
4529    for(i=0; i<ArraySize(azHelp); i++){
4530      if( azHelp[i][0]=='.' ) j = i;
4531      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4532        utf8_printf(out, "%s\n", azHelp[j]);
4533        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4534          j++;
4535          utf8_printf(out, "%s\n", azHelp[j]);
4536        }
4537        i = j;
4538        n++;
4539      }
4540    }
4541    sqlite3_free(zPat);
4542  }
4543  return n;
4544}
4545
4546/* Forward reference */
4547static int process_input(ShellState *p);
4548
4549/*
4550** Read the content of file zName into memory obtained from sqlite3_malloc64()
4551** and return a pointer to the buffer. The caller is responsible for freeing
4552** the memory.
4553**
4554** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4555** read.
4556**
4557** For convenience, a nul-terminator byte is always appended to the data read
4558** from the file before the buffer is returned. This byte is not included in
4559** the final value of (*pnByte), if applicable.
4560**
4561** NULL is returned if any error is encountered. The final value of *pnByte
4562** is undefined in this case.
4563*/
4564static char *readFile(const char *zName, int *pnByte){
4565  FILE *in = fopen(zName, "rb");
4566  long nIn;
4567  size_t nRead;
4568  char *pBuf;
4569  if( in==0 ) return 0;
4570  fseek(in, 0, SEEK_END);
4571  nIn = ftell(in);
4572  rewind(in);
4573  pBuf = sqlite3_malloc64( nIn+1 );
4574  if( pBuf==0 ){ fclose(in); return 0; }
4575  nRead = fread(pBuf, nIn, 1, in);
4576  fclose(in);
4577  if( nRead!=1 ){
4578    sqlite3_free(pBuf);
4579    return 0;
4580  }
4581  pBuf[nIn] = 0;
4582  if( pnByte ) *pnByte = nIn;
4583  return pBuf;
4584}
4585
4586#if defined(SQLITE_ENABLE_SESSION)
4587/*
4588** Close a single OpenSession object and release all of its associated
4589** resources.
4590*/
4591static void session_close(OpenSession *pSession){
4592  int i;
4593  sqlite3session_delete(pSession->p);
4594  sqlite3_free(pSession->zName);
4595  for(i=0; i<pSession->nFilter; i++){
4596    sqlite3_free(pSession->azFilter[i]);
4597  }
4598  sqlite3_free(pSession->azFilter);
4599  memset(pSession, 0, sizeof(OpenSession));
4600}
4601#endif
4602
4603/*
4604** Close all OpenSession objects and release all associated resources.
4605*/
4606#if defined(SQLITE_ENABLE_SESSION)
4607static void session_close_all(ShellState *p, int i){
4608  int j;
4609  struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4610  for(j=0; j<pAuxDb->nSession; j++){
4611    session_close(&pAuxDb->aSession[j]);
4612  }
4613  pAuxDb->nSession = 0;
4614}
4615#else
4616# define session_close_all(X,Y)
4617#endif
4618
4619/*
4620** Implementation of the xFilter function for an open session.  Omit
4621** any tables named by ".session filter" but let all other table through.
4622*/
4623#if defined(SQLITE_ENABLE_SESSION)
4624static int session_filter(void *pCtx, const char *zTab){
4625  OpenSession *pSession = (OpenSession*)pCtx;
4626  int i;
4627  for(i=0; i<pSession->nFilter; i++){
4628    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4629  }
4630  return 1;
4631}
4632#endif
4633
4634/*
4635** Try to deduce the type of file for zName based on its content.  Return
4636** one of the SHELL_OPEN_* constants.
4637**
4638** If the file does not exist or is empty but its name looks like a ZIP
4639** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4640** Otherwise, assume an ordinary database regardless of the filename if
4641** the type cannot be determined from content.
4642*/
4643int deduceDatabaseType(const char *zName, int dfltZip){
4644  FILE *f = fopen(zName, "rb");
4645  size_t n;
4646  int rc = SHELL_OPEN_UNSPEC;
4647  char zBuf[100];
4648  if( f==0 ){
4649    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4650       return SHELL_OPEN_ZIPFILE;
4651    }else{
4652       return SHELL_OPEN_NORMAL;
4653    }
4654  }
4655  n = fread(zBuf, 16, 1, f);
4656  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4657    fclose(f);
4658    return SHELL_OPEN_NORMAL;
4659  }
4660  fseek(f, -25, SEEK_END);
4661  n = fread(zBuf, 25, 1, f);
4662  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4663    rc = SHELL_OPEN_APPENDVFS;
4664  }else{
4665    fseek(f, -22, SEEK_END);
4666    n = fread(zBuf, 22, 1, f);
4667    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4668       && zBuf[3]==0x06 ){
4669      rc = SHELL_OPEN_ZIPFILE;
4670    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4671      rc = SHELL_OPEN_ZIPFILE;
4672    }
4673  }
4674  fclose(f);
4675  return rc;
4676}
4677
4678#ifndef SQLITE_OMIT_DESERIALIZE
4679/*
4680** Reconstruct an in-memory database using the output from the "dbtotxt"
4681** program.  Read content from the file in p->aAuxDb[].zDbFilename.
4682** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4683*/
4684static unsigned char *readHexDb(ShellState *p, int *pnData){
4685  unsigned char *a = 0;
4686  int nLine;
4687  int n = 0;
4688  int pgsz = 0;
4689  int iOffset = 0;
4690  int j, k;
4691  int rc;
4692  FILE *in;
4693  const char *zDbFilename = p->pAuxDb->zDbFilename;
4694  unsigned int x[16];
4695  char zLine[1000];
4696  if( zDbFilename ){
4697    in = fopen(zDbFilename, "r");
4698    if( in==0 ){
4699      utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4700      return 0;
4701    }
4702    nLine = 0;
4703  }else{
4704    in = p->in;
4705    nLine = p->lineno;
4706    if( in==0 ) in = stdin;
4707  }
4708  *pnData = 0;
4709  nLine++;
4710  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4711  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4712  if( rc!=2 ) goto readHexDb_error;
4713  if( n<0 ) goto readHexDb_error;
4714  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4715  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
4716  a = sqlite3_malloc( n ? n : 1 );
4717  shell_check_oom(a);
4718  memset(a, 0, n);
4719  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4720    utf8_printf(stderr, "invalid pagesize\n");
4721    goto readHexDb_error;
4722  }
4723  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4724    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4725    if( rc==2 ){
4726      iOffset = k;
4727      continue;
4728    }
4729    if( strncmp(zLine, "| end ", 6)==0 ){
4730      break;
4731    }
4732    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4733                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4734                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4735    if( rc==17 ){
4736      k = iOffset+j;
4737      if( k+16<=n && k>=0 ){
4738        int ii;
4739        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4740      }
4741    }
4742  }
4743  *pnData = n;
4744  if( in!=p->in ){
4745    fclose(in);
4746  }else{
4747    p->lineno = nLine;
4748  }
4749  return a;
4750
4751readHexDb_error:
4752  if( in!=p->in ){
4753    fclose(in);
4754  }else{
4755    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4756      nLine++;
4757      if(strncmp(zLine, "| end ", 6)==0 ) break;
4758    }
4759    p->lineno = nLine;
4760  }
4761  sqlite3_free(a);
4762  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4763  return 0;
4764}
4765#endif /* SQLITE_OMIT_DESERIALIZE */
4766
4767/*
4768** Scalar function "shell_int32". The first argument to this function
4769** must be a blob. The second a non-negative integer. This function
4770** reads and returns a 32-bit big-endian integer from byte
4771** offset (4*<arg2>) of the blob.
4772*/
4773static void shellInt32(
4774  sqlite3_context *context,
4775  int argc,
4776  sqlite3_value **argv
4777){
4778  const unsigned char *pBlob;
4779  int nBlob;
4780  int iInt;
4781
4782  UNUSED_PARAMETER(argc);
4783  nBlob = sqlite3_value_bytes(argv[0]);
4784  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4785  iInt = sqlite3_value_int(argv[1]);
4786
4787  if( iInt>=0 && (iInt+1)*4<=nBlob ){
4788    const unsigned char *a = &pBlob[iInt*4];
4789    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4790                       + ((sqlite3_int64)a[1]<<16)
4791                       + ((sqlite3_int64)a[2]<< 8)
4792                       + ((sqlite3_int64)a[3]<< 0);
4793    sqlite3_result_int64(context, iVal);
4794  }
4795}
4796
4797/*
4798** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4799** using "..." with internal double-quote characters doubled.
4800*/
4801static void shellIdQuote(
4802  sqlite3_context *context,
4803  int argc,
4804  sqlite3_value **argv
4805){
4806  const char *zName = (const char*)sqlite3_value_text(argv[0]);
4807  UNUSED_PARAMETER(argc);
4808  if( zName ){
4809    char *z = sqlite3_mprintf("\"%w\"", zName);
4810    sqlite3_result_text(context, z, -1, sqlite3_free);
4811  }
4812}
4813
4814/*
4815** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4816*/
4817static void shellUSleepFunc(
4818  sqlite3_context *context,
4819  int argcUnused,
4820  sqlite3_value **argv
4821){
4822  int sleep = sqlite3_value_int(argv[0]);
4823  (void)argcUnused;
4824  sqlite3_sleep(sleep/1000);
4825  sqlite3_result_int(context, sleep);
4826}
4827
4828/*
4829** Scalar function "shell_escape_crnl" used by the .recover command.
4830** The argument passed to this function is the output of built-in
4831** function quote(). If the first character of the input is "'",
4832** indicating that the value passed to quote() was a text value,
4833** then this function searches the input for "\n" and "\r" characters
4834** and adds a wrapper similar to the following:
4835**
4836**   replace(replace(<input>, '\n', char(10), '\r', char(13));
4837**
4838** Or, if the first character of the input is not "'", then a copy
4839** of the input is returned.
4840*/
4841static void shellEscapeCrnl(
4842  sqlite3_context *context,
4843  int argc,
4844  sqlite3_value **argv
4845){
4846  const char *zText = (const char*)sqlite3_value_text(argv[0]);
4847  UNUSED_PARAMETER(argc);
4848  if( zText && zText[0]=='\'' ){
4849    int nText = sqlite3_value_bytes(argv[0]);
4850    int i;
4851    char zBuf1[20];
4852    char zBuf2[20];
4853    const char *zNL = 0;
4854    const char *zCR = 0;
4855    int nCR = 0;
4856    int nNL = 0;
4857
4858    for(i=0; zText[i]; i++){
4859      if( zNL==0 && zText[i]=='\n' ){
4860        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4861        nNL = (int)strlen(zNL);
4862      }
4863      if( zCR==0 && zText[i]=='\r' ){
4864        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4865        nCR = (int)strlen(zCR);
4866      }
4867    }
4868
4869    if( zNL || zCR ){
4870      int iOut = 0;
4871      i64 nMax = (nNL > nCR) ? nNL : nCR;
4872      i64 nAlloc = nMax * nText + (nMax+64)*2;
4873      char *zOut = (char*)sqlite3_malloc64(nAlloc);
4874      if( zOut==0 ){
4875        sqlite3_result_error_nomem(context);
4876        return;
4877      }
4878
4879      if( zNL && zCR ){
4880        memcpy(&zOut[iOut], "replace(replace(", 16);
4881        iOut += 16;
4882      }else{
4883        memcpy(&zOut[iOut], "replace(", 8);
4884        iOut += 8;
4885      }
4886      for(i=0; zText[i]; i++){
4887        if( zText[i]=='\n' ){
4888          memcpy(&zOut[iOut], zNL, nNL);
4889          iOut += nNL;
4890        }else if( zText[i]=='\r' ){
4891          memcpy(&zOut[iOut], zCR, nCR);
4892          iOut += nCR;
4893        }else{
4894          zOut[iOut] = zText[i];
4895          iOut++;
4896        }
4897      }
4898
4899      if( zNL ){
4900        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4901        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
4902        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
4903      }
4904      if( zCR ){
4905        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4906        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
4907        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
4908      }
4909
4910      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
4911      sqlite3_free(zOut);
4912      return;
4913    }
4914  }
4915
4916  sqlite3_result_value(context, argv[0]);
4917}
4918
4919/* Flags for open_db().
4920**
4921** The default behavior of open_db() is to exit(1) if the database fails to
4922** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
4923** but still returns without calling exit.
4924**
4925** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
4926** ZIP archive if the file does not exist or is empty and its name matches
4927** the *.zip pattern.
4928*/
4929#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
4930#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
4931
4932/*
4933** Make sure the database is open.  If it is not, then open it.  If
4934** the database fails to open, print an error message and exit.
4935*/
4936static void open_db(ShellState *p, int openFlags){
4937  if( p->db==0 ){
4938    const char *zDbFilename = p->pAuxDb->zDbFilename;
4939    if( p->openMode==SHELL_OPEN_UNSPEC ){
4940      if( zDbFilename==0 || zDbFilename[0]==0 ){
4941        p->openMode = SHELL_OPEN_NORMAL;
4942      }else{
4943        p->openMode = (u8)deduceDatabaseType(zDbFilename,
4944                             (openFlags & OPEN_DB_ZIPFILE)!=0);
4945      }
4946    }
4947    switch( p->openMode ){
4948      case SHELL_OPEN_APPENDVFS: {
4949        sqlite3_open_v2(zDbFilename, &p->db,
4950           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
4951        break;
4952      }
4953      case SHELL_OPEN_HEXDB:
4954      case SHELL_OPEN_DESERIALIZE: {
4955        sqlite3_open(0, &p->db);
4956        break;
4957      }
4958      case SHELL_OPEN_ZIPFILE: {
4959        sqlite3_open(":memory:", &p->db);
4960        break;
4961      }
4962      case SHELL_OPEN_READONLY: {
4963        sqlite3_open_v2(zDbFilename, &p->db,
4964            SQLITE_OPEN_READONLY|p->openFlags, 0);
4965        break;
4966      }
4967      case SHELL_OPEN_UNSPEC:
4968      case SHELL_OPEN_NORMAL: {
4969        sqlite3_open_v2(zDbFilename, &p->db,
4970           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
4971        break;
4972      }
4973    }
4974    globalDb = p->db;
4975    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4976      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4977          zDbFilename, sqlite3_errmsg(p->db));
4978      if( openFlags & OPEN_DB_KEEPALIVE ){
4979        sqlite3_open(":memory:", &p->db);
4980        return;
4981      }
4982      exit(1);
4983    }
4984#ifndef SQLITE_OMIT_LOAD_EXTENSION
4985    sqlite3_enable_load_extension(p->db, 1);
4986#endif
4987    sqlite3_fileio_init(p->db, 0, 0);
4988    sqlite3_shathree_init(p->db, 0, 0);
4989    sqlite3_completion_init(p->db, 0, 0);
4990    sqlite3_uint_init(p->db, 0, 0);
4991    sqlite3_decimal_init(p->db, 0, 0);
4992    sqlite3_regexp_init(p->db, 0, 0);
4993    sqlite3_ieee_init(p->db, 0, 0);
4994    sqlite3_series_init(p->db, 0, 0);
4995#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4996    sqlite3_dbdata_init(p->db, 0, 0);
4997#endif
4998#ifdef SQLITE_HAVE_ZLIB
4999    sqlite3_zipfile_init(p->db, 0, 0);
5000    sqlite3_sqlar_init(p->db, 0, 0);
5001#endif
5002    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
5003                            shellAddSchemaName, 0, 0);
5004    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
5005                            shellModuleSchema, 0, 0);
5006    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
5007                            shellPutsFunc, 0, 0);
5008    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
5009                            shellEscapeCrnl, 0, 0);
5010    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
5011                            shellInt32, 0, 0);
5012    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
5013                            shellIdQuote, 0, 0);
5014    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
5015                            shellUSleepFunc, 0, 0);
5016#ifndef SQLITE_NOHAVE_SYSTEM
5017    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
5018                            editFunc, 0, 0);
5019    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
5020                            editFunc, 0, 0);
5021#endif
5022    if( p->openMode==SHELL_OPEN_ZIPFILE ){
5023      char *zSql = sqlite3_mprintf(
5024         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
5025      shell_check_oom(zSql);
5026      sqlite3_exec(p->db, zSql, 0, 0, 0);
5027      sqlite3_free(zSql);
5028    }
5029#ifndef SQLITE_OMIT_DESERIALIZE
5030    else
5031    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
5032      int rc;
5033      int nData = 0;
5034      unsigned char *aData;
5035      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
5036        aData = (unsigned char*)readFile(zDbFilename, &nData);
5037      }else{
5038        aData = readHexDb(p, &nData);
5039        if( aData==0 ){
5040          return;
5041        }
5042      }
5043      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
5044                   SQLITE_DESERIALIZE_RESIZEABLE |
5045                   SQLITE_DESERIALIZE_FREEONCLOSE);
5046      if( rc ){
5047        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
5048      }
5049      if( p->szMax>0 ){
5050        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
5051      }
5052    }
5053#endif
5054  }
5055  if( p->bSafeModePersist && p->db!=0 ){
5056    sqlite3_set_authorizer(p->db, safeModeAuth, p);
5057  }
5058}
5059
5060/*
5061** Attempt to close the databaes connection.  Report errors.
5062*/
5063void close_db(sqlite3 *db){
5064  int rc = sqlite3_close(db);
5065  if( rc ){
5066    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
5067        rc, sqlite3_errmsg(db));
5068  }
5069}
5070
5071#if HAVE_READLINE || HAVE_EDITLINE
5072/*
5073** Readline completion callbacks
5074*/
5075static char *readline_completion_generator(const char *text, int state){
5076  static sqlite3_stmt *pStmt = 0;
5077  char *zRet;
5078  if( state==0 ){
5079    char *zSql;
5080    sqlite3_finalize(pStmt);
5081    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5082                           "  FROM completion(%Q) ORDER BY 1", text);
5083    shell_check_oom(zSql);
5084    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5085    sqlite3_free(zSql);
5086  }
5087  if( sqlite3_step(pStmt)==SQLITE_ROW ){
5088    const char *z = (const char*)sqlite3_column_text(pStmt,0);
5089    zRet = z ? strdup(z) : 0;
5090  }else{
5091    sqlite3_finalize(pStmt);
5092    pStmt = 0;
5093    zRet = 0;
5094  }
5095  return zRet;
5096}
5097static char **readline_completion(const char *zText, int iStart, int iEnd){
5098  rl_attempted_completion_over = 1;
5099  return rl_completion_matches(zText, readline_completion_generator);
5100}
5101
5102#elif HAVE_LINENOISE
5103/*
5104** Linenoise completion callback
5105*/
5106static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
5107  int nLine = strlen30(zLine);
5108  int i, iStart;
5109  sqlite3_stmt *pStmt = 0;
5110  char *zSql;
5111  char zBuf[1000];
5112
5113  if( nLine>sizeof(zBuf)-30 ) return;
5114  if( zLine[0]=='.' || zLine[0]=='#') return;
5115  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
5116  if( i==nLine-1 ) return;
5117  iStart = i+1;
5118  memcpy(zBuf, zLine, iStart);
5119  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5120                         "  FROM completion(%Q,%Q) ORDER BY 1",
5121                         &zLine[iStart], zLine);
5122  shell_check_oom(zSql);
5123  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5124  sqlite3_free(zSql);
5125  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
5126  while( sqlite3_step(pStmt)==SQLITE_ROW ){
5127    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
5128    int nCompletion = sqlite3_column_bytes(pStmt, 0);
5129    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
5130      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
5131      linenoiseAddCompletion(lc, zBuf);
5132    }
5133  }
5134  sqlite3_finalize(pStmt);
5135}
5136#endif
5137
5138/*
5139** Do C-language style dequoting.
5140**
5141**    \a    -> alarm
5142**    \b    -> backspace
5143**    \t    -> tab
5144**    \n    -> newline
5145**    \v    -> vertical tab
5146**    \f    -> form feed
5147**    \r    -> carriage return
5148**    \s    -> space
5149**    \"    -> "
5150**    \'    -> '
5151**    \\    -> backslash
5152**    \NNN  -> ascii character NNN in octal
5153*/
5154static void resolve_backslashes(char *z){
5155  int i, j;
5156  char c;
5157  while( *z && *z!='\\' ) z++;
5158  for(i=j=0; (c = z[i])!=0; i++, j++){
5159    if( c=='\\' && z[i+1]!=0 ){
5160      c = z[++i];
5161      if( c=='a' ){
5162        c = '\a';
5163      }else if( c=='b' ){
5164        c = '\b';
5165      }else if( c=='t' ){
5166        c = '\t';
5167      }else if( c=='n' ){
5168        c = '\n';
5169      }else if( c=='v' ){
5170        c = '\v';
5171      }else if( c=='f' ){
5172        c = '\f';
5173      }else if( c=='r' ){
5174        c = '\r';
5175      }else if( c=='"' ){
5176        c = '"';
5177      }else if( c=='\'' ){
5178        c = '\'';
5179      }else if( c=='\\' ){
5180        c = '\\';
5181      }else if( c>='0' && c<='7' ){
5182        c -= '0';
5183        if( z[i+1]>='0' && z[i+1]<='7' ){
5184          i++;
5185          c = (c<<3) + z[i] - '0';
5186          if( z[i+1]>='0' && z[i+1]<='7' ){
5187            i++;
5188            c = (c<<3) + z[i] - '0';
5189          }
5190        }
5191      }
5192    }
5193    z[j] = c;
5194  }
5195  if( j<i ) z[j] = 0;
5196}
5197
5198/*
5199** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
5200** for TRUE and FALSE.  Return the integer value if appropriate.
5201*/
5202static int booleanValue(const char *zArg){
5203  int i;
5204  if( zArg[0]=='0' && zArg[1]=='x' ){
5205    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
5206  }else{
5207    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
5208  }
5209  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
5210  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
5211    return 1;
5212  }
5213  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
5214    return 0;
5215  }
5216  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
5217          zArg);
5218  return 0;
5219}
5220
5221/*
5222** Set or clear a shell flag according to a boolean value.
5223*/
5224static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
5225  if( booleanValue(zArg) ){
5226    ShellSetFlag(p, mFlag);
5227  }else{
5228    ShellClearFlag(p, mFlag);
5229  }
5230}
5231
5232/*
5233** Close an output file, assuming it is not stderr or stdout
5234*/
5235static void output_file_close(FILE *f){
5236  if( f && f!=stdout && f!=stderr ) fclose(f);
5237}
5238
5239/*
5240** Try to open an output file.   The names "stdout" and "stderr" are
5241** recognized and do the right thing.  NULL is returned if the output
5242** filename is "off".
5243*/
5244static FILE *output_file_open(const char *zFile, int bTextMode){
5245  FILE *f;
5246  if( strcmp(zFile,"stdout")==0 ){
5247    f = stdout;
5248  }else if( strcmp(zFile, "stderr")==0 ){
5249    f = stderr;
5250  }else if( strcmp(zFile, "off")==0 ){
5251    f = 0;
5252  }else{
5253    f = fopen(zFile, bTextMode ? "w" : "wb");
5254    if( f==0 ){
5255      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5256    }
5257  }
5258  return f;
5259}
5260
5261#ifndef SQLITE_OMIT_TRACE
5262/*
5263** A routine for handling output from sqlite3_trace().
5264*/
5265static int sql_trace_callback(
5266  unsigned mType,         /* The trace type */
5267  void *pArg,             /* The ShellState pointer */
5268  void *pP,               /* Usually a pointer to sqlite_stmt */
5269  void *pX                /* Auxiliary output */
5270){
5271  ShellState *p = (ShellState*)pArg;
5272  sqlite3_stmt *pStmt;
5273  const char *zSql;
5274  int nSql;
5275  if( p->traceOut==0 ) return 0;
5276  if( mType==SQLITE_TRACE_CLOSE ){
5277    utf8_printf(p->traceOut, "-- closing database connection\n");
5278    return 0;
5279  }
5280  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5281    zSql = (const char*)pX;
5282  }else{
5283    pStmt = (sqlite3_stmt*)pP;
5284    switch( p->eTraceType ){
5285      case SHELL_TRACE_EXPANDED: {
5286        zSql = sqlite3_expanded_sql(pStmt);
5287        break;
5288      }
5289#ifdef SQLITE_ENABLE_NORMALIZE
5290      case SHELL_TRACE_NORMALIZED: {
5291        zSql = sqlite3_normalized_sql(pStmt);
5292        break;
5293      }
5294#endif
5295      default: {
5296        zSql = sqlite3_sql(pStmt);
5297        break;
5298      }
5299    }
5300  }
5301  if( zSql==0 ) return 0;
5302  nSql = strlen30(zSql);
5303  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5304  switch( mType ){
5305    case SQLITE_TRACE_ROW:
5306    case SQLITE_TRACE_STMT: {
5307      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5308      break;
5309    }
5310    case SQLITE_TRACE_PROFILE: {
5311      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5312      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5313      break;
5314    }
5315  }
5316  return 0;
5317}
5318#endif
5319
5320/*
5321** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5322** a useful spot to set a debugger breakpoint.
5323*/
5324static void test_breakpoint(void){
5325  static int nCall = 0;
5326  nCall++;
5327}
5328
5329/*
5330** An object used to read a CSV and other files for import.
5331*/
5332typedef struct ImportCtx ImportCtx;
5333struct ImportCtx {
5334  const char *zFile;  /* Name of the input file */
5335  FILE *in;           /* Read the CSV text from this input stream */
5336  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5337  char *z;            /* Accumulated text for a field */
5338  int n;              /* Number of bytes in z */
5339  int nAlloc;         /* Space allocated for z[] */
5340  int nLine;          /* Current line number */
5341  int nRow;           /* Number of rows imported */
5342  int nErr;           /* Number of errors encountered */
5343  int bNotFirst;      /* True if one or more bytes already read */
5344  int cTerm;          /* Character that terminated the most recent field */
5345  int cColSep;        /* The column separator character.  (Usually ",") */
5346  int cRowSep;        /* The row separator character.  (Usually "\n") */
5347};
5348
5349/* Clean up resourced used by an ImportCtx */
5350static void import_cleanup(ImportCtx *p){
5351  if( p->in!=0 && p->xCloser!=0 ){
5352    p->xCloser(p->in);
5353    p->in = 0;
5354  }
5355  sqlite3_free(p->z);
5356  p->z = 0;
5357}
5358
5359/* Append a single byte to z[] */
5360static void import_append_char(ImportCtx *p, int c){
5361  if( p->n+1>=p->nAlloc ){
5362    p->nAlloc += p->nAlloc + 100;
5363    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5364    shell_check_oom(p->z);
5365  }
5366  p->z[p->n++] = (char)c;
5367}
5368
5369/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5370** with the option of having a separator other than ",".
5371**
5372**   +  Input comes from p->in.
5373**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5374**      from sqlite3_malloc64().
5375**   +  Use p->cSep as the column separator.  The default is ",".
5376**   +  Use p->rSep as the row separator.  The default is "\n".
5377**   +  Keep track of the line number in p->nLine.
5378**   +  Store the character that terminates the field in p->cTerm.  Store
5379**      EOF on end-of-file.
5380**   +  Report syntax errors on stderr
5381*/
5382static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5383  int c;
5384  int cSep = p->cColSep;
5385  int rSep = p->cRowSep;
5386  p->n = 0;
5387  c = fgetc(p->in);
5388  if( c==EOF || seenInterrupt ){
5389    p->cTerm = EOF;
5390    return 0;
5391  }
5392  if( c=='"' ){
5393    int pc, ppc;
5394    int startLine = p->nLine;
5395    int cQuote = c;
5396    pc = ppc = 0;
5397    while( 1 ){
5398      c = fgetc(p->in);
5399      if( c==rSep ) p->nLine++;
5400      if( c==cQuote ){
5401        if( pc==cQuote ){
5402          pc = 0;
5403          continue;
5404        }
5405      }
5406      if( (c==cSep && pc==cQuote)
5407       || (c==rSep && pc==cQuote)
5408       || (c==rSep && pc=='\r' && ppc==cQuote)
5409       || (c==EOF && pc==cQuote)
5410      ){
5411        do{ p->n--; }while( p->z[p->n]!=cQuote );
5412        p->cTerm = c;
5413        break;
5414      }
5415      if( pc==cQuote && c!='\r' ){
5416        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5417                p->zFile, p->nLine, cQuote);
5418      }
5419      if( c==EOF ){
5420        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5421                p->zFile, startLine, cQuote);
5422        p->cTerm = c;
5423        break;
5424      }
5425      import_append_char(p, c);
5426      ppc = pc;
5427      pc = c;
5428    }
5429  }else{
5430    /* If this is the first field being parsed and it begins with the
5431    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5432    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5433      import_append_char(p, c);
5434      c = fgetc(p->in);
5435      if( (c&0xff)==0xbb ){
5436        import_append_char(p, c);
5437        c = fgetc(p->in);
5438        if( (c&0xff)==0xbf ){
5439          p->bNotFirst = 1;
5440          p->n = 0;
5441          return csv_read_one_field(p);
5442        }
5443      }
5444    }
5445    while( c!=EOF && c!=cSep && c!=rSep ){
5446      import_append_char(p, c);
5447      c = fgetc(p->in);
5448    }
5449    if( c==rSep ){
5450      p->nLine++;
5451      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5452    }
5453    p->cTerm = c;
5454  }
5455  if( p->z ) p->z[p->n] = 0;
5456  p->bNotFirst = 1;
5457  return p->z;
5458}
5459
5460/* Read a single field of ASCII delimited text.
5461**
5462**   +  Input comes from p->in.
5463**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5464**      from sqlite3_malloc64().
5465**   +  Use p->cSep as the column separator.  The default is "\x1F".
5466**   +  Use p->rSep as the row separator.  The default is "\x1E".
5467**   +  Keep track of the row number in p->nLine.
5468**   +  Store the character that terminates the field in p->cTerm.  Store
5469**      EOF on end-of-file.
5470**   +  Report syntax errors on stderr
5471*/
5472static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5473  int c;
5474  int cSep = p->cColSep;
5475  int rSep = p->cRowSep;
5476  p->n = 0;
5477  c = fgetc(p->in);
5478  if( c==EOF || seenInterrupt ){
5479    p->cTerm = EOF;
5480    return 0;
5481  }
5482  while( c!=EOF && c!=cSep && c!=rSep ){
5483    import_append_char(p, c);
5484    c = fgetc(p->in);
5485  }
5486  if( c==rSep ){
5487    p->nLine++;
5488  }
5489  p->cTerm = c;
5490  if( p->z ) p->z[p->n] = 0;
5491  return p->z;
5492}
5493
5494/*
5495** Try to transfer data for table zTable.  If an error is seen while
5496** moving forward, try to go backwards.  The backwards movement won't
5497** work for WITHOUT ROWID tables.
5498*/
5499static void tryToCloneData(
5500  ShellState *p,
5501  sqlite3 *newDb,
5502  const char *zTable
5503){
5504  sqlite3_stmt *pQuery = 0;
5505  sqlite3_stmt *pInsert = 0;
5506  char *zQuery = 0;
5507  char *zInsert = 0;
5508  int rc;
5509  int i, j, n;
5510  int nTable = strlen30(zTable);
5511  int k = 0;
5512  int cnt = 0;
5513  const int spinRate = 10000;
5514
5515  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5516  shell_check_oom(zQuery);
5517  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5518  if( rc ){
5519    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5520            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5521            zQuery);
5522    goto end_data_xfer;
5523  }
5524  n = sqlite3_column_count(pQuery);
5525  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5526  shell_check_oom(zInsert);
5527  sqlite3_snprintf(200+nTable,zInsert,
5528                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5529  i = strlen30(zInsert);
5530  for(j=1; j<n; j++){
5531    memcpy(zInsert+i, ",?", 2);
5532    i += 2;
5533  }
5534  memcpy(zInsert+i, ");", 3);
5535  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5536  if( rc ){
5537    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5538            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5539            zQuery);
5540    goto end_data_xfer;
5541  }
5542  for(k=0; k<2; k++){
5543    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5544      for(i=0; i<n; i++){
5545        switch( sqlite3_column_type(pQuery, i) ){
5546          case SQLITE_NULL: {
5547            sqlite3_bind_null(pInsert, i+1);
5548            break;
5549          }
5550          case SQLITE_INTEGER: {
5551            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5552            break;
5553          }
5554          case SQLITE_FLOAT: {
5555            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5556            break;
5557          }
5558          case SQLITE_TEXT: {
5559            sqlite3_bind_text(pInsert, i+1,
5560                             (const char*)sqlite3_column_text(pQuery,i),
5561                             -1, SQLITE_STATIC);
5562            break;
5563          }
5564          case SQLITE_BLOB: {
5565            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5566                                            sqlite3_column_bytes(pQuery,i),
5567                                            SQLITE_STATIC);
5568            break;
5569          }
5570        }
5571      } /* End for */
5572      rc = sqlite3_step(pInsert);
5573      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5574        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5575                        sqlite3_errmsg(newDb));
5576      }
5577      sqlite3_reset(pInsert);
5578      cnt++;
5579      if( (cnt%spinRate)==0 ){
5580        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5581        fflush(stdout);
5582      }
5583    } /* End while */
5584    if( rc==SQLITE_DONE ) break;
5585    sqlite3_finalize(pQuery);
5586    sqlite3_free(zQuery);
5587    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5588                             zTable);
5589    shell_check_oom(zQuery);
5590    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5591    if( rc ){
5592      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5593      break;
5594    }
5595  } /* End for(k=0...) */
5596
5597end_data_xfer:
5598  sqlite3_finalize(pQuery);
5599  sqlite3_finalize(pInsert);
5600  sqlite3_free(zQuery);
5601  sqlite3_free(zInsert);
5602}
5603
5604
5605/*
5606** Try to transfer all rows of the schema that match zWhere.  For
5607** each row, invoke xForEach() on the object defined by that row.
5608** If an error is encountered while moving forward through the
5609** sqlite_schema table, try again moving backwards.
5610*/
5611static void tryToCloneSchema(
5612  ShellState *p,
5613  sqlite3 *newDb,
5614  const char *zWhere,
5615  void (*xForEach)(ShellState*,sqlite3*,const char*)
5616){
5617  sqlite3_stmt *pQuery = 0;
5618  char *zQuery = 0;
5619  int rc;
5620  const unsigned char *zName;
5621  const unsigned char *zSql;
5622  char *zErrMsg = 0;
5623
5624  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5625                           " WHERE %s", zWhere);
5626  shell_check_oom(zQuery);
5627  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5628  if( rc ){
5629    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5630                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5631                    zQuery);
5632    goto end_schema_xfer;
5633  }
5634  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5635    zName = sqlite3_column_text(pQuery, 0);
5636    zSql = sqlite3_column_text(pQuery, 1);
5637    if( zName==0 || zSql==0 ) continue;
5638    printf("%s... ", zName); fflush(stdout);
5639    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5640    if( zErrMsg ){
5641      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5642      sqlite3_free(zErrMsg);
5643      zErrMsg = 0;
5644    }
5645    if( xForEach ){
5646      xForEach(p, newDb, (const char*)zName);
5647    }
5648    printf("done\n");
5649  }
5650  if( rc!=SQLITE_DONE ){
5651    sqlite3_finalize(pQuery);
5652    sqlite3_free(zQuery);
5653    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5654                             " WHERE %s ORDER BY rowid DESC", zWhere);
5655    shell_check_oom(zQuery);
5656    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5657    if( rc ){
5658      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5659                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5660                      zQuery);
5661      goto end_schema_xfer;
5662    }
5663    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5664      zName = sqlite3_column_text(pQuery, 0);
5665      zSql = sqlite3_column_text(pQuery, 1);
5666      if( zName==0 || zSql==0 ) continue;
5667      printf("%s... ", zName); fflush(stdout);
5668      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5669      if( zErrMsg ){
5670        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5671        sqlite3_free(zErrMsg);
5672        zErrMsg = 0;
5673      }
5674      if( xForEach ){
5675        xForEach(p, newDb, (const char*)zName);
5676      }
5677      printf("done\n");
5678    }
5679  }
5680end_schema_xfer:
5681  sqlite3_finalize(pQuery);
5682  sqlite3_free(zQuery);
5683}
5684
5685/*
5686** Open a new database file named "zNewDb".  Try to recover as much information
5687** as possible out of the main database (which might be corrupt) and write it
5688** into zNewDb.
5689*/
5690static void tryToClone(ShellState *p, const char *zNewDb){
5691  int rc;
5692  sqlite3 *newDb = 0;
5693  if( access(zNewDb,0)==0 ){
5694    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5695    return;
5696  }
5697  rc = sqlite3_open(zNewDb, &newDb);
5698  if( rc ){
5699    utf8_printf(stderr, "Cannot create output database: %s\n",
5700            sqlite3_errmsg(newDb));
5701  }else{
5702    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5703    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5704    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5705    tryToCloneSchema(p, newDb, "type!='table'", 0);
5706    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5707    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5708  }
5709  close_db(newDb);
5710}
5711
5712/*
5713** Change the output file back to stdout.
5714**
5715** If the p->doXdgOpen flag is set, that means the output was being
5716** redirected to a temporary file named by p->zTempFile.  In that case,
5717** launch start/open/xdg-open on that temporary file.
5718*/
5719static void output_reset(ShellState *p){
5720  if( p->outfile[0]=='|' ){
5721#ifndef SQLITE_OMIT_POPEN
5722    pclose(p->out);
5723#endif
5724  }else{
5725    output_file_close(p->out);
5726#ifndef SQLITE_NOHAVE_SYSTEM
5727    if( p->doXdgOpen ){
5728      const char *zXdgOpenCmd =
5729#if defined(_WIN32)
5730      "start";
5731#elif defined(__APPLE__)
5732      "open";
5733#else
5734      "xdg-open";
5735#endif
5736      char *zCmd;
5737      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5738      if( system(zCmd) ){
5739        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5740      }else{
5741        /* Give the start/open/xdg-open command some time to get
5742        ** going before we continue, and potential delete the
5743        ** p->zTempFile data file out from under it */
5744        sqlite3_sleep(2000);
5745      }
5746      sqlite3_free(zCmd);
5747      outputModePop(p);
5748      p->doXdgOpen = 0;
5749    }
5750#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5751  }
5752  p->outfile[0] = 0;
5753  p->out = stdout;
5754}
5755
5756/*
5757** Run an SQL command and return the single integer result.
5758*/
5759static int db_int(sqlite3 *db, const char *zSql){
5760  sqlite3_stmt *pStmt;
5761  int res = 0;
5762  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
5763  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5764    res = sqlite3_column_int(pStmt,0);
5765  }
5766  sqlite3_finalize(pStmt);
5767  return res;
5768}
5769
5770/*
5771** Convert a 2-byte or 4-byte big-endian integer into a native integer
5772*/
5773static unsigned int get2byteInt(unsigned char *a){
5774  return (a[0]<<8) + a[1];
5775}
5776static unsigned int get4byteInt(unsigned char *a){
5777  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5778}
5779
5780/*
5781** Implementation of the ".dbinfo" command.
5782**
5783** Return 1 on error, 2 to exit, and 0 otherwise.
5784*/
5785static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5786  static const struct { const char *zName; int ofst; } aField[] = {
5787     { "file change counter:",  24  },
5788     { "database page count:",  28  },
5789     { "freelist page count:",  36  },
5790     { "schema cookie:",        40  },
5791     { "schema format:",        44  },
5792     { "default cache size:",   48  },
5793     { "autovacuum top root:",  52  },
5794     { "incremental vacuum:",   64  },
5795     { "text encoding:",        56  },
5796     { "user version:",         60  },
5797     { "application id:",       68  },
5798     { "software version:",     96  },
5799  };
5800  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5801     { "number of tables:",
5802       "SELECT count(*) FROM %s WHERE type='table'" },
5803     { "number of indexes:",
5804       "SELECT count(*) FROM %s WHERE type='index'" },
5805     { "number of triggers:",
5806       "SELECT count(*) FROM %s WHERE type='trigger'" },
5807     { "number of views:",
5808       "SELECT count(*) FROM %s WHERE type='view'" },
5809     { "schema size:",
5810       "SELECT total(length(sql)) FROM %s" },
5811  };
5812  int i, rc;
5813  unsigned iDataVersion;
5814  char *zSchemaTab;
5815  char *zDb = nArg>=2 ? azArg[1] : "main";
5816  sqlite3_stmt *pStmt = 0;
5817  unsigned char aHdr[100];
5818  open_db(p, 0);
5819  if( p->db==0 ) return 1;
5820  rc = sqlite3_prepare_v2(p->db,
5821             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5822             -1, &pStmt, 0);
5823  if( rc ){
5824    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5825    sqlite3_finalize(pStmt);
5826    return 1;
5827  }
5828  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5829  if( sqlite3_step(pStmt)==SQLITE_ROW
5830   && sqlite3_column_bytes(pStmt,0)>100
5831  ){
5832    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5833    sqlite3_finalize(pStmt);
5834  }else{
5835    raw_printf(stderr, "unable to read database header\n");
5836    sqlite3_finalize(pStmt);
5837    return 1;
5838  }
5839  i = get2byteInt(aHdr+16);
5840  if( i==1 ) i = 65536;
5841  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5842  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5843  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5844  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5845  for(i=0; i<ArraySize(aField); i++){
5846    int ofst = aField[i].ofst;
5847    unsigned int val = get4byteInt(aHdr + ofst);
5848    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5849    switch( ofst ){
5850      case 56: {
5851        if( val==1 ) raw_printf(p->out, " (utf8)");
5852        if( val==2 ) raw_printf(p->out, " (utf16le)");
5853        if( val==3 ) raw_printf(p->out, " (utf16be)");
5854      }
5855    }
5856    raw_printf(p->out, "\n");
5857  }
5858  if( zDb==0 ){
5859    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5860  }else if( strcmp(zDb,"temp")==0 ){
5861    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5862  }else{
5863    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5864  }
5865  for(i=0; i<ArraySize(aQuery); i++){
5866    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5867    int val = db_int(p->db, zSql);
5868    sqlite3_free(zSql);
5869    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5870  }
5871  sqlite3_free(zSchemaTab);
5872  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5873  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5874  return 0;
5875}
5876
5877/*
5878** Print the current sqlite3_errmsg() value to stderr and return 1.
5879*/
5880static int shellDatabaseError(sqlite3 *db){
5881  const char *zErr = sqlite3_errmsg(db);
5882  utf8_printf(stderr, "Error: %s\n", zErr);
5883  return 1;
5884}
5885
5886/*
5887** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
5888** if they match and FALSE (0) if they do not match.
5889**
5890** Globbing rules:
5891**
5892**      '*'       Matches any sequence of zero or more characters.
5893**
5894**      '?'       Matches exactly one character.
5895**
5896**     [...]      Matches one character from the enclosed list of
5897**                characters.
5898**
5899**     [^...]     Matches one character not in the enclosed list.
5900**
5901**      '#'       Matches any sequence of one or more digits with an
5902**                optional + or - sign in front
5903**
5904**      ' '       Any span of whitespace matches any other span of
5905**                whitespace.
5906**
5907** Extra whitespace at the end of z[] is ignored.
5908*/
5909static int testcase_glob(const char *zGlob, const char *z){
5910  int c, c2;
5911  int invert;
5912  int seen;
5913
5914  while( (c = (*(zGlob++)))!=0 ){
5915    if( IsSpace(c) ){
5916      if( !IsSpace(*z) ) return 0;
5917      while( IsSpace(*zGlob) ) zGlob++;
5918      while( IsSpace(*z) ) z++;
5919    }else if( c=='*' ){
5920      while( (c=(*(zGlob++))) == '*' || c=='?' ){
5921        if( c=='?' && (*(z++))==0 ) return 0;
5922      }
5923      if( c==0 ){
5924        return 1;
5925      }else if( c=='[' ){
5926        while( *z && testcase_glob(zGlob-1,z)==0 ){
5927          z++;
5928        }
5929        return (*z)!=0;
5930      }
5931      while( (c2 = (*(z++)))!=0 ){
5932        while( c2!=c ){
5933          c2 = *(z++);
5934          if( c2==0 ) return 0;
5935        }
5936        if( testcase_glob(zGlob,z) ) return 1;
5937      }
5938      return 0;
5939    }else if( c=='?' ){
5940      if( (*(z++))==0 ) return 0;
5941    }else if( c=='[' ){
5942      int prior_c = 0;
5943      seen = 0;
5944      invert = 0;
5945      c = *(z++);
5946      if( c==0 ) return 0;
5947      c2 = *(zGlob++);
5948      if( c2=='^' ){
5949        invert = 1;
5950        c2 = *(zGlob++);
5951      }
5952      if( c2==']' ){
5953        if( c==']' ) seen = 1;
5954        c2 = *(zGlob++);
5955      }
5956      while( c2 && c2!=']' ){
5957        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5958          c2 = *(zGlob++);
5959          if( c>=prior_c && c<=c2 ) seen = 1;
5960          prior_c = 0;
5961        }else{
5962          if( c==c2 ){
5963            seen = 1;
5964          }
5965          prior_c = c2;
5966        }
5967        c2 = *(zGlob++);
5968      }
5969      if( c2==0 || (seen ^ invert)==0 ) return 0;
5970    }else if( c=='#' ){
5971      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5972      if( !IsDigit(z[0]) ) return 0;
5973      z++;
5974      while( IsDigit(z[0]) ){ z++; }
5975    }else{
5976      if( c!=(*(z++)) ) return 0;
5977    }
5978  }
5979  while( IsSpace(*z) ){ z++; }
5980  return *z==0;
5981}
5982
5983
5984/*
5985** Compare the string as a command-line option with either one or two
5986** initial "-" characters.
5987*/
5988static int optionMatch(const char *zStr, const char *zOpt){
5989  if( zStr[0]!='-' ) return 0;
5990  zStr++;
5991  if( zStr[0]=='-' ) zStr++;
5992  return strcmp(zStr, zOpt)==0;
5993}
5994
5995/*
5996** Delete a file.
5997*/
5998int shellDeleteFile(const char *zFilename){
5999  int rc;
6000#ifdef _WIN32
6001  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
6002  rc = _wunlink(z);
6003  sqlite3_free(z);
6004#else
6005  rc = unlink(zFilename);
6006#endif
6007  return rc;
6008}
6009
6010/*
6011** Try to delete the temporary file (if there is one) and free the
6012** memory used to hold the name of the temp file.
6013*/
6014static void clearTempFile(ShellState *p){
6015  if( p->zTempFile==0 ) return;
6016  if( p->doXdgOpen ) return;
6017  if( shellDeleteFile(p->zTempFile) ) return;
6018  sqlite3_free(p->zTempFile);
6019  p->zTempFile = 0;
6020}
6021
6022/*
6023** Create a new temp file name with the given suffix.
6024*/
6025static void newTempFile(ShellState *p, const char *zSuffix){
6026  clearTempFile(p);
6027  sqlite3_free(p->zTempFile);
6028  p->zTempFile = 0;
6029  if( p->db ){
6030    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
6031  }
6032  if( p->zTempFile==0 ){
6033    /* If p->db is an in-memory database then the TEMPFILENAME file-control
6034    ** will not work and we will need to fallback to guessing */
6035    char *zTemp;
6036    sqlite3_uint64 r;
6037    sqlite3_randomness(sizeof(r), &r);
6038    zTemp = getenv("TEMP");
6039    if( zTemp==0 ) zTemp = getenv("TMP");
6040    if( zTemp==0 ){
6041#ifdef _WIN32
6042      zTemp = "\\tmp";
6043#else
6044      zTemp = "/tmp";
6045#endif
6046    }
6047    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
6048  }else{
6049    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
6050  }
6051  shell_check_oom(p->zTempFile);
6052}
6053
6054
6055/*
6056** The implementation of SQL scalar function fkey_collate_clause(), used
6057** by the ".lint fkey-indexes" command. This scalar function is always
6058** called with four arguments - the parent table name, the parent column name,
6059** the child table name and the child column name.
6060**
6061**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
6062**
6063** If either of the named tables or columns do not exist, this function
6064** returns an empty string. An empty string is also returned if both tables
6065** and columns exist but have the same default collation sequence. Or,
6066** if both exist but the default collation sequences are different, this
6067** function returns the string " COLLATE <parent-collation>", where
6068** <parent-collation> is the default collation sequence of the parent column.
6069*/
6070static void shellFkeyCollateClause(
6071  sqlite3_context *pCtx,
6072  int nVal,
6073  sqlite3_value **apVal
6074){
6075  sqlite3 *db = sqlite3_context_db_handle(pCtx);
6076  const char *zParent;
6077  const char *zParentCol;
6078  const char *zParentSeq;
6079  const char *zChild;
6080  const char *zChildCol;
6081  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
6082  int rc;
6083
6084  assert( nVal==4 );
6085  zParent = (const char*)sqlite3_value_text(apVal[0]);
6086  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
6087  zChild = (const char*)sqlite3_value_text(apVal[2]);
6088  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
6089
6090  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
6091  rc = sqlite3_table_column_metadata(
6092      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
6093  );
6094  if( rc==SQLITE_OK ){
6095    rc = sqlite3_table_column_metadata(
6096        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
6097    );
6098  }
6099
6100  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
6101    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
6102    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
6103    sqlite3_free(z);
6104  }
6105}
6106
6107
6108/*
6109** The implementation of dot-command ".lint fkey-indexes".
6110*/
6111static int lintFkeyIndexes(
6112  ShellState *pState,             /* Current shell tool state */
6113  char **azArg,                   /* Array of arguments passed to dot command */
6114  int nArg                        /* Number of entries in azArg[] */
6115){
6116  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
6117  FILE *out = pState->out;        /* Stream to write non-error output to */
6118  int bVerbose = 0;               /* If -verbose is present */
6119  int bGroupByParent = 0;         /* If -groupbyparent is present */
6120  int i;                          /* To iterate through azArg[] */
6121  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
6122  int rc;                         /* Return code */
6123  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
6124
6125  /*
6126  ** This SELECT statement returns one row for each foreign key constraint
6127  ** in the schema of the main database. The column values are:
6128  **
6129  ** 0. The text of an SQL statement similar to:
6130  **
6131  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
6132  **
6133  **    This SELECT is similar to the one that the foreign keys implementation
6134  **    needs to run internally on child tables. If there is an index that can
6135  **    be used to optimize this query, then it can also be used by the FK
6136  **    implementation to optimize DELETE or UPDATE statements on the parent
6137  **    table.
6138  **
6139  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
6140  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
6141  **    contains an index that can be used to optimize the query.
6142  **
6143  ** 2. Human readable text that describes the child table and columns. e.g.
6144  **
6145  **       "child_table(child_key1, child_key2)"
6146  **
6147  ** 3. Human readable text that describes the parent table and columns. e.g.
6148  **
6149  **       "parent_table(parent_key1, parent_key2)"
6150  **
6151  ** 4. A full CREATE INDEX statement for an index that could be used to
6152  **    optimize DELETE or UPDATE statements on the parent table. e.g.
6153  **
6154  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
6155  **
6156  ** 5. The name of the parent table.
6157  **
6158  ** These six values are used by the C logic below to generate the report.
6159  */
6160  const char *zSql =
6161  "SELECT "
6162    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
6163    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
6164    "  || fkey_collate_clause("
6165    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
6166    ", "
6167    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
6168    "  || group_concat('*=?', ' AND ') || ')'"
6169    ", "
6170    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
6171    ", "
6172    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
6173    ", "
6174    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
6175    "  || ' ON ' || quote(s.name) || '('"
6176    "  || group_concat(quote(f.[from]) ||"
6177    "        fkey_collate_clause("
6178    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
6179    "  || ');'"
6180    ", "
6181    "     f.[table] "
6182    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
6183    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
6184    "GROUP BY s.name, f.id "
6185    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
6186  ;
6187  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
6188
6189  for(i=2; i<nArg; i++){
6190    int n = strlen30(azArg[i]);
6191    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
6192      bVerbose = 1;
6193    }
6194    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
6195      bGroupByParent = 1;
6196      zIndent = "    ";
6197    }
6198    else{
6199      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
6200          azArg[0], azArg[1]
6201      );
6202      return SQLITE_ERROR;
6203    }
6204  }
6205
6206  /* Register the fkey_collate_clause() SQL function */
6207  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
6208      0, shellFkeyCollateClause, 0, 0
6209  );
6210
6211
6212  if( rc==SQLITE_OK ){
6213    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
6214  }
6215  if( rc==SQLITE_OK ){
6216    sqlite3_bind_int(pSql, 1, bGroupByParent);
6217  }
6218
6219  if( rc==SQLITE_OK ){
6220    int rc2;
6221    char *zPrev = 0;
6222    while( SQLITE_ROW==sqlite3_step(pSql) ){
6223      int res = -1;
6224      sqlite3_stmt *pExplain = 0;
6225      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
6226      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
6227      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
6228      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
6229      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
6230      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
6231
6232      if( zEQP==0 ) continue;
6233      if( zGlob==0 ) continue;
6234      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6235      if( rc!=SQLITE_OK ) break;
6236      if( SQLITE_ROW==sqlite3_step(pExplain) ){
6237        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6238        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
6239                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
6240      }
6241      rc = sqlite3_finalize(pExplain);
6242      if( rc!=SQLITE_OK ) break;
6243
6244      if( res<0 ){
6245        raw_printf(stderr, "Error: internal error");
6246        break;
6247      }else{
6248        if( bGroupByParent
6249        && (bVerbose || res==0)
6250        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6251        ){
6252          raw_printf(out, "-- Parent table %s\n", zParent);
6253          sqlite3_free(zPrev);
6254          zPrev = sqlite3_mprintf("%s", zParent);
6255        }
6256
6257        if( res==0 ){
6258          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6259        }else if( bVerbose ){
6260          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6261              zIndent, zFrom, zTarget
6262          );
6263        }
6264      }
6265    }
6266    sqlite3_free(zPrev);
6267
6268    if( rc!=SQLITE_OK ){
6269      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6270    }
6271
6272    rc2 = sqlite3_finalize(pSql);
6273    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6274      rc = rc2;
6275      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6276    }
6277  }else{
6278    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6279  }
6280
6281  return rc;
6282}
6283
6284/*
6285** Implementation of ".lint" dot command.
6286*/
6287static int lintDotCommand(
6288  ShellState *pState,             /* Current shell tool state */
6289  char **azArg,                   /* Array of arguments passed to dot command */
6290  int nArg                        /* Number of entries in azArg[] */
6291){
6292  int n;
6293  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6294  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6295  return lintFkeyIndexes(pState, azArg, nArg);
6296
6297 usage:
6298  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6299  raw_printf(stderr, "Where sub-commands are:\n");
6300  raw_printf(stderr, "    fkey-indexes\n");
6301  return SQLITE_ERROR;
6302}
6303
6304#if !defined SQLITE_OMIT_VIRTUALTABLE
6305static void shellPrepare(
6306  sqlite3 *db,
6307  int *pRc,
6308  const char *zSql,
6309  sqlite3_stmt **ppStmt
6310){
6311  *ppStmt = 0;
6312  if( *pRc==SQLITE_OK ){
6313    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6314    if( rc!=SQLITE_OK ){
6315      raw_printf(stderr, "sql error: %s (%d)\n",
6316          sqlite3_errmsg(db), sqlite3_errcode(db)
6317      );
6318      *pRc = rc;
6319    }
6320  }
6321}
6322
6323/*
6324** Create a prepared statement using printf-style arguments for the SQL.
6325**
6326** This routine is could be marked "static".  But it is not always used,
6327** depending on compile-time options.  By omitting the "static", we avoid
6328** nuisance compiler warnings about "defined but not used".
6329*/
6330void shellPreparePrintf(
6331  sqlite3 *db,
6332  int *pRc,
6333  sqlite3_stmt **ppStmt,
6334  const char *zFmt,
6335  ...
6336){
6337  *ppStmt = 0;
6338  if( *pRc==SQLITE_OK ){
6339    va_list ap;
6340    char *z;
6341    va_start(ap, zFmt);
6342    z = sqlite3_vmprintf(zFmt, ap);
6343    va_end(ap);
6344    if( z==0 ){
6345      *pRc = SQLITE_NOMEM;
6346    }else{
6347      shellPrepare(db, pRc, z, ppStmt);
6348      sqlite3_free(z);
6349    }
6350  }
6351}
6352
6353/* Finalize the prepared statement created using shellPreparePrintf().
6354**
6355** This routine is could be marked "static".  But it is not always used,
6356** depending on compile-time options.  By omitting the "static", we avoid
6357** nuisance compiler warnings about "defined but not used".
6358*/
6359void shellFinalize(
6360  int *pRc,
6361  sqlite3_stmt *pStmt
6362){
6363  if( pStmt ){
6364    sqlite3 *db = sqlite3_db_handle(pStmt);
6365    int rc = sqlite3_finalize(pStmt);
6366    if( *pRc==SQLITE_OK ){
6367      if( rc!=SQLITE_OK ){
6368        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6369      }
6370      *pRc = rc;
6371    }
6372  }
6373}
6374
6375/* Reset the prepared statement created using shellPreparePrintf().
6376**
6377** This routine is could be marked "static".  But it is not always used,
6378** depending on compile-time options.  By omitting the "static", we avoid
6379** nuisance compiler warnings about "defined but not used".
6380*/
6381void shellReset(
6382  int *pRc,
6383  sqlite3_stmt *pStmt
6384){
6385  int rc = sqlite3_reset(pStmt);
6386  if( *pRc==SQLITE_OK ){
6387    if( rc!=SQLITE_OK ){
6388      sqlite3 *db = sqlite3_db_handle(pStmt);
6389      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6390    }
6391    *pRc = rc;
6392  }
6393}
6394#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6395
6396#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6397/******************************************************************************
6398** The ".archive" or ".ar" command.
6399*/
6400/*
6401** Structure representing a single ".ar" command.
6402*/
6403typedef struct ArCommand ArCommand;
6404struct ArCommand {
6405  u8 eCmd;                        /* An AR_CMD_* value */
6406  u8 bVerbose;                    /* True if --verbose */
6407  u8 bZip;                        /* True if the archive is a ZIP */
6408  u8 bDryRun;                     /* True if --dry-run */
6409  u8 bAppend;                     /* True if --append */
6410  u8 bGlob;                       /* True if --glob */
6411  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6412  int nArg;                       /* Number of command arguments */
6413  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6414  const char *zFile;              /* --file argument, or NULL */
6415  const char *zDir;               /* --directory argument, or NULL */
6416  char **azArg;                   /* Array of command arguments */
6417  ShellState *p;                  /* Shell state */
6418  sqlite3 *db;                    /* Database containing the archive */
6419};
6420
6421/*
6422** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6423*/
6424static int arUsage(FILE *f){
6425  showHelp(f,"archive");
6426  return SQLITE_ERROR;
6427}
6428
6429/*
6430** Print an error message for the .ar command to stderr and return
6431** SQLITE_ERROR.
6432*/
6433static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6434  va_list ap;
6435  char *z;
6436  va_start(ap, zFmt);
6437  z = sqlite3_vmprintf(zFmt, ap);
6438  va_end(ap);
6439  utf8_printf(stderr, "Error: %s\n", z);
6440  if( pAr->fromCmdLine ){
6441    utf8_printf(stderr, "Use \"-A\" for more help\n");
6442  }else{
6443    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6444  }
6445  sqlite3_free(z);
6446  return SQLITE_ERROR;
6447}
6448
6449/*
6450** Values for ArCommand.eCmd.
6451*/
6452#define AR_CMD_CREATE       1
6453#define AR_CMD_UPDATE       2
6454#define AR_CMD_INSERT       3
6455#define AR_CMD_EXTRACT      4
6456#define AR_CMD_LIST         5
6457#define AR_CMD_HELP         6
6458#define AR_CMD_REMOVE       7
6459
6460/*
6461** Other (non-command) switches.
6462*/
6463#define AR_SWITCH_VERBOSE     8
6464#define AR_SWITCH_FILE        9
6465#define AR_SWITCH_DIRECTORY  10
6466#define AR_SWITCH_APPEND     11
6467#define AR_SWITCH_DRYRUN     12
6468#define AR_SWITCH_GLOB       13
6469
6470static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6471  switch( eSwitch ){
6472    case AR_CMD_CREATE:
6473    case AR_CMD_EXTRACT:
6474    case AR_CMD_LIST:
6475    case AR_CMD_REMOVE:
6476    case AR_CMD_UPDATE:
6477    case AR_CMD_INSERT:
6478    case AR_CMD_HELP:
6479      if( pAr->eCmd ){
6480        return arErrorMsg(pAr, "multiple command options");
6481      }
6482      pAr->eCmd = eSwitch;
6483      break;
6484
6485    case AR_SWITCH_DRYRUN:
6486      pAr->bDryRun = 1;
6487      break;
6488    case AR_SWITCH_GLOB:
6489      pAr->bGlob = 1;
6490      break;
6491    case AR_SWITCH_VERBOSE:
6492      pAr->bVerbose = 1;
6493      break;
6494    case AR_SWITCH_APPEND:
6495      pAr->bAppend = 1;
6496      /* Fall thru into --file */
6497    case AR_SWITCH_FILE:
6498      pAr->zFile = zArg;
6499      break;
6500    case AR_SWITCH_DIRECTORY:
6501      pAr->zDir = zArg;
6502      break;
6503  }
6504
6505  return SQLITE_OK;
6506}
6507
6508/*
6509** Parse the command line for an ".ar" command. The results are written into
6510** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6511** successfully, otherwise an error message is written to stderr and
6512** SQLITE_ERROR returned.
6513*/
6514static int arParseCommand(
6515  char **azArg,                   /* Array of arguments passed to dot command */
6516  int nArg,                       /* Number of entries in azArg[] */
6517  ArCommand *pAr                  /* Populate this object */
6518){
6519  struct ArSwitch {
6520    const char *zLong;
6521    char cShort;
6522    u8 eSwitch;
6523    u8 bArg;
6524  } aSwitch[] = {
6525    { "create",    'c', AR_CMD_CREATE,       0 },
6526    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6527    { "insert",    'i', AR_CMD_INSERT,       0 },
6528    { "list",      't', AR_CMD_LIST,         0 },
6529    { "remove",    'r', AR_CMD_REMOVE,       0 },
6530    { "update",    'u', AR_CMD_UPDATE,       0 },
6531    { "help",      'h', AR_CMD_HELP,         0 },
6532    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6533    { "file",      'f', AR_SWITCH_FILE,      1 },
6534    { "append",    'a', AR_SWITCH_APPEND,    1 },
6535    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6536    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6537    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6538  };
6539  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6540  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6541
6542  if( nArg<=1 ){
6543    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6544    return arUsage(stderr);
6545  }else{
6546    char *z = azArg[1];
6547    if( z[0]!='-' ){
6548      /* Traditional style [tar] invocation */
6549      int i;
6550      int iArg = 2;
6551      for(i=0; z[i]; i++){
6552        const char *zArg = 0;
6553        struct ArSwitch *pOpt;
6554        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6555          if( z[i]==pOpt->cShort ) break;
6556        }
6557        if( pOpt==pEnd ){
6558          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6559        }
6560        if( pOpt->bArg ){
6561          if( iArg>=nArg ){
6562            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6563          }
6564          zArg = azArg[iArg++];
6565        }
6566        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6567      }
6568      pAr->nArg = nArg-iArg;
6569      if( pAr->nArg>0 ){
6570        pAr->azArg = &azArg[iArg];
6571      }
6572    }else{
6573      /* Non-traditional invocation */
6574      int iArg;
6575      for(iArg=1; iArg<nArg; iArg++){
6576        int n;
6577        z = azArg[iArg];
6578        if( z[0]!='-' ){
6579          /* All remaining command line words are command arguments. */
6580          pAr->azArg = &azArg[iArg];
6581          pAr->nArg = nArg-iArg;
6582          break;
6583        }
6584        n = strlen30(z);
6585
6586        if( z[1]!='-' ){
6587          int i;
6588          /* One or more short options */
6589          for(i=1; i<n; i++){
6590            const char *zArg = 0;
6591            struct ArSwitch *pOpt;
6592            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6593              if( z[i]==pOpt->cShort ) break;
6594            }
6595            if( pOpt==pEnd ){
6596              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6597            }
6598            if( pOpt->bArg ){
6599              if( i<(n-1) ){
6600                zArg = &z[i+1];
6601                i = n;
6602              }else{
6603                if( iArg>=(nArg-1) ){
6604                  return arErrorMsg(pAr, "option requires an argument: %c",
6605                                    z[i]);
6606                }
6607                zArg = azArg[++iArg];
6608              }
6609            }
6610            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6611          }
6612        }else if( z[2]=='\0' ){
6613          /* A -- option, indicating that all remaining command line words
6614          ** are command arguments.  */
6615          pAr->azArg = &azArg[iArg+1];
6616          pAr->nArg = nArg-iArg-1;
6617          break;
6618        }else{
6619          /* A long option */
6620          const char *zArg = 0;             /* Argument for option, if any */
6621          struct ArSwitch *pMatch = 0;      /* Matching option */
6622          struct ArSwitch *pOpt;            /* Iterator */
6623          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6624            const char *zLong = pOpt->zLong;
6625            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6626              if( pMatch ){
6627                return arErrorMsg(pAr, "ambiguous option: %s",z);
6628              }else{
6629                pMatch = pOpt;
6630              }
6631            }
6632          }
6633
6634          if( pMatch==0 ){
6635            return arErrorMsg(pAr, "unrecognized option: %s", z);
6636          }
6637          if( pMatch->bArg ){
6638            if( iArg>=(nArg-1) ){
6639              return arErrorMsg(pAr, "option requires an argument: %s", z);
6640            }
6641            zArg = azArg[++iArg];
6642          }
6643          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6644        }
6645      }
6646    }
6647  }
6648
6649  return SQLITE_OK;
6650}
6651
6652/*
6653** This function assumes that all arguments within the ArCommand.azArg[]
6654** array refer to archive members, as for the --extract, --list or --remove
6655** commands. It checks that each of them are "present". If any specified
6656** file is not present in the archive, an error is printed to stderr and an
6657** error code returned. Otherwise, if all specified arguments are present
6658** in the archive, SQLITE_OK is returned. Here, "present" means either an
6659** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6660** when pAr->bGlob is true.
6661**
6662** This function strips any trailing '/' characters from each argument.
6663** This is consistent with the way the [tar] command seems to work on
6664** Linux.
6665*/
6666static int arCheckEntries(ArCommand *pAr){
6667  int rc = SQLITE_OK;
6668  if( pAr->nArg ){
6669    int i, j;
6670    sqlite3_stmt *pTest = 0;
6671    const char *zSel = (pAr->bGlob)
6672      ? "SELECT name FROM %s WHERE glob($name,name)"
6673      : "SELECT name FROM %s WHERE name=$name";
6674
6675    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6676    j = sqlite3_bind_parameter_index(pTest, "$name");
6677    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6678      char *z = pAr->azArg[i];
6679      int n = strlen30(z);
6680      int bOk = 0;
6681      while( n>0 && z[n-1]=='/' ) n--;
6682      z[n] = '\0';
6683      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6684      if( SQLITE_ROW==sqlite3_step(pTest) ){
6685        bOk = 1;
6686      }
6687      shellReset(&rc, pTest);
6688      if( rc==SQLITE_OK && bOk==0 ){
6689        utf8_printf(stderr, "not found in archive: %s\n", z);
6690        rc = SQLITE_ERROR;
6691      }
6692    }
6693    shellFinalize(&rc, pTest);
6694  }
6695  return rc;
6696}
6697
6698/*
6699** Format a WHERE clause that can be used against the "sqlar" table to
6700** identify all archive members that match the command arguments held
6701** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6702** The caller is responsible for eventually calling sqlite3_free() on
6703** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6704** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6705*/
6706static void arWhereClause(
6707  int *pRc,
6708  ArCommand *pAr,
6709  char **pzWhere                  /* OUT: New WHERE clause */
6710){
6711  char *zWhere = 0;
6712  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6713  if( *pRc==SQLITE_OK ){
6714    if( pAr->nArg==0 ){
6715      zWhere = sqlite3_mprintf("1");
6716    }else{
6717      int i;
6718      const char *zSep = "";
6719      for(i=0; i<pAr->nArg; i++){
6720        const char *z = pAr->azArg[i];
6721        zWhere = sqlite3_mprintf(
6722          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6723          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6724        );
6725        if( zWhere==0 ){
6726          *pRc = SQLITE_NOMEM;
6727          break;
6728        }
6729        zSep = " OR ";
6730      }
6731    }
6732  }
6733  *pzWhere = zWhere;
6734}
6735
6736/*
6737** Implementation of .ar "lisT" command.
6738*/
6739static int arListCommand(ArCommand *pAr){
6740  const char *zSql = "SELECT %s FROM %s WHERE %s";
6741  const char *azCols[] = {
6742    "name",
6743    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6744  };
6745
6746  char *zWhere = 0;
6747  sqlite3_stmt *pSql = 0;
6748  int rc;
6749
6750  rc = arCheckEntries(pAr);
6751  arWhereClause(&rc, pAr, &zWhere);
6752
6753  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6754                     pAr->zSrcTable, zWhere);
6755  if( pAr->bDryRun ){
6756    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6757  }else{
6758    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6759      if( pAr->bVerbose ){
6760        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6761            sqlite3_column_text(pSql, 0),
6762            sqlite3_column_int(pSql, 1),
6763            sqlite3_column_text(pSql, 2),
6764            sqlite3_column_text(pSql, 3)
6765        );
6766      }else{
6767        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6768      }
6769    }
6770  }
6771  shellFinalize(&rc, pSql);
6772  sqlite3_free(zWhere);
6773  return rc;
6774}
6775
6776
6777/*
6778** Implementation of .ar "Remove" command.
6779*/
6780static int arRemoveCommand(ArCommand *pAr){
6781  int rc = 0;
6782  char *zSql = 0;
6783  char *zWhere = 0;
6784
6785  if( pAr->nArg ){
6786    /* Verify that args actually exist within the archive before proceeding.
6787    ** And formulate a WHERE clause to match them.  */
6788    rc = arCheckEntries(pAr);
6789    arWhereClause(&rc, pAr, &zWhere);
6790  }
6791  if( rc==SQLITE_OK ){
6792    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6793                           pAr->zSrcTable, zWhere);
6794    if( pAr->bDryRun ){
6795      utf8_printf(pAr->p->out, "%s\n", zSql);
6796    }else{
6797      char *zErr = 0;
6798      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6799      if( rc==SQLITE_OK ){
6800        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6801        if( rc!=SQLITE_OK ){
6802          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6803        }else{
6804          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6805        }
6806      }
6807      if( zErr ){
6808        utf8_printf(stdout, "ERROR: %s\n", zErr);
6809        sqlite3_free(zErr);
6810      }
6811    }
6812  }
6813  sqlite3_free(zWhere);
6814  sqlite3_free(zSql);
6815  return rc;
6816}
6817
6818/*
6819** Implementation of .ar "eXtract" command.
6820*/
6821static int arExtractCommand(ArCommand *pAr){
6822  const char *zSql1 =
6823    "SELECT "
6824    " ($dir || name),"
6825    " writefile(($dir || name), %s, mode, mtime) "
6826    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6827    " AND name NOT GLOB '*..[/\\]*'";
6828
6829  const char *azExtraArg[] = {
6830    "sqlar_uncompress(data, sz)",
6831    "data"
6832  };
6833
6834  sqlite3_stmt *pSql = 0;
6835  int rc = SQLITE_OK;
6836  char *zDir = 0;
6837  char *zWhere = 0;
6838  int i, j;
6839
6840  /* If arguments are specified, check that they actually exist within
6841  ** the archive before proceeding. And formulate a WHERE clause to
6842  ** match them.  */
6843  rc = arCheckEntries(pAr);
6844  arWhereClause(&rc, pAr, &zWhere);
6845
6846  if( rc==SQLITE_OK ){
6847    if( pAr->zDir ){
6848      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6849    }else{
6850      zDir = sqlite3_mprintf("");
6851    }
6852    if( zDir==0 ) rc = SQLITE_NOMEM;
6853  }
6854
6855  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6856      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6857  );
6858
6859  if( rc==SQLITE_OK ){
6860    j = sqlite3_bind_parameter_index(pSql, "$dir");
6861    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6862
6863    /* Run the SELECT statement twice. The first time, writefile() is called
6864    ** for all archive members that should be extracted. The second time,
6865    ** only for the directories. This is because the timestamps for
6866    ** extracted directories must be reset after they are populated (as
6867    ** populating them changes the timestamp).  */
6868    for(i=0; i<2; i++){
6869      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6870      sqlite3_bind_int(pSql, j, i);
6871      if( pAr->bDryRun ){
6872        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6873      }else{
6874        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6875          if( i==0 && pAr->bVerbose ){
6876            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6877          }
6878        }
6879      }
6880      shellReset(&rc, pSql);
6881    }
6882    shellFinalize(&rc, pSql);
6883  }
6884
6885  sqlite3_free(zDir);
6886  sqlite3_free(zWhere);
6887  return rc;
6888}
6889
6890/*
6891** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
6892*/
6893static int arExecSql(ArCommand *pAr, const char *zSql){
6894  int rc;
6895  if( pAr->bDryRun ){
6896    utf8_printf(pAr->p->out, "%s\n", zSql);
6897    rc = SQLITE_OK;
6898  }else{
6899    char *zErr = 0;
6900    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6901    if( zErr ){
6902      utf8_printf(stdout, "ERROR: %s\n", zErr);
6903      sqlite3_free(zErr);
6904    }
6905  }
6906  return rc;
6907}
6908
6909
6910/*
6911** Implementation of .ar "create", "insert", and "update" commands.
6912**
6913**     create    ->     Create a new SQL archive
6914**     insert    ->     Insert or reinsert all files listed
6915**     update    ->     Insert files that have changed or that were not
6916**                      previously in the archive
6917**
6918** Create the "sqlar" table in the database if it does not already exist.
6919** Then add each file in the azFile[] array to the archive. Directories
6920** are added recursively. If argument bVerbose is non-zero, a message is
6921** printed on stdout for each file archived.
6922**
6923** The create command is the same as update, except that it drops
6924** any existing "sqlar" table before beginning.  The "insert" command
6925** always overwrites every file named on the command-line, where as
6926** "update" only overwrites if the size or mtime or mode has changed.
6927*/
6928static int arCreateOrUpdateCommand(
6929  ArCommand *pAr,                 /* Command arguments and options */
6930  int bUpdate,                    /* true for a --create. */
6931  int bOnlyIfChanged              /* Only update if file has changed */
6932){
6933  const char *zCreate =
6934      "CREATE TABLE IF NOT EXISTS sqlar(\n"
6935      "  name TEXT PRIMARY KEY,  -- name of the file\n"
6936      "  mode INT,               -- access permissions\n"
6937      "  mtime INT,              -- last modification time\n"
6938      "  sz INT,                 -- original file size\n"
6939      "  data BLOB               -- compressed content\n"
6940      ")";
6941  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6942  const char *zInsertFmt[2] = {
6943     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6944     "  SELECT\n"
6945     "    %s,\n"
6946     "    mode,\n"
6947     "    mtime,\n"
6948     "    CASE substr(lsmode(mode),1,1)\n"
6949     "      WHEN '-' THEN length(data)\n"
6950     "      WHEN 'd' THEN 0\n"
6951     "      ELSE -1 END,\n"
6952     "    sqlar_compress(data)\n"
6953     "  FROM fsdir(%Q,%Q) AS disk\n"
6954     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6955     ,
6956     "REPLACE INTO %s(name,mode,mtime,data)\n"
6957     "  SELECT\n"
6958     "    %s,\n"
6959     "    mode,\n"
6960     "    mtime,\n"
6961     "    data\n"
6962     "  FROM fsdir(%Q,%Q) AS disk\n"
6963     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6964  };
6965  int i;                          /* For iterating through azFile[] */
6966  int rc;                         /* Return code */
6967  const char *zTab = 0;           /* SQL table into which to insert */
6968  char *zSql;
6969  char zTemp[50];
6970  char *zExists = 0;
6971
6972  arExecSql(pAr, "PRAGMA page_size=512");
6973  rc = arExecSql(pAr, "SAVEPOINT ar;");
6974  if( rc!=SQLITE_OK ) return rc;
6975  zTemp[0] = 0;
6976  if( pAr->bZip ){
6977    /* Initialize the zipfile virtual table, if necessary */
6978    if( pAr->zFile ){
6979      sqlite3_uint64 r;
6980      sqlite3_randomness(sizeof(r),&r);
6981      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6982      zTab = zTemp;
6983      zSql = sqlite3_mprintf(
6984         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6985         zTab, pAr->zFile
6986      );
6987      rc = arExecSql(pAr, zSql);
6988      sqlite3_free(zSql);
6989    }else{
6990      zTab = "zip";
6991    }
6992  }else{
6993    /* Initialize the table for an SQLAR */
6994    zTab = "sqlar";
6995    if( bUpdate==0 ){
6996      rc = arExecSql(pAr, zDrop);
6997      if( rc!=SQLITE_OK ) goto end_ar_transaction;
6998    }
6999    rc = arExecSql(pAr, zCreate);
7000  }
7001  if( bOnlyIfChanged ){
7002    zExists = sqlite3_mprintf(
7003      " AND NOT EXISTS("
7004          "SELECT 1 FROM %s AS mem"
7005          " WHERE mem.name=disk.name"
7006          " AND mem.mtime=disk.mtime"
7007          " AND mem.mode=disk.mode)", zTab);
7008  }else{
7009    zExists = sqlite3_mprintf("");
7010  }
7011  if( zExists==0 ) rc = SQLITE_NOMEM;
7012  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
7013    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
7014        pAr->bVerbose ? "shell_putsnl(name)" : "name",
7015        pAr->azArg[i], pAr->zDir, zExists);
7016    rc = arExecSql(pAr, zSql2);
7017    sqlite3_free(zSql2);
7018  }
7019end_ar_transaction:
7020  if( rc!=SQLITE_OK ){
7021    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
7022  }else{
7023    rc = arExecSql(pAr, "RELEASE ar;");
7024    if( pAr->bZip && pAr->zFile ){
7025      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
7026      arExecSql(pAr, zSql);
7027      sqlite3_free(zSql);
7028    }
7029  }
7030  sqlite3_free(zExists);
7031  return rc;
7032}
7033
7034/*
7035** Implementation of ".ar" dot command.
7036*/
7037static int arDotCommand(
7038  ShellState *pState,          /* Current shell tool state */
7039  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
7040  char **azArg,                /* Array of arguments passed to dot command */
7041  int nArg                     /* Number of entries in azArg[] */
7042){
7043  ArCommand cmd;
7044  int rc;
7045  memset(&cmd, 0, sizeof(cmd));
7046  cmd.fromCmdLine = fromCmdLine;
7047  rc = arParseCommand(azArg, nArg, &cmd);
7048  if( rc==SQLITE_OK ){
7049    int eDbType = SHELL_OPEN_UNSPEC;
7050    cmd.p = pState;
7051    cmd.db = pState->db;
7052    if( cmd.zFile ){
7053      eDbType = deduceDatabaseType(cmd.zFile, 1);
7054    }else{
7055      eDbType = pState->openMode;
7056    }
7057    if( eDbType==SHELL_OPEN_ZIPFILE ){
7058      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
7059        if( cmd.zFile==0 ){
7060          cmd.zSrcTable = sqlite3_mprintf("zip");
7061        }else{
7062          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
7063        }
7064      }
7065      cmd.bZip = 1;
7066    }else if( cmd.zFile ){
7067      int flags;
7068      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
7069      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
7070           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
7071        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
7072      }else{
7073        flags = SQLITE_OPEN_READONLY;
7074      }
7075      cmd.db = 0;
7076      if( cmd.bDryRun ){
7077        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
7078             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
7079      }
7080      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
7081             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
7082      if( rc!=SQLITE_OK ){
7083        utf8_printf(stderr, "cannot open file: %s (%s)\n",
7084            cmd.zFile, sqlite3_errmsg(cmd.db)
7085        );
7086        goto end_ar_command;
7087      }
7088      sqlite3_fileio_init(cmd.db, 0, 0);
7089      sqlite3_sqlar_init(cmd.db, 0, 0);
7090      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
7091                              shellPutsFunc, 0, 0);
7092
7093    }
7094    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
7095      if( cmd.eCmd!=AR_CMD_CREATE
7096       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
7097      ){
7098        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
7099        rc = SQLITE_ERROR;
7100        goto end_ar_command;
7101      }
7102      cmd.zSrcTable = sqlite3_mprintf("sqlar");
7103    }
7104
7105    switch( cmd.eCmd ){
7106      case AR_CMD_CREATE:
7107        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
7108        break;
7109
7110      case AR_CMD_EXTRACT:
7111        rc = arExtractCommand(&cmd);
7112        break;
7113
7114      case AR_CMD_LIST:
7115        rc = arListCommand(&cmd);
7116        break;
7117
7118      case AR_CMD_HELP:
7119        arUsage(pState->out);
7120        break;
7121
7122      case AR_CMD_INSERT:
7123        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
7124        break;
7125
7126      case AR_CMD_REMOVE:
7127        rc = arRemoveCommand(&cmd);
7128        break;
7129
7130      default:
7131        assert( cmd.eCmd==AR_CMD_UPDATE );
7132        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
7133        break;
7134    }
7135  }
7136end_ar_command:
7137  if( cmd.db!=pState->db ){
7138    close_db(cmd.db);
7139  }
7140  sqlite3_free(cmd.zSrcTable);
7141
7142  return rc;
7143}
7144/* End of the ".archive" or ".ar" command logic
7145*******************************************************************************/
7146#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
7147
7148#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7149/*
7150** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
7151** Otherwise, the SQL statement or statements in zSql are executed using
7152** database connection db and the error code written to *pRc before
7153** this function returns.
7154*/
7155static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
7156  int rc = *pRc;
7157  if( rc==SQLITE_OK ){
7158    char *zErr = 0;
7159    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
7160    if( rc!=SQLITE_OK ){
7161      raw_printf(stderr, "SQL error: %s\n", zErr);
7162    }
7163    sqlite3_free(zErr);
7164    *pRc = rc;
7165  }
7166}
7167
7168/*
7169** Like shellExec(), except that zFmt is a printf() style format string.
7170*/
7171static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
7172  char *z = 0;
7173  if( *pRc==SQLITE_OK ){
7174    va_list ap;
7175    va_start(ap, zFmt);
7176    z = sqlite3_vmprintf(zFmt, ap);
7177    va_end(ap);
7178    if( z==0 ){
7179      *pRc = SQLITE_NOMEM;
7180    }else{
7181      shellExec(db, pRc, z);
7182    }
7183    sqlite3_free(z);
7184  }
7185}
7186
7187/*
7188** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7189** Otherwise, an attempt is made to allocate, zero and return a pointer
7190** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
7191** to SQLITE_NOMEM and NULL returned.
7192*/
7193static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
7194  void *pRet = 0;
7195  if( *pRc==SQLITE_OK ){
7196    pRet = sqlite3_malloc64(nByte);
7197    if( pRet==0 ){
7198      *pRc = SQLITE_NOMEM;
7199    }else{
7200      memset(pRet, 0, nByte);
7201    }
7202  }
7203  return pRet;
7204}
7205
7206/*
7207** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7208** Otherwise, zFmt is treated as a printf() style string. The result of
7209** formatting it along with any trailing arguments is written into a
7210** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
7211** It is the responsibility of the caller to eventually free this buffer
7212** using a call to sqlite3_free().
7213**
7214** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
7215** pointer returned.
7216*/
7217static char *shellMPrintf(int *pRc, const char *zFmt, ...){
7218  char *z = 0;
7219  if( *pRc==SQLITE_OK ){
7220    va_list ap;
7221    va_start(ap, zFmt);
7222    z = sqlite3_vmprintf(zFmt, ap);
7223    va_end(ap);
7224    if( z==0 ){
7225      *pRc = SQLITE_NOMEM;
7226    }
7227  }
7228  return z;
7229}
7230
7231
7232/*
7233** When running the ".recover" command, each output table, and the special
7234** orphaned row table if it is required, is represented by an instance
7235** of the following struct.
7236*/
7237typedef struct RecoverTable RecoverTable;
7238struct RecoverTable {
7239  char *zQuoted;                  /* Quoted version of table name */
7240  int nCol;                       /* Number of columns in table */
7241  char **azlCol;                  /* Array of column lists */
7242  int iPk;                        /* Index of IPK column */
7243};
7244
7245/*
7246** Free a RecoverTable object allocated by recoverFindTable() or
7247** recoverOrphanTable().
7248*/
7249static void recoverFreeTable(RecoverTable *pTab){
7250  if( pTab ){
7251    sqlite3_free(pTab->zQuoted);
7252    if( pTab->azlCol ){
7253      int i;
7254      for(i=0; i<=pTab->nCol; i++){
7255        sqlite3_free(pTab->azlCol[i]);
7256      }
7257      sqlite3_free(pTab->azlCol);
7258    }
7259    sqlite3_free(pTab);
7260  }
7261}
7262
7263/*
7264** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
7265** Otherwise, it allocates and returns a RecoverTable object based on the
7266** final four arguments passed to this function. It is the responsibility
7267** of the caller to eventually free the returned object using
7268** recoverFreeTable().
7269*/
7270static RecoverTable *recoverNewTable(
7271  int *pRc,                       /* IN/OUT: Error code */
7272  const char *zName,              /* Name of table */
7273  const char *zSql,               /* CREATE TABLE statement */
7274  int bIntkey,
7275  int nCol
7276){
7277  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
7278  int rc = *pRc;
7279  RecoverTable *pTab = 0;
7280
7281  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
7282  if( rc==SQLITE_OK ){
7283    int nSqlCol = 0;
7284    int bSqlIntkey = 0;
7285    sqlite3_stmt *pStmt = 0;
7286
7287    rc = sqlite3_open("", &dbtmp);
7288    if( rc==SQLITE_OK ){
7289      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7290                              shellIdQuote, 0, 0);
7291    }
7292    if( rc==SQLITE_OK ){
7293      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7294    }
7295    if( rc==SQLITE_OK ){
7296      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7297      if( rc==SQLITE_ERROR ){
7298        rc = SQLITE_OK;
7299        goto finished;
7300      }
7301    }
7302    shellPreparePrintf(dbtmp, &rc, &pStmt,
7303        "SELECT count(*) FROM pragma_table_info(%Q)", zName
7304    );
7305    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7306      nSqlCol = sqlite3_column_int(pStmt, 0);
7307    }
7308    shellFinalize(&rc, pStmt);
7309
7310    if( rc!=SQLITE_OK || nSqlCol<nCol ){
7311      goto finished;
7312    }
7313
7314    shellPreparePrintf(dbtmp, &rc, &pStmt,
7315      "SELECT ("
7316      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7317      ") FROM sqlite_schema WHERE name = %Q", zName
7318    );
7319    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7320      bSqlIntkey = sqlite3_column_int(pStmt, 0);
7321    }
7322    shellFinalize(&rc, pStmt);
7323
7324    if( bIntkey==bSqlIntkey ){
7325      int i;
7326      const char *zPk = "_rowid_";
7327      sqlite3_stmt *pPkFinder = 0;
7328
7329      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7330      ** set zPk to the name of the PK column, and pTab->iPk to the index
7331      ** of the column, where columns are 0-numbered from left to right.
7332      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7333      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
7334      pTab->iPk = -2;
7335      if( bIntkey ){
7336        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7337          "SELECT cid, name FROM pragma_table_info(%Q) "
7338          "  WHERE pk=1 AND type='integer' COLLATE nocase"
7339          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7340          , zName, zName
7341        );
7342        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7343          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7344          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7345          if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
7346        }
7347      }
7348
7349      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7350      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7351      pTab->nCol = nSqlCol;
7352
7353      if( bIntkey ){
7354        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7355      }else{
7356        pTab->azlCol[0] = shellMPrintf(&rc, "");
7357      }
7358      i = 1;
7359      shellPreparePrintf(dbtmp, &rc, &pStmt,
7360          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7361          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7362          "FROM pragma_table_info(%Q)",
7363          bIntkey ? ", " : "", pTab->iPk,
7364          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7365          zName
7366      );
7367      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7368        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7369        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7370        i++;
7371      }
7372      shellFinalize(&rc, pStmt);
7373
7374      shellFinalize(&rc, pPkFinder);
7375    }
7376  }
7377
7378 finished:
7379  sqlite3_close(dbtmp);
7380  *pRc = rc;
7381  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7382    recoverFreeTable(pTab);
7383    pTab = 0;
7384  }
7385  return pTab;
7386}
7387
7388/*
7389** This function is called to search the schema recovered from the
7390** sqlite_schema table of the (possibly) corrupt database as part
7391** of a ".recover" command. Specifically, for a table with root page
7392** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7393** table must be a WITHOUT ROWID table, or if non-zero, not one of
7394** those.
7395**
7396** If a table is found, a (RecoverTable*) object is returned. Or, if
7397** no such table is found, but bIntkey is false and iRoot is the
7398** root page of an index in the recovered schema, then (*pbNoop) is
7399** set to true and NULL returned. Or, if there is no such table or
7400** index, NULL is returned and (*pbNoop) set to 0, indicating that
7401** the caller should write data to the orphans table.
7402*/
7403static RecoverTable *recoverFindTable(
7404  ShellState *pState,             /* Shell state object */
7405  int *pRc,                       /* IN/OUT: Error code */
7406  int iRoot,                      /* Root page of table */
7407  int bIntkey,                    /* True for an intkey table */
7408  int nCol,                       /* Number of columns in table */
7409  int *pbNoop                     /* OUT: True if iRoot is root of index */
7410){
7411  sqlite3_stmt *pStmt = 0;
7412  RecoverTable *pRet = 0;
7413  int bNoop = 0;
7414  const char *zSql = 0;
7415  const char *zName = 0;
7416
7417  /* Search the recovered schema for an object with root page iRoot. */
7418  shellPreparePrintf(pState->db, pRc, &pStmt,
7419      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7420  );
7421  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7422    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7423    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7424      bNoop = 1;
7425      break;
7426    }
7427    if( sqlite3_stricmp(zType, "table")==0 ){
7428      zName = (const char*)sqlite3_column_text(pStmt, 1);
7429      zSql = (const char*)sqlite3_column_text(pStmt, 2);
7430      if( zName!=0 && zSql!=0 ){
7431        pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7432        break;
7433      }
7434    }
7435  }
7436
7437  shellFinalize(pRc, pStmt);
7438  *pbNoop = bNoop;
7439  return pRet;
7440}
7441
7442/*
7443** Return a RecoverTable object representing the orphans table.
7444*/
7445static RecoverTable *recoverOrphanTable(
7446  ShellState *pState,             /* Shell state object */
7447  int *pRc,                       /* IN/OUT: Error code */
7448  const char *zLostAndFound,      /* Base name for orphans table */
7449  int nCol                        /* Number of user data columns */
7450){
7451  RecoverTable *pTab = 0;
7452  if( nCol>=0 && *pRc==SQLITE_OK ){
7453    int i;
7454
7455    /* This block determines the name of the orphan table. The prefered
7456    ** name is zLostAndFound. But if that clashes with another name
7457    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7458    ** and so on until a non-clashing name is found.  */
7459    int iTab = 0;
7460    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7461    sqlite3_stmt *pTest = 0;
7462    shellPrepare(pState->db, pRc,
7463        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7464    );
7465    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7466    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7467      shellReset(pRc, pTest);
7468      sqlite3_free(zTab);
7469      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7470      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7471    }
7472    shellFinalize(pRc, pTest);
7473
7474    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7475    if( pTab ){
7476      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7477      pTab->nCol = nCol;
7478      pTab->iPk = -2;
7479      if( nCol>0 ){
7480        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7481        if( pTab->azlCol ){
7482          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7483          for(i=nCol-1; i>=0; i--){
7484            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7485          }
7486        }
7487      }
7488
7489      if( *pRc!=SQLITE_OK ){
7490        recoverFreeTable(pTab);
7491        pTab = 0;
7492      }else{
7493        raw_printf(pState->out,
7494            "CREATE TABLE %s(rootpgno INTEGER, "
7495            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7496        );
7497        for(i=0; i<nCol; i++){
7498          raw_printf(pState->out, ", c%d", i);
7499        }
7500        raw_printf(pState->out, ");\n");
7501      }
7502    }
7503    sqlite3_free(zTab);
7504  }
7505  return pTab;
7506}
7507
7508/*
7509** This function is called to recover data from the database. A script
7510** to construct a new database containing all recovered data is output
7511** on stream pState->out.
7512*/
7513static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7514  int rc = SQLITE_OK;
7515  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
7516  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
7517  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
7518  const char *zRecoveryDb = "";   /* Name of "recovery" database */
7519  const char *zLostAndFound = "lost_and_found";
7520  int i;
7521  int nOrphan = -1;
7522  RecoverTable *pOrphan = 0;
7523
7524  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
7525  int bRowids = 1;                /* 0 if --no-rowids */
7526  for(i=1; i<nArg; i++){
7527    char *z = azArg[i];
7528    int n;
7529    if( z[0]=='-' && z[1]=='-' ) z++;
7530    n = strlen30(z);
7531    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7532      bFreelist = 0;
7533    }else
7534    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7535      i++;
7536      zRecoveryDb = azArg[i];
7537    }else
7538    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7539      i++;
7540      zLostAndFound = azArg[i];
7541    }else
7542    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7543      bRowids = 0;
7544    }
7545    else{
7546      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7547      showHelp(pState->out, azArg[0]);
7548      return 1;
7549    }
7550  }
7551
7552  shellExecPrintf(pState->db, &rc,
7553    /* Attach an in-memory database named 'recovery'. Create an indexed
7554    ** cache of the sqlite_dbptr virtual table. */
7555    "PRAGMA writable_schema = on;"
7556    "ATTACH %Q AS recovery;"
7557    "DROP TABLE IF EXISTS recovery.dbptr;"
7558    "DROP TABLE IF EXISTS recovery.freelist;"
7559    "DROP TABLE IF EXISTS recovery.map;"
7560    "DROP TABLE IF EXISTS recovery.schema;"
7561    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7562  );
7563
7564  if( bFreelist ){
7565    shellExec(pState->db, &rc,
7566      "WITH trunk(pgno) AS ("
7567      "  SELECT shell_int32("
7568      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7569      "      WHERE x>0"
7570      "    UNION"
7571      "  SELECT shell_int32("
7572      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7573      "      FROM trunk WHERE x>0"
7574      "),"
7575      "freelist(data, n, freepgno) AS ("
7576      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7577      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7578      "    UNION ALL"
7579      "  SELECT data, n-1, shell_int32(data, 2+n) "
7580      "      FROM freelist WHERE n>=0"
7581      ")"
7582      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7583    );
7584  }
7585
7586  /* If this is an auto-vacuum database, add all pointer-map pages to
7587  ** the freelist table. Do this regardless of whether or not
7588  ** --freelist-corrupt was specified.  */
7589  shellExec(pState->db, &rc,
7590    "WITH ptrmap(pgno) AS ("
7591    "  SELECT 2 WHERE shell_int32("
7592    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7593    "  )"
7594    "    UNION ALL "
7595    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7596    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7597    ")"
7598    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7599  );
7600
7601  shellExec(pState->db, &rc,
7602    "CREATE TABLE recovery.dbptr("
7603    "      pgno, child, PRIMARY KEY(child, pgno)"
7604    ") WITHOUT ROWID;"
7605    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7606    "    SELECT * FROM sqlite_dbptr"
7607    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7608
7609    /* Delete any pointer to page 1. This ensures that page 1 is considered
7610    ** a root page, regardless of how corrupt the db is. */
7611    "DELETE FROM recovery.dbptr WHERE child = 1;"
7612
7613    /* Delete all pointers to any pages that have more than one pointer
7614    ** to them. Such pages will be treated as root pages when recovering
7615    ** data.  */
7616    "DELETE FROM recovery.dbptr WHERE child IN ("
7617    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7618    ");"
7619
7620    /* Create the "map" table that will (eventually) contain instructions
7621    ** for dealing with each page in the db that contains one or more
7622    ** records. */
7623    "CREATE TABLE recovery.map("
7624      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7625    ");"
7626
7627    /* Populate table [map]. If there are circular loops of pages in the
7628    ** database, the following adds all pages in such a loop to the map
7629    ** as individual root pages. This could be handled better.  */
7630    "WITH pages(i, maxlen) AS ("
7631    "  SELECT page_count, ("
7632    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7633    "  ) FROM pragma_page_count WHERE page_count>0"
7634    "    UNION ALL"
7635    "  SELECT i-1, ("
7636    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7637    "  ) FROM pages WHERE i>=2"
7638    ")"
7639    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7640    "  SELECT i, maxlen, NULL, ("
7641    "    WITH p(orig, pgno, parent) AS ("
7642    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7643    "        UNION "
7644    "      SELECT i, p.parent, "
7645    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7646    "    )"
7647    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7648    ") "
7649    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7650    "UPDATE recovery.map AS o SET intkey = ("
7651    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7652    ");"
7653
7654    /* Extract data from page 1 and any linked pages into table
7655    ** recovery.schema. With the same schema as an sqlite_schema table.  */
7656    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7657    "INSERT INTO recovery.schema SELECT "
7658    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
7659    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
7660    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
7661    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
7662    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
7663    "FROM sqlite_dbdata WHERE pgno IN ("
7664    "  SELECT pgno FROM recovery.map WHERE root=1"
7665    ")"
7666    "GROUP BY pgno, cell;"
7667    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7668  );
7669
7670  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7671  ** CREATE TABLE statements that extracted from the existing schema.  */
7672  if( rc==SQLITE_OK ){
7673    sqlite3_stmt *pStmt = 0;
7674    /* ".recover" might output content in an order which causes immediate
7675    ** foreign key constraints to be violated. So disable foreign-key
7676    ** constraint enforcement to prevent problems when running the output
7677    ** script. */
7678    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7679    raw_printf(pState->out, "BEGIN;\n");
7680    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7681    shellPrepare(pState->db, &rc,
7682        "SELECT sql FROM recovery.schema "
7683        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7684    );
7685    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7686      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7687      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7688          &zCreateTable[12]
7689      );
7690    }
7691    shellFinalize(&rc, pStmt);
7692  }
7693
7694  /* Figure out if an orphan table will be required. And if so, how many
7695  ** user columns it should contain */
7696  shellPrepare(pState->db, &rc,
7697      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7698      , &pLoop
7699  );
7700  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7701    nOrphan = sqlite3_column_int(pLoop, 0);
7702  }
7703  shellFinalize(&rc, pLoop);
7704  pLoop = 0;
7705
7706  shellPrepare(pState->db, &rc,
7707      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7708  );
7709
7710  shellPrepare(pState->db, &rc,
7711      "SELECT max(field), group_concat(shell_escape_crnl(quote"
7712      "(case when (? AND field<0) then NULL else value end)"
7713      "), ', ')"
7714      ", min(field) "
7715      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7716      "GROUP BY cell", &pCells
7717  );
7718
7719  /* Loop through each root page. */
7720  shellPrepare(pState->db, &rc,
7721      "SELECT root, intkey, max(maxlen) FROM recovery.map"
7722      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7723      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7724      ")", &pLoop
7725  );
7726  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7727    int iRoot = sqlite3_column_int(pLoop, 0);
7728    int bIntkey = sqlite3_column_int(pLoop, 1);
7729    int nCol = sqlite3_column_int(pLoop, 2);
7730    int bNoop = 0;
7731    RecoverTable *pTab;
7732
7733    assert( bIntkey==0 || bIntkey==1 );
7734    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7735    if( bNoop || rc ) continue;
7736    if( pTab==0 ){
7737      if( pOrphan==0 ){
7738        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7739      }
7740      pTab = pOrphan;
7741      if( pTab==0 ) break;
7742    }
7743
7744    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7745      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7746    }
7747    sqlite3_bind_int(pPages, 1, iRoot);
7748    if( bRowids==0 && pTab->iPk<0 ){
7749      sqlite3_bind_int(pCells, 1, 1);
7750    }else{
7751      sqlite3_bind_int(pCells, 1, 0);
7752    }
7753    sqlite3_bind_int(pCells, 3, pTab->iPk);
7754
7755    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7756      int iPgno = sqlite3_column_int(pPages, 0);
7757      sqlite3_bind_int(pCells, 2, iPgno);
7758      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7759        int nField = sqlite3_column_int(pCells, 0);
7760        int iMin = sqlite3_column_int(pCells, 2);
7761        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7762
7763        RecoverTable *pTab2 = pTab;
7764        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7765          if( pOrphan==0 ){
7766            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7767          }
7768          pTab2 = pOrphan;
7769          if( pTab2==0 ) break;
7770        }
7771
7772        nField = nField+1;
7773        if( pTab2==pOrphan ){
7774          raw_printf(pState->out,
7775              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7776              pTab2->zQuoted, iRoot, iPgno, nField,
7777              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7778          );
7779        }else{
7780          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7781              pTab2->zQuoted, pTab2->azlCol[nField], zVal
7782          );
7783        }
7784      }
7785      shellReset(&rc, pCells);
7786    }
7787    shellReset(&rc, pPages);
7788    if( pTab!=pOrphan ) recoverFreeTable(pTab);
7789  }
7790  shellFinalize(&rc, pLoop);
7791  shellFinalize(&rc, pPages);
7792  shellFinalize(&rc, pCells);
7793  recoverFreeTable(pOrphan);
7794
7795  /* The rest of the schema */
7796  if( rc==SQLITE_OK ){
7797    sqlite3_stmt *pStmt = 0;
7798    shellPrepare(pState->db, &rc,
7799        "SELECT sql, name FROM recovery.schema "
7800        "WHERE sql NOT LIKE 'create table%'", &pStmt
7801    );
7802    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7803      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7804      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7805        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7806        char *zPrint = shellMPrintf(&rc,
7807          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7808          zName, zName, zSql
7809        );
7810        raw_printf(pState->out, "%s;\n", zPrint);
7811        sqlite3_free(zPrint);
7812      }else{
7813        raw_printf(pState->out, "%s;\n", zSql);
7814      }
7815    }
7816    shellFinalize(&rc, pStmt);
7817  }
7818
7819  if( rc==SQLITE_OK ){
7820    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7821    raw_printf(pState->out, "COMMIT;\n");
7822  }
7823  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7824  return rc;
7825}
7826#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7827
7828
7829/*
7830 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
7831 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
7832 *   close db and set it to 0, and return the columns spec, to later
7833 *   be sqlite3_free()'ed by the caller.
7834 * The return is 0 when either:
7835 *   (a) The db was not initialized and zCol==0 (There are no columns.)
7836 *   (b) zCol!=0  (Column was added, db initialized as needed.)
7837 * The 3rd argument, pRenamed, references an out parameter. If the
7838 * pointer is non-zero, its referent will be set to a summary of renames
7839 * done if renaming was necessary, or set to 0 if none was done. The out
7840 * string (if any) must be sqlite3_free()'ed by the caller.
7841 */
7842#ifdef SHELL_DEBUG
7843#define rc_err_oom_die(rc) \
7844  if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
7845  else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
7846    fprintf(stderr,"E:%d\n",rc), assert(0)
7847#else
7848static void rc_err_oom_die(int rc){
7849  if( rc==SQLITE_NOMEM ) shell_check_oom(0);
7850  assert(rc==SQLITE_OK||rc==SQLITE_DONE);
7851}
7852#endif
7853
7854#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
7855static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
7856#else  /* Otherwise, memory is faster/better for the transient DB. */
7857static const char *zCOL_DB = ":memory:";
7858#endif
7859
7860/* Define character (as C string) to separate generated column ordinal
7861 * from protected part of incoming column names. This defaults to "_"
7862 * so that incoming column identifiers that did not need not be quoted
7863 * remain usable without being quoted. It must be one character.
7864 */
7865#ifndef SHELL_AUTOCOLUMN_SEP
7866# define AUTOCOLUMN_SEP "_"
7867#else
7868# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
7869#endif
7870
7871static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
7872  /* Queries and D{D,M}L used here */
7873  static const char * const zTabMake = "\
7874CREATE TABLE ColNames(\
7875 cpos INTEGER PRIMARY KEY,\
7876 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
7877CREATE VIEW RepeatedNames AS \
7878SELECT DISTINCT t.name FROM ColNames t \
7879WHERE t.name COLLATE NOCASE IN (\
7880 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
7881);\
7882";
7883  static const char * const zTabFill = "\
7884INSERT INTO ColNames(name,nlen,chop,reps,suff)\
7885 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
7886";
7887  static const char * const zHasDupes = "\
7888SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
7889 <count(name) FROM ColNames\
7890";
7891#ifdef SHELL_COLUMN_RENAME_CLEAN
7892  static const char * const zDedoctor = "\
7893UPDATE ColNames SET chop=iif(\
7894  (substring(name,nlen,1) BETWEEN '0' AND '9')\
7895  AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
7896 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
7897 0\
7898)\
7899";
7900#endif
7901  static const char * const zSetReps = "\
7902UPDATE ColNames AS t SET reps=\
7903(SELECT count(*) FROM ColNames d \
7904 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
7905 COLLATE NOCASE\
7906)\
7907";
7908#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7909  static const char * const zColDigits = "\
7910SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
7911";
7912#endif
7913  static const char * const zRenameRank =
7914#ifdef SHELL_COLUMN_RENAME_CLEAN
7915    "UPDATE ColNames AS t SET suff="
7916    "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
7917#else /* ...RENAME_MINIMAL_ONE_PASS */
7918"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
7919"  SELECT 0 AS nlz"
7920"  UNION"
7921"  SELECT nlz+1 AS nlz FROM Lzn"
7922"  WHERE EXISTS("
7923"   SELECT 1"
7924"   FROM ColNames t, ColNames o"
7925"   WHERE"
7926"    iif(t.name IN (SELECT * FROM RepeatedNames),"
7927"     printf('%s"AUTOCOLUMN_SEP"%s',"
7928"      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
7929"     t.name"
7930"    )"
7931"    ="
7932"    iif(o.name IN (SELECT * FROM RepeatedNames),"
7933"     printf('%s"AUTOCOLUMN_SEP"%s',"
7934"      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
7935"     o.name"
7936"    )"
7937"    COLLATE NOCASE"
7938"    AND o.cpos<>t.cpos"
7939"   GROUP BY t.cpos"
7940"  )"
7941") UPDATE Colnames AS t SET"
7942" chop = 0," /* No chopping, never touch incoming names. */
7943" suff = iif(name IN (SELECT * FROM RepeatedNames),"
7944"  printf('"AUTOCOLUMN_SEP"%s', substring("
7945"   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
7946"  ''"
7947" )"
7948#endif
7949    ;
7950  static const char * const zCollectVar = "\
7951SELECT\
7952 '('||x'0a'\
7953 || group_concat(\
7954  cname||' TEXT',\
7955  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
7956 ||')' AS ColsSpec \
7957FROM (\
7958 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \
7959 FROM ColNames ORDER BY cpos\
7960)";
7961  static const char * const zRenamesDone =
7962    "SELECT group_concat("
7963    " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff)),"
7964    " ','||x'0a')"
7965    "FROM ColNames WHERE suff<>'' OR chop!=0"
7966    ;
7967  int rc;
7968  sqlite3_stmt *pStmt = 0;
7969  assert(pDb!=0);
7970  if( zColNew ){
7971    /* Add initial or additional column. Init db if necessary. */
7972    if( *pDb==0 ){
7973      if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
7974#ifdef SHELL_COLFIX_DB
7975      if(*zCOL_DB!=':')
7976        sqlite3_exec(*pDb,"drop table if exists ColNames;"
7977                     "drop view if exists RepeatedNames;",0,0,0);
7978#endif
7979      rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
7980      rc_err_oom_die(rc);
7981    }
7982    assert(*pDb!=0);
7983    rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
7984    rc_err_oom_die(rc);
7985    rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
7986    rc_err_oom_die(rc);
7987    rc = sqlite3_step(pStmt);
7988    rc_err_oom_die(rc);
7989    sqlite3_finalize(pStmt);
7990    return 0;
7991  }else if( *pDb==0 ){
7992    return 0;
7993  }else{
7994    /* Formulate the columns spec, close the DB, zero *pDb. */
7995    char *zColsSpec = 0;
7996    int hasDupes = db_int(*pDb, zHasDupes);
7997#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7998    int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
7999#else
8000# define nDigits 2
8001#endif
8002    if( hasDupes ){
8003#ifdef SHELL_COLUMN_RENAME_CLEAN
8004      rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
8005      rc_err_oom_die(rc);
8006#endif
8007      rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
8008      rc_err_oom_die(rc);
8009      rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
8010      rc_err_oom_die(rc);
8011      sqlite3_bind_int(pStmt, 1, nDigits);
8012      rc = sqlite3_step(pStmt);
8013      sqlite3_finalize(pStmt);
8014      assert(rc==SQLITE_DONE);
8015    }
8016    assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
8017    rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
8018    rc_err_oom_die(rc);
8019    rc = sqlite3_step(pStmt);
8020    if( rc==SQLITE_ROW ){
8021      zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8022    }else{
8023      zColsSpec = 0;
8024    }
8025    if( pzRenamed!=0 ){
8026      if( !hasDupes ) *pzRenamed = 0;
8027      else{
8028        sqlite3_finalize(pStmt);
8029        if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
8030            && SQLITE_ROW==sqlite3_step(pStmt) ){
8031          *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8032        }else
8033          *pzRenamed = 0;
8034      }
8035    }
8036    sqlite3_finalize(pStmt);
8037    sqlite3_close(*pDb);
8038    *pDb = 0;
8039    return zColsSpec;
8040  }
8041}
8042
8043/*
8044** If an input line begins with "." then invoke this routine to
8045** process that line.
8046**
8047** Return 1 on error, 2 to exit, and 0 otherwise.
8048*/
8049static int do_meta_command(char *zLine, ShellState *p){
8050  int h = 1;
8051  int nArg = 0;
8052  int n, c;
8053  int rc = 0;
8054  char *azArg[52];
8055
8056#ifndef SQLITE_OMIT_VIRTUALTABLE
8057  if( p->expert.pExpert ){
8058    expertFinish(p, 1, 0);
8059  }
8060#endif
8061
8062  /* Parse the input line into tokens.
8063  */
8064  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
8065    while( IsSpace(zLine[h]) ){ h++; }
8066    if( zLine[h]==0 ) break;
8067    if( zLine[h]=='\'' || zLine[h]=='"' ){
8068      int delim = zLine[h++];
8069      azArg[nArg++] = &zLine[h];
8070      while( zLine[h] && zLine[h]!=delim ){
8071        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
8072        h++;
8073      }
8074      if( zLine[h]==delim ){
8075        zLine[h++] = 0;
8076      }
8077      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
8078    }else{
8079      azArg[nArg++] = &zLine[h];
8080      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
8081      if( zLine[h] ) zLine[h++] = 0;
8082      resolve_backslashes(azArg[nArg-1]);
8083    }
8084  }
8085  azArg[nArg] = 0;
8086
8087  /* Process the input line.
8088  */
8089  if( nArg==0 ) return 0; /* no tokens, no error */
8090  n = strlen30(azArg[0]);
8091  c = azArg[0][0];
8092  clearTempFile(p);
8093
8094#ifndef SQLITE_OMIT_AUTHORIZATION
8095  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
8096    if( nArg!=2 ){
8097      raw_printf(stderr, "Usage: .auth ON|OFF\n");
8098      rc = 1;
8099      goto meta_command_exit;
8100    }
8101    open_db(p, 0);
8102    if( booleanValue(azArg[1]) ){
8103      sqlite3_set_authorizer(p->db, shellAuth, p);
8104    }else if( p->bSafeModePersist ){
8105      sqlite3_set_authorizer(p->db, safeModeAuth, p);
8106    }else{
8107      sqlite3_set_authorizer(p->db, 0, 0);
8108    }
8109  }else
8110#endif
8111
8112#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8113  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
8114    open_db(p, 0);
8115    failIfSafeMode(p, "cannot run .archive in safe mode");
8116    rc = arDotCommand(p, 0, azArg, nArg);
8117  }else
8118#endif
8119
8120  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
8121   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
8122  ){
8123    const char *zDestFile = 0;
8124    const char *zDb = 0;
8125    sqlite3 *pDest;
8126    sqlite3_backup *pBackup;
8127    int j;
8128    int bAsync = 0;
8129    const char *zVfs = 0;
8130    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
8131    for(j=1; j<nArg; j++){
8132      const char *z = azArg[j];
8133      if( z[0]=='-' ){
8134        if( z[1]=='-' ) z++;
8135        if( strcmp(z, "-append")==0 ){
8136          zVfs = "apndvfs";
8137        }else
8138        if( strcmp(z, "-async")==0 ){
8139          bAsync = 1;
8140        }else
8141        {
8142          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
8143          return 1;
8144        }
8145      }else if( zDestFile==0 ){
8146        zDestFile = azArg[j];
8147      }else if( zDb==0 ){
8148        zDb = zDestFile;
8149        zDestFile = azArg[j];
8150      }else{
8151        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
8152        return 1;
8153      }
8154    }
8155    if( zDestFile==0 ){
8156      raw_printf(stderr, "missing FILENAME argument on .backup\n");
8157      return 1;
8158    }
8159    if( zDb==0 ) zDb = "main";
8160    rc = sqlite3_open_v2(zDestFile, &pDest,
8161                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
8162    if( rc!=SQLITE_OK ){
8163      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
8164      close_db(pDest);
8165      return 1;
8166    }
8167    if( bAsync ){
8168      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
8169                   0, 0, 0);
8170    }
8171    open_db(p, 0);
8172    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
8173    if( pBackup==0 ){
8174      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8175      close_db(pDest);
8176      return 1;
8177    }
8178    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
8179    sqlite3_backup_finish(pBackup);
8180    if( rc==SQLITE_DONE ){
8181      rc = 0;
8182    }else{
8183      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8184      rc = 1;
8185    }
8186    close_db(pDest);
8187  }else
8188
8189  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
8190    if( nArg==2 ){
8191      bail_on_error = booleanValue(azArg[1]);
8192    }else{
8193      raw_printf(stderr, "Usage: .bail on|off\n");
8194      rc = 1;
8195    }
8196  }else
8197
8198  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
8199    if( nArg==2 ){
8200      if( booleanValue(azArg[1]) ){
8201        setBinaryMode(p->out, 1);
8202      }else{
8203        setTextMode(p->out, 1);
8204      }
8205    }else{
8206      raw_printf(stderr, "Usage: .binary on|off\n");
8207      rc = 1;
8208    }
8209  }else
8210
8211  /* The undocumented ".breakpoint" command causes a call to the no-op
8212  ** routine named test_breakpoint().
8213  */
8214  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
8215    test_breakpoint();
8216  }else
8217
8218  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
8219    failIfSafeMode(p, "cannot run .cd in safe mode");
8220    if( nArg==2 ){
8221#if defined(_WIN32) || defined(WIN32)
8222      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
8223      rc = !SetCurrentDirectoryW(z);
8224      sqlite3_free(z);
8225#else
8226      rc = chdir(azArg[1]);
8227#endif
8228      if( rc ){
8229        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
8230        rc = 1;
8231      }
8232    }else{
8233      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
8234      rc = 1;
8235    }
8236  }else
8237
8238  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
8239    if( nArg==2 ){
8240      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
8241    }else{
8242      raw_printf(stderr, "Usage: .changes on|off\n");
8243      rc = 1;
8244    }
8245  }else
8246
8247  /* Cancel output redirection, if it is currently set (by .testcase)
8248  ** Then read the content of the testcase-out.txt file and compare against
8249  ** azArg[1].  If there are differences, report an error and exit.
8250  */
8251  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
8252    char *zRes = 0;
8253    output_reset(p);
8254    if( nArg!=2 ){
8255      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
8256      rc = 2;
8257    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
8258      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
8259      rc = 2;
8260    }else if( testcase_glob(azArg[1],zRes)==0 ){
8261      utf8_printf(stderr,
8262                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
8263                 p->zTestcase, azArg[1], zRes);
8264      rc = 1;
8265    }else{
8266      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
8267      p->nCheck++;
8268    }
8269    sqlite3_free(zRes);
8270  }else
8271
8272  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
8273    failIfSafeMode(p, "cannot run .clone in safe mode");
8274    if( nArg==2 ){
8275      tryToClone(p, azArg[1]);
8276    }else{
8277      raw_printf(stderr, "Usage: .clone FILENAME\n");
8278      rc = 1;
8279    }
8280  }else
8281
8282  if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
8283    if( nArg==1 ){
8284      /* List available connections */
8285      int i;
8286      for(i=0; i<ArraySize(p->aAuxDb); i++){
8287        const char *zFile = p->aAuxDb[i].zDbFilename;
8288        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
8289          zFile = "(not open)";
8290        }else if( zFile==0 ){
8291          zFile = "(memory)";
8292        }else if( zFile[0]==0 ){
8293          zFile = "(temporary-file)";
8294        }
8295        if( p->pAuxDb == &p->aAuxDb[i] ){
8296          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
8297        }else if( p->aAuxDb[i].db!=0 ){
8298          utf8_printf(stdout, "       %d: %s\n", i, zFile);
8299        }
8300      }
8301    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
8302      int i = azArg[1][0] - '0';
8303      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
8304        p->pAuxDb->db = p->db;
8305        p->pAuxDb = &p->aAuxDb[i];
8306        globalDb = p->db = p->pAuxDb->db;
8307        p->pAuxDb->db = 0;
8308      }
8309    }else if( nArg==3 && strcmp(azArg[1], "close")==0
8310           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
8311      int i = azArg[2][0] - '0';
8312      if( i<0 || i>=ArraySize(p->aAuxDb) ){
8313        /* No-op */
8314      }else if( p->pAuxDb == &p->aAuxDb[i] ){
8315        raw_printf(stderr, "cannot close the active database connection\n");
8316        rc = 1;
8317      }else if( p->aAuxDb[i].db ){
8318        session_close_all(p, i);
8319        close_db(p->aAuxDb[i].db);
8320        p->aAuxDb[i].db = 0;
8321      }
8322    }else{
8323      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
8324      rc = 1;
8325    }
8326  }else
8327
8328  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
8329    char **azName = 0;
8330    int nName = 0;
8331    sqlite3_stmt *pStmt;
8332    int i;
8333    open_db(p, 0);
8334    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
8335    if( rc ){
8336      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8337      rc = 1;
8338    }else{
8339      while( sqlite3_step(pStmt)==SQLITE_ROW ){
8340        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
8341        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
8342        if( zSchema==0 || zFile==0 ) continue;
8343        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
8344        shell_check_oom(azName);
8345        azName[nName*2] = strdup(zSchema);
8346        azName[nName*2+1] = strdup(zFile);
8347        nName++;
8348      }
8349    }
8350    sqlite3_finalize(pStmt);
8351    for(i=0; i<nName; i++){
8352      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
8353      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
8354      const char *z = azName[i*2+1];
8355      utf8_printf(p->out, "%s: %s %s%s\n",
8356         azName[i*2],
8357         z && z[0] ? z : "\"\"",
8358         bRdonly ? "r/o" : "r/w",
8359         eTxn==SQLITE_TXN_NONE ? "" :
8360            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
8361      free(azName[i*2]);
8362      free(azName[i*2+1]);
8363    }
8364    sqlite3_free(azName);
8365  }else
8366
8367  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
8368    static const struct DbConfigChoices {
8369      const char *zName;
8370      int op;
8371    } aDbConfig[] = {
8372        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
8373        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
8374        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
8375        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
8376        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
8377        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
8378        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
8379        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
8380        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
8381        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
8382        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
8383        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
8384        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
8385        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
8386        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
8387        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
8388    };
8389    int ii, v;
8390    open_db(p, 0);
8391    for(ii=0; ii<ArraySize(aDbConfig); ii++){
8392      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
8393      if( nArg>=3 ){
8394        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
8395      }
8396      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
8397      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
8398      if( nArg>1 ) break;
8399    }
8400    if( nArg>1 && ii==ArraySize(aDbConfig) ){
8401      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
8402      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
8403    }
8404  }else
8405
8406  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
8407    rc = shell_dbinfo_command(p, nArg, azArg);
8408  }else
8409
8410#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8411  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
8412    open_db(p, 0);
8413    rc = recoverDatabaseCmd(p, nArg, azArg);
8414  }else
8415#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
8416
8417  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
8418    char *zLike = 0;
8419    char *zSql;
8420    int i;
8421    int savedShowHeader = p->showHeader;
8422    int savedShellFlags = p->shellFlgs;
8423    ShellClearFlag(p,
8424       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
8425       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
8426    for(i=1; i<nArg; i++){
8427      if( azArg[i][0]=='-' ){
8428        const char *z = azArg[i]+1;
8429        if( z[0]=='-' ) z++;
8430        if( strcmp(z,"preserve-rowids")==0 ){
8431#ifdef SQLITE_OMIT_VIRTUALTABLE
8432          raw_printf(stderr, "The --preserve-rowids option is not compatible"
8433                             " with SQLITE_OMIT_VIRTUALTABLE\n");
8434          rc = 1;
8435          sqlite3_free(zLike);
8436          goto meta_command_exit;
8437#else
8438          ShellSetFlag(p, SHFLG_PreserveRowid);
8439#endif
8440        }else
8441        if( strcmp(z,"newlines")==0 ){
8442          ShellSetFlag(p, SHFLG_Newlines);
8443        }else
8444        if( strcmp(z,"data-only")==0 ){
8445          ShellSetFlag(p, SHFLG_DumpDataOnly);
8446        }else
8447        if( strcmp(z,"nosys")==0 ){
8448          ShellSetFlag(p, SHFLG_DumpNoSys);
8449        }else
8450        {
8451          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8452          rc = 1;
8453          sqlite3_free(zLike);
8454          goto meta_command_exit;
8455        }
8456      }else{
8457        /* azArg[i] contains a LIKE pattern. This ".dump" request should
8458        ** only dump data for tables for which either the table name matches
8459        ** the LIKE pattern, or the table appears to be a shadow table of
8460        ** a virtual table for which the name matches the LIKE pattern.
8461        */
8462        char *zExpr = sqlite3_mprintf(
8463            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8464            "  SELECT 1 FROM sqlite_schema WHERE "
8465            "    name LIKE %Q ESCAPE '\\' AND"
8466            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8467            "    substr(o.name, 1, length(name)+1) == (name||'_')"
8468            ")", azArg[i], azArg[i]
8469        );
8470
8471        if( zLike ){
8472          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8473        }else{
8474          zLike = zExpr;
8475        }
8476      }
8477    }
8478
8479    open_db(p, 0);
8480
8481    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8482      /* When playing back a "dump", the content might appear in an order
8483      ** which causes immediate foreign key constraints to be violated.
8484      ** So disable foreign-key constraint enforcement to prevent problems. */
8485      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8486      raw_printf(p->out, "BEGIN TRANSACTION;\n");
8487    }
8488    p->writableSchema = 0;
8489    p->showHeader = 0;
8490    /* Set writable_schema=ON since doing so forces SQLite to initialize
8491    ** as much of the schema as it can even if the sqlite_schema table is
8492    ** corrupt. */
8493    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8494    p->nErr = 0;
8495    if( zLike==0 ) zLike = sqlite3_mprintf("true");
8496    zSql = sqlite3_mprintf(
8497      "SELECT name, type, sql FROM sqlite_schema AS o "
8498      "WHERE (%s) AND type=='table'"
8499      "  AND sql NOT NULL"
8500      " ORDER BY tbl_name='sqlite_sequence', rowid",
8501      zLike
8502    );
8503    run_schema_dump_query(p,zSql);
8504    sqlite3_free(zSql);
8505    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8506      zSql = sqlite3_mprintf(
8507        "SELECT sql FROM sqlite_schema AS o "
8508        "WHERE (%s) AND sql NOT NULL"
8509        "  AND type IN ('index','trigger','view')",
8510        zLike
8511      );
8512      run_table_dump_query(p, zSql);
8513      sqlite3_free(zSql);
8514    }
8515    sqlite3_free(zLike);
8516    if( p->writableSchema ){
8517      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8518      p->writableSchema = 0;
8519    }
8520    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8521    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8522    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8523      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8524    }
8525    p->showHeader = savedShowHeader;
8526    p->shellFlgs = savedShellFlags;
8527  }else
8528
8529  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8530    if( nArg==2 ){
8531      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8532    }else{
8533      raw_printf(stderr, "Usage: .echo on|off\n");
8534      rc = 1;
8535    }
8536  }else
8537
8538  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8539    if( nArg==2 ){
8540      p->autoEQPtest = 0;
8541      if( p->autoEQPtrace ){
8542        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8543        p->autoEQPtrace = 0;
8544      }
8545      if( strcmp(azArg[1],"full")==0 ){
8546        p->autoEQP = AUTOEQP_full;
8547      }else if( strcmp(azArg[1],"trigger")==0 ){
8548        p->autoEQP = AUTOEQP_trigger;
8549#ifdef SQLITE_DEBUG
8550      }else if( strcmp(azArg[1],"test")==0 ){
8551        p->autoEQP = AUTOEQP_on;
8552        p->autoEQPtest = 1;
8553      }else if( strcmp(azArg[1],"trace")==0 ){
8554        p->autoEQP = AUTOEQP_full;
8555        p->autoEQPtrace = 1;
8556        open_db(p, 0);
8557        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8558        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8559#endif
8560      }else{
8561        p->autoEQP = (u8)booleanValue(azArg[1]);
8562      }
8563    }else{
8564      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8565      rc = 1;
8566    }
8567  }else
8568
8569  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8570    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8571    rc = 2;
8572  }else
8573
8574  /* The ".explain" command is automatic now.  It is largely pointless.  It
8575  ** retained purely for backwards compatibility */
8576  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8577    int val = 1;
8578    if( nArg>=2 ){
8579      if( strcmp(azArg[1],"auto")==0 ){
8580        val = 99;
8581      }else{
8582        val =  booleanValue(azArg[1]);
8583      }
8584    }
8585    if( val==1 && p->mode!=MODE_Explain ){
8586      p->normalMode = p->mode;
8587      p->mode = MODE_Explain;
8588      p->autoExplain = 0;
8589    }else if( val==0 ){
8590      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8591      p->autoExplain = 0;
8592    }else if( val==99 ){
8593      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8594      p->autoExplain = 1;
8595    }
8596  }else
8597
8598#ifndef SQLITE_OMIT_VIRTUALTABLE
8599  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8600    if( p->bSafeMode ){
8601      raw_printf(stderr,
8602        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8603        azArg[0]);
8604      rc = 1;
8605    }else{
8606      open_db(p, 0);
8607      expertDotCommand(p, azArg, nArg);
8608    }
8609  }else
8610#endif
8611
8612  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8613    static const struct {
8614       const char *zCtrlName;   /* Name of a test-control option */
8615       int ctrlCode;            /* Integer code for that option */
8616       const char *zUsage;      /* Usage notes */
8617    } aCtrl[] = {
8618      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8619      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8620      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8621      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8622      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8623   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8624      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8625      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8626      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8627      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8628   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8629    };
8630    int filectrl = -1;
8631    int iCtrl = -1;
8632    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8633    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8634    int n2, i;
8635    const char *zCmd = 0;
8636    const char *zSchema = 0;
8637
8638    open_db(p, 0);
8639    zCmd = nArg>=2 ? azArg[1] : "help";
8640
8641    if( zCmd[0]=='-'
8642     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8643     && nArg>=4
8644    ){
8645      zSchema = azArg[2];
8646      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8647      nArg -= 2;
8648      zCmd = azArg[1];
8649    }
8650
8651    /* The argument can optionally begin with "-" or "--" */
8652    if( zCmd[0]=='-' && zCmd[1] ){
8653      zCmd++;
8654      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8655    }
8656
8657    /* --help lists all file-controls */
8658    if( strcmp(zCmd,"help")==0 ){
8659      utf8_printf(p->out, "Available file-controls:\n");
8660      for(i=0; i<ArraySize(aCtrl); i++){
8661        utf8_printf(p->out, "  .filectrl %s %s\n",
8662                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8663      }
8664      rc = 1;
8665      goto meta_command_exit;
8666    }
8667
8668    /* convert filectrl text option to value. allow any unique prefix
8669    ** of the option name, or a numerical value. */
8670    n2 = strlen30(zCmd);
8671    for(i=0; i<ArraySize(aCtrl); i++){
8672      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8673        if( filectrl<0 ){
8674          filectrl = aCtrl[i].ctrlCode;
8675          iCtrl = i;
8676        }else{
8677          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8678                              "Use \".filectrl --help\" for help\n", zCmd);
8679          rc = 1;
8680          goto meta_command_exit;
8681        }
8682      }
8683    }
8684    if( filectrl<0 ){
8685      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8686                         "Use \".filectrl --help\" for help\n", zCmd);
8687    }else{
8688      switch(filectrl){
8689        case SQLITE_FCNTL_SIZE_LIMIT: {
8690          if( nArg!=2 && nArg!=3 ) break;
8691          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8692          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8693          isOk = 1;
8694          break;
8695        }
8696        case SQLITE_FCNTL_LOCK_TIMEOUT:
8697        case SQLITE_FCNTL_CHUNK_SIZE: {
8698          int x;
8699          if( nArg!=3 ) break;
8700          x = (int)integerValue(azArg[2]);
8701          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8702          isOk = 2;
8703          break;
8704        }
8705        case SQLITE_FCNTL_PERSIST_WAL:
8706        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8707          int x;
8708          if( nArg!=2 && nArg!=3 ) break;
8709          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8710          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8711          iRes = x;
8712          isOk = 1;
8713          break;
8714        }
8715        case SQLITE_FCNTL_DATA_VERSION:
8716        case SQLITE_FCNTL_HAS_MOVED: {
8717          int x;
8718          if( nArg!=2 ) break;
8719          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8720          iRes = x;
8721          isOk = 1;
8722          break;
8723        }
8724        case SQLITE_FCNTL_TEMPFILENAME: {
8725          char *z = 0;
8726          if( nArg!=2 ) break;
8727          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8728          if( z ){
8729            utf8_printf(p->out, "%s\n", z);
8730            sqlite3_free(z);
8731          }
8732          isOk = 2;
8733          break;
8734        }
8735        case SQLITE_FCNTL_RESERVE_BYTES: {
8736          int x;
8737          if( nArg>=3 ){
8738            x = atoi(azArg[2]);
8739            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8740          }
8741          x = -1;
8742          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8743          utf8_printf(p->out,"%d\n", x);
8744          isOk = 2;
8745          break;
8746        }
8747      }
8748    }
8749    if( isOk==0 && iCtrl>=0 ){
8750      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8751      rc = 1;
8752    }else if( isOk==1 ){
8753      char zBuf[100];
8754      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8755      raw_printf(p->out, "%s\n", zBuf);
8756    }
8757  }else
8758
8759  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8760    ShellState data;
8761    int doStats = 0;
8762    memcpy(&data, p, sizeof(data));
8763    data.showHeader = 0;
8764    data.cMode = data.mode = MODE_Semi;
8765    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8766      data.cMode = data.mode = MODE_Pretty;
8767      nArg = 1;
8768    }
8769    if( nArg!=1 ){
8770      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8771      rc = 1;
8772      goto meta_command_exit;
8773    }
8774    open_db(p, 0);
8775    rc = sqlite3_exec(p->db,
8776       "SELECT sql FROM"
8777       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8778       "     FROM sqlite_schema UNION ALL"
8779       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8780       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8781       "ORDER BY x",
8782       callback, &data, 0
8783    );
8784    if( rc==SQLITE_OK ){
8785      sqlite3_stmt *pStmt;
8786      rc = sqlite3_prepare_v2(p->db,
8787               "SELECT rowid FROM sqlite_schema"
8788               " WHERE name GLOB 'sqlite_stat[134]'",
8789               -1, &pStmt, 0);
8790      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8791      sqlite3_finalize(pStmt);
8792    }
8793    if( doStats==0 ){
8794      raw_printf(p->out, "/* No STAT tables available */\n");
8795    }else{
8796      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8797      data.cMode = data.mode = MODE_Insert;
8798      data.zDestTable = "sqlite_stat1";
8799      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8800      data.zDestTable = "sqlite_stat4";
8801      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8802      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8803    }
8804  }else
8805
8806  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8807    if( nArg==2 ){
8808      p->showHeader = booleanValue(azArg[1]);
8809      p->shellFlgs |= SHFLG_HeaderSet;
8810    }else{
8811      raw_printf(stderr, "Usage: .headers on|off\n");
8812      rc = 1;
8813    }
8814  }else
8815
8816  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8817    if( nArg>=2 ){
8818      n = showHelp(p->out, azArg[1]);
8819      if( n==0 ){
8820        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8821      }
8822    }else{
8823      showHelp(p->out, 0);
8824    }
8825  }else
8826
8827  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8828    char *zTable = 0;           /* Insert data into this table */
8829    char *zSchema = "main";     /* within this schema */
8830    char *zFile = 0;            /* Name of file to extra content from */
8831    sqlite3_stmt *pStmt = NULL; /* A statement */
8832    int nCol;                   /* Number of columns in the table */
8833    int nByte;                  /* Number of bytes in an SQL string */
8834    int i, j;                   /* Loop counters */
8835    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8836    int nSep;                   /* Number of bytes in p->colSeparator[] */
8837    char *zSql;                 /* An SQL statement */
8838    ImportCtx sCtx;             /* Reader context */
8839    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8840    int eVerbose = 0;           /* Larger for more console output */
8841    int nSkip = 0;              /* Initial lines to skip */
8842    int useOutputMode = 1;      /* Use output mode to determine separators */
8843
8844    failIfSafeMode(p, "cannot run .import in safe mode");
8845    memset(&sCtx, 0, sizeof(sCtx));
8846    sCtx.z = sqlite3_malloc64(120);
8847    if( sCtx.z==0 ){
8848      import_cleanup(&sCtx);
8849      shell_out_of_memory();
8850    }
8851    if( p->mode==MODE_Ascii ){
8852      xRead = ascii_read_one_field;
8853    }else{
8854      xRead = csv_read_one_field;
8855    }
8856    for(i=1; i<nArg; i++){
8857      char *z = azArg[i];
8858      if( z[0]=='-' && z[1]=='-' ) z++;
8859      if( z[0]!='-' ){
8860        if( zFile==0 ){
8861          zFile = z;
8862        }else if( zTable==0 ){
8863          zTable = z;
8864        }else{
8865          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8866          showHelp(p->out, "import");
8867          rc = 1;
8868          goto meta_command_exit;
8869        }
8870      }else if( strcmp(z,"-v")==0 ){
8871        eVerbose++;
8872      }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){
8873        zSchema = azArg[++i];
8874      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8875        nSkip = integerValue(azArg[++i]);
8876      }else if( strcmp(z,"-ascii")==0 ){
8877        sCtx.cColSep = SEP_Unit[0];
8878        sCtx.cRowSep = SEP_Record[0];
8879        xRead = ascii_read_one_field;
8880        useOutputMode = 0;
8881      }else if( strcmp(z,"-csv")==0 ){
8882        sCtx.cColSep = ',';
8883        sCtx.cRowSep = '\n';
8884        xRead = csv_read_one_field;
8885        useOutputMode = 0;
8886      }else{
8887        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8888        showHelp(p->out, "import");
8889        rc = 1;
8890        goto meta_command_exit;
8891      }
8892    }
8893    if( zTable==0 ){
8894      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8895                  zFile==0 ? "FILE" : "TABLE");
8896      showHelp(p->out, "import");
8897      rc = 1;
8898      goto meta_command_exit;
8899    }
8900    seenInterrupt = 0;
8901    open_db(p, 0);
8902    if( useOutputMode ){
8903      /* If neither the --csv or --ascii options are specified, then set
8904      ** the column and row separator characters from the output mode. */
8905      nSep = strlen30(p->colSeparator);
8906      if( nSep==0 ){
8907        raw_printf(stderr,
8908                   "Error: non-null column separator required for import\n");
8909        rc = 1;
8910        goto meta_command_exit;
8911      }
8912      if( nSep>1 ){
8913        raw_printf(stderr,
8914              "Error: multi-character column separators not allowed"
8915              " for import\n");
8916        rc = 1;
8917        goto meta_command_exit;
8918      }
8919      nSep = strlen30(p->rowSeparator);
8920      if( nSep==0 ){
8921        raw_printf(stderr,
8922            "Error: non-null row separator required for import\n");
8923        rc = 1;
8924        goto meta_command_exit;
8925      }
8926      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8927        /* When importing CSV (only), if the row separator is set to the
8928        ** default output row separator, change it to the default input
8929        ** row separator.  This avoids having to maintain different input
8930        ** and output row separators. */
8931        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8932        nSep = strlen30(p->rowSeparator);
8933      }
8934      if( nSep>1 ){
8935        raw_printf(stderr, "Error: multi-character row separators not allowed"
8936                           " for import\n");
8937        rc = 1;
8938        goto meta_command_exit;
8939      }
8940      sCtx.cColSep = p->colSeparator[0];
8941      sCtx.cRowSep = p->rowSeparator[0];
8942    }
8943    sCtx.zFile = zFile;
8944    sCtx.nLine = 1;
8945    if( sCtx.zFile[0]=='|' ){
8946#ifdef SQLITE_OMIT_POPEN
8947      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8948      rc = 1;
8949      goto meta_command_exit;
8950#else
8951      sCtx.in = popen(sCtx.zFile+1, "r");
8952      sCtx.zFile = "<pipe>";
8953      sCtx.xCloser = pclose;
8954#endif
8955    }else{
8956      sCtx.in = fopen(sCtx.zFile, "rb");
8957      sCtx.xCloser = fclose;
8958    }
8959    if( sCtx.in==0 ){
8960      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8961      rc = 1;
8962      import_cleanup(&sCtx);
8963      goto meta_command_exit;
8964    }
8965    /* Below, resources must be freed before exit. */
8966    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8967      char zSep[2];
8968      zSep[1] = 0;
8969      zSep[0] = sCtx.cColSep;
8970      utf8_printf(p->out, "Column separator ");
8971      output_c_string(p->out, zSep);
8972      utf8_printf(p->out, ", row separator ");
8973      zSep[0] = sCtx.cRowSep;
8974      output_c_string(p->out, zSep);
8975      utf8_printf(p->out, "\n");
8976    }
8977    while( (nSkip--)>0 ){
8978      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8979    }
8980    zSql = sqlite3_mprintf("SELECT * FROM \"%w\".\"%w\"", zSchema, zTable);
8981    if( zSql==0 ){
8982      import_cleanup(&sCtx);
8983      shell_out_of_memory();
8984    }
8985    nByte = strlen30(zSql);
8986    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8987    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8988    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8989      char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"",
8990                                      zSchema, zTable);
8991      sqlite3 *dbCols = 0;
8992      char *zRenames = 0;
8993      char *zColDefs;
8994      while( xRead(&sCtx) ){
8995        zAutoColumn(sCtx.z, &dbCols, 0);
8996        if( sCtx.cTerm!=sCtx.cColSep ) break;
8997      }
8998      zColDefs = zAutoColumn(0, &dbCols, &zRenames);
8999      if( zRenames!=0 ){
9000        utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
9001                    "Columns renamed during .import %s due to duplicates:\n"
9002                    "%s\n", sCtx.zFile, zRenames);
9003        sqlite3_free(zRenames);
9004      }
9005      assert(dbCols==0);
9006      if( zColDefs==0 ){
9007        sqlite3_free(zCreate);
9008        import_cleanup(&sCtx);
9009        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
9010        rc = 1;
9011        goto meta_command_exit;
9012      }
9013      zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
9014      if( eVerbose>=1 ){
9015        utf8_printf(p->out, "%s\n", zCreate);
9016      }
9017      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
9018      if( rc ){
9019        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
9020        sqlite3_free(zCreate);
9021        import_cleanup(&sCtx);
9022        rc = 1;
9023        goto meta_command_exit;
9024      }
9025      sqlite3_free(zCreate);
9026      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9027    }
9028    sqlite3_free(zSql);
9029    if( rc ){
9030      if (pStmt) sqlite3_finalize(pStmt);
9031      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
9032      import_cleanup(&sCtx);
9033      rc = 1;
9034      goto meta_command_exit;
9035    }
9036    nCol = sqlite3_column_count(pStmt);
9037    sqlite3_finalize(pStmt);
9038    pStmt = 0;
9039    if( nCol==0 ) return 0; /* no columns, no error */
9040    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
9041    if( zSql==0 ){
9042      import_cleanup(&sCtx);
9043      shell_out_of_memory();
9044    }
9045    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?",
9046                     zSchema, zTable);
9047    j = strlen30(zSql);
9048    for(i=1; i<nCol; i++){
9049      zSql[j++] = ',';
9050      zSql[j++] = '?';
9051    }
9052    zSql[j++] = ')';
9053    zSql[j] = 0;
9054    if( eVerbose>=2 ){
9055      utf8_printf(p->out, "Insert using: %s\n", zSql);
9056    }
9057    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9058    sqlite3_free(zSql);
9059    if( rc ){
9060      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9061      if (pStmt) sqlite3_finalize(pStmt);
9062      import_cleanup(&sCtx);
9063      rc = 1;
9064      goto meta_command_exit;
9065    }
9066    needCommit = sqlite3_get_autocommit(p->db);
9067    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
9068    do{
9069      int startLine = sCtx.nLine;
9070      for(i=0; i<nCol; i++){
9071        char *z = xRead(&sCtx);
9072        /*
9073        ** Did we reach end-of-file before finding any columns?
9074        ** If so, stop instead of NULL filling the remaining columns.
9075        */
9076        if( z==0 && i==0 ) break;
9077        /*
9078        ** Did we reach end-of-file OR end-of-line before finding any
9079        ** columns in ASCII mode?  If so, stop instead of NULL filling
9080        ** the remaining columns.
9081        */
9082        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
9083        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
9084        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
9085          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9086                          "filling the rest with NULL\n",
9087                          sCtx.zFile, startLine, nCol, i+1);
9088          i += 2;
9089          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
9090        }
9091      }
9092      if( sCtx.cTerm==sCtx.cColSep ){
9093        do{
9094          xRead(&sCtx);
9095          i++;
9096        }while( sCtx.cTerm==sCtx.cColSep );
9097        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9098                        "extras ignored\n",
9099                        sCtx.zFile, startLine, nCol, i);
9100      }
9101      if( i>=nCol ){
9102        sqlite3_step(pStmt);
9103        rc = sqlite3_reset(pStmt);
9104        if( rc!=SQLITE_OK ){
9105          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
9106                      startLine, sqlite3_errmsg(p->db));
9107          sCtx.nErr++;
9108        }else{
9109          sCtx.nRow++;
9110        }
9111      }
9112    }while( sCtx.cTerm!=EOF );
9113
9114    import_cleanup(&sCtx);
9115    sqlite3_finalize(pStmt);
9116    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
9117    if( eVerbose>0 ){
9118      utf8_printf(p->out,
9119          "Added %d rows with %d errors using %d lines of input\n",
9120          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
9121    }
9122  }else
9123
9124#ifndef SQLITE_UNTESTABLE
9125  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
9126    char *zSql;
9127    char *zCollist = 0;
9128    sqlite3_stmt *pStmt;
9129    int tnum = 0;
9130    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
9131    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
9132    int i;
9133    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
9134      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
9135                          "       .imposter off\n");
9136      /* Also allowed, but not documented:
9137      **
9138      **    .imposter TABLE IMPOSTER
9139      **
9140      ** where TABLE is a WITHOUT ROWID table.  In that case, the
9141      ** imposter is another WITHOUT ROWID table with the columns in
9142      ** storage order. */
9143      rc = 1;
9144      goto meta_command_exit;
9145    }
9146    open_db(p, 0);
9147    if( nArg==2 ){
9148      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
9149      goto meta_command_exit;
9150    }
9151    zSql = sqlite3_mprintf(
9152      "SELECT rootpage, 0 FROM sqlite_schema"
9153      " WHERE name='%q' AND type='index'"
9154      "UNION ALL "
9155      "SELECT rootpage, 1 FROM sqlite_schema"
9156      " WHERE name='%q' AND type='table'"
9157      "   AND sql LIKE '%%without%%rowid%%'",
9158      azArg[1], azArg[1]
9159    );
9160    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9161    sqlite3_free(zSql);
9162    if( sqlite3_step(pStmt)==SQLITE_ROW ){
9163      tnum = sqlite3_column_int(pStmt, 0);
9164      isWO = sqlite3_column_int(pStmt, 1);
9165    }
9166    sqlite3_finalize(pStmt);
9167    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
9168    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9169    sqlite3_free(zSql);
9170    i = 0;
9171    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9172      char zLabel[20];
9173      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
9174      i++;
9175      if( zCol==0 ){
9176        if( sqlite3_column_int(pStmt,1)==-1 ){
9177          zCol = "_ROWID_";
9178        }else{
9179          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
9180          zCol = zLabel;
9181        }
9182      }
9183      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
9184        lenPK = (int)strlen(zCollist);
9185      }
9186      if( zCollist==0 ){
9187        zCollist = sqlite3_mprintf("\"%w\"", zCol);
9188      }else{
9189        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
9190      }
9191    }
9192    sqlite3_finalize(pStmt);
9193    if( i==0 || tnum==0 ){
9194      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
9195      rc = 1;
9196      sqlite3_free(zCollist);
9197      goto meta_command_exit;
9198    }
9199    if( lenPK==0 ) lenPK = 100000;
9200    zSql = sqlite3_mprintf(
9201          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
9202          azArg[2], zCollist, lenPK, zCollist);
9203    sqlite3_free(zCollist);
9204    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
9205    if( rc==SQLITE_OK ){
9206      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
9207      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
9208      if( rc ){
9209        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
9210      }else{
9211        utf8_printf(stdout, "%s;\n", zSql);
9212        raw_printf(stdout,
9213          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
9214          azArg[1], isWO ? "table" : "index"
9215        );
9216      }
9217    }else{
9218      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
9219      rc = 1;
9220    }
9221    sqlite3_free(zSql);
9222  }else
9223#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
9224
9225#ifdef SQLITE_ENABLE_IOTRACE
9226  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
9227    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
9228    if( iotrace && iotrace!=stdout ) fclose(iotrace);
9229    iotrace = 0;
9230    if( nArg<2 ){
9231      sqlite3IoTrace = 0;
9232    }else if( strcmp(azArg[1], "-")==0 ){
9233      sqlite3IoTrace = iotracePrintf;
9234      iotrace = stdout;
9235    }else{
9236      iotrace = fopen(azArg[1], "w");
9237      if( iotrace==0 ){
9238        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9239        sqlite3IoTrace = 0;
9240        rc = 1;
9241      }else{
9242        sqlite3IoTrace = iotracePrintf;
9243      }
9244    }
9245  }else
9246#endif
9247
9248  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
9249    static const struct {
9250       const char *zLimitName;   /* Name of a limit */
9251       int limitCode;            /* Integer code for that limit */
9252    } aLimit[] = {
9253      { "length",                SQLITE_LIMIT_LENGTH                    },
9254      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
9255      { "column",                SQLITE_LIMIT_COLUMN                    },
9256      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
9257      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
9258      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
9259      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
9260      { "attached",              SQLITE_LIMIT_ATTACHED                  },
9261      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
9262      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
9263      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
9264      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
9265    };
9266    int i, n2;
9267    open_db(p, 0);
9268    if( nArg==1 ){
9269      for(i=0; i<ArraySize(aLimit); i++){
9270        printf("%20s %d\n", aLimit[i].zLimitName,
9271               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
9272      }
9273    }else if( nArg>3 ){
9274      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
9275      rc = 1;
9276      goto meta_command_exit;
9277    }else{
9278      int iLimit = -1;
9279      n2 = strlen30(azArg[1]);
9280      for(i=0; i<ArraySize(aLimit); i++){
9281        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
9282          if( iLimit<0 ){
9283            iLimit = i;
9284          }else{
9285            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
9286            rc = 1;
9287            goto meta_command_exit;
9288          }
9289        }
9290      }
9291      if( iLimit<0 ){
9292        utf8_printf(stderr, "unknown limit: \"%s\"\n"
9293                        "enter \".limits\" with no arguments for a list.\n",
9294                         azArg[1]);
9295        rc = 1;
9296        goto meta_command_exit;
9297      }
9298      if( nArg==3 ){
9299        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
9300                      (int)integerValue(azArg[2]));
9301      }
9302      printf("%20s %d\n", aLimit[iLimit].zLimitName,
9303             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
9304    }
9305  }else
9306
9307  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
9308    open_db(p, 0);
9309    lintDotCommand(p, azArg, nArg);
9310  }else
9311
9312#ifndef SQLITE_OMIT_LOAD_EXTENSION
9313  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
9314    const char *zFile, *zProc;
9315    char *zErrMsg = 0;
9316    failIfSafeMode(p, "cannot run .load in safe mode");
9317    if( nArg<2 ){
9318      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
9319      rc = 1;
9320      goto meta_command_exit;
9321    }
9322    zFile = azArg[1];
9323    zProc = nArg>=3 ? azArg[2] : 0;
9324    open_db(p, 0);
9325    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
9326    if( rc!=SQLITE_OK ){
9327      utf8_printf(stderr, "Error: %s\n", zErrMsg);
9328      sqlite3_free(zErrMsg);
9329      rc = 1;
9330    }
9331  }else
9332#endif
9333
9334  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
9335    failIfSafeMode(p, "cannot run .log in safe mode");
9336    if( nArg!=2 ){
9337      raw_printf(stderr, "Usage: .log FILENAME\n");
9338      rc = 1;
9339    }else{
9340      const char *zFile = azArg[1];
9341      output_file_close(p->pLog);
9342      p->pLog = output_file_open(zFile, 0);
9343    }
9344  }else
9345
9346  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
9347    const char *zMode = 0;
9348    const char *zTabname = 0;
9349    int i, n2;
9350    ColModeOpts cmOpts = ColModeOpts_default;
9351    for(i=1; i<nArg; i++){
9352      const char *z = azArg[i];
9353      if( optionMatch(z,"wrap") && i+1<nArg ){
9354        cmOpts.iWrap = integerValue(azArg[++i]);
9355      }else if( optionMatch(z,"ww") ){
9356        cmOpts.bWordWrap = 1;
9357      }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
9358        cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
9359      }else if( optionMatch(z,"quote") ){
9360        cmOpts.bQuote = 1;
9361      }else if( optionMatch(z,"noquote") ){
9362        cmOpts.bQuote = 0;
9363      }else if( zMode==0 ){
9364        zMode = z;
9365        /* Apply defaults for qbox pseudo-mods. If that
9366         * overwrites already-set values, user was informed of this.
9367         */
9368        if( strcmp(z, "qbox")==0 ){
9369          ColModeOpts cmo = ColModeOpts_default_qbox;
9370          zMode = "box";
9371          cmOpts = cmo;
9372        }
9373      }else if( zTabname==0 ){
9374        zTabname = z;
9375      }else if( z[0]=='-' ){
9376        utf8_printf(stderr, "unknown option: %s\n", z);
9377        utf8_printf(stderr, "options:\n"
9378                            "  --noquote\n"
9379                            "  --quote\n"
9380                            "  --wordwrap on/off\n"
9381                            "  --wrap N\n"
9382                            "  --ww\n");
9383        rc = 1;
9384        goto meta_command_exit;
9385      }else{
9386        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9387        rc = 1;
9388        goto meta_command_exit;
9389      }
9390    }
9391    if( zMode==0 ){
9392      if( p->mode==MODE_Column
9393       || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
9394      ){
9395        raw_printf
9396          (p->out,
9397           "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
9398           modeDescr[p->mode], p->cmOpts.iWrap,
9399           p->cmOpts.bWordWrap ? "on" : "off",
9400           p->cmOpts.bQuote ? "" : "no");
9401      }else{
9402        raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
9403      }
9404      zMode = modeDescr[p->mode];
9405    }
9406    n2 = strlen30(zMode);
9407    if( strncmp(zMode,"lines",n2)==0 ){
9408      p->mode = MODE_Line;
9409      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9410    }else if( strncmp(zMode,"columns",n2)==0 ){
9411      p->mode = MODE_Column;
9412      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
9413        p->showHeader = 1;
9414      }
9415      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9416      p->cmOpts = cmOpts;
9417    }else if( strncmp(zMode,"list",n2)==0 ){
9418      p->mode = MODE_List;
9419      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
9420      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9421    }else if( strncmp(zMode,"html",n2)==0 ){
9422      p->mode = MODE_Html;
9423    }else if( strncmp(zMode,"tcl",n2)==0 ){
9424      p->mode = MODE_Tcl;
9425      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
9426      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9427    }else if( strncmp(zMode,"csv",n2)==0 ){
9428      p->mode = MODE_Csv;
9429      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9430      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9431    }else if( strncmp(zMode,"tabs",n2)==0 ){
9432      p->mode = MODE_List;
9433      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
9434    }else if( strncmp(zMode,"insert",n2)==0 ){
9435      p->mode = MODE_Insert;
9436      set_table_name(p, zTabname ? zTabname : "table");
9437    }else if( strncmp(zMode,"quote",n2)==0 ){
9438      p->mode = MODE_Quote;
9439      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9440      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9441    }else if( strncmp(zMode,"ascii",n2)==0 ){
9442      p->mode = MODE_Ascii;
9443      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
9444      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
9445    }else if( strncmp(zMode,"markdown",n2)==0 ){
9446      p->mode = MODE_Markdown;
9447      p->cmOpts = cmOpts;
9448    }else if( strncmp(zMode,"table",n2)==0 ){
9449      p->mode = MODE_Table;
9450      p->cmOpts = cmOpts;
9451    }else if( strncmp(zMode,"box",n2)==0 ){
9452      p->mode = MODE_Box;
9453      p->cmOpts = cmOpts;
9454    }else if( strncmp(zMode,"count",n2)==0 ){
9455      p->mode = MODE_Count;
9456    }else if( strncmp(zMode,"off",n2)==0 ){
9457      p->mode = MODE_Off;
9458    }else if( strncmp(zMode,"json",n2)==0 ){
9459      p->mode = MODE_Json;
9460    }else{
9461      raw_printf(stderr, "Error: mode should be one of: "
9462         "ascii box column csv html insert json line list markdown "
9463         "qbox quote table tabs tcl\n");
9464      rc = 1;
9465    }
9466    p->cMode = p->mode;
9467  }else
9468
9469  if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
9470    if( nArg!=2 ){
9471      raw_printf(stderr, "Usage: .nonce NONCE\n");
9472      rc = 1;
9473    }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
9474      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
9475                 p->lineno, azArg[1]);
9476      exit(1);
9477    }else{
9478      p->bSafeMode = 0;
9479      return 0;  /* Return immediately to bypass the safe mode reset
9480                 ** at the end of this procedure */
9481    }
9482  }else
9483
9484  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
9485    if( nArg==2 ){
9486      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
9487                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
9488    }else{
9489      raw_printf(stderr, "Usage: .nullvalue STRING\n");
9490      rc = 1;
9491    }
9492  }else
9493
9494  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
9495    const char *zFN = 0;     /* Pointer to constant filename */
9496    char *zNewFilename = 0;  /* Name of the database file to open */
9497    int iName = 1;           /* Index in azArg[] of the filename */
9498    int newFlag = 0;         /* True to delete file before opening */
9499    int openMode = SHELL_OPEN_UNSPEC;
9500
9501    /* Check for command-line arguments */
9502    for(iName=1; iName<nArg; iName++){
9503      const char *z = azArg[iName];
9504      if( optionMatch(z,"new") ){
9505        newFlag = 1;
9506#ifdef SQLITE_HAVE_ZLIB
9507      }else if( optionMatch(z, "zip") ){
9508        openMode = SHELL_OPEN_ZIPFILE;
9509#endif
9510      }else if( optionMatch(z, "append") ){
9511        openMode = SHELL_OPEN_APPENDVFS;
9512      }else if( optionMatch(z, "readonly") ){
9513        openMode = SHELL_OPEN_READONLY;
9514      }else if( optionMatch(z, "nofollow") ){
9515        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
9516#ifndef SQLITE_OMIT_DESERIALIZE
9517      }else if( optionMatch(z, "deserialize") ){
9518        openMode = SHELL_OPEN_DESERIALIZE;
9519      }else if( optionMatch(z, "hexdb") ){
9520        openMode = SHELL_OPEN_HEXDB;
9521      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
9522        p->szMax = integerValue(azArg[++iName]);
9523#endif /* SQLITE_OMIT_DESERIALIZE */
9524      }else if( z[0]=='-' ){
9525        utf8_printf(stderr, "unknown option: %s\n", z);
9526        rc = 1;
9527        goto meta_command_exit;
9528      }else if( zFN ){
9529        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9530        rc = 1;
9531        goto meta_command_exit;
9532      }else{
9533        zFN = z;
9534      }
9535    }
9536
9537    /* Close the existing database */
9538    session_close_all(p, -1);
9539    close_db(p->db);
9540    p->db = 0;
9541    p->pAuxDb->zDbFilename = 0;
9542    sqlite3_free(p->pAuxDb->zFreeOnClose);
9543    p->pAuxDb->zFreeOnClose = 0;
9544    p->openMode = openMode;
9545    p->openFlags = 0;
9546    p->szMax = 0;
9547
9548    /* If a filename is specified, try to open it first */
9549    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9550      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9551      if( p->bSafeMode
9552       && p->openMode!=SHELL_OPEN_HEXDB
9553       && zFN
9554       && strcmp(zFN,":memory:")!=0
9555      ){
9556        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9557      }
9558      if( zFN ){
9559        zNewFilename = sqlite3_mprintf("%s", zFN);
9560        shell_check_oom(zNewFilename);
9561      }else{
9562        zNewFilename = 0;
9563      }
9564      p->pAuxDb->zDbFilename = zNewFilename;
9565      open_db(p, OPEN_DB_KEEPALIVE);
9566      if( p->db==0 ){
9567        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9568        sqlite3_free(zNewFilename);
9569      }else{
9570        p->pAuxDb->zFreeOnClose = zNewFilename;
9571      }
9572    }
9573    if( p->db==0 ){
9574      /* As a fall-back open a TEMP database */
9575      p->pAuxDb->zDbFilename = 0;
9576      open_db(p, 0);
9577    }
9578  }else
9579
9580  if( (c=='o'
9581        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9582   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9583  ){
9584    char *zFile = 0;
9585    int bTxtMode = 0;
9586    int i;
9587    int eMode = 0;
9588    int bBOM = 0;
9589    int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
9590
9591    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9592    if( c=='e' ){
9593      eMode = 'x';
9594      bOnce = 2;
9595    }else if( strncmp(azArg[0],"once",n)==0 ){
9596      bOnce = 1;
9597    }
9598    for(i=1; i<nArg; i++){
9599      char *z = azArg[i];
9600      if( z[0]=='-' ){
9601        if( z[1]=='-' ) z++;
9602        if( strcmp(z,"-bom")==0 ){
9603          bBOM = 1;
9604        }else if( c!='e' && strcmp(z,"-x")==0 ){
9605          eMode = 'x';  /* spreadsheet */
9606        }else if( c!='e' && strcmp(z,"-e")==0 ){
9607          eMode = 'e';  /* text editor */
9608        }else{
9609          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9610                      azArg[i]);
9611          showHelp(p->out, azArg[0]);
9612          rc = 1;
9613          goto meta_command_exit;
9614        }
9615      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9616        zFile = sqlite3_mprintf("%s", z);
9617        if( zFile && zFile[0]=='|' ){
9618          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9619          break;
9620        }
9621      }else{
9622        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9623                    azArg[i]);
9624        showHelp(p->out, azArg[0]);
9625        rc = 1;
9626        sqlite3_free(zFile);
9627        goto meta_command_exit;
9628      }
9629    }
9630    if( zFile==0 ){
9631      zFile = sqlite3_mprintf("stdout");
9632    }
9633    if( bOnce ){
9634      p->outCount = 2;
9635    }else{
9636      p->outCount = 0;
9637    }
9638    output_reset(p);
9639#ifndef SQLITE_NOHAVE_SYSTEM
9640    if( eMode=='e' || eMode=='x' ){
9641      p->doXdgOpen = 1;
9642      outputModePush(p);
9643      if( eMode=='x' ){
9644        /* spreadsheet mode.  Output as CSV. */
9645        newTempFile(p, "csv");
9646        ShellClearFlag(p, SHFLG_Echo);
9647        p->mode = MODE_Csv;
9648        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9649        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9650      }else{
9651        /* text editor mode */
9652        newTempFile(p, "txt");
9653        bTxtMode = 1;
9654      }
9655      sqlite3_free(zFile);
9656      zFile = sqlite3_mprintf("%s", p->zTempFile);
9657    }
9658#endif /* SQLITE_NOHAVE_SYSTEM */
9659    shell_check_oom(zFile);
9660    if( zFile[0]=='|' ){
9661#ifdef SQLITE_OMIT_POPEN
9662      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9663      rc = 1;
9664      p->out = stdout;
9665#else
9666      p->out = popen(zFile + 1, "w");
9667      if( p->out==0 ){
9668        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9669        p->out = stdout;
9670        rc = 1;
9671      }else{
9672        if( bBOM ) fprintf(p->out,"\357\273\277");
9673        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9674      }
9675#endif
9676    }else{
9677      p->out = output_file_open(zFile, bTxtMode);
9678      if( p->out==0 ){
9679        if( strcmp(zFile,"off")!=0 ){
9680          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9681        }
9682        p->out = stdout;
9683        rc = 1;
9684      } else {
9685        if( bBOM ) fprintf(p->out,"\357\273\277");
9686        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9687      }
9688    }
9689    sqlite3_free(zFile);
9690  }else
9691
9692  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9693    open_db(p,0);
9694    if( nArg<=1 ) goto parameter_syntax_error;
9695
9696    /* .parameter clear
9697    ** Clear all bind parameters by dropping the TEMP table that holds them.
9698    */
9699    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9700      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9701                   0, 0, 0);
9702    }else
9703
9704    /* .parameter list
9705    ** List all bind parameters.
9706    */
9707    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9708      sqlite3_stmt *pStmt = 0;
9709      int rx;
9710      int len = 0;
9711      rx = sqlite3_prepare_v2(p->db,
9712             "SELECT max(length(key)) "
9713             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9714      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9715        len = sqlite3_column_int(pStmt, 0);
9716        if( len>40 ) len = 40;
9717      }
9718      sqlite3_finalize(pStmt);
9719      pStmt = 0;
9720      if( len ){
9721        rx = sqlite3_prepare_v2(p->db,
9722             "SELECT key, quote(value) "
9723             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9724        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9725          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9726                      sqlite3_column_text(pStmt,1));
9727        }
9728        sqlite3_finalize(pStmt);
9729      }
9730    }else
9731
9732    /* .parameter init
9733    ** Make sure the TEMP table used to hold bind parameters exists.
9734    ** Create it if necessary.
9735    */
9736    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9737      bind_table_init(p);
9738    }else
9739
9740    /* .parameter set NAME VALUE
9741    ** Set or reset a bind parameter.  NAME should be the full parameter
9742    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9743    ** VALUE can be in either SQL literal notation, or if not it will be
9744    ** understood to be a text string.
9745    */
9746    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9747      int rx;
9748      char *zSql;
9749      sqlite3_stmt *pStmt;
9750      const char *zKey = azArg[2];
9751      const char *zValue = azArg[3];
9752      bind_table_init(p);
9753      zSql = sqlite3_mprintf(
9754                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9755                  "VALUES(%Q,%s);", zKey, zValue);
9756      shell_check_oom(zSql);
9757      pStmt = 0;
9758      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9759      sqlite3_free(zSql);
9760      if( rx!=SQLITE_OK ){
9761        sqlite3_finalize(pStmt);
9762        pStmt = 0;
9763        zSql = sqlite3_mprintf(
9764                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9765                   "VALUES(%Q,%Q);", zKey, zValue);
9766        shell_check_oom(zSql);
9767        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9768        sqlite3_free(zSql);
9769        if( rx!=SQLITE_OK ){
9770          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9771          sqlite3_finalize(pStmt);
9772          pStmt = 0;
9773          rc = 1;
9774        }
9775      }
9776      sqlite3_step(pStmt);
9777      sqlite3_finalize(pStmt);
9778    }else
9779
9780    /* .parameter unset NAME
9781    ** Remove the NAME binding from the parameter binding table, if it
9782    ** exists.
9783    */
9784    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9785      char *zSql = sqlite3_mprintf(
9786          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9787      shell_check_oom(zSql);
9788      sqlite3_exec(p->db, zSql, 0, 0, 0);
9789      sqlite3_free(zSql);
9790    }else
9791    /* If no command name matches, show a syntax error */
9792    parameter_syntax_error:
9793    showHelp(p->out, "parameter");
9794  }else
9795
9796  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9797    int i;
9798    for(i=1; i<nArg; i++){
9799      if( i>1 ) raw_printf(p->out, " ");
9800      utf8_printf(p->out, "%s", azArg[i]);
9801    }
9802    raw_printf(p->out, "\n");
9803  }else
9804
9805#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9806  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9807    int i;
9808    int nn = 0;
9809    p->flgProgress = 0;
9810    p->mxProgress = 0;
9811    p->nProgress = 0;
9812    for(i=1; i<nArg; i++){
9813      const char *z = azArg[i];
9814      if( z[0]=='-' ){
9815        z++;
9816        if( z[0]=='-' ) z++;
9817        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9818          p->flgProgress |= SHELL_PROGRESS_QUIET;
9819          continue;
9820        }
9821        if( strcmp(z,"reset")==0 ){
9822          p->flgProgress |= SHELL_PROGRESS_RESET;
9823          continue;
9824        }
9825        if( strcmp(z,"once")==0 ){
9826          p->flgProgress |= SHELL_PROGRESS_ONCE;
9827          continue;
9828        }
9829        if( strcmp(z,"limit")==0 ){
9830          if( i+1>=nArg ){
9831            utf8_printf(stderr, "Error: missing argument on --limit\n");
9832            rc = 1;
9833            goto meta_command_exit;
9834          }else{
9835            p->mxProgress = (int)integerValue(azArg[++i]);
9836          }
9837          continue;
9838        }
9839        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9840        rc = 1;
9841        goto meta_command_exit;
9842      }else{
9843        nn = (int)integerValue(z);
9844      }
9845    }
9846    open_db(p, 0);
9847    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9848  }else
9849#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9850
9851  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9852    if( nArg >= 2) {
9853      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9854    }
9855    if( nArg >= 3) {
9856      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9857    }
9858  }else
9859
9860  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9861    rc = 2;
9862  }else
9863
9864  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9865    FILE *inSaved = p->in;
9866    int savedLineno = p->lineno;
9867    failIfSafeMode(p, "cannot run .read in safe mode");
9868    if( nArg!=2 ){
9869      raw_printf(stderr, "Usage: .read FILE\n");
9870      rc = 1;
9871      goto meta_command_exit;
9872    }
9873    if( azArg[1][0]=='|' ){
9874#ifdef SQLITE_OMIT_POPEN
9875      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9876      rc = 1;
9877      p->out = stdout;
9878#else
9879      p->in = popen(azArg[1]+1, "r");
9880      if( p->in==0 ){
9881        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9882        rc = 1;
9883      }else{
9884        rc = process_input(p);
9885        pclose(p->in);
9886      }
9887#endif
9888    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9889      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9890      rc = 1;
9891    }else{
9892      rc = process_input(p);
9893      fclose(p->in);
9894    }
9895    p->in = inSaved;
9896    p->lineno = savedLineno;
9897  }else
9898
9899  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9900    const char *zSrcFile;
9901    const char *zDb;
9902    sqlite3 *pSrc;
9903    sqlite3_backup *pBackup;
9904    int nTimeout = 0;
9905
9906    failIfSafeMode(p, "cannot run .restore in safe mode");
9907    if( nArg==2 ){
9908      zSrcFile = azArg[1];
9909      zDb = "main";
9910    }else if( nArg==3 ){
9911      zSrcFile = azArg[2];
9912      zDb = azArg[1];
9913    }else{
9914      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9915      rc = 1;
9916      goto meta_command_exit;
9917    }
9918    rc = sqlite3_open(zSrcFile, &pSrc);
9919    if( rc!=SQLITE_OK ){
9920      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9921      close_db(pSrc);
9922      return 1;
9923    }
9924    open_db(p, 0);
9925    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9926    if( pBackup==0 ){
9927      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9928      close_db(pSrc);
9929      return 1;
9930    }
9931    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9932          || rc==SQLITE_BUSY  ){
9933      if( rc==SQLITE_BUSY ){
9934        if( nTimeout++ >= 3 ) break;
9935        sqlite3_sleep(100);
9936      }
9937    }
9938    sqlite3_backup_finish(pBackup);
9939    if( rc==SQLITE_DONE ){
9940      rc = 0;
9941    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9942      raw_printf(stderr, "Error: source database is busy\n");
9943      rc = 1;
9944    }else{
9945      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9946      rc = 1;
9947    }
9948    close_db(pSrc);
9949  }else
9950
9951  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9952    if( nArg==2 ){
9953      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9954#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9955      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9956#endif
9957    }else{
9958      raw_printf(stderr, "Usage: .scanstats on|off\n");
9959      rc = 1;
9960    }
9961  }else
9962
9963  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9964    ShellText sSelect;
9965    ShellState data;
9966    char *zErrMsg = 0;
9967    const char *zDiv = "(";
9968    const char *zName = 0;
9969    int iSchema = 0;
9970    int bDebug = 0;
9971    int bNoSystemTabs = 0;
9972    int ii;
9973
9974    open_db(p, 0);
9975    memcpy(&data, p, sizeof(data));
9976    data.showHeader = 0;
9977    data.cMode = data.mode = MODE_Semi;
9978    initText(&sSelect);
9979    for(ii=1; ii<nArg; ii++){
9980      if( optionMatch(azArg[ii],"indent") ){
9981        data.cMode = data.mode = MODE_Pretty;
9982      }else if( optionMatch(azArg[ii],"debug") ){
9983        bDebug = 1;
9984      }else if( optionMatch(azArg[ii],"nosys") ){
9985        bNoSystemTabs = 1;
9986      }else if( azArg[ii][0]=='-' ){
9987        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9988        rc = 1;
9989        goto meta_command_exit;
9990      }else if( zName==0 ){
9991        zName = azArg[ii];
9992      }else{
9993        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9994        rc = 1;
9995        goto meta_command_exit;
9996      }
9997    }
9998    if( zName!=0 ){
9999      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
10000                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
10001                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
10002                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
10003      if( isSchema ){
10004        char *new_argv[2], *new_colv[2];
10005        new_argv[0] = sqlite3_mprintf(
10006                      "CREATE TABLE %s (\n"
10007                      "  type text,\n"
10008                      "  name text,\n"
10009                      "  tbl_name text,\n"
10010                      "  rootpage integer,\n"
10011                      "  sql text\n"
10012                      ")", zName);
10013        shell_check_oom(new_argv[0]);
10014        new_argv[1] = 0;
10015        new_colv[0] = "sql";
10016        new_colv[1] = 0;
10017        callback(&data, 1, new_argv, new_colv);
10018        sqlite3_free(new_argv[0]);
10019      }
10020    }
10021    if( zDiv ){
10022      sqlite3_stmt *pStmt = 0;
10023      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
10024                              -1, &pStmt, 0);
10025      if( rc ){
10026        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
10027        sqlite3_finalize(pStmt);
10028        rc = 1;
10029        goto meta_command_exit;
10030      }
10031      appendText(&sSelect, "SELECT sql FROM", 0);
10032      iSchema = 0;
10033      while( sqlite3_step(pStmt)==SQLITE_ROW ){
10034        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
10035        char zScNum[30];
10036        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
10037        appendText(&sSelect, zDiv, 0);
10038        zDiv = " UNION ALL ";
10039        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
10040        if( sqlite3_stricmp(zDb, "main")!=0 ){
10041          appendText(&sSelect, zDb, '\'');
10042        }else{
10043          appendText(&sSelect, "NULL", 0);
10044        }
10045        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
10046        appendText(&sSelect, zScNum, 0);
10047        appendText(&sSelect, " AS snum, ", 0);
10048        appendText(&sSelect, zDb, '\'');
10049        appendText(&sSelect, " AS sname FROM ", 0);
10050        appendText(&sSelect, zDb, quoteChar(zDb));
10051        appendText(&sSelect, ".sqlite_schema", 0);
10052      }
10053      sqlite3_finalize(pStmt);
10054#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
10055      if( zName ){
10056        appendText(&sSelect,
10057           " UNION ALL SELECT shell_module_schema(name),"
10058           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
10059        0);
10060      }
10061#endif
10062      appendText(&sSelect, ") WHERE ", 0);
10063      if( zName ){
10064        char *zQarg = sqlite3_mprintf("%Q", zName);
10065        int bGlob;
10066        shell_check_oom(zQarg);
10067        bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
10068                strchr(zName, '[') != 0;
10069        if( strchr(zName, '.') ){
10070          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
10071        }else{
10072          appendText(&sSelect, "lower(tbl_name)", 0);
10073        }
10074        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
10075        appendText(&sSelect, zQarg, 0);
10076        if( !bGlob ){
10077          appendText(&sSelect, " ESCAPE '\\' ", 0);
10078        }
10079        appendText(&sSelect, " AND ", 0);
10080        sqlite3_free(zQarg);
10081      }
10082      if( bNoSystemTabs ){
10083        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
10084      }
10085      appendText(&sSelect, "sql IS NOT NULL"
10086                           " ORDER BY snum, rowid", 0);
10087      if( bDebug ){
10088        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
10089      }else{
10090        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
10091      }
10092      freeText(&sSelect);
10093    }
10094    if( zErrMsg ){
10095      utf8_printf(stderr,"Error: %s\n", zErrMsg);
10096      sqlite3_free(zErrMsg);
10097      rc = 1;
10098    }else if( rc != SQLITE_OK ){
10099      raw_printf(stderr,"Error: querying schema information\n");
10100      rc = 1;
10101    }else{
10102      rc = 0;
10103    }
10104  }else
10105
10106  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
10107    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10108    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
10109  }else
10110
10111#if defined(SQLITE_ENABLE_SESSION)
10112  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
10113    struct AuxDb *pAuxDb = p->pAuxDb;
10114    OpenSession *pSession = &pAuxDb->aSession[0];
10115    char **azCmd = &azArg[1];
10116    int iSes = 0;
10117    int nCmd = nArg - 1;
10118    int i;
10119    if( nArg<=1 ) goto session_syntax_error;
10120    open_db(p, 0);
10121    if( nArg>=3 ){
10122      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
10123        if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
10124      }
10125      if( iSes<pAuxDb->nSession ){
10126        pSession = &pAuxDb->aSession[iSes];
10127        azCmd++;
10128        nCmd--;
10129      }else{
10130        pSession = &pAuxDb->aSession[0];
10131        iSes = 0;
10132      }
10133    }
10134
10135    /* .session attach TABLE
10136    ** Invoke the sqlite3session_attach() interface to attach a particular
10137    ** table so that it is never filtered.
10138    */
10139    if( strcmp(azCmd[0],"attach")==0 ){
10140      if( nCmd!=2 ) goto session_syntax_error;
10141      if( pSession->p==0 ){
10142        session_not_open:
10143        raw_printf(stderr, "ERROR: No sessions are open\n");
10144      }else{
10145        rc = sqlite3session_attach(pSession->p, azCmd[1]);
10146        if( rc ){
10147          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
10148          rc = 0;
10149        }
10150      }
10151    }else
10152
10153    /* .session changeset FILE
10154    ** .session patchset FILE
10155    ** Write a changeset or patchset into a file.  The file is overwritten.
10156    */
10157    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
10158      FILE *out = 0;
10159      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
10160      if( nCmd!=2 ) goto session_syntax_error;
10161      if( pSession->p==0 ) goto session_not_open;
10162      out = fopen(azCmd[1], "wb");
10163      if( out==0 ){
10164        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
10165                    azCmd[1]);
10166      }else{
10167        int szChng;
10168        void *pChng;
10169        if( azCmd[0][0]=='c' ){
10170          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
10171        }else{
10172          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
10173        }
10174        if( rc ){
10175          printf("Error: error code %d\n", rc);
10176          rc = 0;
10177        }
10178        if( pChng
10179          && fwrite(pChng, szChng, 1, out)!=1 ){
10180          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
10181                  szChng);
10182        }
10183        sqlite3_free(pChng);
10184        fclose(out);
10185      }
10186    }else
10187
10188    /* .session close
10189    ** Close the identified session
10190    */
10191    if( strcmp(azCmd[0], "close")==0 ){
10192      if( nCmd!=1 ) goto session_syntax_error;
10193      if( pAuxDb->nSession ){
10194        session_close(pSession);
10195        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
10196      }
10197    }else
10198
10199    /* .session enable ?BOOLEAN?
10200    ** Query or set the enable flag
10201    */
10202    if( strcmp(azCmd[0], "enable")==0 ){
10203      int ii;
10204      if( nCmd>2 ) goto session_syntax_error;
10205      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10206      if( pAuxDb->nSession ){
10207        ii = sqlite3session_enable(pSession->p, ii);
10208        utf8_printf(p->out, "session %s enable flag = %d\n",
10209                    pSession->zName, ii);
10210      }
10211    }else
10212
10213    /* .session filter GLOB ....
10214    ** Set a list of GLOB patterns of table names to be excluded.
10215    */
10216    if( strcmp(azCmd[0], "filter")==0 ){
10217      int ii, nByte;
10218      if( nCmd<2 ) goto session_syntax_error;
10219      if( pAuxDb->nSession ){
10220        for(ii=0; ii<pSession->nFilter; ii++){
10221          sqlite3_free(pSession->azFilter[ii]);
10222        }
10223        sqlite3_free(pSession->azFilter);
10224        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
10225        pSession->azFilter = sqlite3_malloc( nByte );
10226        if( pSession->azFilter==0 ){
10227          raw_printf(stderr, "Error: out or memory\n");
10228          exit(1);
10229        }
10230        for(ii=1; ii<nCmd; ii++){
10231          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
10232          shell_check_oom(x);
10233        }
10234        pSession->nFilter = ii-1;
10235      }
10236    }else
10237
10238    /* .session indirect ?BOOLEAN?
10239    ** Query or set the indirect flag
10240    */
10241    if( strcmp(azCmd[0], "indirect")==0 ){
10242      int ii;
10243      if( nCmd>2 ) goto session_syntax_error;
10244      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10245      if( pAuxDb->nSession ){
10246        ii = sqlite3session_indirect(pSession->p, ii);
10247        utf8_printf(p->out, "session %s indirect flag = %d\n",
10248                    pSession->zName, ii);
10249      }
10250    }else
10251
10252    /* .session isempty
10253    ** Determine if the session is empty
10254    */
10255    if( strcmp(azCmd[0], "isempty")==0 ){
10256      int ii;
10257      if( nCmd!=1 ) goto session_syntax_error;
10258      if( pAuxDb->nSession ){
10259        ii = sqlite3session_isempty(pSession->p);
10260        utf8_printf(p->out, "session %s isempty flag = %d\n",
10261                    pSession->zName, ii);
10262      }
10263    }else
10264
10265    /* .session list
10266    ** List all currently open sessions
10267    */
10268    if( strcmp(azCmd[0],"list")==0 ){
10269      for(i=0; i<pAuxDb->nSession; i++){
10270        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
10271      }
10272    }else
10273
10274    /* .session open DB NAME
10275    ** Open a new session called NAME on the attached database DB.
10276    ** DB is normally "main".
10277    */
10278    if( strcmp(azCmd[0],"open")==0 ){
10279      char *zName;
10280      if( nCmd!=3 ) goto session_syntax_error;
10281      zName = azCmd[2];
10282      if( zName[0]==0 ) goto session_syntax_error;
10283      for(i=0; i<pAuxDb->nSession; i++){
10284        if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
10285          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
10286          goto meta_command_exit;
10287        }
10288      }
10289      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
10290        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
10291        goto meta_command_exit;
10292      }
10293      pSession = &pAuxDb->aSession[pAuxDb->nSession];
10294      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
10295      if( rc ){
10296        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
10297        rc = 0;
10298        goto meta_command_exit;
10299      }
10300      pSession->nFilter = 0;
10301      sqlite3session_table_filter(pSession->p, session_filter, pSession);
10302      pAuxDb->nSession++;
10303      pSession->zName = sqlite3_mprintf("%s", zName);
10304      shell_check_oom(pSession->zName);
10305    }else
10306    /* If no command name matches, show a syntax error */
10307    session_syntax_error:
10308    showHelp(p->out, "session");
10309  }else
10310#endif
10311
10312#ifdef SQLITE_DEBUG
10313  /* Undocumented commands for internal testing.  Subject to change
10314  ** without notice. */
10315  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
10316    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
10317      int i, v;
10318      for(i=1; i<nArg; i++){
10319        v = booleanValue(azArg[i]);
10320        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
10321      }
10322    }
10323    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
10324      int i; sqlite3_int64 v;
10325      for(i=1; i<nArg; i++){
10326        char zBuf[200];
10327        v = integerValue(azArg[i]);
10328        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
10329        utf8_printf(p->out, "%s", zBuf);
10330      }
10331    }
10332  }else
10333#endif
10334
10335  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
10336    int bIsInit = 0;         /* True to initialize the SELFTEST table */
10337    int bVerbose = 0;        /* Verbose output */
10338    int bSelftestExists;     /* True if SELFTEST already exists */
10339    int i, k;                /* Loop counters */
10340    int nTest = 0;           /* Number of tests runs */
10341    int nErr = 0;            /* Number of errors seen */
10342    ShellText str;           /* Answer for a query */
10343    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
10344
10345    open_db(p,0);
10346    for(i=1; i<nArg; i++){
10347      const char *z = azArg[i];
10348      if( z[0]=='-' && z[1]=='-' ) z++;
10349      if( strcmp(z,"-init")==0 ){
10350        bIsInit = 1;
10351      }else
10352      if( strcmp(z,"-v")==0 ){
10353        bVerbose++;
10354      }else
10355      {
10356        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10357                    azArg[i], azArg[0]);
10358        raw_printf(stderr, "Should be one of: --init -v\n");
10359        rc = 1;
10360        goto meta_command_exit;
10361      }
10362    }
10363    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
10364           != SQLITE_OK ){
10365      bSelftestExists = 0;
10366    }else{
10367      bSelftestExists = 1;
10368    }
10369    if( bIsInit ){
10370      createSelftestTable(p);
10371      bSelftestExists = 1;
10372    }
10373    initText(&str);
10374    appendText(&str, "x", 0);
10375    for(k=bSelftestExists; k>=0; k--){
10376      if( k==1 ){
10377        rc = sqlite3_prepare_v2(p->db,
10378            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
10379            -1, &pStmt, 0);
10380      }else{
10381        rc = sqlite3_prepare_v2(p->db,
10382          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
10383          "      (1,'run','PRAGMA integrity_check','ok')",
10384          -1, &pStmt, 0);
10385      }
10386      if( rc ){
10387        raw_printf(stderr, "Error querying the selftest table\n");
10388        rc = 1;
10389        sqlite3_finalize(pStmt);
10390        goto meta_command_exit;
10391      }
10392      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
10393        int tno = sqlite3_column_int(pStmt, 0);
10394        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
10395        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
10396        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
10397
10398        if( zOp==0 ) continue;
10399        if( zSql==0 ) continue;
10400        if( zAns==0 ) continue;
10401        k = 0;
10402        if( bVerbose>0 ){
10403          printf("%d: %s %s\n", tno, zOp, zSql);
10404        }
10405        if( strcmp(zOp,"memo")==0 ){
10406          utf8_printf(p->out, "%s\n", zSql);
10407        }else
10408        if( strcmp(zOp,"run")==0 ){
10409          char *zErrMsg = 0;
10410          str.n = 0;
10411          str.z[0] = 0;
10412          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
10413          nTest++;
10414          if( bVerbose ){
10415            utf8_printf(p->out, "Result: %s\n", str.z);
10416          }
10417          if( rc || zErrMsg ){
10418            nErr++;
10419            rc = 1;
10420            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
10421            sqlite3_free(zErrMsg);
10422          }else if( strcmp(zAns,str.z)!=0 ){
10423            nErr++;
10424            rc = 1;
10425            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
10426            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
10427          }
10428        }else
10429        {
10430          utf8_printf(stderr,
10431            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
10432          rc = 1;
10433          break;
10434        }
10435      } /* End loop over rows of content from SELFTEST */
10436      sqlite3_finalize(pStmt);
10437    } /* End loop over k */
10438    freeText(&str);
10439    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
10440  }else
10441
10442  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
10443    if( nArg<2 || nArg>3 ){
10444      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
10445      rc = 1;
10446    }
10447    if( nArg>=2 ){
10448      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
10449                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
10450    }
10451    if( nArg>=3 ){
10452      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
10453                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
10454    }
10455  }else
10456
10457  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
10458    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
10459    int i;                   /* Loop counter */
10460    int bSchema = 0;         /* Also hash the schema */
10461    int bSeparate = 0;       /* Hash each table separately */
10462    int iSize = 224;         /* Hash algorithm to use */
10463    int bDebug = 0;          /* Only show the query that would have run */
10464    sqlite3_stmt *pStmt;     /* For querying tables names */
10465    char *zSql;              /* SQL to be run */
10466    char *zSep;              /* Separator */
10467    ShellText sSql;          /* Complete SQL for the query to run the hash */
10468    ShellText sQuery;        /* Set of queries used to read all content */
10469    open_db(p, 0);
10470    for(i=1; i<nArg; i++){
10471      const char *z = azArg[i];
10472      if( z[0]=='-' ){
10473        z++;
10474        if( z[0]=='-' ) z++;
10475        if( strcmp(z,"schema")==0 ){
10476          bSchema = 1;
10477        }else
10478        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
10479         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
10480        ){
10481          iSize = atoi(&z[5]);
10482        }else
10483        if( strcmp(z,"debug")==0 ){
10484          bDebug = 1;
10485        }else
10486        {
10487          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10488                      azArg[i], azArg[0]);
10489          showHelp(p->out, azArg[0]);
10490          rc = 1;
10491          goto meta_command_exit;
10492        }
10493      }else if( zLike ){
10494        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
10495        rc = 1;
10496        goto meta_command_exit;
10497      }else{
10498        zLike = z;
10499        bSeparate = 1;
10500        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
10501      }
10502    }
10503    if( bSchema ){
10504      zSql = "SELECT lower(name) FROM sqlite_schema"
10505             " WHERE type='table' AND coalesce(rootpage,0)>1"
10506             " UNION ALL SELECT 'sqlite_schema'"
10507             " ORDER BY 1 collate nocase";
10508    }else{
10509      zSql = "SELECT lower(name) FROM sqlite_schema"
10510             " WHERE type='table' AND coalesce(rootpage,0)>1"
10511             " AND name NOT LIKE 'sqlite_%'"
10512             " ORDER BY 1 collate nocase";
10513    }
10514    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10515    initText(&sQuery);
10516    initText(&sSql);
10517    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
10518    zSep = "VALUES(";
10519    while( SQLITE_ROW==sqlite3_step(pStmt) ){
10520      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
10521      if( zTab==0 ) continue;
10522      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
10523      if( strncmp(zTab, "sqlite_",7)!=0 ){
10524        appendText(&sQuery,"SELECT * FROM ", 0);
10525        appendText(&sQuery,zTab,'"');
10526        appendText(&sQuery," NOT INDEXED;", 0);
10527      }else if( strcmp(zTab, "sqlite_schema")==0 ){
10528        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10529                           " ORDER BY name;", 0);
10530      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
10531        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10532                           " ORDER BY name;", 0);
10533      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
10534        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10535                           " ORDER BY tbl,idx;", 0);
10536      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
10537        appendText(&sQuery, "SELECT * FROM ", 0);
10538        appendText(&sQuery, zTab, 0);
10539        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10540      }
10541      appendText(&sSql, zSep, 0);
10542      appendText(&sSql, sQuery.z, '\'');
10543      sQuery.n = 0;
10544      appendText(&sSql, ",", 0);
10545      appendText(&sSql, zTab, '\'');
10546      zSep = "),(";
10547    }
10548    sqlite3_finalize(pStmt);
10549    if( bSeparate ){
10550      zSql = sqlite3_mprintf(
10551          "%s))"
10552          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10553          "   FROM [sha3sum$query]",
10554          sSql.z, iSize);
10555    }else{
10556      zSql = sqlite3_mprintf(
10557          "%s))"
10558          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10559          "   FROM [sha3sum$query]",
10560          sSql.z, iSize);
10561    }
10562    shell_check_oom(zSql);
10563    freeText(&sQuery);
10564    freeText(&sSql);
10565    if( bDebug ){
10566      utf8_printf(p->out, "%s\n", zSql);
10567    }else{
10568      shell_exec(p, zSql, 0);
10569    }
10570    sqlite3_free(zSql);
10571  }else
10572
10573#ifndef SQLITE_NOHAVE_SYSTEM
10574  if( c=='s'
10575   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10576  ){
10577    char *zCmd;
10578    int i, x;
10579    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10580    if( nArg<2 ){
10581      raw_printf(stderr, "Usage: .system COMMAND\n");
10582      rc = 1;
10583      goto meta_command_exit;
10584    }
10585    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10586    for(i=2; i<nArg && zCmd!=0; i++){
10587      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10588                             zCmd, azArg[i]);
10589    }
10590    x = zCmd!=0 ? system(zCmd) : 1;
10591    sqlite3_free(zCmd);
10592    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10593  }else
10594#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10595
10596  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10597    static const char *azBool[] = { "off", "on", "trigger", "full"};
10598    const char *zOut;
10599    int i;
10600    if( nArg!=1 ){
10601      raw_printf(stderr, "Usage: .show\n");
10602      rc = 1;
10603      goto meta_command_exit;
10604    }
10605    utf8_printf(p->out, "%12.12s: %s\n","echo",
10606                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
10607    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10608    utf8_printf(p->out, "%12.12s: %s\n","explain",
10609         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10610    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10611    if( p->mode==MODE_Column
10612     || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
10613    ){
10614      utf8_printf
10615        (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
10616         modeDescr[p->mode], p->cmOpts.iWrap,
10617         p->cmOpts.bWordWrap ? "on" : "off",
10618         p->cmOpts.bQuote ? "" : "no");
10619    }else{
10620      utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10621    }
10622    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10623      output_c_string(p->out, p->nullValue);
10624      raw_printf(p->out, "\n");
10625    utf8_printf(p->out,"%12.12s: %s\n","output",
10626            strlen30(p->outfile) ? p->outfile : "stdout");
10627    utf8_printf(p->out,"%12.12s: ", "colseparator");
10628      output_c_string(p->out, p->colSeparator);
10629      raw_printf(p->out, "\n");
10630    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10631      output_c_string(p->out, p->rowSeparator);
10632      raw_printf(p->out, "\n");
10633    switch( p->statsOn ){
10634      case 0:  zOut = "off";     break;
10635      default: zOut = "on";      break;
10636      case 2:  zOut = "stmt";    break;
10637      case 3:  zOut = "vmstep";  break;
10638    }
10639    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10640    utf8_printf(p->out, "%12.12s: ", "width");
10641    for (i=0;i<p->nWidth;i++) {
10642      raw_printf(p->out, "%d ", p->colWidth[i]);
10643    }
10644    raw_printf(p->out, "\n");
10645    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10646                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10647  }else
10648
10649  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10650    if( nArg==2 ){
10651      if( strcmp(azArg[1],"stmt")==0 ){
10652        p->statsOn = 2;
10653      }else if( strcmp(azArg[1],"vmstep")==0 ){
10654        p->statsOn = 3;
10655      }else{
10656        p->statsOn = (u8)booleanValue(azArg[1]);
10657      }
10658    }else if( nArg==1 ){
10659      display_stats(p->db, p, 0);
10660    }else{
10661      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10662      rc = 1;
10663    }
10664  }else
10665
10666  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10667   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10668                 || strncmp(azArg[0], "indexes", n)==0) )
10669  ){
10670    sqlite3_stmt *pStmt;
10671    char **azResult;
10672    int nRow, nAlloc;
10673    int ii;
10674    ShellText s;
10675    initText(&s);
10676    open_db(p, 0);
10677    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10678    if( rc ){
10679      sqlite3_finalize(pStmt);
10680      return shellDatabaseError(p->db);
10681    }
10682
10683    if( nArg>2 && c=='i' ){
10684      /* It is an historical accident that the .indexes command shows an error
10685      ** when called with the wrong number of arguments whereas the .tables
10686      ** command does not. */
10687      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10688      rc = 1;
10689      sqlite3_finalize(pStmt);
10690      goto meta_command_exit;
10691    }
10692    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10693      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10694      if( zDbName==0 ) continue;
10695      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10696      if( sqlite3_stricmp(zDbName, "main")==0 ){
10697        appendText(&s, "SELECT name FROM ", 0);
10698      }else{
10699        appendText(&s, "SELECT ", 0);
10700        appendText(&s, zDbName, '\'');
10701        appendText(&s, "||'.'||name FROM ", 0);
10702      }
10703      appendText(&s, zDbName, '"');
10704      appendText(&s, ".sqlite_schema ", 0);
10705      if( c=='t' ){
10706        appendText(&s," WHERE type IN ('table','view')"
10707                      "   AND name NOT LIKE 'sqlite_%'"
10708                      "   AND name LIKE ?1", 0);
10709      }else{
10710        appendText(&s," WHERE type='index'"
10711                      "   AND tbl_name LIKE ?1", 0);
10712      }
10713    }
10714    rc = sqlite3_finalize(pStmt);
10715    if( rc==SQLITE_OK ){
10716      appendText(&s, " ORDER BY 1", 0);
10717      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10718    }
10719    freeText(&s);
10720    if( rc ) return shellDatabaseError(p->db);
10721
10722    /* Run the SQL statement prepared by the above block. Store the results
10723    ** as an array of nul-terminated strings in azResult[].  */
10724    nRow = nAlloc = 0;
10725    azResult = 0;
10726    if( nArg>1 ){
10727      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10728    }else{
10729      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10730    }
10731    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10732      if( nRow>=nAlloc ){
10733        char **azNew;
10734        int n2 = nAlloc*2 + 10;
10735        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10736        shell_check_oom(azNew);
10737        nAlloc = n2;
10738        azResult = azNew;
10739      }
10740      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10741      shell_check_oom(azResult[nRow]);
10742      nRow++;
10743    }
10744    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10745      rc = shellDatabaseError(p->db);
10746    }
10747
10748    /* Pretty-print the contents of array azResult[] to the output */
10749    if( rc==0 && nRow>0 ){
10750      int len, maxlen = 0;
10751      int i, j;
10752      int nPrintCol, nPrintRow;
10753      for(i=0; i<nRow; i++){
10754        len = strlen30(azResult[i]);
10755        if( len>maxlen ) maxlen = len;
10756      }
10757      nPrintCol = 80/(maxlen+2);
10758      if( nPrintCol<1 ) nPrintCol = 1;
10759      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10760      for(i=0; i<nPrintRow; i++){
10761        for(j=i; j<nRow; j+=nPrintRow){
10762          char *zSp = j<nPrintRow ? "" : "  ";
10763          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10764                      azResult[j] ? azResult[j]:"");
10765        }
10766        raw_printf(p->out, "\n");
10767      }
10768    }
10769
10770    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10771    sqlite3_free(azResult);
10772  }else
10773
10774  /* Begin redirecting output to the file "testcase-out.txt" */
10775  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10776    output_reset(p);
10777    p->out = output_file_open("testcase-out.txt", 0);
10778    if( p->out==0 ){
10779      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10780    }
10781    if( nArg>=2 ){
10782      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10783    }else{
10784      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10785    }
10786  }else
10787
10788#ifndef SQLITE_UNTESTABLE
10789  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10790    static const struct {
10791       const char *zCtrlName;   /* Name of a test-control option */
10792       int ctrlCode;            /* Integer code for that option */
10793       int unSafe;              /* Not valid for --safe mode */
10794       const char *zUsage;      /* Usage notes */
10795    } aCtrl[] = {
10796      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10797      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10798    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10799    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10800      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10801      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10802    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10803      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10804      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10805      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10806      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10807      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10808#ifdef YYCOVERAGE
10809      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10810#endif
10811      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10812      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10813      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10814      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10815      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10816      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10817      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10818    };
10819    int testctrl = -1;
10820    int iCtrl = -1;
10821    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10822    int isOk = 0;
10823    int i, n2;
10824    const char *zCmd = 0;
10825
10826    open_db(p, 0);
10827    zCmd = nArg>=2 ? azArg[1] : "help";
10828
10829    /* The argument can optionally begin with "-" or "--" */
10830    if( zCmd[0]=='-' && zCmd[1] ){
10831      zCmd++;
10832      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10833    }
10834
10835    /* --help lists all test-controls */
10836    if( strcmp(zCmd,"help")==0 ){
10837      utf8_printf(p->out, "Available test-controls:\n");
10838      for(i=0; i<ArraySize(aCtrl); i++){
10839        utf8_printf(p->out, "  .testctrl %s %s\n",
10840                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10841      }
10842      rc = 1;
10843      goto meta_command_exit;
10844    }
10845
10846    /* convert testctrl text option to value. allow any unique prefix
10847    ** of the option name, or a numerical value. */
10848    n2 = strlen30(zCmd);
10849    for(i=0; i<ArraySize(aCtrl); i++){
10850      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10851        if( testctrl<0 ){
10852          testctrl = aCtrl[i].ctrlCode;
10853          iCtrl = i;
10854        }else{
10855          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10856                              "Use \".testctrl --help\" for help\n", zCmd);
10857          rc = 1;
10858          goto meta_command_exit;
10859        }
10860      }
10861    }
10862    if( testctrl<0 ){
10863      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10864                         "Use \".testctrl --help\" for help\n", zCmd);
10865    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10866      utf8_printf(stderr,
10867         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10868         p->lineno, aCtrl[iCtrl].zCtrlName);
10869      exit(1);
10870    }else{
10871      switch(testctrl){
10872
10873        /* sqlite3_test_control(int, db, int) */
10874        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10875          if( nArg==3 ){
10876            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10877            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10878            isOk = 3;
10879          }
10880          break;
10881
10882        /* sqlite3_test_control(int) */
10883        case SQLITE_TESTCTRL_PRNG_SAVE:
10884        case SQLITE_TESTCTRL_PRNG_RESTORE:
10885        case SQLITE_TESTCTRL_BYTEORDER:
10886          if( nArg==2 ){
10887            rc2 = sqlite3_test_control(testctrl);
10888            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10889          }
10890          break;
10891
10892        /* sqlite3_test_control(int, uint) */
10893        case SQLITE_TESTCTRL_PENDING_BYTE:
10894          if( nArg==3 ){
10895            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10896            rc2 = sqlite3_test_control(testctrl, opt);
10897            isOk = 3;
10898          }
10899          break;
10900
10901        /* sqlite3_test_control(int, int, sqlite3*) */
10902        case SQLITE_TESTCTRL_PRNG_SEED:
10903          if( nArg==3 || nArg==4 ){
10904            int ii = (int)integerValue(azArg[2]);
10905            sqlite3 *db;
10906            if( ii==0 && strcmp(azArg[2],"random")==0 ){
10907              sqlite3_randomness(sizeof(ii),&ii);
10908              printf("-- random seed: %d\n", ii);
10909            }
10910            if( nArg==3 ){
10911              db = 0;
10912            }else{
10913              db = p->db;
10914              /* Make sure the schema has been loaded */
10915              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10916            }
10917            rc2 = sqlite3_test_control(testctrl, ii, db);
10918            isOk = 3;
10919          }
10920          break;
10921
10922        /* sqlite3_test_control(int, int) */
10923        case SQLITE_TESTCTRL_ASSERT:
10924        case SQLITE_TESTCTRL_ALWAYS:
10925          if( nArg==3 ){
10926            int opt = booleanValue(azArg[2]);
10927            rc2 = sqlite3_test_control(testctrl, opt);
10928            isOk = 1;
10929          }
10930          break;
10931
10932        /* sqlite3_test_control(int, int) */
10933        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10934        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10935          if( nArg==3 ){
10936            int opt = booleanValue(azArg[2]);
10937            rc2 = sqlite3_test_control(testctrl, opt);
10938            isOk = 3;
10939          }
10940          break;
10941
10942        /* sqlite3_test_control(sqlite3*) */
10943        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10944          rc2 = sqlite3_test_control(testctrl, p->db);
10945          isOk = 3;
10946          break;
10947
10948        case SQLITE_TESTCTRL_IMPOSTER:
10949          if( nArg==5 ){
10950            rc2 = sqlite3_test_control(testctrl, p->db,
10951                          azArg[2],
10952                          integerValue(azArg[3]),
10953                          integerValue(azArg[4]));
10954            isOk = 3;
10955          }
10956          break;
10957
10958        case SQLITE_TESTCTRL_SEEK_COUNT: {
10959          u64 x = 0;
10960          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10961          utf8_printf(p->out, "%llu\n", x);
10962          isOk = 3;
10963          break;
10964        }
10965
10966#ifdef YYCOVERAGE
10967        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10968          if( nArg==2 ){
10969            sqlite3_test_control(testctrl, p->out);
10970            isOk = 3;
10971          }
10972          break;
10973        }
10974#endif
10975#ifdef SQLITE_DEBUG
10976        case SQLITE_TESTCTRL_TUNE: {
10977          if( nArg==4 ){
10978            int id = (int)integerValue(azArg[2]);
10979            int val = (int)integerValue(azArg[3]);
10980            sqlite3_test_control(testctrl, id, &val);
10981            isOk = 3;
10982          }else if( nArg==3 ){
10983            int id = (int)integerValue(azArg[2]);
10984            sqlite3_test_control(testctrl, -id, &rc2);
10985            isOk = 1;
10986          }else if( nArg==2 ){
10987            int id = 1;
10988            while(1){
10989              int val = 0;
10990              rc2 = sqlite3_test_control(testctrl, -id, &val);
10991              if( rc2!=SQLITE_OK ) break;
10992              if( id>1 ) utf8_printf(p->out, "  ");
10993              utf8_printf(p->out, "%d: %d", id, val);
10994              id++;
10995            }
10996            if( id>1 ) utf8_printf(p->out, "\n");
10997            isOk = 3;
10998          }
10999          break;
11000        }
11001#endif
11002        case SQLITE_TESTCTRL_SORTER_MMAP:
11003          if( nArg==3 ){
11004            int opt = (unsigned int)integerValue(azArg[2]);
11005            rc2 = sqlite3_test_control(testctrl, p->db, opt);
11006            isOk = 3;
11007          }
11008          break;
11009      }
11010    }
11011    if( isOk==0 && iCtrl>=0 ){
11012      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
11013      rc = 1;
11014    }else if( isOk==1 ){
11015      raw_printf(p->out, "%d\n", rc2);
11016    }else if( isOk==2 ){
11017      raw_printf(p->out, "0x%08x\n", rc2);
11018    }
11019  }else
11020#endif /* !defined(SQLITE_UNTESTABLE) */
11021
11022  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
11023    open_db(p, 0);
11024    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
11025  }else
11026
11027  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
11028    if( nArg==2 ){
11029      enableTimer = booleanValue(azArg[1]);
11030      if( enableTimer && !HAS_TIMER ){
11031        raw_printf(stderr, "Error: timer not available on this system.\n");
11032        enableTimer = 0;
11033      }
11034    }else{
11035      raw_printf(stderr, "Usage: .timer on|off\n");
11036      rc = 1;
11037    }
11038  }else
11039
11040#ifndef SQLITE_OMIT_TRACE
11041  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
11042    int mType = 0;
11043    int jj;
11044    open_db(p, 0);
11045    for(jj=1; jj<nArg; jj++){
11046      const char *z = azArg[jj];
11047      if( z[0]=='-' ){
11048        if( optionMatch(z, "expanded") ){
11049          p->eTraceType = SHELL_TRACE_EXPANDED;
11050        }
11051#ifdef SQLITE_ENABLE_NORMALIZE
11052        else if( optionMatch(z, "normalized") ){
11053          p->eTraceType = SHELL_TRACE_NORMALIZED;
11054        }
11055#endif
11056        else if( optionMatch(z, "plain") ){
11057          p->eTraceType = SHELL_TRACE_PLAIN;
11058        }
11059        else if( optionMatch(z, "profile") ){
11060          mType |= SQLITE_TRACE_PROFILE;
11061        }
11062        else if( optionMatch(z, "row") ){
11063          mType |= SQLITE_TRACE_ROW;
11064        }
11065        else if( optionMatch(z, "stmt") ){
11066          mType |= SQLITE_TRACE_STMT;
11067        }
11068        else if( optionMatch(z, "close") ){
11069          mType |= SQLITE_TRACE_CLOSE;
11070        }
11071        else {
11072          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
11073          rc = 1;
11074          goto meta_command_exit;
11075        }
11076      }else{
11077        output_file_close(p->traceOut);
11078        p->traceOut = output_file_open(azArg[1], 0);
11079      }
11080    }
11081    if( p->traceOut==0 ){
11082      sqlite3_trace_v2(p->db, 0, 0, 0);
11083    }else{
11084      if( mType==0 ) mType = SQLITE_TRACE_STMT;
11085      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
11086    }
11087  }else
11088#endif /* !defined(SQLITE_OMIT_TRACE) */
11089
11090#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11091  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
11092    int ii;
11093    int lenOpt;
11094    char *zOpt;
11095    if( nArg<2 ){
11096      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
11097      rc = 1;
11098      goto meta_command_exit;
11099    }
11100    open_db(p, 0);
11101    zOpt = azArg[1];
11102    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
11103    lenOpt = (int)strlen(zOpt);
11104    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
11105      assert( azArg[nArg]==0 );
11106      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
11107    }else{
11108      for(ii=1; ii<nArg; ii++){
11109        sqlite3_create_module(p->db, azArg[ii], 0, 0);
11110      }
11111    }
11112  }else
11113#endif
11114
11115#if SQLITE_USER_AUTHENTICATION
11116  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
11117    if( nArg<2 ){
11118      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
11119      rc = 1;
11120      goto meta_command_exit;
11121    }
11122    open_db(p, 0);
11123    if( strcmp(azArg[1],"login")==0 ){
11124      if( nArg!=4 ){
11125        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
11126        rc = 1;
11127        goto meta_command_exit;
11128      }
11129      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
11130                                     strlen30(azArg[3]));
11131      if( rc ){
11132        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
11133        rc = 1;
11134      }
11135    }else if( strcmp(azArg[1],"add")==0 ){
11136      if( nArg!=5 ){
11137        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
11138        rc = 1;
11139        goto meta_command_exit;
11140      }
11141      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11142                            booleanValue(azArg[4]));
11143      if( rc ){
11144        raw_printf(stderr, "User-Add failed: %d\n", rc);
11145        rc = 1;
11146      }
11147    }else if( strcmp(azArg[1],"edit")==0 ){
11148      if( nArg!=5 ){
11149        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
11150        rc = 1;
11151        goto meta_command_exit;
11152      }
11153      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11154                              booleanValue(azArg[4]));
11155      if( rc ){
11156        raw_printf(stderr, "User-Edit failed: %d\n", rc);
11157        rc = 1;
11158      }
11159    }else if( strcmp(azArg[1],"delete")==0 ){
11160      if( nArg!=3 ){
11161        raw_printf(stderr, "Usage: .user delete USER\n");
11162        rc = 1;
11163        goto meta_command_exit;
11164      }
11165      rc = sqlite3_user_delete(p->db, azArg[2]);
11166      if( rc ){
11167        raw_printf(stderr, "User-Delete failed: %d\n", rc);
11168        rc = 1;
11169      }
11170    }else{
11171      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
11172      rc = 1;
11173      goto meta_command_exit;
11174    }
11175  }else
11176#endif /* SQLITE_USER_AUTHENTICATION */
11177
11178  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
11179    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
11180        sqlite3_libversion(), sqlite3_sourceid());
11181#if SQLITE_HAVE_ZLIB
11182    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
11183#endif
11184#define CTIMEOPT_VAL_(opt) #opt
11185#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
11186#if defined(__clang__) && defined(__clang_major__)
11187    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
11188                    CTIMEOPT_VAL(__clang_minor__) "."
11189                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
11190#elif defined(_MSC_VER)
11191    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
11192#elif defined(__GNUC__) && defined(__VERSION__)
11193    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
11194#endif
11195  }else
11196
11197  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
11198    const char *zDbName = nArg==2 ? azArg[1] : "main";
11199    sqlite3_vfs *pVfs = 0;
11200    if( p->db ){
11201      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
11202      if( pVfs ){
11203        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
11204        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11205        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11206        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11207      }
11208    }
11209  }else
11210
11211  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
11212    sqlite3_vfs *pVfs;
11213    sqlite3_vfs *pCurrent = 0;
11214    if( p->db ){
11215      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
11216    }
11217    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
11218      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
11219           pVfs==pCurrent ? "  <--- CURRENT" : "");
11220      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11221      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11222      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11223      if( pVfs->pNext ){
11224        raw_printf(p->out, "-----------------------------------\n");
11225      }
11226    }
11227  }else
11228
11229  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
11230    const char *zDbName = nArg==2 ? azArg[1] : "main";
11231    char *zVfsName = 0;
11232    if( p->db ){
11233      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
11234      if( zVfsName ){
11235        utf8_printf(p->out, "%s\n", zVfsName);
11236        sqlite3_free(zVfsName);
11237      }
11238    }
11239  }else
11240
11241  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
11242    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
11243    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
11244  }else
11245
11246  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
11247    int j;
11248    assert( nArg<=ArraySize(azArg) );
11249    p->nWidth = nArg-1;
11250    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
11251    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
11252    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
11253    for(j=1; j<nArg; j++){
11254      p->colWidth[j-1] = (int)integerValue(azArg[j]);
11255    }
11256  }else
11257
11258  {
11259    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
11260      " \"%s\". Enter \".help\" for help\n", azArg[0]);
11261    rc = 1;
11262  }
11263
11264meta_command_exit:
11265  if( p->outCount ){
11266    p->outCount--;
11267    if( p->outCount==0 ) output_reset(p);
11268  }
11269  p->bSafeMode = p->bSafeModePersist;
11270  return rc;
11271}
11272
11273/* Line scan result and intermediate states (supporting scan resumption)
11274*/
11275#ifndef CHAR_BIT
11276# define CHAR_BIT 8
11277#endif
11278typedef enum {
11279  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
11280  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
11281  QSS_Start = 0
11282} QuickScanState;
11283#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
11284#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
11285#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
11286#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
11287#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
11288
11289/*
11290** Scan line for classification to guide shell's handling.
11291** The scan is resumable for subsequent lines when prior
11292** return values are passed as the 2nd argument.
11293*/
11294static QuickScanState quickscan(char *zLine, QuickScanState qss){
11295  char cin;
11296  char cWait = (char)qss; /* intentional narrowing loss */
11297  if( cWait==0 ){
11298  PlainScan:
11299    assert( cWait==0 );
11300    while( (cin = *zLine++)!=0 ){
11301      if( IsSpace(cin) )
11302        continue;
11303      switch (cin){
11304      case '-':
11305        if( *zLine!='-' )
11306          break;
11307        while((cin = *++zLine)!=0 )
11308          if( cin=='\n')
11309            goto PlainScan;
11310        return qss;
11311      case ';':
11312        qss |= QSS_EndingSemi;
11313        continue;
11314      case '/':
11315        if( *zLine=='*' ){
11316          ++zLine;
11317          cWait = '*';
11318          qss = QSS_SETV(qss, cWait);
11319          goto TermScan;
11320        }
11321        break;
11322      case '[':
11323        cin = ']';
11324        /* fall thru */
11325      case '`': case '\'': case '"':
11326        cWait = cin;
11327        qss = QSS_HasDark | cWait;
11328        goto TermScan;
11329      default:
11330        break;
11331      }
11332      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
11333    }
11334  }else{
11335  TermScan:
11336    while( (cin = *zLine++)!=0 ){
11337      if( cin==cWait ){
11338        switch( cWait ){
11339        case '*':
11340          if( *zLine != '/' )
11341            continue;
11342          ++zLine;
11343          cWait = 0;
11344          qss = QSS_SETV(qss, 0);
11345          goto PlainScan;
11346        case '`': case '\'': case '"':
11347          if(*zLine==cWait){
11348            ++zLine;
11349            continue;
11350          }
11351          /* fall thru */
11352        case ']':
11353          cWait = 0;
11354          qss = QSS_SETV(qss, 0);
11355          goto PlainScan;
11356        default: assert(0);
11357        }
11358      }
11359    }
11360  }
11361  return qss;
11362}
11363
11364/*
11365** Return TRUE if the line typed in is an SQL command terminator other
11366** than a semi-colon.  The SQL Server style "go" command is understood
11367** as is the Oracle "/".
11368*/
11369static int line_is_command_terminator(char *zLine){
11370  while( IsSpace(zLine[0]) ){ zLine++; };
11371  if( zLine[0]=='/' )
11372    zLine += 1; /* Oracle */
11373  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
11374    zLine += 2; /* SQL Server */
11375  else
11376    return 0;
11377  return quickscan(zLine,QSS_Start)==QSS_Start;
11378}
11379
11380/*
11381** We need a default sqlite3_complete() implementation to use in case
11382** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
11383** any arbitrary text is a complete SQL statement.  This is not very
11384** user-friendly, but it does seem to work.
11385*/
11386#ifdef SQLITE_OMIT_COMPLETE
11387#define sqlite3_complete(x) 1
11388#endif
11389
11390/*
11391** Return true if zSql is a complete SQL statement.  Return false if it
11392** ends in the middle of a string literal or C-style comment.
11393*/
11394static int line_is_complete(char *zSql, int nSql){
11395  int rc;
11396  if( zSql==0 ) return 1;
11397  zSql[nSql] = ';';
11398  zSql[nSql+1] = 0;
11399  rc = sqlite3_complete(zSql);
11400  zSql[nSql] = 0;
11401  return rc;
11402}
11403
11404/*
11405** Run a single line of SQL.  Return the number of errors.
11406*/
11407static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
11408  int rc;
11409  char *zErrMsg = 0;
11410
11411  open_db(p, 0);
11412  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
11413  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
11414  BEGIN_TIMER;
11415  rc = shell_exec(p, zSql, &zErrMsg);
11416  END_TIMER;
11417  if( rc || zErrMsg ){
11418    char zPrefix[100];
11419    const char *zErrorTail;
11420    const char *zErrorType;
11421    if( zErrMsg==0 ){
11422      zErrorType = "Error";
11423      zErrorTail = sqlite3_errmsg(p->db);
11424    }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){
11425      zErrorType = "Parse error";
11426      zErrorTail = &zErrMsg[12];
11427    }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){
11428      zErrorType = "Runtime error";
11429      zErrorTail = &zErrMsg[10];
11430    }else{
11431      zErrorType = "Error";
11432      zErrorTail = zErrMsg;
11433    }
11434    if( in!=0 || !stdin_is_interactive ){
11435      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
11436                       "%s near line %d:", zErrorType, startline);
11437    }else{
11438      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
11439    }
11440    utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
11441    sqlite3_free(zErrMsg);
11442    zErrMsg = 0;
11443    return 1;
11444  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
11445    char zLineBuf[2000];
11446    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
11447            "changes: %lld   total_changes: %lld",
11448            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
11449    raw_printf(p->out, "%s\n", zLineBuf);
11450  }
11451  return 0;
11452}
11453
11454
11455/*
11456** Read input from *in and process it.  If *in==0 then input
11457** is interactive - the user is typing it it.  Otherwise, input
11458** is coming from a file or device.  A prompt is issued and history
11459** is saved only if input is interactive.  An interrupt signal will
11460** cause this routine to exit immediately, unless input is interactive.
11461**
11462** Return the number of errors.
11463*/
11464static int process_input(ShellState *p){
11465  char *zLine = 0;          /* A single input line */
11466  char *zSql = 0;           /* Accumulated SQL text */
11467  int nLine;                /* Length of current line */
11468  int nSql = 0;             /* Bytes of zSql[] used */
11469  int nAlloc = 0;           /* Allocated zSql[] space */
11470  int rc;                   /* Error code */
11471  int errCnt = 0;           /* Number of errors seen */
11472  int startline = 0;        /* Line number for start of current input */
11473  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
11474
11475  if( p->inputNesting==MAX_INPUT_NESTING ){
11476    /* This will be more informative in a later version. */
11477    utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
11478                " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
11479    return 1;
11480  }
11481  ++p->inputNesting;
11482  p->lineno = 0;
11483  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
11484    fflush(p->out);
11485    zLine = one_input_line(p->in, zLine, nSql>0);
11486    if( zLine==0 ){
11487      /* End of input */
11488      if( p->in==0 && stdin_is_interactive ) printf("\n");
11489      break;
11490    }
11491    if( seenInterrupt ){
11492      if( p->in!=0 ) break;
11493      seenInterrupt = 0;
11494    }
11495    p->lineno++;
11496    if( QSS_INPLAIN(qss)
11497        && line_is_command_terminator(zLine)
11498        && line_is_complete(zSql, nSql) ){
11499      memcpy(zLine,";",2);
11500    }
11501    qss = quickscan(zLine, qss);
11502    if( QSS_PLAINWHITE(qss) && nSql==0 ){
11503      if( ShellHasFlag(p, SHFLG_Echo) )
11504        printf("%s\n", zLine);
11505      /* Just swallow single-line whitespace */
11506      qss = QSS_Start;
11507      continue;
11508    }
11509    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
11510      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
11511      if( zLine[0]=='.' ){
11512        rc = do_meta_command(zLine, p);
11513        if( rc==2 ){ /* exit requested */
11514          break;
11515        }else if( rc ){
11516          errCnt++;
11517        }
11518      }
11519      qss = QSS_Start;
11520      continue;
11521    }
11522    /* No single-line dispositions remain; accumulate line(s). */
11523    nLine = strlen30(zLine);
11524    if( nSql+nLine+2>=nAlloc ){
11525      /* Grow buffer by half-again increments when big. */
11526      nAlloc = nSql+(nSql>>1)+nLine+100;
11527      zSql = realloc(zSql, nAlloc);
11528      shell_check_oom(zSql);
11529    }
11530    if( nSql==0 ){
11531      int i;
11532      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
11533      assert( nAlloc>0 && zSql!=0 );
11534      memcpy(zSql, zLine+i, nLine+1-i);
11535      startline = p->lineno;
11536      nSql = nLine-i;
11537    }else{
11538      zSql[nSql++] = '\n';
11539      memcpy(zSql+nSql, zLine, nLine+1);
11540      nSql += nLine;
11541    }
11542    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
11543      errCnt += runOneSqlLine(p, zSql, p->in, startline);
11544      nSql = 0;
11545      if( p->outCount ){
11546        output_reset(p);
11547        p->outCount = 0;
11548      }else{
11549        clearTempFile(p);
11550      }
11551      p->bSafeMode = p->bSafeModePersist;
11552      qss = QSS_Start;
11553    }else if( nSql && QSS_PLAINWHITE(qss) ){
11554      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
11555      nSql = 0;
11556      qss = QSS_Start;
11557    }
11558  }
11559  if( nSql && QSS_PLAINDARK(qss) ){
11560    errCnt += runOneSqlLine(p, zSql, p->in, startline);
11561  }
11562  free(zSql);
11563  free(zLine);
11564  --p->inputNesting;
11565  return errCnt>0;
11566}
11567
11568/*
11569** Return a pathname which is the user's home directory.  A
11570** 0 return indicates an error of some kind.
11571*/
11572static char *find_home_dir(int clearFlag){
11573  static char *home_dir = NULL;
11574  if( clearFlag ){
11575    free(home_dir);
11576    home_dir = 0;
11577    return 0;
11578  }
11579  if( home_dir ) return home_dir;
11580
11581#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11582     && !defined(__RTP__) && !defined(_WRS_KERNEL)
11583  {
11584    struct passwd *pwent;
11585    uid_t uid = getuid();
11586    if( (pwent=getpwuid(uid)) != NULL) {
11587      home_dir = pwent->pw_dir;
11588    }
11589  }
11590#endif
11591
11592#if defined(_WIN32_WCE)
11593  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11594   */
11595  home_dir = "/";
11596#else
11597
11598#if defined(_WIN32) || defined(WIN32)
11599  if (!home_dir) {
11600    home_dir = getenv("USERPROFILE");
11601  }
11602#endif
11603
11604  if (!home_dir) {
11605    home_dir = getenv("HOME");
11606  }
11607
11608#if defined(_WIN32) || defined(WIN32)
11609  if (!home_dir) {
11610    char *zDrive, *zPath;
11611    int n;
11612    zDrive = getenv("HOMEDRIVE");
11613    zPath = getenv("HOMEPATH");
11614    if( zDrive && zPath ){
11615      n = strlen30(zDrive) + strlen30(zPath) + 1;
11616      home_dir = malloc( n );
11617      if( home_dir==0 ) return 0;
11618      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11619      return home_dir;
11620    }
11621    home_dir = "c:\\";
11622  }
11623#endif
11624
11625#endif /* !_WIN32_WCE */
11626
11627  if( home_dir ){
11628    int n = strlen30(home_dir) + 1;
11629    char *z = malloc( n );
11630    if( z ) memcpy(z, home_dir, n);
11631    home_dir = z;
11632  }
11633
11634  return home_dir;
11635}
11636
11637/*
11638** Read input from the file given by sqliterc_override.  Or if that
11639** parameter is NULL, take input from ~/.sqliterc
11640**
11641** Returns the number of errors.
11642*/
11643static void process_sqliterc(
11644  ShellState *p,                  /* Configuration data */
11645  const char *sqliterc_override   /* Name of config file. NULL to use default */
11646){
11647  char *home_dir = NULL;
11648  const char *sqliterc = sqliterc_override;
11649  char *zBuf = 0;
11650  FILE *inSaved = p->in;
11651  int savedLineno = p->lineno;
11652
11653  if (sqliterc == NULL) {
11654    home_dir = find_home_dir(0);
11655    if( home_dir==0 ){
11656      raw_printf(stderr, "-- warning: cannot find home directory;"
11657                      " cannot read ~/.sqliterc\n");
11658      return;
11659    }
11660    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11661    shell_check_oom(zBuf);
11662    sqliterc = zBuf;
11663  }
11664  p->in = fopen(sqliterc,"rb");
11665  if( p->in ){
11666    if( stdin_is_interactive ){
11667      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11668    }
11669    if( process_input(p) && bail_on_error ) exit(1);
11670    fclose(p->in);
11671  }else if( sqliterc_override!=0 ){
11672    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11673    if( bail_on_error ) exit(1);
11674  }
11675  p->in = inSaved;
11676  p->lineno = savedLineno;
11677  sqlite3_free(zBuf);
11678}
11679
11680/*
11681** Show available command line options
11682*/
11683static const char zOptions[] =
11684#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11685  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11686#endif
11687  "   -append              append the database to the end of the file\n"
11688  "   -ascii               set output mode to 'ascii'\n"
11689  "   -bail                stop after hitting an error\n"
11690  "   -batch               force batch I/O\n"
11691  "   -box                 set output mode to 'box'\n"
11692  "   -column              set output mode to 'column'\n"
11693  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11694  "   -csv                 set output mode to 'csv'\n"
11695#if !defined(SQLITE_OMIT_DESERIALIZE)
11696  "   -deserialize         open the database using sqlite3_deserialize()\n"
11697#endif
11698  "   -echo                print commands before execution\n"
11699  "   -init FILENAME       read/process named file\n"
11700  "   -[no]header          turn headers on or off\n"
11701#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11702  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11703#endif
11704  "   -help                show this message\n"
11705  "   -html                set output mode to HTML\n"
11706  "   -interactive         force interactive I/O\n"
11707  "   -json                set output mode to 'json'\n"
11708  "   -line                set output mode to 'line'\n"
11709  "   -list                set output mode to 'list'\n"
11710  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11711  "   -markdown            set output mode to 'markdown'\n"
11712#if !defined(SQLITE_OMIT_DESERIALIZE)
11713  "   -maxsize N           maximum size for a --deserialize database\n"
11714#endif
11715  "   -memtrace            trace all memory allocations and deallocations\n"
11716  "   -mmap N              default mmap size set to N\n"
11717#ifdef SQLITE_ENABLE_MULTIPLEX
11718  "   -multiplex           enable the multiplexor VFS\n"
11719#endif
11720  "   -newline SEP         set output row separator. Default: '\\n'\n"
11721  "   -nofollow            refuse to open symbolic links to database files\n"
11722  "   -nonce STRING        set the safe-mode escape nonce\n"
11723  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11724  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11725  "   -quote               set output mode to 'quote'\n"
11726  "   -readonly            open the database read-only\n"
11727  "   -safe                enable safe-mode\n"
11728  "   -separator SEP       set output column separator. Default: '|'\n"
11729#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11730  "   -sorterref SIZE      sorter references threshold size\n"
11731#endif
11732  "   -stats               print memory stats before each finalize\n"
11733  "   -table               set output mode to 'table'\n"
11734  "   -tabs                set output mode to 'tabs'\n"
11735  "   -version             show SQLite version\n"
11736  "   -vfs NAME            use NAME as the default VFS\n"
11737#ifdef SQLITE_ENABLE_VFSTRACE
11738  "   -vfstrace            enable tracing of all VFS calls\n"
11739#endif
11740#ifdef SQLITE_HAVE_ZLIB
11741  "   -zip                 open the file as a ZIP Archive\n"
11742#endif
11743;
11744static void usage(int showDetail){
11745  utf8_printf(stderr,
11746      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11747      "FILENAME is the name of an SQLite database. A new database is created\n"
11748      "if the file does not previously exist.\n", Argv0);
11749  if( showDetail ){
11750    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11751  }else{
11752    raw_printf(stderr, "Use the -help option for additional information\n");
11753  }
11754  exit(1);
11755}
11756
11757/*
11758** Internal check:  Verify that the SQLite is uninitialized.  Print a
11759** error message if it is initialized.
11760*/
11761static void verify_uninitialized(void){
11762  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11763    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11764                        " initialization.\n");
11765  }
11766}
11767
11768/*
11769** Initialize the state information in data
11770*/
11771static void main_init(ShellState *data) {
11772  memset(data, 0, sizeof(*data));
11773  data->normalMode = data->cMode = data->mode = MODE_List;
11774  data->autoExplain = 1;
11775  data->pAuxDb = &data->aAuxDb[0];
11776  memcpy(data->colSeparator,SEP_Column, 2);
11777  memcpy(data->rowSeparator,SEP_Row, 2);
11778  data->showHeader = 0;
11779  data->shellFlgs = SHFLG_Lookaside;
11780  verify_uninitialized();
11781  sqlite3_config(SQLITE_CONFIG_URI, 1);
11782  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11783  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11784  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11785  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11786}
11787
11788/*
11789** Output text to the console in a font that attracts extra attention.
11790*/
11791#ifdef _WIN32
11792static void printBold(const char *zText){
11793#if !SQLITE_OS_WINRT
11794  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11795  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11796  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11797  SetConsoleTextAttribute(out,
11798         FOREGROUND_RED|FOREGROUND_INTENSITY
11799  );
11800#endif
11801  printf("%s", zText);
11802#if !SQLITE_OS_WINRT
11803  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11804#endif
11805}
11806#else
11807static void printBold(const char *zText){
11808  printf("\033[1m%s\033[0m", zText);
11809}
11810#endif
11811
11812/*
11813** Get the argument to an --option.  Throw an error and die if no argument
11814** is available.
11815*/
11816static char *cmdline_option_value(int argc, char **argv, int i){
11817  if( i==argc ){
11818    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11819            argv[0], argv[argc-1]);
11820    exit(1);
11821  }
11822  return argv[i];
11823}
11824
11825#ifndef SQLITE_SHELL_IS_UTF8
11826#  if (defined(_WIN32) || defined(WIN32)) \
11827   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11828#    define SQLITE_SHELL_IS_UTF8          (0)
11829#  else
11830#    define SQLITE_SHELL_IS_UTF8          (1)
11831#  endif
11832#endif
11833
11834#if SQLITE_SHELL_IS_UTF8
11835int SQLITE_CDECL main(int argc, char **argv){
11836#else
11837int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11838  char **argv;
11839#endif
11840  char *zErrMsg = 0;
11841  ShellState data;
11842  const char *zInitFile = 0;
11843  int i;
11844  int rc = 0;
11845  int warnInmemoryDb = 0;
11846  int readStdin = 1;
11847  int nCmd = 0;
11848  char **azCmd = 0;
11849  const char *zVfs = 0;           /* Value of -vfs command-line option */
11850#if !SQLITE_SHELL_IS_UTF8
11851  char **argvToFree = 0;
11852  int argcToFree = 0;
11853#endif
11854
11855  setBinaryMode(stdin, 0);
11856  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11857  stdin_is_interactive = isatty(0);
11858  stdout_is_console = isatty(1);
11859
11860#if !defined(_WIN32_WCE)
11861  if( getenv("SQLITE_DEBUG_BREAK") ){
11862    if( isatty(0) && isatty(2) ){
11863      fprintf(stderr,
11864          "attach debugger to process %d and press any key to continue.\n",
11865          GETPID());
11866      fgetc(stdin);
11867    }else{
11868#if defined(_WIN32) || defined(WIN32)
11869#if SQLITE_OS_WINRT
11870      __debugbreak();
11871#else
11872      DebugBreak();
11873#endif
11874#elif defined(SIGTRAP)
11875      raise(SIGTRAP);
11876#endif
11877    }
11878  }
11879#endif
11880
11881#if USE_SYSTEM_SQLITE+0!=1
11882  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11883    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11884            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11885    exit(1);
11886  }
11887#endif
11888  main_init(&data);
11889
11890  /* On Windows, we must translate command-line arguments into UTF-8.
11891  ** The SQLite memory allocator subsystem has to be enabled in order to
11892  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11893  ** subsequent sqlite3_config() calls will work.  So copy all results into
11894  ** memory that does not come from the SQLite memory allocator.
11895  */
11896#if !SQLITE_SHELL_IS_UTF8
11897  sqlite3_initialize();
11898  argvToFree = malloc(sizeof(argv[0])*argc*2);
11899  shell_check_oom(argvToFree);
11900  argcToFree = argc;
11901  argv = argvToFree + argc;
11902  for(i=0; i<argc; i++){
11903    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11904    int n;
11905    shell_check_oom(z);
11906    n = (int)strlen(z);
11907    argv[i] = malloc( n+1 );
11908    shell_check_oom(argv[i]);
11909    memcpy(argv[i], z, n+1);
11910    argvToFree[i] = argv[i];
11911    sqlite3_free(z);
11912  }
11913  sqlite3_shutdown();
11914#endif
11915
11916  assert( argc>=1 && argv && argv[0] );
11917  Argv0 = argv[0];
11918
11919  /* Make sure we have a valid signal handler early, before anything
11920  ** else is done.
11921  */
11922#ifdef SIGINT
11923  signal(SIGINT, interrupt_handler);
11924#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11925  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11926#endif
11927
11928#ifdef SQLITE_SHELL_DBNAME_PROC
11929  {
11930    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11931    ** of a C-function that will provide the name of the database file.  Use
11932    ** this compile-time option to embed this shell program in larger
11933    ** applications. */
11934    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11935    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11936    warnInmemoryDb = 0;
11937  }
11938#endif
11939
11940  /* Do an initial pass through the command-line argument to locate
11941  ** the name of the database file, the name of the initialization file,
11942  ** the size of the alternative malloc heap,
11943  ** and the first command to execute.
11944  */
11945  verify_uninitialized();
11946  for(i=1; i<argc; i++){
11947    char *z;
11948    z = argv[i];
11949    if( z[0]!='-' ){
11950      if( data.aAuxDb->zDbFilename==0 ){
11951        data.aAuxDb->zDbFilename = z;
11952      }else{
11953        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11954        ** mean that nothing is read from stdin */
11955        readStdin = 0;
11956        nCmd++;
11957        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11958        shell_check_oom(azCmd);
11959        azCmd[nCmd-1] = z;
11960      }
11961    }
11962    if( z[1]=='-' ) z++;
11963    if( strcmp(z,"-separator")==0
11964     || strcmp(z,"-nullvalue")==0
11965     || strcmp(z,"-newline")==0
11966     || strcmp(z,"-cmd")==0
11967    ){
11968      (void)cmdline_option_value(argc, argv, ++i);
11969    }else if( strcmp(z,"-init")==0 ){
11970      zInitFile = cmdline_option_value(argc, argv, ++i);
11971    }else if( strcmp(z,"-batch")==0 ){
11972      /* Need to check for batch mode here to so we can avoid printing
11973      ** informational messages (like from process_sqliterc) before
11974      ** we do the actual processing of arguments later in a second pass.
11975      */
11976      stdin_is_interactive = 0;
11977    }else if( strcmp(z,"-heap")==0 ){
11978#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11979      const char *zSize;
11980      sqlite3_int64 szHeap;
11981
11982      zSize = cmdline_option_value(argc, argv, ++i);
11983      szHeap = integerValue(zSize);
11984      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11985      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11986#else
11987      (void)cmdline_option_value(argc, argv, ++i);
11988#endif
11989    }else if( strcmp(z,"-pagecache")==0 ){
11990      sqlite3_int64 n, sz;
11991      sz = integerValue(cmdline_option_value(argc,argv,++i));
11992      if( sz>70000 ) sz = 70000;
11993      if( sz<0 ) sz = 0;
11994      n = integerValue(cmdline_option_value(argc,argv,++i));
11995      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
11996        n = 0xffffffffffffLL/sz;
11997      }
11998      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
11999                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
12000      data.shellFlgs |= SHFLG_Pagecache;
12001    }else if( strcmp(z,"-lookaside")==0 ){
12002      int n, sz;
12003      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
12004      if( sz<0 ) sz = 0;
12005      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12006      if( n<0 ) n = 0;
12007      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
12008      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
12009    }else if( strcmp(z,"-threadsafe")==0 ){
12010      int n;
12011      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12012      switch( n ){
12013         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
12014         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
12015         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
12016      }
12017#ifdef SQLITE_ENABLE_VFSTRACE
12018    }else if( strcmp(z,"-vfstrace")==0 ){
12019      extern int vfstrace_register(
12020         const char *zTraceName,
12021         const char *zOldVfsName,
12022         int (*xOut)(const char*,void*),
12023         void *pOutArg,
12024         int makeDefault
12025      );
12026      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
12027#endif
12028#ifdef SQLITE_ENABLE_MULTIPLEX
12029    }else if( strcmp(z,"-multiplex")==0 ){
12030      extern int sqlite3_multiple_initialize(const char*,int);
12031      sqlite3_multiplex_initialize(0, 1);
12032#endif
12033    }else if( strcmp(z,"-mmap")==0 ){
12034      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12035      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
12036#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12037    }else if( strcmp(z,"-sorterref")==0 ){
12038      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12039      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
12040#endif
12041    }else if( strcmp(z,"-vfs")==0 ){
12042      zVfs = cmdline_option_value(argc, argv, ++i);
12043#ifdef SQLITE_HAVE_ZLIB
12044    }else if( strcmp(z,"-zip")==0 ){
12045      data.openMode = SHELL_OPEN_ZIPFILE;
12046#endif
12047    }else if( strcmp(z,"-append")==0 ){
12048      data.openMode = SHELL_OPEN_APPENDVFS;
12049#ifndef SQLITE_OMIT_DESERIALIZE
12050    }else if( strcmp(z,"-deserialize")==0 ){
12051      data.openMode = SHELL_OPEN_DESERIALIZE;
12052    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12053      data.szMax = integerValue(argv[++i]);
12054#endif
12055    }else if( strcmp(z,"-readonly")==0 ){
12056      data.openMode = SHELL_OPEN_READONLY;
12057    }else if( strcmp(z,"-nofollow")==0 ){
12058      data.openFlags = SQLITE_OPEN_NOFOLLOW;
12059#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12060    }else if( strncmp(z, "-A",2)==0 ){
12061      /* All remaining command-line arguments are passed to the ".archive"
12062      ** command, so ignore them */
12063      break;
12064#endif
12065    }else if( strcmp(z, "-memtrace")==0 ){
12066      sqlite3MemTraceActivate(stderr);
12067    }else if( strcmp(z,"-bail")==0 ){
12068      bail_on_error = 1;
12069    }else if( strcmp(z,"-nonce")==0 ){
12070      free(data.zNonce);
12071      data.zNonce = strdup(argv[++i]);
12072    }else if( strcmp(z,"-safe")==0 ){
12073      /* no-op - catch this on the second pass */
12074    }
12075  }
12076  verify_uninitialized();
12077
12078
12079#ifdef SQLITE_SHELL_INIT_PROC
12080  {
12081    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
12082    ** of a C-function that will perform initialization actions on SQLite that
12083    ** occur just before or after sqlite3_initialize(). Use this compile-time
12084    ** option to embed this shell program in larger applications. */
12085    extern void SQLITE_SHELL_INIT_PROC(void);
12086    SQLITE_SHELL_INIT_PROC();
12087  }
12088#else
12089  /* All the sqlite3_config() calls have now been made. So it is safe
12090  ** to call sqlite3_initialize() and process any command line -vfs option. */
12091  sqlite3_initialize();
12092#endif
12093
12094  if( zVfs ){
12095    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
12096    if( pVfs ){
12097      sqlite3_vfs_register(pVfs, 1);
12098    }else{
12099      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
12100      exit(1);
12101    }
12102  }
12103
12104  if( data.pAuxDb->zDbFilename==0 ){
12105#ifndef SQLITE_OMIT_MEMORYDB
12106    data.pAuxDb->zDbFilename = ":memory:";
12107    warnInmemoryDb = argc==1;
12108#else
12109    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
12110    return 1;
12111#endif
12112  }
12113  data.out = stdout;
12114  sqlite3_appendvfs_init(0,0,0);
12115
12116  /* Go ahead and open the database file if it already exists.  If the
12117  ** file does not exist, delay opening it.  This prevents empty database
12118  ** files from being created if a user mistypes the database name argument
12119  ** to the sqlite command-line tool.
12120  */
12121  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
12122    open_db(&data, 0);
12123  }
12124
12125  /* Process the initialization file if there is one.  If no -init option
12126  ** is given on the command line, look for a file named ~/.sqliterc and
12127  ** try to process it.
12128  */
12129  process_sqliterc(&data,zInitFile);
12130
12131  /* Make a second pass through the command-line argument and set
12132  ** options.  This second pass is delayed until after the initialization
12133  ** file is processed so that the command-line arguments will override
12134  ** settings in the initialization file.
12135  */
12136  for(i=1; i<argc; i++){
12137    char *z = argv[i];
12138    if( z[0]!='-' ) continue;
12139    if( z[1]=='-' ){ z++; }
12140    if( strcmp(z,"-init")==0 ){
12141      i++;
12142    }else if( strcmp(z,"-html")==0 ){
12143      data.mode = MODE_Html;
12144    }else if( strcmp(z,"-list")==0 ){
12145      data.mode = MODE_List;
12146    }else if( strcmp(z,"-quote")==0 ){
12147      data.mode = MODE_Quote;
12148      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
12149      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12150    }else if( strcmp(z,"-line")==0 ){
12151      data.mode = MODE_Line;
12152    }else if( strcmp(z,"-column")==0 ){
12153      data.mode = MODE_Column;
12154    }else if( strcmp(z,"-json")==0 ){
12155      data.mode = MODE_Json;
12156    }else if( strcmp(z,"-markdown")==0 ){
12157      data.mode = MODE_Markdown;
12158    }else if( strcmp(z,"-table")==0 ){
12159      data.mode = MODE_Table;
12160    }else if( strcmp(z,"-box")==0 ){
12161      data.mode = MODE_Box;
12162    }else if( strcmp(z,"-csv")==0 ){
12163      data.mode = MODE_Csv;
12164      memcpy(data.colSeparator,",",2);
12165#ifdef SQLITE_HAVE_ZLIB
12166    }else if( strcmp(z,"-zip")==0 ){
12167      data.openMode = SHELL_OPEN_ZIPFILE;
12168#endif
12169    }else if( strcmp(z,"-append")==0 ){
12170      data.openMode = SHELL_OPEN_APPENDVFS;
12171#ifndef SQLITE_OMIT_DESERIALIZE
12172    }else if( strcmp(z,"-deserialize")==0 ){
12173      data.openMode = SHELL_OPEN_DESERIALIZE;
12174    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12175      data.szMax = integerValue(argv[++i]);
12176#endif
12177    }else if( strcmp(z,"-readonly")==0 ){
12178      data.openMode = SHELL_OPEN_READONLY;
12179    }else if( strcmp(z,"-nofollow")==0 ){
12180      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
12181    }else if( strcmp(z,"-ascii")==0 ){
12182      data.mode = MODE_Ascii;
12183      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
12184      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
12185    }else if( strcmp(z,"-tabs")==0 ){
12186      data.mode = MODE_List;
12187      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
12188      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12189    }else if( strcmp(z,"-separator")==0 ){
12190      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
12191                       "%s",cmdline_option_value(argc,argv,++i));
12192    }else if( strcmp(z,"-newline")==0 ){
12193      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
12194                       "%s",cmdline_option_value(argc,argv,++i));
12195    }else if( strcmp(z,"-nullvalue")==0 ){
12196      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
12197                       "%s",cmdline_option_value(argc,argv,++i));
12198    }else if( strcmp(z,"-header")==0 ){
12199      data.showHeader = 1;
12200      ShellSetFlag(&data, SHFLG_HeaderSet);
12201     }else if( strcmp(z,"-noheader")==0 ){
12202      data.showHeader = 0;
12203      ShellSetFlag(&data, SHFLG_HeaderSet);
12204    }else if( strcmp(z,"-echo")==0 ){
12205      ShellSetFlag(&data, SHFLG_Echo);
12206    }else if( strcmp(z,"-eqp")==0 ){
12207      data.autoEQP = AUTOEQP_on;
12208    }else if( strcmp(z,"-eqpfull")==0 ){
12209      data.autoEQP = AUTOEQP_full;
12210    }else if( strcmp(z,"-stats")==0 ){
12211      data.statsOn = 1;
12212    }else if( strcmp(z,"-scanstats")==0 ){
12213      data.scanstatsOn = 1;
12214    }else if( strcmp(z,"-backslash")==0 ){
12215      /* Undocumented command-line option: -backslash
12216      ** Causes C-style backslash escapes to be evaluated in SQL statements
12217      ** prior to sending the SQL into SQLite.  Useful for injecting
12218      ** crazy bytes in the middle of SQL statements for testing and debugging.
12219      */
12220      ShellSetFlag(&data, SHFLG_Backslash);
12221    }else if( strcmp(z,"-bail")==0 ){
12222      /* No-op.  The bail_on_error flag should already be set. */
12223    }else if( strcmp(z,"-version")==0 ){
12224      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
12225      return 0;
12226    }else if( strcmp(z,"-interactive")==0 ){
12227      stdin_is_interactive = 1;
12228    }else if( strcmp(z,"-batch")==0 ){
12229      stdin_is_interactive = 0;
12230    }else if( strcmp(z,"-heap")==0 ){
12231      i++;
12232    }else if( strcmp(z,"-pagecache")==0 ){
12233      i+=2;
12234    }else if( strcmp(z,"-lookaside")==0 ){
12235      i+=2;
12236    }else if( strcmp(z,"-threadsafe")==0 ){
12237      i+=2;
12238    }else if( strcmp(z,"-nonce")==0 ){
12239      i += 2;
12240    }else if( strcmp(z,"-mmap")==0 ){
12241      i++;
12242    }else if( strcmp(z,"-memtrace")==0 ){
12243      i++;
12244#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12245    }else if( strcmp(z,"-sorterref")==0 ){
12246      i++;
12247#endif
12248    }else if( strcmp(z,"-vfs")==0 ){
12249      i++;
12250#ifdef SQLITE_ENABLE_VFSTRACE
12251    }else if( strcmp(z,"-vfstrace")==0 ){
12252      i++;
12253#endif
12254#ifdef SQLITE_ENABLE_MULTIPLEX
12255    }else if( strcmp(z,"-multiplex")==0 ){
12256      i++;
12257#endif
12258    }else if( strcmp(z,"-help")==0 ){
12259      usage(1);
12260    }else if( strcmp(z,"-cmd")==0 ){
12261      /* Run commands that follow -cmd first and separately from commands
12262      ** that simply appear on the command-line.  This seems goofy.  It would
12263      ** be better if all commands ran in the order that they appear.  But
12264      ** we retain the goofy behavior for historical compatibility. */
12265      if( i==argc-1 ) break;
12266      z = cmdline_option_value(argc,argv,++i);
12267      if( z[0]=='.' ){
12268        rc = do_meta_command(z, &data);
12269        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
12270      }else{
12271        open_db(&data, 0);
12272        rc = shell_exec(&data, z, &zErrMsg);
12273        if( zErrMsg!=0 ){
12274          utf8_printf(stderr,"Error: %s\n", zErrMsg);
12275          if( bail_on_error ) return rc!=0 ? rc : 1;
12276        }else if( rc!=0 ){
12277          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
12278          if( bail_on_error ) return rc;
12279        }
12280      }
12281#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12282    }else if( strncmp(z, "-A", 2)==0 ){
12283      if( nCmd>0 ){
12284        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
12285                            " with \"%s\"\n", z);
12286        return 1;
12287      }
12288      open_db(&data, OPEN_DB_ZIPFILE);
12289      if( z[2] ){
12290        argv[i] = &z[2];
12291        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
12292      }else{
12293        arDotCommand(&data, 1, argv+i, argc-i);
12294      }
12295      readStdin = 0;
12296      break;
12297#endif
12298    }else if( strcmp(z,"-safe")==0 ){
12299      data.bSafeMode = data.bSafeModePersist = 1;
12300    }else{
12301      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
12302      raw_printf(stderr,"Use -help for a list of options.\n");
12303      return 1;
12304    }
12305    data.cMode = data.mode;
12306  }
12307
12308  if( !readStdin ){
12309    /* Run all arguments that do not begin with '-' as if they were separate
12310    ** command-line inputs, except for the argToSkip argument which contains
12311    ** the database filename.
12312    */
12313    for(i=0; i<nCmd; i++){
12314      if( azCmd[i][0]=='.' ){
12315        rc = do_meta_command(azCmd[i], &data);
12316        if( rc ){
12317          free(azCmd);
12318          return rc==2 ? 0 : rc;
12319        }
12320      }else{
12321        open_db(&data, 0);
12322        rc = shell_exec(&data, azCmd[i], &zErrMsg);
12323        if( zErrMsg || rc ){
12324          if( zErrMsg!=0 ){
12325            utf8_printf(stderr,"Error: %s\n", zErrMsg);
12326          }else{
12327            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
12328          }
12329          sqlite3_free(zErrMsg);
12330          free(azCmd);
12331          return rc!=0 ? rc : 1;
12332        }
12333      }
12334    }
12335  }else{
12336    /* Run commands received from standard input
12337    */
12338    if( stdin_is_interactive ){
12339      char *zHome;
12340      char *zHistory;
12341      int nHistory;
12342      printf(
12343        "SQLite version %s %.19s\n" /*extra-version-info*/
12344        "Enter \".help\" for usage hints.\n",
12345        sqlite3_libversion(), sqlite3_sourceid()
12346      );
12347      if( warnInmemoryDb ){
12348        printf("Connected to a ");
12349        printBold("transient in-memory database");
12350        printf(".\nUse \".open FILENAME\" to reopen on a "
12351               "persistent database.\n");
12352      }
12353      zHistory = getenv("SQLITE_HISTORY");
12354      if( zHistory ){
12355        zHistory = strdup(zHistory);
12356      }else if( (zHome = find_home_dir(0))!=0 ){
12357        nHistory = strlen30(zHome) + 20;
12358        if( (zHistory = malloc(nHistory))!=0 ){
12359          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
12360        }
12361      }
12362      if( zHistory ){ shell_read_history(zHistory); }
12363#if HAVE_READLINE || HAVE_EDITLINE
12364      rl_attempted_completion_function = readline_completion;
12365#elif HAVE_LINENOISE
12366      linenoiseSetCompletionCallback(linenoise_completion);
12367#endif
12368      data.in = 0;
12369      rc = process_input(&data);
12370      if( zHistory ){
12371        shell_stifle_history(2000);
12372        shell_write_history(zHistory);
12373        free(zHistory);
12374      }
12375    }else{
12376      data.in = stdin;
12377      rc = process_input(&data);
12378    }
12379  }
12380  free(azCmd);
12381  set_table_name(&data, 0);
12382  if( data.db ){
12383    session_close_all(&data, -1);
12384    close_db(data.db);
12385  }
12386  for(i=0; i<ArraySize(data.aAuxDb); i++){
12387    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
12388    if( data.aAuxDb[i].db ){
12389      session_close_all(&data, i);
12390      close_db(data.aAuxDb[i].db);
12391    }
12392  }
12393  find_home_dir(1);
12394  output_reset(&data);
12395  data.doXdgOpen = 0;
12396  clearTempFile(&data);
12397#if !SQLITE_SHELL_IS_UTF8
12398  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
12399  free(argvToFree);
12400#endif
12401  free(data.colWidth);
12402  free(data.zNonce);
12403  /* Clear the global data structure so that valgrind will detect memory
12404  ** leaks */
12405  memset(&data, 0, sizeof(data));
12406  return rc;
12407}
12408