xref: /sqlite-3.40.0/src/shell.c.in (revision c381056e)
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 .treetrace/.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  "   Options:",
4249  "       --append            Use the appendvfs",
4250  "       --async             Write to FILE without journal and fsync()",
4251  ".bail on|off             Stop after hitting an error.  Default OFF",
4252  ".binary on|off           Turn binary output on or off.  Default OFF",
4253  ".cd DIRECTORY            Change the working directory to DIRECTORY",
4254  ".changes on|off          Show number of rows changed by SQL",
4255  ".check GLOB              Fail if output since .testcase does not match",
4256  ".clone NEWDB             Clone data into NEWDB from the existing database",
4257  ".connection [close] [#]  Open or close an auxiliary database connection",
4258  ".databases               List names and files of attached databases",
4259  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
4260  ".dbinfo ?DB?             Show status information about the database",
4261  ".dump ?OBJECTS?          Render database content as SQL",
4262  "   Options:",
4263  "     --data-only            Output only INSERT statements",
4264  "     --newlines             Allow unescaped newline characters in output",
4265  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
4266  "     --preserve-rowids      Include ROWID values in the output",
4267  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
4268  "   Additional LIKE patterns can be given in subsequent arguments",
4269  ".echo on|off             Turn command echo on or off",
4270  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
4271  "   Other Modes:",
4272#ifdef SQLITE_DEBUG
4273  "      test                  Show raw EXPLAIN QUERY PLAN output",
4274  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4275#endif
4276  "      trigger               Like \"full\" but also show trigger bytecode",
4277  ".excel                   Display the output of next command in spreadsheet",
4278  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
4279  ".exit ?CODE?             Exit this program with return-code CODE",
4280  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
4281  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
4282  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
4283  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
4284  "   --help                  Show CMD details",
4285  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
4286  ".headers on|off          Turn display of headers on or off",
4287  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
4288  ".import FILE TABLE       Import data from FILE into TABLE",
4289  "   Options:",
4290  "     --ascii               Use \\037 and \\036 as column and row separators",
4291  "     --csv                 Use , and \\n as column and row separators",
4292  "     --skip N              Skip the first N rows of input",
4293  "     --schema S            Target table to be S.TABLE",
4294  "     -v                    \"Verbose\" - increase auxiliary output",
4295  "   Notes:",
4296  "     *  If TABLE does not exist, it is created.  The first row of input",
4297  "        determines the column names.",
4298  "     *  If neither --csv or --ascii are used, the input mode is derived",
4299  "        from the \".mode\" output mode",
4300  "     *  If FILE begins with \"|\" then it is a command that generates the",
4301  "        input text.",
4302#ifndef SQLITE_OMIT_TEST_CONTROL
4303  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
4304#endif
4305  ".indexes ?TABLE?         Show names of indexes",
4306  "                           If TABLE is specified, only show indexes for",
4307  "                           tables matching TABLE using the LIKE operator.",
4308#ifdef SQLITE_ENABLE_IOTRACE
4309  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
4310#endif
4311  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
4312  ".lint OPTIONS            Report potential schema issues.",
4313  "     Options:",
4314  "        fkey-indexes     Find missing foreign key indexes",
4315#ifndef SQLITE_OMIT_LOAD_EXTENSION
4316  ".load FILE ?ENTRY?       Load an extension library",
4317#endif
4318  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
4319  ".mode MODE ?OPTIONS?     Set output mode",
4320  "   MODE is one of:",
4321  "     ascii       Columns/rows delimited by 0x1F and 0x1E",
4322  "     box         Tables using unicode box-drawing characters",
4323  "     csv         Comma-separated values",
4324  "     column      Output in columns.  (See .width)",
4325  "     html        HTML <table> code",
4326  "     insert      SQL insert statements for TABLE",
4327  "     json        Results in a JSON array",
4328  "     line        One value per line",
4329  "     list        Values delimited by \"|\"",
4330  "     markdown    Markdown table format",
4331  "     qbox        Shorthand for \"box --width 60 --quote\"",
4332  "     quote       Escape answers as for SQL",
4333  "     table       ASCII-art table",
4334  "     tabs        Tab-separated values",
4335  "     tcl         TCL list elements",
4336  "   OPTIONS: (for columnar modes or insert mode):",
4337  "     --wrap N       Wrap output lines to no longer than N characters",
4338  "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
4339  "     --ww           Shorthand for \"--wordwrap 1\"",
4340  "     --quote        Quote output text as SQL literals",
4341  "     --noquote      Do not quote output text",
4342  "     TABLE          The name of SQL table used for \"insert\" mode",
4343  ".nonce STRING            Suspend safe mode for one command if nonce matches",
4344  ".nullvalue STRING        Use STRING in place of NULL values",
4345  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
4346  "     If FILE begins with '|' then open as a pipe",
4347  "       --bom  Put a UTF8 byte-order mark at the beginning",
4348  "       -e     Send output to the system text editor",
4349  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
4350  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
4351  "     Options:",
4352  "        --append        Use appendvfs to append database to the end of FILE",
4353#ifndef SQLITE_OMIT_DESERIALIZE
4354  "        --deserialize   Load into memory using sqlite3_deserialize()",
4355  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
4356  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
4357#endif
4358  "        --new           Initialize FILE to an empty database",
4359  "        --nofollow      Do not follow symbolic links",
4360  "        --readonly      Open FILE readonly",
4361  "        --zip           FILE is a ZIP archive",
4362  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
4363  "   If FILE begins with '|' then open it as a pipe.",
4364  "   Options:",
4365  "     --bom                 Prefix output with a UTF8 byte-order mark",
4366  "     -e                    Send output to the system text editor",
4367  "     -x                    Send output as CSV to a spreadsheet",
4368  ".parameter CMD ...       Manage SQL parameter bindings",
4369  "   clear                   Erase all bindings",
4370  "   init                    Initialize the TEMP table that holds bindings",
4371  "   list                    List the current parameter bindings",
4372  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
4373  "                           PARAMETER should start with one of: $ : @ ?",
4374  "   unset PARAMETER         Remove PARAMETER from the binding table",
4375  ".print STRING...         Print literal STRING",
4376#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4377  ".progress N              Invoke progress handler after every N opcodes",
4378  "   --limit N                 Interrupt after N progress callbacks",
4379  "   --once                    Do no more than one progress interrupt",
4380  "   --quiet|-q                No output except at interrupts",
4381  "   --reset                   Reset the count for each input and interrupt",
4382#endif
4383  ".prompt MAIN CONTINUE    Replace the standard prompts",
4384  ".quit                    Exit this program",
4385  ".read FILE               Read input from FILE or command output",
4386  "    If FILE begins with \"|\", it is a command that generates the input.",
4387#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4388  ".recover                 Recover as much data as possible from corrupt db.",
4389  "   --freelist-corrupt       Assume the freelist is corrupt",
4390  "   --recovery-db NAME       Store recovery metadata in database file NAME",
4391  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
4392  "   --no-rowids              Do not attempt to recover rowid values",
4393  "                            that are not also INTEGER PRIMARY KEYs",
4394#endif
4395  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
4396  ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
4397  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
4398  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
4399  "   Options:",
4400  "      --indent             Try to pretty-print the schema",
4401  "      --nosys              Omit objects whose names start with \"sqlite_\"",
4402  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
4403  "    Options:",
4404  "       --init               Create a new SELFTEST table",
4405  "       -v                   Verbose output",
4406  ".separator COL ?ROW?     Change the column and row separators",
4407#if defined(SQLITE_ENABLE_SESSION)
4408  ".session ?NAME? CMD ...  Create or control sessions",
4409  "   Subcommands:",
4410  "     attach TABLE             Attach TABLE",
4411  "     changeset FILE           Write a changeset into FILE",
4412  "     close                    Close one session",
4413  "     enable ?BOOLEAN?         Set or query the enable bit",
4414  "     filter GLOB...           Reject tables matching GLOBs",
4415  "     indirect ?BOOLEAN?       Mark or query the indirect status",
4416  "     isempty                  Query whether the session is empty",
4417  "     list                     List currently open session names",
4418  "     open DB NAME             Open a new session on DB",
4419  "     patchset FILE            Write a patchset into FILE",
4420  "   If ?NAME? is omitted, the first defined session is used.",
4421#endif
4422  ".sha3sum ...             Compute a SHA3 hash of database content",
4423  "    Options:",
4424  "      --schema              Also hash the sqlite_schema table",
4425  "      --sha3-224            Use the sha3-224 algorithm",
4426  "      --sha3-256            Use the sha3-256 algorithm (default)",
4427  "      --sha3-384            Use the sha3-384 algorithm",
4428  "      --sha3-512            Use the sha3-512 algorithm",
4429  "    Any other argument is a LIKE pattern for tables to hash",
4430#ifndef SQLITE_NOHAVE_SYSTEM
4431  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
4432#endif
4433  ".show                    Show the current values for various settings",
4434  ".stats ?ARG?             Show stats or turn stats on or off",
4435  "   off                      Turn off automatic stat display",
4436  "   on                       Turn on automatic stat display",
4437  "   stmt                     Show statement stats",
4438  "   vmstep                   Show the virtual machine step count only",
4439#ifndef SQLITE_NOHAVE_SYSTEM
4440  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
4441#endif
4442  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
4443  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
4444  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
4445  "                           Run \".testctrl\" with no arguments for details",
4446  ".timeout MS              Try opening locked tables for MS milliseconds",
4447  ".timer on|off            Turn SQL timer on or off",
4448#ifndef SQLITE_OMIT_TRACE
4449  ".trace ?OPTIONS?         Output each SQL statement as it is run",
4450  "    FILE                    Send output to FILE",
4451  "    stdout                  Send output to stdout",
4452  "    stderr                  Send output to stderr",
4453  "    off                     Disable tracing",
4454  "    --expanded              Expand query parameters",
4455#ifdef SQLITE_ENABLE_NORMALIZE
4456  "    --normalized            Normal the SQL statements",
4457#endif
4458  "    --plain                 Show SQL as it is input",
4459  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
4460  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
4461  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
4462  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
4463#endif /* SQLITE_OMIT_TRACE */
4464#ifdef SQLITE_DEBUG
4465  ".unmodule NAME ...       Unregister virtual table modules",
4466  "    --allexcept             Unregister everything except those named",
4467#endif
4468  ".vfsinfo ?AUX?           Information about the top-level VFS",
4469  ".vfslist                 List all available VFSes",
4470  ".vfsname ?AUX?           Print the name of the VFS stack",
4471  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
4472  "     Negative values right-justify",
4473};
4474
4475/*
4476** Output help text.
4477**
4478** zPattern describes the set of commands for which help text is provided.
4479** If zPattern is NULL, then show all commands, but only give a one-line
4480** description of each.
4481**
4482** Return the number of matches.
4483*/
4484static int showHelp(FILE *out, const char *zPattern){
4485  int i = 0;
4486  int j = 0;
4487  int n = 0;
4488  char *zPat;
4489  if( zPattern==0
4490   || zPattern[0]=='0'
4491   || strcmp(zPattern,"-a")==0
4492   || strcmp(zPattern,"-all")==0
4493   || strcmp(zPattern,"--all")==0
4494  ){
4495    /* Show all commands, but only one line per command */
4496    if( zPattern==0 ) zPattern = "";
4497    for(i=0; i<ArraySize(azHelp); i++){
4498      if( azHelp[i][0]=='.' || zPattern[0] ){
4499        utf8_printf(out, "%s\n", azHelp[i]);
4500        n++;
4501      }
4502    }
4503  }else{
4504    /* Look for commands that for which zPattern is an exact prefix */
4505    zPat = sqlite3_mprintf(".%s*", zPattern);
4506    shell_check_oom(zPat);
4507    for(i=0; i<ArraySize(azHelp); i++){
4508      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4509        utf8_printf(out, "%s\n", azHelp[i]);
4510        j = i+1;
4511        n++;
4512      }
4513    }
4514    sqlite3_free(zPat);
4515    if( n ){
4516      if( n==1 ){
4517        /* when zPattern is a prefix of exactly one command, then include the
4518        ** details of that command, which should begin at offset j */
4519        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4520          utf8_printf(out, "%s\n", azHelp[j]);
4521          j++;
4522        }
4523      }
4524      return n;
4525    }
4526    /* Look for commands that contain zPattern anywhere.  Show the complete
4527    ** text of all commands that match. */
4528    zPat = sqlite3_mprintf("%%%s%%", zPattern);
4529    shell_check_oom(zPat);
4530    for(i=0; i<ArraySize(azHelp); i++){
4531      if( azHelp[i][0]=='.' ) j = i;
4532      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4533        utf8_printf(out, "%s\n", azHelp[j]);
4534        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4535          j++;
4536          utf8_printf(out, "%s\n", azHelp[j]);
4537        }
4538        i = j;
4539        n++;
4540      }
4541    }
4542    sqlite3_free(zPat);
4543  }
4544  return n;
4545}
4546
4547/* Forward reference */
4548static int process_input(ShellState *p);
4549
4550/*
4551** Read the content of file zName into memory obtained from sqlite3_malloc64()
4552** and return a pointer to the buffer. The caller is responsible for freeing
4553** the memory.
4554**
4555** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4556** read.
4557**
4558** For convenience, a nul-terminator byte is always appended to the data read
4559** from the file before the buffer is returned. This byte is not included in
4560** the final value of (*pnByte), if applicable.
4561**
4562** NULL is returned if any error is encountered. The final value of *pnByte
4563** is undefined in this case.
4564*/
4565static char *readFile(const char *zName, int *pnByte){
4566  FILE *in = fopen(zName, "rb");
4567  long nIn;
4568  size_t nRead;
4569  char *pBuf;
4570  if( in==0 ) return 0;
4571  fseek(in, 0, SEEK_END);
4572  nIn = ftell(in);
4573  rewind(in);
4574  pBuf = sqlite3_malloc64( nIn+1 );
4575  if( pBuf==0 ){ fclose(in); return 0; }
4576  nRead = fread(pBuf, nIn, 1, in);
4577  fclose(in);
4578  if( nRead!=1 ){
4579    sqlite3_free(pBuf);
4580    return 0;
4581  }
4582  pBuf[nIn] = 0;
4583  if( pnByte ) *pnByte = nIn;
4584  return pBuf;
4585}
4586
4587#if defined(SQLITE_ENABLE_SESSION)
4588/*
4589** Close a single OpenSession object and release all of its associated
4590** resources.
4591*/
4592static void session_close(OpenSession *pSession){
4593  int i;
4594  sqlite3session_delete(pSession->p);
4595  sqlite3_free(pSession->zName);
4596  for(i=0; i<pSession->nFilter; i++){
4597    sqlite3_free(pSession->azFilter[i]);
4598  }
4599  sqlite3_free(pSession->azFilter);
4600  memset(pSession, 0, sizeof(OpenSession));
4601}
4602#endif
4603
4604/*
4605** Close all OpenSession objects and release all associated resources.
4606*/
4607#if defined(SQLITE_ENABLE_SESSION)
4608static void session_close_all(ShellState *p, int i){
4609  int j;
4610  struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4611  for(j=0; j<pAuxDb->nSession; j++){
4612    session_close(&pAuxDb->aSession[j]);
4613  }
4614  pAuxDb->nSession = 0;
4615}
4616#else
4617# define session_close_all(X,Y)
4618#endif
4619
4620/*
4621** Implementation of the xFilter function for an open session.  Omit
4622** any tables named by ".session filter" but let all other table through.
4623*/
4624#if defined(SQLITE_ENABLE_SESSION)
4625static int session_filter(void *pCtx, const char *zTab){
4626  OpenSession *pSession = (OpenSession*)pCtx;
4627  int i;
4628  for(i=0; i<pSession->nFilter; i++){
4629    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4630  }
4631  return 1;
4632}
4633#endif
4634
4635/*
4636** Try to deduce the type of file for zName based on its content.  Return
4637** one of the SHELL_OPEN_* constants.
4638**
4639** If the file does not exist or is empty but its name looks like a ZIP
4640** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4641** Otherwise, assume an ordinary database regardless of the filename if
4642** the type cannot be determined from content.
4643*/
4644int deduceDatabaseType(const char *zName, int dfltZip){
4645  FILE *f = fopen(zName, "rb");
4646  size_t n;
4647  int rc = SHELL_OPEN_UNSPEC;
4648  char zBuf[100];
4649  if( f==0 ){
4650    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4651       return SHELL_OPEN_ZIPFILE;
4652    }else{
4653       return SHELL_OPEN_NORMAL;
4654    }
4655  }
4656  n = fread(zBuf, 16, 1, f);
4657  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4658    fclose(f);
4659    return SHELL_OPEN_NORMAL;
4660  }
4661  fseek(f, -25, SEEK_END);
4662  n = fread(zBuf, 25, 1, f);
4663  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4664    rc = SHELL_OPEN_APPENDVFS;
4665  }else{
4666    fseek(f, -22, SEEK_END);
4667    n = fread(zBuf, 22, 1, f);
4668    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4669       && zBuf[3]==0x06 ){
4670      rc = SHELL_OPEN_ZIPFILE;
4671    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4672      rc = SHELL_OPEN_ZIPFILE;
4673    }
4674  }
4675  fclose(f);
4676  return rc;
4677}
4678
4679#ifndef SQLITE_OMIT_DESERIALIZE
4680/*
4681** Reconstruct an in-memory database using the output from the "dbtotxt"
4682** program.  Read content from the file in p->aAuxDb[].zDbFilename.
4683** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4684*/
4685static unsigned char *readHexDb(ShellState *p, int *pnData){
4686  unsigned char *a = 0;
4687  int nLine;
4688  int n = 0;
4689  int pgsz = 0;
4690  int iOffset = 0;
4691  int j, k;
4692  int rc;
4693  FILE *in;
4694  const char *zDbFilename = p->pAuxDb->zDbFilename;
4695  unsigned int x[16];
4696  char zLine[1000];
4697  if( zDbFilename ){
4698    in = fopen(zDbFilename, "r");
4699    if( in==0 ){
4700      utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4701      return 0;
4702    }
4703    nLine = 0;
4704  }else{
4705    in = p->in;
4706    nLine = p->lineno;
4707    if( in==0 ) in = stdin;
4708  }
4709  *pnData = 0;
4710  nLine++;
4711  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4712  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4713  if( rc!=2 ) goto readHexDb_error;
4714  if( n<0 ) goto readHexDb_error;
4715  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4716  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
4717  a = sqlite3_malloc( n ? n : 1 );
4718  shell_check_oom(a);
4719  memset(a, 0, n);
4720  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4721    utf8_printf(stderr, "invalid pagesize\n");
4722    goto readHexDb_error;
4723  }
4724  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4725    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4726    if( rc==2 ){
4727      iOffset = k;
4728      continue;
4729    }
4730    if( strncmp(zLine, "| end ", 6)==0 ){
4731      break;
4732    }
4733    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4734                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4735                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4736    if( rc==17 ){
4737      k = iOffset+j;
4738      if( k+16<=n && k>=0 ){
4739        int ii;
4740        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4741      }
4742    }
4743  }
4744  *pnData = n;
4745  if( in!=p->in ){
4746    fclose(in);
4747  }else{
4748    p->lineno = nLine;
4749  }
4750  return a;
4751
4752readHexDb_error:
4753  if( in!=p->in ){
4754    fclose(in);
4755  }else{
4756    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4757      nLine++;
4758      if(strncmp(zLine, "| end ", 6)==0 ) break;
4759    }
4760    p->lineno = nLine;
4761  }
4762  sqlite3_free(a);
4763  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4764  return 0;
4765}
4766#endif /* SQLITE_OMIT_DESERIALIZE */
4767
4768/*
4769** Scalar function "shell_int32". The first argument to this function
4770** must be a blob. The second a non-negative integer. This function
4771** reads and returns a 32-bit big-endian integer from byte
4772** offset (4*<arg2>) of the blob.
4773*/
4774static void shellInt32(
4775  sqlite3_context *context,
4776  int argc,
4777  sqlite3_value **argv
4778){
4779  const unsigned char *pBlob;
4780  int nBlob;
4781  int iInt;
4782
4783  UNUSED_PARAMETER(argc);
4784  nBlob = sqlite3_value_bytes(argv[0]);
4785  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4786  iInt = sqlite3_value_int(argv[1]);
4787
4788  if( iInt>=0 && (iInt+1)*4<=nBlob ){
4789    const unsigned char *a = &pBlob[iInt*4];
4790    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4791                       + ((sqlite3_int64)a[1]<<16)
4792                       + ((sqlite3_int64)a[2]<< 8)
4793                       + ((sqlite3_int64)a[3]<< 0);
4794    sqlite3_result_int64(context, iVal);
4795  }
4796}
4797
4798/*
4799** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4800** using "..." with internal double-quote characters doubled.
4801*/
4802static void shellIdQuote(
4803  sqlite3_context *context,
4804  int argc,
4805  sqlite3_value **argv
4806){
4807  const char *zName = (const char*)sqlite3_value_text(argv[0]);
4808  UNUSED_PARAMETER(argc);
4809  if( zName ){
4810    char *z = sqlite3_mprintf("\"%w\"", zName);
4811    sqlite3_result_text(context, z, -1, sqlite3_free);
4812  }
4813}
4814
4815/*
4816** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4817*/
4818static void shellUSleepFunc(
4819  sqlite3_context *context,
4820  int argcUnused,
4821  sqlite3_value **argv
4822){
4823  int sleep = sqlite3_value_int(argv[0]);
4824  (void)argcUnused;
4825  sqlite3_sleep(sleep/1000);
4826  sqlite3_result_int(context, sleep);
4827}
4828
4829/*
4830** Scalar function "shell_escape_crnl" used by the .recover command.
4831** The argument passed to this function is the output of built-in
4832** function quote(). If the first character of the input is "'",
4833** indicating that the value passed to quote() was a text value,
4834** then this function searches the input for "\n" and "\r" characters
4835** and adds a wrapper similar to the following:
4836**
4837**   replace(replace(<input>, '\n', char(10), '\r', char(13));
4838**
4839** Or, if the first character of the input is not "'", then a copy
4840** of the input is returned.
4841*/
4842static void shellEscapeCrnl(
4843  sqlite3_context *context,
4844  int argc,
4845  sqlite3_value **argv
4846){
4847  const char *zText = (const char*)sqlite3_value_text(argv[0]);
4848  UNUSED_PARAMETER(argc);
4849  if( zText && zText[0]=='\'' ){
4850    int nText = sqlite3_value_bytes(argv[0]);
4851    int i;
4852    char zBuf1[20];
4853    char zBuf2[20];
4854    const char *zNL = 0;
4855    const char *zCR = 0;
4856    int nCR = 0;
4857    int nNL = 0;
4858
4859    for(i=0; zText[i]; i++){
4860      if( zNL==0 && zText[i]=='\n' ){
4861        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4862        nNL = (int)strlen(zNL);
4863      }
4864      if( zCR==0 && zText[i]=='\r' ){
4865        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4866        nCR = (int)strlen(zCR);
4867      }
4868    }
4869
4870    if( zNL || zCR ){
4871      int iOut = 0;
4872      i64 nMax = (nNL > nCR) ? nNL : nCR;
4873      i64 nAlloc = nMax * nText + (nMax+64)*2;
4874      char *zOut = (char*)sqlite3_malloc64(nAlloc);
4875      if( zOut==0 ){
4876        sqlite3_result_error_nomem(context);
4877        return;
4878      }
4879
4880      if( zNL && zCR ){
4881        memcpy(&zOut[iOut], "replace(replace(", 16);
4882        iOut += 16;
4883      }else{
4884        memcpy(&zOut[iOut], "replace(", 8);
4885        iOut += 8;
4886      }
4887      for(i=0; zText[i]; i++){
4888        if( zText[i]=='\n' ){
4889          memcpy(&zOut[iOut], zNL, nNL);
4890          iOut += nNL;
4891        }else if( zText[i]=='\r' ){
4892          memcpy(&zOut[iOut], zCR, nCR);
4893          iOut += nCR;
4894        }else{
4895          zOut[iOut] = zText[i];
4896          iOut++;
4897        }
4898      }
4899
4900      if( zNL ){
4901        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4902        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
4903        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
4904      }
4905      if( zCR ){
4906        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4907        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
4908        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
4909      }
4910
4911      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
4912      sqlite3_free(zOut);
4913      return;
4914    }
4915  }
4916
4917  sqlite3_result_value(context, argv[0]);
4918}
4919
4920/* Flags for open_db().
4921**
4922** The default behavior of open_db() is to exit(1) if the database fails to
4923** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
4924** but still returns without calling exit.
4925**
4926** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
4927** ZIP archive if the file does not exist or is empty and its name matches
4928** the *.zip pattern.
4929*/
4930#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
4931#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
4932
4933/*
4934** Make sure the database is open.  If it is not, then open it.  If
4935** the database fails to open, print an error message and exit.
4936*/
4937static void open_db(ShellState *p, int openFlags){
4938  if( p->db==0 ){
4939    const char *zDbFilename = p->pAuxDb->zDbFilename;
4940    if( p->openMode==SHELL_OPEN_UNSPEC ){
4941      if( zDbFilename==0 || zDbFilename[0]==0 ){
4942        p->openMode = SHELL_OPEN_NORMAL;
4943      }else{
4944        p->openMode = (u8)deduceDatabaseType(zDbFilename,
4945                             (openFlags & OPEN_DB_ZIPFILE)!=0);
4946      }
4947    }
4948    switch( p->openMode ){
4949      case SHELL_OPEN_APPENDVFS: {
4950        sqlite3_open_v2(zDbFilename, &p->db,
4951           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
4952        break;
4953      }
4954      case SHELL_OPEN_HEXDB:
4955      case SHELL_OPEN_DESERIALIZE: {
4956        sqlite3_open(0, &p->db);
4957        break;
4958      }
4959      case SHELL_OPEN_ZIPFILE: {
4960        sqlite3_open(":memory:", &p->db);
4961        break;
4962      }
4963      case SHELL_OPEN_READONLY: {
4964        sqlite3_open_v2(zDbFilename, &p->db,
4965            SQLITE_OPEN_READONLY|p->openFlags, 0);
4966        break;
4967      }
4968      case SHELL_OPEN_UNSPEC:
4969      case SHELL_OPEN_NORMAL: {
4970        sqlite3_open_v2(zDbFilename, &p->db,
4971           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
4972        break;
4973      }
4974    }
4975    globalDb = p->db;
4976    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4977      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4978          zDbFilename, sqlite3_errmsg(p->db));
4979      if( openFlags & OPEN_DB_KEEPALIVE ){
4980        sqlite3_open(":memory:", &p->db);
4981        return;
4982      }
4983      exit(1);
4984    }
4985#ifndef SQLITE_OMIT_LOAD_EXTENSION
4986    sqlite3_enable_load_extension(p->db, 1);
4987#endif
4988    sqlite3_fileio_init(p->db, 0, 0);
4989    sqlite3_shathree_init(p->db, 0, 0);
4990    sqlite3_completion_init(p->db, 0, 0);
4991    sqlite3_uint_init(p->db, 0, 0);
4992    sqlite3_decimal_init(p->db, 0, 0);
4993    sqlite3_regexp_init(p->db, 0, 0);
4994    sqlite3_ieee_init(p->db, 0, 0);
4995    sqlite3_series_init(p->db, 0, 0);
4996#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4997    sqlite3_dbdata_init(p->db, 0, 0);
4998#endif
4999#ifdef SQLITE_HAVE_ZLIB
5000    if( !p->bSafeModePersist ){
5001      sqlite3_zipfile_init(p->db, 0, 0);
5002      sqlite3_sqlar_init(p->db, 0, 0);
5003    }
5004#endif
5005    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
5006                            shellAddSchemaName, 0, 0);
5007    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
5008                            shellModuleSchema, 0, 0);
5009    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
5010                            shellPutsFunc, 0, 0);
5011    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
5012                            shellEscapeCrnl, 0, 0);
5013    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
5014                            shellInt32, 0, 0);
5015    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
5016                            shellIdQuote, 0, 0);
5017    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
5018                            shellUSleepFunc, 0, 0);
5019#ifndef SQLITE_NOHAVE_SYSTEM
5020    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
5021                            editFunc, 0, 0);
5022    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
5023                            editFunc, 0, 0);
5024#endif
5025    if( p->openMode==SHELL_OPEN_ZIPFILE ){
5026      char *zSql = sqlite3_mprintf(
5027         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
5028      shell_check_oom(zSql);
5029      sqlite3_exec(p->db, zSql, 0, 0, 0);
5030      sqlite3_free(zSql);
5031    }
5032#ifndef SQLITE_OMIT_DESERIALIZE
5033    else
5034    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
5035      int rc;
5036      int nData = 0;
5037      unsigned char *aData;
5038      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
5039        aData = (unsigned char*)readFile(zDbFilename, &nData);
5040      }else{
5041        aData = readHexDb(p, &nData);
5042        if( aData==0 ){
5043          return;
5044        }
5045      }
5046      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
5047                   SQLITE_DESERIALIZE_RESIZEABLE |
5048                   SQLITE_DESERIALIZE_FREEONCLOSE);
5049      if( rc ){
5050        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
5051      }
5052      if( p->szMax>0 ){
5053        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
5054      }
5055    }
5056#endif
5057  }
5058  if( p->bSafeModePersist && p->db!=0 ){
5059    sqlite3_set_authorizer(p->db, safeModeAuth, p);
5060  }
5061}
5062
5063/*
5064** Attempt to close the databaes connection.  Report errors.
5065*/
5066void close_db(sqlite3 *db){
5067  int rc = sqlite3_close(db);
5068  if( rc ){
5069    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
5070        rc, sqlite3_errmsg(db));
5071  }
5072}
5073
5074#if HAVE_READLINE || HAVE_EDITLINE
5075/*
5076** Readline completion callbacks
5077*/
5078static char *readline_completion_generator(const char *text, int state){
5079  static sqlite3_stmt *pStmt = 0;
5080  char *zRet;
5081  if( state==0 ){
5082    char *zSql;
5083    sqlite3_finalize(pStmt);
5084    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5085                           "  FROM completion(%Q) ORDER BY 1", text);
5086    shell_check_oom(zSql);
5087    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5088    sqlite3_free(zSql);
5089  }
5090  if( sqlite3_step(pStmt)==SQLITE_ROW ){
5091    const char *z = (const char*)sqlite3_column_text(pStmt,0);
5092    zRet = z ? strdup(z) : 0;
5093  }else{
5094    sqlite3_finalize(pStmt);
5095    pStmt = 0;
5096    zRet = 0;
5097  }
5098  return zRet;
5099}
5100static char **readline_completion(const char *zText, int iStart, int iEnd){
5101  rl_attempted_completion_over = 1;
5102  return rl_completion_matches(zText, readline_completion_generator);
5103}
5104
5105#elif HAVE_LINENOISE
5106/*
5107** Linenoise completion callback
5108*/
5109static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
5110  int nLine = strlen30(zLine);
5111  int i, iStart;
5112  sqlite3_stmt *pStmt = 0;
5113  char *zSql;
5114  char zBuf[1000];
5115
5116  if( nLine>sizeof(zBuf)-30 ) return;
5117  if( zLine[0]=='.' || zLine[0]=='#') return;
5118  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
5119  if( i==nLine-1 ) return;
5120  iStart = i+1;
5121  memcpy(zBuf, zLine, iStart);
5122  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5123                         "  FROM completion(%Q,%Q) ORDER BY 1",
5124                         &zLine[iStart], zLine);
5125  shell_check_oom(zSql);
5126  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5127  sqlite3_free(zSql);
5128  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
5129  while( sqlite3_step(pStmt)==SQLITE_ROW ){
5130    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
5131    int nCompletion = sqlite3_column_bytes(pStmt, 0);
5132    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
5133      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
5134      linenoiseAddCompletion(lc, zBuf);
5135    }
5136  }
5137  sqlite3_finalize(pStmt);
5138}
5139#endif
5140
5141/*
5142** Do C-language style dequoting.
5143**
5144**    \a    -> alarm
5145**    \b    -> backspace
5146**    \t    -> tab
5147**    \n    -> newline
5148**    \v    -> vertical tab
5149**    \f    -> form feed
5150**    \r    -> carriage return
5151**    \s    -> space
5152**    \"    -> "
5153**    \'    -> '
5154**    \\    -> backslash
5155**    \NNN  -> ascii character NNN in octal
5156*/
5157static void resolve_backslashes(char *z){
5158  int i, j;
5159  char c;
5160  while( *z && *z!='\\' ) z++;
5161  for(i=j=0; (c = z[i])!=0; i++, j++){
5162    if( c=='\\' && z[i+1]!=0 ){
5163      c = z[++i];
5164      if( c=='a' ){
5165        c = '\a';
5166      }else if( c=='b' ){
5167        c = '\b';
5168      }else if( c=='t' ){
5169        c = '\t';
5170      }else if( c=='n' ){
5171        c = '\n';
5172      }else if( c=='v' ){
5173        c = '\v';
5174      }else if( c=='f' ){
5175        c = '\f';
5176      }else if( c=='r' ){
5177        c = '\r';
5178      }else if( c=='"' ){
5179        c = '"';
5180      }else if( c=='\'' ){
5181        c = '\'';
5182      }else if( c=='\\' ){
5183        c = '\\';
5184      }else if( c>='0' && c<='7' ){
5185        c -= '0';
5186        if( z[i+1]>='0' && z[i+1]<='7' ){
5187          i++;
5188          c = (c<<3) + z[i] - '0';
5189          if( z[i+1]>='0' && z[i+1]<='7' ){
5190            i++;
5191            c = (c<<3) + z[i] - '0';
5192          }
5193        }
5194      }
5195    }
5196    z[j] = c;
5197  }
5198  if( j<i ) z[j] = 0;
5199}
5200
5201/*
5202** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
5203** for TRUE and FALSE.  Return the integer value if appropriate.
5204*/
5205static int booleanValue(const char *zArg){
5206  int i;
5207  if( zArg[0]=='0' && zArg[1]=='x' ){
5208    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
5209  }else{
5210    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
5211  }
5212  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
5213  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
5214    return 1;
5215  }
5216  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
5217    return 0;
5218  }
5219  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
5220          zArg);
5221  return 0;
5222}
5223
5224/*
5225** Set or clear a shell flag according to a boolean value.
5226*/
5227static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
5228  if( booleanValue(zArg) ){
5229    ShellSetFlag(p, mFlag);
5230  }else{
5231    ShellClearFlag(p, mFlag);
5232  }
5233}
5234
5235/*
5236** Close an output file, assuming it is not stderr or stdout
5237*/
5238static void output_file_close(FILE *f){
5239  if( f && f!=stdout && f!=stderr ) fclose(f);
5240}
5241
5242/*
5243** Try to open an output file.   The names "stdout" and "stderr" are
5244** recognized and do the right thing.  NULL is returned if the output
5245** filename is "off".
5246*/
5247static FILE *output_file_open(const char *zFile, int bTextMode){
5248  FILE *f;
5249  if( strcmp(zFile,"stdout")==0 ){
5250    f = stdout;
5251  }else if( strcmp(zFile, "stderr")==0 ){
5252    f = stderr;
5253  }else if( strcmp(zFile, "off")==0 ){
5254    f = 0;
5255  }else{
5256    f = fopen(zFile, bTextMode ? "w" : "wb");
5257    if( f==0 ){
5258      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5259    }
5260  }
5261  return f;
5262}
5263
5264#ifndef SQLITE_OMIT_TRACE
5265/*
5266** A routine for handling output from sqlite3_trace().
5267*/
5268static int sql_trace_callback(
5269  unsigned mType,         /* The trace type */
5270  void *pArg,             /* The ShellState pointer */
5271  void *pP,               /* Usually a pointer to sqlite_stmt */
5272  void *pX                /* Auxiliary output */
5273){
5274  ShellState *p = (ShellState*)pArg;
5275  sqlite3_stmt *pStmt;
5276  const char *zSql;
5277  int nSql;
5278  if( p->traceOut==0 ) return 0;
5279  if( mType==SQLITE_TRACE_CLOSE ){
5280    utf8_printf(p->traceOut, "-- closing database connection\n");
5281    return 0;
5282  }
5283  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5284    zSql = (const char*)pX;
5285  }else{
5286    pStmt = (sqlite3_stmt*)pP;
5287    switch( p->eTraceType ){
5288      case SHELL_TRACE_EXPANDED: {
5289        zSql = sqlite3_expanded_sql(pStmt);
5290        break;
5291      }
5292#ifdef SQLITE_ENABLE_NORMALIZE
5293      case SHELL_TRACE_NORMALIZED: {
5294        zSql = sqlite3_normalized_sql(pStmt);
5295        break;
5296      }
5297#endif
5298      default: {
5299        zSql = sqlite3_sql(pStmt);
5300        break;
5301      }
5302    }
5303  }
5304  if( zSql==0 ) return 0;
5305  nSql = strlen30(zSql);
5306  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5307  switch( mType ){
5308    case SQLITE_TRACE_ROW:
5309    case SQLITE_TRACE_STMT: {
5310      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5311      break;
5312    }
5313    case SQLITE_TRACE_PROFILE: {
5314      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5315      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5316      break;
5317    }
5318  }
5319  return 0;
5320}
5321#endif
5322
5323/*
5324** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5325** a useful spot to set a debugger breakpoint.
5326*/
5327static void test_breakpoint(void){
5328  static int nCall = 0;
5329  nCall++;
5330}
5331
5332/*
5333** An object used to read a CSV and other files for import.
5334*/
5335typedef struct ImportCtx ImportCtx;
5336struct ImportCtx {
5337  const char *zFile;  /* Name of the input file */
5338  FILE *in;           /* Read the CSV text from this input stream */
5339  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5340  char *z;            /* Accumulated text for a field */
5341  int n;              /* Number of bytes in z */
5342  int nAlloc;         /* Space allocated for z[] */
5343  int nLine;          /* Current line number */
5344  int nRow;           /* Number of rows imported */
5345  int nErr;           /* Number of errors encountered */
5346  int bNotFirst;      /* True if one or more bytes already read */
5347  int cTerm;          /* Character that terminated the most recent field */
5348  int cColSep;        /* The column separator character.  (Usually ",") */
5349  int cRowSep;        /* The row separator character.  (Usually "\n") */
5350};
5351
5352/* Clean up resourced used by an ImportCtx */
5353static void import_cleanup(ImportCtx *p){
5354  if( p->in!=0 && p->xCloser!=0 ){
5355    p->xCloser(p->in);
5356    p->in = 0;
5357  }
5358  sqlite3_free(p->z);
5359  p->z = 0;
5360}
5361
5362/* Append a single byte to z[] */
5363static void import_append_char(ImportCtx *p, int c){
5364  if( p->n+1>=p->nAlloc ){
5365    p->nAlloc += p->nAlloc + 100;
5366    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5367    shell_check_oom(p->z);
5368  }
5369  p->z[p->n++] = (char)c;
5370}
5371
5372/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5373** with the option of having a separator other than ",".
5374**
5375**   +  Input comes from p->in.
5376**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5377**      from sqlite3_malloc64().
5378**   +  Use p->cSep as the column separator.  The default is ",".
5379**   +  Use p->rSep as the row separator.  The default is "\n".
5380**   +  Keep track of the line number in p->nLine.
5381**   +  Store the character that terminates the field in p->cTerm.  Store
5382**      EOF on end-of-file.
5383**   +  Report syntax errors on stderr
5384*/
5385static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5386  int c;
5387  int cSep = p->cColSep;
5388  int rSep = p->cRowSep;
5389  p->n = 0;
5390  c = fgetc(p->in);
5391  if( c==EOF || seenInterrupt ){
5392    p->cTerm = EOF;
5393    return 0;
5394  }
5395  if( c=='"' ){
5396    int pc, ppc;
5397    int startLine = p->nLine;
5398    int cQuote = c;
5399    pc = ppc = 0;
5400    while( 1 ){
5401      c = fgetc(p->in);
5402      if( c==rSep ) p->nLine++;
5403      if( c==cQuote ){
5404        if( pc==cQuote ){
5405          pc = 0;
5406          continue;
5407        }
5408      }
5409      if( (c==cSep && pc==cQuote)
5410       || (c==rSep && pc==cQuote)
5411       || (c==rSep && pc=='\r' && ppc==cQuote)
5412       || (c==EOF && pc==cQuote)
5413      ){
5414        do{ p->n--; }while( p->z[p->n]!=cQuote );
5415        p->cTerm = c;
5416        break;
5417      }
5418      if( pc==cQuote && c!='\r' ){
5419        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5420                p->zFile, p->nLine, cQuote);
5421      }
5422      if( c==EOF ){
5423        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5424                p->zFile, startLine, cQuote);
5425        p->cTerm = c;
5426        break;
5427      }
5428      import_append_char(p, c);
5429      ppc = pc;
5430      pc = c;
5431    }
5432  }else{
5433    /* If this is the first field being parsed and it begins with the
5434    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5435    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5436      import_append_char(p, c);
5437      c = fgetc(p->in);
5438      if( (c&0xff)==0xbb ){
5439        import_append_char(p, c);
5440        c = fgetc(p->in);
5441        if( (c&0xff)==0xbf ){
5442          p->bNotFirst = 1;
5443          p->n = 0;
5444          return csv_read_one_field(p);
5445        }
5446      }
5447    }
5448    while( c!=EOF && c!=cSep && c!=rSep ){
5449      import_append_char(p, c);
5450      c = fgetc(p->in);
5451    }
5452    if( c==rSep ){
5453      p->nLine++;
5454      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5455    }
5456    p->cTerm = c;
5457  }
5458  if( p->z ) p->z[p->n] = 0;
5459  p->bNotFirst = 1;
5460  return p->z;
5461}
5462
5463/* Read a single field of ASCII delimited text.
5464**
5465**   +  Input comes from p->in.
5466**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5467**      from sqlite3_malloc64().
5468**   +  Use p->cSep as the column separator.  The default is "\x1F".
5469**   +  Use p->rSep as the row separator.  The default is "\x1E".
5470**   +  Keep track of the row number in p->nLine.
5471**   +  Store the character that terminates the field in p->cTerm.  Store
5472**      EOF on end-of-file.
5473**   +  Report syntax errors on stderr
5474*/
5475static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5476  int c;
5477  int cSep = p->cColSep;
5478  int rSep = p->cRowSep;
5479  p->n = 0;
5480  c = fgetc(p->in);
5481  if( c==EOF || seenInterrupt ){
5482    p->cTerm = EOF;
5483    return 0;
5484  }
5485  while( c!=EOF && c!=cSep && c!=rSep ){
5486    import_append_char(p, c);
5487    c = fgetc(p->in);
5488  }
5489  if( c==rSep ){
5490    p->nLine++;
5491  }
5492  p->cTerm = c;
5493  if( p->z ) p->z[p->n] = 0;
5494  return p->z;
5495}
5496
5497/*
5498** Try to transfer data for table zTable.  If an error is seen while
5499** moving forward, try to go backwards.  The backwards movement won't
5500** work for WITHOUT ROWID tables.
5501*/
5502static void tryToCloneData(
5503  ShellState *p,
5504  sqlite3 *newDb,
5505  const char *zTable
5506){
5507  sqlite3_stmt *pQuery = 0;
5508  sqlite3_stmt *pInsert = 0;
5509  char *zQuery = 0;
5510  char *zInsert = 0;
5511  int rc;
5512  int i, j, n;
5513  int nTable = strlen30(zTable);
5514  int k = 0;
5515  int cnt = 0;
5516  const int spinRate = 10000;
5517
5518  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5519  shell_check_oom(zQuery);
5520  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5521  if( rc ){
5522    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5523            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5524            zQuery);
5525    goto end_data_xfer;
5526  }
5527  n = sqlite3_column_count(pQuery);
5528  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5529  shell_check_oom(zInsert);
5530  sqlite3_snprintf(200+nTable,zInsert,
5531                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5532  i = strlen30(zInsert);
5533  for(j=1; j<n; j++){
5534    memcpy(zInsert+i, ",?", 2);
5535    i += 2;
5536  }
5537  memcpy(zInsert+i, ");", 3);
5538  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5539  if( rc ){
5540    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5541            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5542            zQuery);
5543    goto end_data_xfer;
5544  }
5545  for(k=0; k<2; k++){
5546    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5547      for(i=0; i<n; i++){
5548        switch( sqlite3_column_type(pQuery, i) ){
5549          case SQLITE_NULL: {
5550            sqlite3_bind_null(pInsert, i+1);
5551            break;
5552          }
5553          case SQLITE_INTEGER: {
5554            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5555            break;
5556          }
5557          case SQLITE_FLOAT: {
5558            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5559            break;
5560          }
5561          case SQLITE_TEXT: {
5562            sqlite3_bind_text(pInsert, i+1,
5563                             (const char*)sqlite3_column_text(pQuery,i),
5564                             -1, SQLITE_STATIC);
5565            break;
5566          }
5567          case SQLITE_BLOB: {
5568            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5569                                            sqlite3_column_bytes(pQuery,i),
5570                                            SQLITE_STATIC);
5571            break;
5572          }
5573        }
5574      } /* End for */
5575      rc = sqlite3_step(pInsert);
5576      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5577        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5578                        sqlite3_errmsg(newDb));
5579      }
5580      sqlite3_reset(pInsert);
5581      cnt++;
5582      if( (cnt%spinRate)==0 ){
5583        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5584        fflush(stdout);
5585      }
5586    } /* End while */
5587    if( rc==SQLITE_DONE ) break;
5588    sqlite3_finalize(pQuery);
5589    sqlite3_free(zQuery);
5590    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5591                             zTable);
5592    shell_check_oom(zQuery);
5593    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5594    if( rc ){
5595      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5596      break;
5597    }
5598  } /* End for(k=0...) */
5599
5600end_data_xfer:
5601  sqlite3_finalize(pQuery);
5602  sqlite3_finalize(pInsert);
5603  sqlite3_free(zQuery);
5604  sqlite3_free(zInsert);
5605}
5606
5607
5608/*
5609** Try to transfer all rows of the schema that match zWhere.  For
5610** each row, invoke xForEach() on the object defined by that row.
5611** If an error is encountered while moving forward through the
5612** sqlite_schema table, try again moving backwards.
5613*/
5614static void tryToCloneSchema(
5615  ShellState *p,
5616  sqlite3 *newDb,
5617  const char *zWhere,
5618  void (*xForEach)(ShellState*,sqlite3*,const char*)
5619){
5620  sqlite3_stmt *pQuery = 0;
5621  char *zQuery = 0;
5622  int rc;
5623  const unsigned char *zName;
5624  const unsigned char *zSql;
5625  char *zErrMsg = 0;
5626
5627  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5628                           " WHERE %s", zWhere);
5629  shell_check_oom(zQuery);
5630  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5631  if( rc ){
5632    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5633                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5634                    zQuery);
5635    goto end_schema_xfer;
5636  }
5637  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5638    zName = sqlite3_column_text(pQuery, 0);
5639    zSql = sqlite3_column_text(pQuery, 1);
5640    if( zName==0 || zSql==0 ) continue;
5641    printf("%s... ", zName); fflush(stdout);
5642    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5643    if( zErrMsg ){
5644      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5645      sqlite3_free(zErrMsg);
5646      zErrMsg = 0;
5647    }
5648    if( xForEach ){
5649      xForEach(p, newDb, (const char*)zName);
5650    }
5651    printf("done\n");
5652  }
5653  if( rc!=SQLITE_DONE ){
5654    sqlite3_finalize(pQuery);
5655    sqlite3_free(zQuery);
5656    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5657                             " WHERE %s ORDER BY rowid DESC", zWhere);
5658    shell_check_oom(zQuery);
5659    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5660    if( rc ){
5661      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5662                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5663                      zQuery);
5664      goto end_schema_xfer;
5665    }
5666    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5667      zName = sqlite3_column_text(pQuery, 0);
5668      zSql = sqlite3_column_text(pQuery, 1);
5669      if( zName==0 || zSql==0 ) continue;
5670      printf("%s... ", zName); fflush(stdout);
5671      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5672      if( zErrMsg ){
5673        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5674        sqlite3_free(zErrMsg);
5675        zErrMsg = 0;
5676      }
5677      if( xForEach ){
5678        xForEach(p, newDb, (const char*)zName);
5679      }
5680      printf("done\n");
5681    }
5682  }
5683end_schema_xfer:
5684  sqlite3_finalize(pQuery);
5685  sqlite3_free(zQuery);
5686}
5687
5688/*
5689** Open a new database file named "zNewDb".  Try to recover as much information
5690** as possible out of the main database (which might be corrupt) and write it
5691** into zNewDb.
5692*/
5693static void tryToClone(ShellState *p, const char *zNewDb){
5694  int rc;
5695  sqlite3 *newDb = 0;
5696  if( access(zNewDb,0)==0 ){
5697    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5698    return;
5699  }
5700  rc = sqlite3_open(zNewDb, &newDb);
5701  if( rc ){
5702    utf8_printf(stderr, "Cannot create output database: %s\n",
5703            sqlite3_errmsg(newDb));
5704  }else{
5705    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5706    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5707    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5708    tryToCloneSchema(p, newDb, "type!='table'", 0);
5709    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5710    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5711  }
5712  close_db(newDb);
5713}
5714
5715/*
5716** Change the output file back to stdout.
5717**
5718** If the p->doXdgOpen flag is set, that means the output was being
5719** redirected to a temporary file named by p->zTempFile.  In that case,
5720** launch start/open/xdg-open on that temporary file.
5721*/
5722static void output_reset(ShellState *p){
5723  if( p->outfile[0]=='|' ){
5724#ifndef SQLITE_OMIT_POPEN
5725    pclose(p->out);
5726#endif
5727  }else{
5728    output_file_close(p->out);
5729#ifndef SQLITE_NOHAVE_SYSTEM
5730    if( p->doXdgOpen ){
5731      const char *zXdgOpenCmd =
5732#if defined(_WIN32)
5733      "start";
5734#elif defined(__APPLE__)
5735      "open";
5736#else
5737      "xdg-open";
5738#endif
5739      char *zCmd;
5740      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5741      if( system(zCmd) ){
5742        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5743      }else{
5744        /* Give the start/open/xdg-open command some time to get
5745        ** going before we continue, and potential delete the
5746        ** p->zTempFile data file out from under it */
5747        sqlite3_sleep(2000);
5748      }
5749      sqlite3_free(zCmd);
5750      outputModePop(p);
5751      p->doXdgOpen = 0;
5752    }
5753#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5754  }
5755  p->outfile[0] = 0;
5756  p->out = stdout;
5757}
5758
5759/*
5760** Run an SQL command and return the single integer result.
5761*/
5762static int db_int(sqlite3 *db, const char *zSql){
5763  sqlite3_stmt *pStmt;
5764  int res = 0;
5765  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
5766  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5767    res = sqlite3_column_int(pStmt,0);
5768  }
5769  sqlite3_finalize(pStmt);
5770  return res;
5771}
5772
5773/*
5774** Convert a 2-byte or 4-byte big-endian integer into a native integer
5775*/
5776static unsigned int get2byteInt(unsigned char *a){
5777  return (a[0]<<8) + a[1];
5778}
5779static unsigned int get4byteInt(unsigned char *a){
5780  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5781}
5782
5783/*
5784** Implementation of the ".dbinfo" command.
5785**
5786** Return 1 on error, 2 to exit, and 0 otherwise.
5787*/
5788static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5789  static const struct { const char *zName; int ofst; } aField[] = {
5790     { "file change counter:",  24  },
5791     { "database page count:",  28  },
5792     { "freelist page count:",  36  },
5793     { "schema cookie:",        40  },
5794     { "schema format:",        44  },
5795     { "default cache size:",   48  },
5796     { "autovacuum top root:",  52  },
5797     { "incremental vacuum:",   64  },
5798     { "text encoding:",        56  },
5799     { "user version:",         60  },
5800     { "application id:",       68  },
5801     { "software version:",     96  },
5802  };
5803  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5804     { "number of tables:",
5805       "SELECT count(*) FROM %s WHERE type='table'" },
5806     { "number of indexes:",
5807       "SELECT count(*) FROM %s WHERE type='index'" },
5808     { "number of triggers:",
5809       "SELECT count(*) FROM %s WHERE type='trigger'" },
5810     { "number of views:",
5811       "SELECT count(*) FROM %s WHERE type='view'" },
5812     { "schema size:",
5813       "SELECT total(length(sql)) FROM %s" },
5814  };
5815  int i, rc;
5816  unsigned iDataVersion;
5817  char *zSchemaTab;
5818  char *zDb = nArg>=2 ? azArg[1] : "main";
5819  sqlite3_stmt *pStmt = 0;
5820  unsigned char aHdr[100];
5821  open_db(p, 0);
5822  if( p->db==0 ) return 1;
5823  rc = sqlite3_prepare_v2(p->db,
5824             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5825             -1, &pStmt, 0);
5826  if( rc ){
5827    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5828    sqlite3_finalize(pStmt);
5829    return 1;
5830  }
5831  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5832  if( sqlite3_step(pStmt)==SQLITE_ROW
5833   && sqlite3_column_bytes(pStmt,0)>100
5834  ){
5835    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5836    sqlite3_finalize(pStmt);
5837  }else{
5838    raw_printf(stderr, "unable to read database header\n");
5839    sqlite3_finalize(pStmt);
5840    return 1;
5841  }
5842  i = get2byteInt(aHdr+16);
5843  if( i==1 ) i = 65536;
5844  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5845  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5846  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5847  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5848  for(i=0; i<ArraySize(aField); i++){
5849    int ofst = aField[i].ofst;
5850    unsigned int val = get4byteInt(aHdr + ofst);
5851    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5852    switch( ofst ){
5853      case 56: {
5854        if( val==1 ) raw_printf(p->out, " (utf8)");
5855        if( val==2 ) raw_printf(p->out, " (utf16le)");
5856        if( val==3 ) raw_printf(p->out, " (utf16be)");
5857      }
5858    }
5859    raw_printf(p->out, "\n");
5860  }
5861  if( zDb==0 ){
5862    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5863  }else if( strcmp(zDb,"temp")==0 ){
5864    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5865  }else{
5866    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5867  }
5868  for(i=0; i<ArraySize(aQuery); i++){
5869    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5870    int val = db_int(p->db, zSql);
5871    sqlite3_free(zSql);
5872    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5873  }
5874  sqlite3_free(zSchemaTab);
5875  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5876  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5877  return 0;
5878}
5879
5880/*
5881** Print the current sqlite3_errmsg() value to stderr and return 1.
5882*/
5883static int shellDatabaseError(sqlite3 *db){
5884  const char *zErr = sqlite3_errmsg(db);
5885  utf8_printf(stderr, "Error: %s\n", zErr);
5886  return 1;
5887}
5888
5889/*
5890** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
5891** if they match and FALSE (0) if they do not match.
5892**
5893** Globbing rules:
5894**
5895**      '*'       Matches any sequence of zero or more characters.
5896**
5897**      '?'       Matches exactly one character.
5898**
5899**     [...]      Matches one character from the enclosed list of
5900**                characters.
5901**
5902**     [^...]     Matches one character not in the enclosed list.
5903**
5904**      '#'       Matches any sequence of one or more digits with an
5905**                optional + or - sign in front
5906**
5907**      ' '       Any span of whitespace matches any other span of
5908**                whitespace.
5909**
5910** Extra whitespace at the end of z[] is ignored.
5911*/
5912static int testcase_glob(const char *zGlob, const char *z){
5913  int c, c2;
5914  int invert;
5915  int seen;
5916
5917  while( (c = (*(zGlob++)))!=0 ){
5918    if( IsSpace(c) ){
5919      if( !IsSpace(*z) ) return 0;
5920      while( IsSpace(*zGlob) ) zGlob++;
5921      while( IsSpace(*z) ) z++;
5922    }else if( c=='*' ){
5923      while( (c=(*(zGlob++))) == '*' || c=='?' ){
5924        if( c=='?' && (*(z++))==0 ) return 0;
5925      }
5926      if( c==0 ){
5927        return 1;
5928      }else if( c=='[' ){
5929        while( *z && testcase_glob(zGlob-1,z)==0 ){
5930          z++;
5931        }
5932        return (*z)!=0;
5933      }
5934      while( (c2 = (*(z++)))!=0 ){
5935        while( c2!=c ){
5936          c2 = *(z++);
5937          if( c2==0 ) return 0;
5938        }
5939        if( testcase_glob(zGlob,z) ) return 1;
5940      }
5941      return 0;
5942    }else if( c=='?' ){
5943      if( (*(z++))==0 ) return 0;
5944    }else if( c=='[' ){
5945      int prior_c = 0;
5946      seen = 0;
5947      invert = 0;
5948      c = *(z++);
5949      if( c==0 ) return 0;
5950      c2 = *(zGlob++);
5951      if( c2=='^' ){
5952        invert = 1;
5953        c2 = *(zGlob++);
5954      }
5955      if( c2==']' ){
5956        if( c==']' ) seen = 1;
5957        c2 = *(zGlob++);
5958      }
5959      while( c2 && c2!=']' ){
5960        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5961          c2 = *(zGlob++);
5962          if( c>=prior_c && c<=c2 ) seen = 1;
5963          prior_c = 0;
5964        }else{
5965          if( c==c2 ){
5966            seen = 1;
5967          }
5968          prior_c = c2;
5969        }
5970        c2 = *(zGlob++);
5971      }
5972      if( c2==0 || (seen ^ invert)==0 ) return 0;
5973    }else if( c=='#' ){
5974      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5975      if( !IsDigit(z[0]) ) return 0;
5976      z++;
5977      while( IsDigit(z[0]) ){ z++; }
5978    }else{
5979      if( c!=(*(z++)) ) return 0;
5980    }
5981  }
5982  while( IsSpace(*z) ){ z++; }
5983  return *z==0;
5984}
5985
5986
5987/*
5988** Compare the string as a command-line option with either one or two
5989** initial "-" characters.
5990*/
5991static int optionMatch(const char *zStr, const char *zOpt){
5992  if( zStr[0]!='-' ) return 0;
5993  zStr++;
5994  if( zStr[0]=='-' ) zStr++;
5995  return strcmp(zStr, zOpt)==0;
5996}
5997
5998/*
5999** Delete a file.
6000*/
6001int shellDeleteFile(const char *zFilename){
6002  int rc;
6003#ifdef _WIN32
6004  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
6005  rc = _wunlink(z);
6006  sqlite3_free(z);
6007#else
6008  rc = unlink(zFilename);
6009#endif
6010  return rc;
6011}
6012
6013/*
6014** Try to delete the temporary file (if there is one) and free the
6015** memory used to hold the name of the temp file.
6016*/
6017static void clearTempFile(ShellState *p){
6018  if( p->zTempFile==0 ) return;
6019  if( p->doXdgOpen ) return;
6020  if( shellDeleteFile(p->zTempFile) ) return;
6021  sqlite3_free(p->zTempFile);
6022  p->zTempFile = 0;
6023}
6024
6025/*
6026** Create a new temp file name with the given suffix.
6027*/
6028static void newTempFile(ShellState *p, const char *zSuffix){
6029  clearTempFile(p);
6030  sqlite3_free(p->zTempFile);
6031  p->zTempFile = 0;
6032  if( p->db ){
6033    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
6034  }
6035  if( p->zTempFile==0 ){
6036    /* If p->db is an in-memory database then the TEMPFILENAME file-control
6037    ** will not work and we will need to fallback to guessing */
6038    char *zTemp;
6039    sqlite3_uint64 r;
6040    sqlite3_randomness(sizeof(r), &r);
6041    zTemp = getenv("TEMP");
6042    if( zTemp==0 ) zTemp = getenv("TMP");
6043    if( zTemp==0 ){
6044#ifdef _WIN32
6045      zTemp = "\\tmp";
6046#else
6047      zTemp = "/tmp";
6048#endif
6049    }
6050    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
6051  }else{
6052    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
6053  }
6054  shell_check_oom(p->zTempFile);
6055}
6056
6057
6058/*
6059** The implementation of SQL scalar function fkey_collate_clause(), used
6060** by the ".lint fkey-indexes" command. This scalar function is always
6061** called with four arguments - the parent table name, the parent column name,
6062** the child table name and the child column name.
6063**
6064**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
6065**
6066** If either of the named tables or columns do not exist, this function
6067** returns an empty string. An empty string is also returned if both tables
6068** and columns exist but have the same default collation sequence. Or,
6069** if both exist but the default collation sequences are different, this
6070** function returns the string " COLLATE <parent-collation>", where
6071** <parent-collation> is the default collation sequence of the parent column.
6072*/
6073static void shellFkeyCollateClause(
6074  sqlite3_context *pCtx,
6075  int nVal,
6076  sqlite3_value **apVal
6077){
6078  sqlite3 *db = sqlite3_context_db_handle(pCtx);
6079  const char *zParent;
6080  const char *zParentCol;
6081  const char *zParentSeq;
6082  const char *zChild;
6083  const char *zChildCol;
6084  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
6085  int rc;
6086
6087  assert( nVal==4 );
6088  zParent = (const char*)sqlite3_value_text(apVal[0]);
6089  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
6090  zChild = (const char*)sqlite3_value_text(apVal[2]);
6091  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
6092
6093  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
6094  rc = sqlite3_table_column_metadata(
6095      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
6096  );
6097  if( rc==SQLITE_OK ){
6098    rc = sqlite3_table_column_metadata(
6099        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
6100    );
6101  }
6102
6103  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
6104    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
6105    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
6106    sqlite3_free(z);
6107  }
6108}
6109
6110
6111/*
6112** The implementation of dot-command ".lint fkey-indexes".
6113*/
6114static int lintFkeyIndexes(
6115  ShellState *pState,             /* Current shell tool state */
6116  char **azArg,                   /* Array of arguments passed to dot command */
6117  int nArg                        /* Number of entries in azArg[] */
6118){
6119  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
6120  FILE *out = pState->out;        /* Stream to write non-error output to */
6121  int bVerbose = 0;               /* If -verbose is present */
6122  int bGroupByParent = 0;         /* If -groupbyparent is present */
6123  int i;                          /* To iterate through azArg[] */
6124  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
6125  int rc;                         /* Return code */
6126  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
6127
6128  /*
6129  ** This SELECT statement returns one row for each foreign key constraint
6130  ** in the schema of the main database. The column values are:
6131  **
6132  ** 0. The text of an SQL statement similar to:
6133  **
6134  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
6135  **
6136  **    This SELECT is similar to the one that the foreign keys implementation
6137  **    needs to run internally on child tables. If there is an index that can
6138  **    be used to optimize this query, then it can also be used by the FK
6139  **    implementation to optimize DELETE or UPDATE statements on the parent
6140  **    table.
6141  **
6142  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
6143  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
6144  **    contains an index that can be used to optimize the query.
6145  **
6146  ** 2. Human readable text that describes the child table and columns. e.g.
6147  **
6148  **       "child_table(child_key1, child_key2)"
6149  **
6150  ** 3. Human readable text that describes the parent table and columns. e.g.
6151  **
6152  **       "parent_table(parent_key1, parent_key2)"
6153  **
6154  ** 4. A full CREATE INDEX statement for an index that could be used to
6155  **    optimize DELETE or UPDATE statements on the parent table. e.g.
6156  **
6157  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
6158  **
6159  ** 5. The name of the parent table.
6160  **
6161  ** These six values are used by the C logic below to generate the report.
6162  */
6163  const char *zSql =
6164  "SELECT "
6165    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
6166    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
6167    "  || fkey_collate_clause("
6168    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
6169    ", "
6170    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
6171    "  || group_concat('*=?', ' AND ') || ')'"
6172    ", "
6173    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
6174    ", "
6175    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
6176    ", "
6177    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
6178    "  || ' ON ' || quote(s.name) || '('"
6179    "  || group_concat(quote(f.[from]) ||"
6180    "        fkey_collate_clause("
6181    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
6182    "  || ');'"
6183    ", "
6184    "     f.[table] "
6185    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
6186    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
6187    "GROUP BY s.name, f.id "
6188    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
6189  ;
6190  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
6191
6192  for(i=2; i<nArg; i++){
6193    int n = strlen30(azArg[i]);
6194    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
6195      bVerbose = 1;
6196    }
6197    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
6198      bGroupByParent = 1;
6199      zIndent = "    ";
6200    }
6201    else{
6202      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
6203          azArg[0], azArg[1]
6204      );
6205      return SQLITE_ERROR;
6206    }
6207  }
6208
6209  /* Register the fkey_collate_clause() SQL function */
6210  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
6211      0, shellFkeyCollateClause, 0, 0
6212  );
6213
6214
6215  if( rc==SQLITE_OK ){
6216    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
6217  }
6218  if( rc==SQLITE_OK ){
6219    sqlite3_bind_int(pSql, 1, bGroupByParent);
6220  }
6221
6222  if( rc==SQLITE_OK ){
6223    int rc2;
6224    char *zPrev = 0;
6225    while( SQLITE_ROW==sqlite3_step(pSql) ){
6226      int res = -1;
6227      sqlite3_stmt *pExplain = 0;
6228      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
6229      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
6230      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
6231      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
6232      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
6233      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
6234
6235      if( zEQP==0 ) continue;
6236      if( zGlob==0 ) continue;
6237      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6238      if( rc!=SQLITE_OK ) break;
6239      if( SQLITE_ROW==sqlite3_step(pExplain) ){
6240        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6241        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
6242                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
6243      }
6244      rc = sqlite3_finalize(pExplain);
6245      if( rc!=SQLITE_OK ) break;
6246
6247      if( res<0 ){
6248        raw_printf(stderr, "Error: internal error");
6249        break;
6250      }else{
6251        if( bGroupByParent
6252        && (bVerbose || res==0)
6253        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6254        ){
6255          raw_printf(out, "-- Parent table %s\n", zParent);
6256          sqlite3_free(zPrev);
6257          zPrev = sqlite3_mprintf("%s", zParent);
6258        }
6259
6260        if( res==0 ){
6261          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6262        }else if( bVerbose ){
6263          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6264              zIndent, zFrom, zTarget
6265          );
6266        }
6267      }
6268    }
6269    sqlite3_free(zPrev);
6270
6271    if( rc!=SQLITE_OK ){
6272      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6273    }
6274
6275    rc2 = sqlite3_finalize(pSql);
6276    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6277      rc = rc2;
6278      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6279    }
6280  }else{
6281    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6282  }
6283
6284  return rc;
6285}
6286
6287/*
6288** Implementation of ".lint" dot command.
6289*/
6290static int lintDotCommand(
6291  ShellState *pState,             /* Current shell tool state */
6292  char **azArg,                   /* Array of arguments passed to dot command */
6293  int nArg                        /* Number of entries in azArg[] */
6294){
6295  int n;
6296  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6297  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6298  return lintFkeyIndexes(pState, azArg, nArg);
6299
6300 usage:
6301  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6302  raw_printf(stderr, "Where sub-commands are:\n");
6303  raw_printf(stderr, "    fkey-indexes\n");
6304  return SQLITE_ERROR;
6305}
6306
6307#if !defined SQLITE_OMIT_VIRTUALTABLE
6308static void shellPrepare(
6309  sqlite3 *db,
6310  int *pRc,
6311  const char *zSql,
6312  sqlite3_stmt **ppStmt
6313){
6314  *ppStmt = 0;
6315  if( *pRc==SQLITE_OK ){
6316    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6317    if( rc!=SQLITE_OK ){
6318      raw_printf(stderr, "sql error: %s (%d)\n",
6319          sqlite3_errmsg(db), sqlite3_errcode(db)
6320      );
6321      *pRc = rc;
6322    }
6323  }
6324}
6325
6326/*
6327** Create a prepared statement using printf-style arguments for the SQL.
6328**
6329** This routine is could be marked "static".  But it is not always used,
6330** depending on compile-time options.  By omitting the "static", we avoid
6331** nuisance compiler warnings about "defined but not used".
6332*/
6333void shellPreparePrintf(
6334  sqlite3 *db,
6335  int *pRc,
6336  sqlite3_stmt **ppStmt,
6337  const char *zFmt,
6338  ...
6339){
6340  *ppStmt = 0;
6341  if( *pRc==SQLITE_OK ){
6342    va_list ap;
6343    char *z;
6344    va_start(ap, zFmt);
6345    z = sqlite3_vmprintf(zFmt, ap);
6346    va_end(ap);
6347    if( z==0 ){
6348      *pRc = SQLITE_NOMEM;
6349    }else{
6350      shellPrepare(db, pRc, z, ppStmt);
6351      sqlite3_free(z);
6352    }
6353  }
6354}
6355
6356/* Finalize the prepared statement created using shellPreparePrintf().
6357**
6358** This routine is could be marked "static".  But it is not always used,
6359** depending on compile-time options.  By omitting the "static", we avoid
6360** nuisance compiler warnings about "defined but not used".
6361*/
6362void shellFinalize(
6363  int *pRc,
6364  sqlite3_stmt *pStmt
6365){
6366  if( pStmt ){
6367    sqlite3 *db = sqlite3_db_handle(pStmt);
6368    int rc = sqlite3_finalize(pStmt);
6369    if( *pRc==SQLITE_OK ){
6370      if( rc!=SQLITE_OK ){
6371        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6372      }
6373      *pRc = rc;
6374    }
6375  }
6376}
6377
6378/* Reset the prepared statement created using shellPreparePrintf().
6379**
6380** This routine is could be marked "static".  But it is not always used,
6381** depending on compile-time options.  By omitting the "static", we avoid
6382** nuisance compiler warnings about "defined but not used".
6383*/
6384void shellReset(
6385  int *pRc,
6386  sqlite3_stmt *pStmt
6387){
6388  int rc = sqlite3_reset(pStmt);
6389  if( *pRc==SQLITE_OK ){
6390    if( rc!=SQLITE_OK ){
6391      sqlite3 *db = sqlite3_db_handle(pStmt);
6392      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6393    }
6394    *pRc = rc;
6395  }
6396}
6397#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6398
6399#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6400/******************************************************************************
6401** The ".archive" or ".ar" command.
6402*/
6403/*
6404** Structure representing a single ".ar" command.
6405*/
6406typedef struct ArCommand ArCommand;
6407struct ArCommand {
6408  u8 eCmd;                        /* An AR_CMD_* value */
6409  u8 bVerbose;                    /* True if --verbose */
6410  u8 bZip;                        /* True if the archive is a ZIP */
6411  u8 bDryRun;                     /* True if --dry-run */
6412  u8 bAppend;                     /* True if --append */
6413  u8 bGlob;                       /* True if --glob */
6414  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6415  int nArg;                       /* Number of command arguments */
6416  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6417  const char *zFile;              /* --file argument, or NULL */
6418  const char *zDir;               /* --directory argument, or NULL */
6419  char **azArg;                   /* Array of command arguments */
6420  ShellState *p;                  /* Shell state */
6421  sqlite3 *db;                    /* Database containing the archive */
6422};
6423
6424/*
6425** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6426*/
6427static int arUsage(FILE *f){
6428  showHelp(f,"archive");
6429  return SQLITE_ERROR;
6430}
6431
6432/*
6433** Print an error message for the .ar command to stderr and return
6434** SQLITE_ERROR.
6435*/
6436static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6437  va_list ap;
6438  char *z;
6439  va_start(ap, zFmt);
6440  z = sqlite3_vmprintf(zFmt, ap);
6441  va_end(ap);
6442  utf8_printf(stderr, "Error: %s\n", z);
6443  if( pAr->fromCmdLine ){
6444    utf8_printf(stderr, "Use \"-A\" for more help\n");
6445  }else{
6446    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6447  }
6448  sqlite3_free(z);
6449  return SQLITE_ERROR;
6450}
6451
6452/*
6453** Values for ArCommand.eCmd.
6454*/
6455#define AR_CMD_CREATE       1
6456#define AR_CMD_UPDATE       2
6457#define AR_CMD_INSERT       3
6458#define AR_CMD_EXTRACT      4
6459#define AR_CMD_LIST         5
6460#define AR_CMD_HELP         6
6461#define AR_CMD_REMOVE       7
6462
6463/*
6464** Other (non-command) switches.
6465*/
6466#define AR_SWITCH_VERBOSE     8
6467#define AR_SWITCH_FILE        9
6468#define AR_SWITCH_DIRECTORY  10
6469#define AR_SWITCH_APPEND     11
6470#define AR_SWITCH_DRYRUN     12
6471#define AR_SWITCH_GLOB       13
6472
6473static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6474  switch( eSwitch ){
6475    case AR_CMD_CREATE:
6476    case AR_CMD_EXTRACT:
6477    case AR_CMD_LIST:
6478    case AR_CMD_REMOVE:
6479    case AR_CMD_UPDATE:
6480    case AR_CMD_INSERT:
6481    case AR_CMD_HELP:
6482      if( pAr->eCmd ){
6483        return arErrorMsg(pAr, "multiple command options");
6484      }
6485      pAr->eCmd = eSwitch;
6486      break;
6487
6488    case AR_SWITCH_DRYRUN:
6489      pAr->bDryRun = 1;
6490      break;
6491    case AR_SWITCH_GLOB:
6492      pAr->bGlob = 1;
6493      break;
6494    case AR_SWITCH_VERBOSE:
6495      pAr->bVerbose = 1;
6496      break;
6497    case AR_SWITCH_APPEND:
6498      pAr->bAppend = 1;
6499      /* Fall thru into --file */
6500    case AR_SWITCH_FILE:
6501      pAr->zFile = zArg;
6502      break;
6503    case AR_SWITCH_DIRECTORY:
6504      pAr->zDir = zArg;
6505      break;
6506  }
6507
6508  return SQLITE_OK;
6509}
6510
6511/*
6512** Parse the command line for an ".ar" command. The results are written into
6513** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6514** successfully, otherwise an error message is written to stderr and
6515** SQLITE_ERROR returned.
6516*/
6517static int arParseCommand(
6518  char **azArg,                   /* Array of arguments passed to dot command */
6519  int nArg,                       /* Number of entries in azArg[] */
6520  ArCommand *pAr                  /* Populate this object */
6521){
6522  struct ArSwitch {
6523    const char *zLong;
6524    char cShort;
6525    u8 eSwitch;
6526    u8 bArg;
6527  } aSwitch[] = {
6528    { "create",    'c', AR_CMD_CREATE,       0 },
6529    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6530    { "insert",    'i', AR_CMD_INSERT,       0 },
6531    { "list",      't', AR_CMD_LIST,         0 },
6532    { "remove",    'r', AR_CMD_REMOVE,       0 },
6533    { "update",    'u', AR_CMD_UPDATE,       0 },
6534    { "help",      'h', AR_CMD_HELP,         0 },
6535    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6536    { "file",      'f', AR_SWITCH_FILE,      1 },
6537    { "append",    'a', AR_SWITCH_APPEND,    1 },
6538    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6539    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6540    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6541  };
6542  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6543  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6544
6545  if( nArg<=1 ){
6546    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6547    return arUsage(stderr);
6548  }else{
6549    char *z = azArg[1];
6550    if( z[0]!='-' ){
6551      /* Traditional style [tar] invocation */
6552      int i;
6553      int iArg = 2;
6554      for(i=0; z[i]; i++){
6555        const char *zArg = 0;
6556        struct ArSwitch *pOpt;
6557        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6558          if( z[i]==pOpt->cShort ) break;
6559        }
6560        if( pOpt==pEnd ){
6561          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6562        }
6563        if( pOpt->bArg ){
6564          if( iArg>=nArg ){
6565            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6566          }
6567          zArg = azArg[iArg++];
6568        }
6569        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6570      }
6571      pAr->nArg = nArg-iArg;
6572      if( pAr->nArg>0 ){
6573        pAr->azArg = &azArg[iArg];
6574      }
6575    }else{
6576      /* Non-traditional invocation */
6577      int iArg;
6578      for(iArg=1; iArg<nArg; iArg++){
6579        int n;
6580        z = azArg[iArg];
6581        if( z[0]!='-' ){
6582          /* All remaining command line words are command arguments. */
6583          pAr->azArg = &azArg[iArg];
6584          pAr->nArg = nArg-iArg;
6585          break;
6586        }
6587        n = strlen30(z);
6588
6589        if( z[1]!='-' ){
6590          int i;
6591          /* One or more short options */
6592          for(i=1; i<n; i++){
6593            const char *zArg = 0;
6594            struct ArSwitch *pOpt;
6595            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6596              if( z[i]==pOpt->cShort ) break;
6597            }
6598            if( pOpt==pEnd ){
6599              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6600            }
6601            if( pOpt->bArg ){
6602              if( i<(n-1) ){
6603                zArg = &z[i+1];
6604                i = n;
6605              }else{
6606                if( iArg>=(nArg-1) ){
6607                  return arErrorMsg(pAr, "option requires an argument: %c",
6608                                    z[i]);
6609                }
6610                zArg = azArg[++iArg];
6611              }
6612            }
6613            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6614          }
6615        }else if( z[2]=='\0' ){
6616          /* A -- option, indicating that all remaining command line words
6617          ** are command arguments.  */
6618          pAr->azArg = &azArg[iArg+1];
6619          pAr->nArg = nArg-iArg-1;
6620          break;
6621        }else{
6622          /* A long option */
6623          const char *zArg = 0;             /* Argument for option, if any */
6624          struct ArSwitch *pMatch = 0;      /* Matching option */
6625          struct ArSwitch *pOpt;            /* Iterator */
6626          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6627            const char *zLong = pOpt->zLong;
6628            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6629              if( pMatch ){
6630                return arErrorMsg(pAr, "ambiguous option: %s",z);
6631              }else{
6632                pMatch = pOpt;
6633              }
6634            }
6635          }
6636
6637          if( pMatch==0 ){
6638            return arErrorMsg(pAr, "unrecognized option: %s", z);
6639          }
6640          if( pMatch->bArg ){
6641            if( iArg>=(nArg-1) ){
6642              return arErrorMsg(pAr, "option requires an argument: %s", z);
6643            }
6644            zArg = azArg[++iArg];
6645          }
6646          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6647        }
6648      }
6649    }
6650  }
6651
6652  return SQLITE_OK;
6653}
6654
6655/*
6656** This function assumes that all arguments within the ArCommand.azArg[]
6657** array refer to archive members, as for the --extract, --list or --remove
6658** commands. It checks that each of them are "present". If any specified
6659** file is not present in the archive, an error is printed to stderr and an
6660** error code returned. Otherwise, if all specified arguments are present
6661** in the archive, SQLITE_OK is returned. Here, "present" means either an
6662** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6663** when pAr->bGlob is true.
6664**
6665** This function strips any trailing '/' characters from each argument.
6666** This is consistent with the way the [tar] command seems to work on
6667** Linux.
6668*/
6669static int arCheckEntries(ArCommand *pAr){
6670  int rc = SQLITE_OK;
6671  if( pAr->nArg ){
6672    int i, j;
6673    sqlite3_stmt *pTest = 0;
6674    const char *zSel = (pAr->bGlob)
6675      ? "SELECT name FROM %s WHERE glob($name,name)"
6676      : "SELECT name FROM %s WHERE name=$name";
6677
6678    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6679    j = sqlite3_bind_parameter_index(pTest, "$name");
6680    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6681      char *z = pAr->azArg[i];
6682      int n = strlen30(z);
6683      int bOk = 0;
6684      while( n>0 && z[n-1]=='/' ) n--;
6685      z[n] = '\0';
6686      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6687      if( SQLITE_ROW==sqlite3_step(pTest) ){
6688        bOk = 1;
6689      }
6690      shellReset(&rc, pTest);
6691      if( rc==SQLITE_OK && bOk==0 ){
6692        utf8_printf(stderr, "not found in archive: %s\n", z);
6693        rc = SQLITE_ERROR;
6694      }
6695    }
6696    shellFinalize(&rc, pTest);
6697  }
6698  return rc;
6699}
6700
6701/*
6702** Format a WHERE clause that can be used against the "sqlar" table to
6703** identify all archive members that match the command arguments held
6704** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6705** The caller is responsible for eventually calling sqlite3_free() on
6706** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6707** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6708*/
6709static void arWhereClause(
6710  int *pRc,
6711  ArCommand *pAr,
6712  char **pzWhere                  /* OUT: New WHERE clause */
6713){
6714  char *zWhere = 0;
6715  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6716  if( *pRc==SQLITE_OK ){
6717    if( pAr->nArg==0 ){
6718      zWhere = sqlite3_mprintf("1");
6719    }else{
6720      int i;
6721      const char *zSep = "";
6722      for(i=0; i<pAr->nArg; i++){
6723        const char *z = pAr->azArg[i];
6724        zWhere = sqlite3_mprintf(
6725          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6726          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6727        );
6728        if( zWhere==0 ){
6729          *pRc = SQLITE_NOMEM;
6730          break;
6731        }
6732        zSep = " OR ";
6733      }
6734    }
6735  }
6736  *pzWhere = zWhere;
6737}
6738
6739/*
6740** Implementation of .ar "lisT" command.
6741*/
6742static int arListCommand(ArCommand *pAr){
6743  const char *zSql = "SELECT %s FROM %s WHERE %s";
6744  const char *azCols[] = {
6745    "name",
6746    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6747  };
6748
6749  char *zWhere = 0;
6750  sqlite3_stmt *pSql = 0;
6751  int rc;
6752
6753  rc = arCheckEntries(pAr);
6754  arWhereClause(&rc, pAr, &zWhere);
6755
6756  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6757                     pAr->zSrcTable, zWhere);
6758  if( pAr->bDryRun ){
6759    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6760  }else{
6761    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6762      if( pAr->bVerbose ){
6763        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6764            sqlite3_column_text(pSql, 0),
6765            sqlite3_column_int(pSql, 1),
6766            sqlite3_column_text(pSql, 2),
6767            sqlite3_column_text(pSql, 3)
6768        );
6769      }else{
6770        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6771      }
6772    }
6773  }
6774  shellFinalize(&rc, pSql);
6775  sqlite3_free(zWhere);
6776  return rc;
6777}
6778
6779
6780/*
6781** Implementation of .ar "Remove" command.
6782*/
6783static int arRemoveCommand(ArCommand *pAr){
6784  int rc = 0;
6785  char *zSql = 0;
6786  char *zWhere = 0;
6787
6788  if( pAr->nArg ){
6789    /* Verify that args actually exist within the archive before proceeding.
6790    ** And formulate a WHERE clause to match them.  */
6791    rc = arCheckEntries(pAr);
6792    arWhereClause(&rc, pAr, &zWhere);
6793  }
6794  if( rc==SQLITE_OK ){
6795    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6796                           pAr->zSrcTable, zWhere);
6797    if( pAr->bDryRun ){
6798      utf8_printf(pAr->p->out, "%s\n", zSql);
6799    }else{
6800      char *zErr = 0;
6801      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6802      if( rc==SQLITE_OK ){
6803        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6804        if( rc!=SQLITE_OK ){
6805          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6806        }else{
6807          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6808        }
6809      }
6810      if( zErr ){
6811        utf8_printf(stdout, "ERROR: %s\n", zErr);
6812        sqlite3_free(zErr);
6813      }
6814    }
6815  }
6816  sqlite3_free(zWhere);
6817  sqlite3_free(zSql);
6818  return rc;
6819}
6820
6821/*
6822** Implementation of .ar "eXtract" command.
6823*/
6824static int arExtractCommand(ArCommand *pAr){
6825  const char *zSql1 =
6826    "SELECT "
6827    " ($dir || name),"
6828    " writefile(($dir || name), %s, mode, mtime) "
6829    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6830    " AND name NOT GLOB '*..[/\\]*'";
6831
6832  const char *azExtraArg[] = {
6833    "sqlar_uncompress(data, sz)",
6834    "data"
6835  };
6836
6837  sqlite3_stmt *pSql = 0;
6838  int rc = SQLITE_OK;
6839  char *zDir = 0;
6840  char *zWhere = 0;
6841  int i, j;
6842
6843  /* If arguments are specified, check that they actually exist within
6844  ** the archive before proceeding. And formulate a WHERE clause to
6845  ** match them.  */
6846  rc = arCheckEntries(pAr);
6847  arWhereClause(&rc, pAr, &zWhere);
6848
6849  if( rc==SQLITE_OK ){
6850    if( pAr->zDir ){
6851      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6852    }else{
6853      zDir = sqlite3_mprintf("");
6854    }
6855    if( zDir==0 ) rc = SQLITE_NOMEM;
6856  }
6857
6858  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6859      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6860  );
6861
6862  if( rc==SQLITE_OK ){
6863    j = sqlite3_bind_parameter_index(pSql, "$dir");
6864    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6865
6866    /* Run the SELECT statement twice. The first time, writefile() is called
6867    ** for all archive members that should be extracted. The second time,
6868    ** only for the directories. This is because the timestamps for
6869    ** extracted directories must be reset after they are populated (as
6870    ** populating them changes the timestamp).  */
6871    for(i=0; i<2; i++){
6872      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6873      sqlite3_bind_int(pSql, j, i);
6874      if( pAr->bDryRun ){
6875        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6876      }else{
6877        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6878          if( i==0 && pAr->bVerbose ){
6879            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6880          }
6881        }
6882      }
6883      shellReset(&rc, pSql);
6884    }
6885    shellFinalize(&rc, pSql);
6886  }
6887
6888  sqlite3_free(zDir);
6889  sqlite3_free(zWhere);
6890  return rc;
6891}
6892
6893/*
6894** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
6895*/
6896static int arExecSql(ArCommand *pAr, const char *zSql){
6897  int rc;
6898  if( pAr->bDryRun ){
6899    utf8_printf(pAr->p->out, "%s\n", zSql);
6900    rc = SQLITE_OK;
6901  }else{
6902    char *zErr = 0;
6903    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6904    if( zErr ){
6905      utf8_printf(stdout, "ERROR: %s\n", zErr);
6906      sqlite3_free(zErr);
6907    }
6908  }
6909  return rc;
6910}
6911
6912
6913/*
6914** Implementation of .ar "create", "insert", and "update" commands.
6915**
6916**     create    ->     Create a new SQL archive
6917**     insert    ->     Insert or reinsert all files listed
6918**     update    ->     Insert files that have changed or that were not
6919**                      previously in the archive
6920**
6921** Create the "sqlar" table in the database if it does not already exist.
6922** Then add each file in the azFile[] array to the archive. Directories
6923** are added recursively. If argument bVerbose is non-zero, a message is
6924** printed on stdout for each file archived.
6925**
6926** The create command is the same as update, except that it drops
6927** any existing "sqlar" table before beginning.  The "insert" command
6928** always overwrites every file named on the command-line, where as
6929** "update" only overwrites if the size or mtime or mode has changed.
6930*/
6931static int arCreateOrUpdateCommand(
6932  ArCommand *pAr,                 /* Command arguments and options */
6933  int bUpdate,                    /* true for a --create. */
6934  int bOnlyIfChanged              /* Only update if file has changed */
6935){
6936  const char *zCreate =
6937      "CREATE TABLE IF NOT EXISTS sqlar(\n"
6938      "  name TEXT PRIMARY KEY,  -- name of the file\n"
6939      "  mode INT,               -- access permissions\n"
6940      "  mtime INT,              -- last modification time\n"
6941      "  sz INT,                 -- original file size\n"
6942      "  data BLOB               -- compressed content\n"
6943      ")";
6944  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6945  const char *zInsertFmt[2] = {
6946     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6947     "  SELECT\n"
6948     "    %s,\n"
6949     "    mode,\n"
6950     "    mtime,\n"
6951     "    CASE substr(lsmode(mode),1,1)\n"
6952     "      WHEN '-' THEN length(data)\n"
6953     "      WHEN 'd' THEN 0\n"
6954     "      ELSE -1 END,\n"
6955     "    sqlar_compress(data)\n"
6956     "  FROM fsdir(%Q,%Q) AS disk\n"
6957     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6958     ,
6959     "REPLACE INTO %s(name,mode,mtime,data)\n"
6960     "  SELECT\n"
6961     "    %s,\n"
6962     "    mode,\n"
6963     "    mtime,\n"
6964     "    data\n"
6965     "  FROM fsdir(%Q,%Q) AS disk\n"
6966     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6967  };
6968  int i;                          /* For iterating through azFile[] */
6969  int rc;                         /* Return code */
6970  const char *zTab = 0;           /* SQL table into which to insert */
6971  char *zSql;
6972  char zTemp[50];
6973  char *zExists = 0;
6974
6975  arExecSql(pAr, "PRAGMA page_size=512");
6976  rc = arExecSql(pAr, "SAVEPOINT ar;");
6977  if( rc!=SQLITE_OK ) return rc;
6978  zTemp[0] = 0;
6979  if( pAr->bZip ){
6980    /* Initialize the zipfile virtual table, if necessary */
6981    if( pAr->zFile ){
6982      sqlite3_uint64 r;
6983      sqlite3_randomness(sizeof(r),&r);
6984      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6985      zTab = zTemp;
6986      zSql = sqlite3_mprintf(
6987         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6988         zTab, pAr->zFile
6989      );
6990      rc = arExecSql(pAr, zSql);
6991      sqlite3_free(zSql);
6992    }else{
6993      zTab = "zip";
6994    }
6995  }else{
6996    /* Initialize the table for an SQLAR */
6997    zTab = "sqlar";
6998    if( bUpdate==0 ){
6999      rc = arExecSql(pAr, zDrop);
7000      if( rc!=SQLITE_OK ) goto end_ar_transaction;
7001    }
7002    rc = arExecSql(pAr, zCreate);
7003  }
7004  if( bOnlyIfChanged ){
7005    zExists = sqlite3_mprintf(
7006      " AND NOT EXISTS("
7007          "SELECT 1 FROM %s AS mem"
7008          " WHERE mem.name=disk.name"
7009          " AND mem.mtime=disk.mtime"
7010          " AND mem.mode=disk.mode)", zTab);
7011  }else{
7012    zExists = sqlite3_mprintf("");
7013  }
7014  if( zExists==0 ) rc = SQLITE_NOMEM;
7015  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
7016    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
7017        pAr->bVerbose ? "shell_putsnl(name)" : "name",
7018        pAr->azArg[i], pAr->zDir, zExists);
7019    rc = arExecSql(pAr, zSql2);
7020    sqlite3_free(zSql2);
7021  }
7022end_ar_transaction:
7023  if( rc!=SQLITE_OK ){
7024    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
7025  }else{
7026    rc = arExecSql(pAr, "RELEASE ar;");
7027    if( pAr->bZip && pAr->zFile ){
7028      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
7029      arExecSql(pAr, zSql);
7030      sqlite3_free(zSql);
7031    }
7032  }
7033  sqlite3_free(zExists);
7034  return rc;
7035}
7036
7037/*
7038** Implementation of ".ar" dot command.
7039*/
7040static int arDotCommand(
7041  ShellState *pState,          /* Current shell tool state */
7042  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
7043  char **azArg,                /* Array of arguments passed to dot command */
7044  int nArg                     /* Number of entries in azArg[] */
7045){
7046  ArCommand cmd;
7047  int rc;
7048  memset(&cmd, 0, sizeof(cmd));
7049  cmd.fromCmdLine = fromCmdLine;
7050  rc = arParseCommand(azArg, nArg, &cmd);
7051  if( rc==SQLITE_OK ){
7052    int eDbType = SHELL_OPEN_UNSPEC;
7053    cmd.p = pState;
7054    cmd.db = pState->db;
7055    if( cmd.zFile ){
7056      eDbType = deduceDatabaseType(cmd.zFile, 1);
7057    }else{
7058      eDbType = pState->openMode;
7059    }
7060    if( eDbType==SHELL_OPEN_ZIPFILE ){
7061      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
7062        if( cmd.zFile==0 ){
7063          cmd.zSrcTable = sqlite3_mprintf("zip");
7064        }else{
7065          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
7066        }
7067      }
7068      cmd.bZip = 1;
7069    }else if( cmd.zFile ){
7070      int flags;
7071      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
7072      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
7073           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
7074        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
7075      }else{
7076        flags = SQLITE_OPEN_READONLY;
7077      }
7078      cmd.db = 0;
7079      if( cmd.bDryRun ){
7080        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
7081             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
7082      }
7083      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
7084             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
7085      if( rc!=SQLITE_OK ){
7086        utf8_printf(stderr, "cannot open file: %s (%s)\n",
7087            cmd.zFile, sqlite3_errmsg(cmd.db)
7088        );
7089        goto end_ar_command;
7090      }
7091      sqlite3_fileio_init(cmd.db, 0, 0);
7092      sqlite3_sqlar_init(cmd.db, 0, 0);
7093      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
7094                              shellPutsFunc, 0, 0);
7095
7096    }
7097    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
7098      if( cmd.eCmd!=AR_CMD_CREATE
7099       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
7100      ){
7101        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
7102        rc = SQLITE_ERROR;
7103        goto end_ar_command;
7104      }
7105      cmd.zSrcTable = sqlite3_mprintf("sqlar");
7106    }
7107
7108    switch( cmd.eCmd ){
7109      case AR_CMD_CREATE:
7110        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
7111        break;
7112
7113      case AR_CMD_EXTRACT:
7114        rc = arExtractCommand(&cmd);
7115        break;
7116
7117      case AR_CMD_LIST:
7118        rc = arListCommand(&cmd);
7119        break;
7120
7121      case AR_CMD_HELP:
7122        arUsage(pState->out);
7123        break;
7124
7125      case AR_CMD_INSERT:
7126        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
7127        break;
7128
7129      case AR_CMD_REMOVE:
7130        rc = arRemoveCommand(&cmd);
7131        break;
7132
7133      default:
7134        assert( cmd.eCmd==AR_CMD_UPDATE );
7135        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
7136        break;
7137    }
7138  }
7139end_ar_command:
7140  if( cmd.db!=pState->db ){
7141    close_db(cmd.db);
7142  }
7143  sqlite3_free(cmd.zSrcTable);
7144
7145  return rc;
7146}
7147/* End of the ".archive" or ".ar" command logic
7148*******************************************************************************/
7149#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
7150
7151#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7152/*
7153** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
7154** Otherwise, the SQL statement or statements in zSql are executed using
7155** database connection db and the error code written to *pRc before
7156** this function returns.
7157*/
7158static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
7159  int rc = *pRc;
7160  if( rc==SQLITE_OK ){
7161    char *zErr = 0;
7162    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
7163    if( rc!=SQLITE_OK ){
7164      raw_printf(stderr, "SQL error: %s\n", zErr);
7165    }
7166    sqlite3_free(zErr);
7167    *pRc = rc;
7168  }
7169}
7170
7171/*
7172** Like shellExec(), except that zFmt is a printf() style format string.
7173*/
7174static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
7175  char *z = 0;
7176  if( *pRc==SQLITE_OK ){
7177    va_list ap;
7178    va_start(ap, zFmt);
7179    z = sqlite3_vmprintf(zFmt, ap);
7180    va_end(ap);
7181    if( z==0 ){
7182      *pRc = SQLITE_NOMEM;
7183    }else{
7184      shellExec(db, pRc, z);
7185    }
7186    sqlite3_free(z);
7187  }
7188}
7189
7190/*
7191** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7192** Otherwise, an attempt is made to allocate, zero and return a pointer
7193** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
7194** to SQLITE_NOMEM and NULL returned.
7195*/
7196static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
7197  void *pRet = 0;
7198  if( *pRc==SQLITE_OK ){
7199    pRet = sqlite3_malloc64(nByte);
7200    if( pRet==0 ){
7201      *pRc = SQLITE_NOMEM;
7202    }else{
7203      memset(pRet, 0, nByte);
7204    }
7205  }
7206  return pRet;
7207}
7208
7209/*
7210** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7211** Otherwise, zFmt is treated as a printf() style string. The result of
7212** formatting it along with any trailing arguments is written into a
7213** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
7214** It is the responsibility of the caller to eventually free this buffer
7215** using a call to sqlite3_free().
7216**
7217** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
7218** pointer returned.
7219*/
7220static char *shellMPrintf(int *pRc, const char *zFmt, ...){
7221  char *z = 0;
7222  if( *pRc==SQLITE_OK ){
7223    va_list ap;
7224    va_start(ap, zFmt);
7225    z = sqlite3_vmprintf(zFmt, ap);
7226    va_end(ap);
7227    if( z==0 ){
7228      *pRc = SQLITE_NOMEM;
7229    }
7230  }
7231  return z;
7232}
7233
7234
7235/*
7236** When running the ".recover" command, each output table, and the special
7237** orphaned row table if it is required, is represented by an instance
7238** of the following struct.
7239*/
7240typedef struct RecoverTable RecoverTable;
7241struct RecoverTable {
7242  char *zQuoted;                  /* Quoted version of table name */
7243  int nCol;                       /* Number of columns in table */
7244  char **azlCol;                  /* Array of column lists */
7245  int iPk;                        /* Index of IPK column */
7246};
7247
7248/*
7249** Free a RecoverTable object allocated by recoverFindTable() or
7250** recoverOrphanTable().
7251*/
7252static void recoverFreeTable(RecoverTable *pTab){
7253  if( pTab ){
7254    sqlite3_free(pTab->zQuoted);
7255    if( pTab->azlCol ){
7256      int i;
7257      for(i=0; i<=pTab->nCol; i++){
7258        sqlite3_free(pTab->azlCol[i]);
7259      }
7260      sqlite3_free(pTab->azlCol);
7261    }
7262    sqlite3_free(pTab);
7263  }
7264}
7265
7266/*
7267** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
7268** Otherwise, it allocates and returns a RecoverTable object based on the
7269** final four arguments passed to this function. It is the responsibility
7270** of the caller to eventually free the returned object using
7271** recoverFreeTable().
7272*/
7273static RecoverTable *recoverNewTable(
7274  int *pRc,                       /* IN/OUT: Error code */
7275  const char *zName,              /* Name of table */
7276  const char *zSql,               /* CREATE TABLE statement */
7277  int bIntkey,
7278  int nCol
7279){
7280  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
7281  int rc = *pRc;
7282  RecoverTable *pTab = 0;
7283
7284  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
7285  if( rc==SQLITE_OK ){
7286    int nSqlCol = 0;
7287    int bSqlIntkey = 0;
7288    sqlite3_stmt *pStmt = 0;
7289
7290    rc = sqlite3_open("", &dbtmp);
7291    if( rc==SQLITE_OK ){
7292      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7293                              shellIdQuote, 0, 0);
7294    }
7295    if( rc==SQLITE_OK ){
7296      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7297    }
7298    if( rc==SQLITE_OK ){
7299      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7300      if( rc==SQLITE_ERROR ){
7301        rc = SQLITE_OK;
7302        goto finished;
7303      }
7304    }
7305    shellPreparePrintf(dbtmp, &rc, &pStmt,
7306        "SELECT count(*) FROM pragma_table_info(%Q)", zName
7307    );
7308    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7309      nSqlCol = sqlite3_column_int(pStmt, 0);
7310    }
7311    shellFinalize(&rc, pStmt);
7312
7313    if( rc!=SQLITE_OK || nSqlCol<nCol ){
7314      goto finished;
7315    }
7316
7317    shellPreparePrintf(dbtmp, &rc, &pStmt,
7318      "SELECT ("
7319      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7320      ") FROM sqlite_schema WHERE name = %Q", zName
7321    );
7322    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7323      bSqlIntkey = sqlite3_column_int(pStmt, 0);
7324    }
7325    shellFinalize(&rc, pStmt);
7326
7327    if( bIntkey==bSqlIntkey ){
7328      int i;
7329      const char *zPk = "_rowid_";
7330      sqlite3_stmt *pPkFinder = 0;
7331
7332      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7333      ** set zPk to the name of the PK column, and pTab->iPk to the index
7334      ** of the column, where columns are 0-numbered from left to right.
7335      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7336      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
7337      pTab->iPk = -2;
7338      if( bIntkey ){
7339        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7340          "SELECT cid, name FROM pragma_table_info(%Q) "
7341          "  WHERE pk=1 AND type='integer' COLLATE nocase"
7342          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7343          , zName, zName
7344        );
7345        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7346          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7347          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7348          if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
7349        }
7350      }
7351
7352      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7353      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7354      pTab->nCol = nSqlCol;
7355
7356      if( bIntkey ){
7357        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7358      }else{
7359        pTab->azlCol[0] = shellMPrintf(&rc, "");
7360      }
7361      i = 1;
7362      shellPreparePrintf(dbtmp, &rc, &pStmt,
7363          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7364          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7365          "FROM pragma_table_info(%Q)",
7366          bIntkey ? ", " : "", pTab->iPk,
7367          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7368          zName
7369      );
7370      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7371        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7372        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7373        i++;
7374      }
7375      shellFinalize(&rc, pStmt);
7376
7377      shellFinalize(&rc, pPkFinder);
7378    }
7379  }
7380
7381 finished:
7382  sqlite3_close(dbtmp);
7383  *pRc = rc;
7384  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7385    recoverFreeTable(pTab);
7386    pTab = 0;
7387  }
7388  return pTab;
7389}
7390
7391/*
7392** This function is called to search the schema recovered from the
7393** sqlite_schema table of the (possibly) corrupt database as part
7394** of a ".recover" command. Specifically, for a table with root page
7395** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7396** table must be a WITHOUT ROWID table, or if non-zero, not one of
7397** those.
7398**
7399** If a table is found, a (RecoverTable*) object is returned. Or, if
7400** no such table is found, but bIntkey is false and iRoot is the
7401** root page of an index in the recovered schema, then (*pbNoop) is
7402** set to true and NULL returned. Or, if there is no such table or
7403** index, NULL is returned and (*pbNoop) set to 0, indicating that
7404** the caller should write data to the orphans table.
7405*/
7406static RecoverTable *recoverFindTable(
7407  ShellState *pState,             /* Shell state object */
7408  int *pRc,                       /* IN/OUT: Error code */
7409  int iRoot,                      /* Root page of table */
7410  int bIntkey,                    /* True for an intkey table */
7411  int nCol,                       /* Number of columns in table */
7412  int *pbNoop                     /* OUT: True if iRoot is root of index */
7413){
7414  sqlite3_stmt *pStmt = 0;
7415  RecoverTable *pRet = 0;
7416  int bNoop = 0;
7417  const char *zSql = 0;
7418  const char *zName = 0;
7419
7420  /* Search the recovered schema for an object with root page iRoot. */
7421  shellPreparePrintf(pState->db, pRc, &pStmt,
7422      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7423  );
7424  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7425    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7426    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7427      bNoop = 1;
7428      break;
7429    }
7430    if( sqlite3_stricmp(zType, "table")==0 ){
7431      zName = (const char*)sqlite3_column_text(pStmt, 1);
7432      zSql = (const char*)sqlite3_column_text(pStmt, 2);
7433      if( zName!=0 && zSql!=0 ){
7434        pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7435        break;
7436      }
7437    }
7438  }
7439
7440  shellFinalize(pRc, pStmt);
7441  *pbNoop = bNoop;
7442  return pRet;
7443}
7444
7445/*
7446** Return a RecoverTable object representing the orphans table.
7447*/
7448static RecoverTable *recoverOrphanTable(
7449  ShellState *pState,             /* Shell state object */
7450  int *pRc,                       /* IN/OUT: Error code */
7451  const char *zLostAndFound,      /* Base name for orphans table */
7452  int nCol                        /* Number of user data columns */
7453){
7454  RecoverTable *pTab = 0;
7455  if( nCol>=0 && *pRc==SQLITE_OK ){
7456    int i;
7457
7458    /* This block determines the name of the orphan table. The prefered
7459    ** name is zLostAndFound. But if that clashes with another name
7460    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7461    ** and so on until a non-clashing name is found.  */
7462    int iTab = 0;
7463    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7464    sqlite3_stmt *pTest = 0;
7465    shellPrepare(pState->db, pRc,
7466        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7467    );
7468    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7469    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7470      shellReset(pRc, pTest);
7471      sqlite3_free(zTab);
7472      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7473      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7474    }
7475    shellFinalize(pRc, pTest);
7476
7477    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7478    if( pTab ){
7479      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7480      pTab->nCol = nCol;
7481      pTab->iPk = -2;
7482      if( nCol>0 ){
7483        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7484        if( pTab->azlCol ){
7485          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7486          for(i=nCol-1; i>=0; i--){
7487            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7488          }
7489        }
7490      }
7491
7492      if( *pRc!=SQLITE_OK ){
7493        recoverFreeTable(pTab);
7494        pTab = 0;
7495      }else{
7496        raw_printf(pState->out,
7497            "CREATE TABLE %s(rootpgno INTEGER, "
7498            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7499        );
7500        for(i=0; i<nCol; i++){
7501          raw_printf(pState->out, ", c%d", i);
7502        }
7503        raw_printf(pState->out, ");\n");
7504      }
7505    }
7506    sqlite3_free(zTab);
7507  }
7508  return pTab;
7509}
7510
7511/*
7512** This function is called to recover data from the database. A script
7513** to construct a new database containing all recovered data is output
7514** on stream pState->out.
7515*/
7516static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7517  int rc = SQLITE_OK;
7518  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
7519  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
7520  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
7521  const char *zRecoveryDb = "";   /* Name of "recovery" database */
7522  const char *zLostAndFound = "lost_and_found";
7523  int i;
7524  int nOrphan = -1;
7525  RecoverTable *pOrphan = 0;
7526
7527  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
7528  int bRowids = 1;                /* 0 if --no-rowids */
7529  for(i=1; i<nArg; i++){
7530    char *z = azArg[i];
7531    int n;
7532    if( z[0]=='-' && z[1]=='-' ) z++;
7533    n = strlen30(z);
7534    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7535      bFreelist = 0;
7536    }else
7537    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7538      i++;
7539      zRecoveryDb = azArg[i];
7540    }else
7541    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7542      i++;
7543      zLostAndFound = azArg[i];
7544    }else
7545    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7546      bRowids = 0;
7547    }
7548    else{
7549      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7550      showHelp(pState->out, azArg[0]);
7551      return 1;
7552    }
7553  }
7554
7555  shellExecPrintf(pState->db, &rc,
7556    /* Attach an in-memory database named 'recovery'. Create an indexed
7557    ** cache of the sqlite_dbptr virtual table. */
7558    "PRAGMA writable_schema = on;"
7559    "ATTACH %Q AS recovery;"
7560    "DROP TABLE IF EXISTS recovery.dbptr;"
7561    "DROP TABLE IF EXISTS recovery.freelist;"
7562    "DROP TABLE IF EXISTS recovery.map;"
7563    "DROP TABLE IF EXISTS recovery.schema;"
7564    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7565  );
7566
7567  if( bFreelist ){
7568    shellExec(pState->db, &rc,
7569      "WITH trunk(pgno) AS ("
7570      "  SELECT shell_int32("
7571      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7572      "      WHERE x>0"
7573      "    UNION"
7574      "  SELECT shell_int32("
7575      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7576      "      FROM trunk WHERE x>0"
7577      "),"
7578      "freelist(data, n, freepgno) AS ("
7579      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7580      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7581      "    UNION ALL"
7582      "  SELECT data, n-1, shell_int32(data, 2+n) "
7583      "      FROM freelist WHERE n>=0"
7584      ")"
7585      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7586    );
7587  }
7588
7589  /* If this is an auto-vacuum database, add all pointer-map pages to
7590  ** the freelist table. Do this regardless of whether or not
7591  ** --freelist-corrupt was specified.  */
7592  shellExec(pState->db, &rc,
7593    "WITH ptrmap(pgno) AS ("
7594    "  SELECT 2 WHERE shell_int32("
7595    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7596    "  )"
7597    "    UNION ALL "
7598    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7599    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7600    ")"
7601    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7602  );
7603
7604  shellExec(pState->db, &rc,
7605    "CREATE TABLE recovery.dbptr("
7606    "      pgno, child, PRIMARY KEY(child, pgno)"
7607    ") WITHOUT ROWID;"
7608    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7609    "    SELECT * FROM sqlite_dbptr"
7610    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7611
7612    /* Delete any pointer to page 1. This ensures that page 1 is considered
7613    ** a root page, regardless of how corrupt the db is. */
7614    "DELETE FROM recovery.dbptr WHERE child = 1;"
7615
7616    /* Delete all pointers to any pages that have more than one pointer
7617    ** to them. Such pages will be treated as root pages when recovering
7618    ** data.  */
7619    "DELETE FROM recovery.dbptr WHERE child IN ("
7620    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7621    ");"
7622
7623    /* Create the "map" table that will (eventually) contain instructions
7624    ** for dealing with each page in the db that contains one or more
7625    ** records. */
7626    "CREATE TABLE recovery.map("
7627      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7628    ");"
7629
7630    /* Populate table [map]. If there are circular loops of pages in the
7631    ** database, the following adds all pages in such a loop to the map
7632    ** as individual root pages. This could be handled better.  */
7633    "WITH pages(i, maxlen) AS ("
7634    "  SELECT page_count, ("
7635    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7636    "  ) FROM pragma_page_count WHERE page_count>0"
7637    "    UNION ALL"
7638    "  SELECT i-1, ("
7639    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7640    "  ) FROM pages WHERE i>=2"
7641    ")"
7642    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7643    "  SELECT i, maxlen, NULL, ("
7644    "    WITH p(orig, pgno, parent) AS ("
7645    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7646    "        UNION "
7647    "      SELECT i, p.parent, "
7648    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7649    "    )"
7650    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7651    ") "
7652    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7653    "UPDATE recovery.map AS o SET intkey = ("
7654    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7655    ");"
7656
7657    /* Extract data from page 1 and any linked pages into table
7658    ** recovery.schema. With the same schema as an sqlite_schema table.  */
7659    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7660    "INSERT INTO recovery.schema SELECT "
7661    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
7662    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
7663    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
7664    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
7665    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
7666    "FROM sqlite_dbdata WHERE pgno IN ("
7667    "  SELECT pgno FROM recovery.map WHERE root=1"
7668    ")"
7669    "GROUP BY pgno, cell;"
7670    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7671  );
7672
7673  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7674  ** CREATE TABLE statements that extracted from the existing schema.  */
7675  if( rc==SQLITE_OK ){
7676    sqlite3_stmt *pStmt = 0;
7677    /* ".recover" might output content in an order which causes immediate
7678    ** foreign key constraints to be violated. So disable foreign-key
7679    ** constraint enforcement to prevent problems when running the output
7680    ** script. */
7681    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7682    raw_printf(pState->out, "BEGIN;\n");
7683    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7684    shellPrepare(pState->db, &rc,
7685        "SELECT sql FROM recovery.schema "
7686        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7687    );
7688    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7689      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7690      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7691          &zCreateTable[12]
7692      );
7693    }
7694    shellFinalize(&rc, pStmt);
7695  }
7696
7697  /* Figure out if an orphan table will be required. And if so, how many
7698  ** user columns it should contain */
7699  shellPrepare(pState->db, &rc,
7700      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7701      , &pLoop
7702  );
7703  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7704    nOrphan = sqlite3_column_int(pLoop, 0);
7705  }
7706  shellFinalize(&rc, pLoop);
7707  pLoop = 0;
7708
7709  shellPrepare(pState->db, &rc,
7710      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7711  );
7712
7713  shellPrepare(pState->db, &rc,
7714      "SELECT max(field), group_concat(shell_escape_crnl(quote"
7715      "(case when (? AND field<0) then NULL else value end)"
7716      "), ', ')"
7717      ", min(field) "
7718      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7719      "GROUP BY cell", &pCells
7720  );
7721
7722  /* Loop through each root page. */
7723  shellPrepare(pState->db, &rc,
7724      "SELECT root, intkey, max(maxlen) FROM recovery.map"
7725      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7726      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7727      ")", &pLoop
7728  );
7729  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7730    int iRoot = sqlite3_column_int(pLoop, 0);
7731    int bIntkey = sqlite3_column_int(pLoop, 1);
7732    int nCol = sqlite3_column_int(pLoop, 2);
7733    int bNoop = 0;
7734    RecoverTable *pTab;
7735
7736    assert( bIntkey==0 || bIntkey==1 );
7737    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7738    if( bNoop || rc ) continue;
7739    if( pTab==0 ){
7740      if( pOrphan==0 ){
7741        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7742      }
7743      pTab = pOrphan;
7744      if( pTab==0 ) break;
7745    }
7746
7747    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7748      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7749    }
7750    sqlite3_bind_int(pPages, 1, iRoot);
7751    if( bRowids==0 && pTab->iPk<0 ){
7752      sqlite3_bind_int(pCells, 1, 1);
7753    }else{
7754      sqlite3_bind_int(pCells, 1, 0);
7755    }
7756    sqlite3_bind_int(pCells, 3, pTab->iPk);
7757
7758    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7759      int iPgno = sqlite3_column_int(pPages, 0);
7760      sqlite3_bind_int(pCells, 2, iPgno);
7761      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7762        int nField = sqlite3_column_int(pCells, 0);
7763        int iMin = sqlite3_column_int(pCells, 2);
7764        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7765
7766        RecoverTable *pTab2 = pTab;
7767        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7768          if( pOrphan==0 ){
7769            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7770          }
7771          pTab2 = pOrphan;
7772          if( pTab2==0 ) break;
7773        }
7774
7775        nField = nField+1;
7776        if( pTab2==pOrphan ){
7777          raw_printf(pState->out,
7778              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7779              pTab2->zQuoted, iRoot, iPgno, nField,
7780              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7781          );
7782        }else{
7783          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7784              pTab2->zQuoted, pTab2->azlCol[nField], zVal
7785          );
7786        }
7787      }
7788      shellReset(&rc, pCells);
7789    }
7790    shellReset(&rc, pPages);
7791    if( pTab!=pOrphan ) recoverFreeTable(pTab);
7792  }
7793  shellFinalize(&rc, pLoop);
7794  shellFinalize(&rc, pPages);
7795  shellFinalize(&rc, pCells);
7796  recoverFreeTable(pOrphan);
7797
7798  /* The rest of the schema */
7799  if( rc==SQLITE_OK ){
7800    sqlite3_stmt *pStmt = 0;
7801    shellPrepare(pState->db, &rc,
7802        "SELECT sql, name FROM recovery.schema "
7803        "WHERE sql NOT LIKE 'create table%'", &pStmt
7804    );
7805    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7806      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7807      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7808        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7809        char *zPrint = shellMPrintf(&rc,
7810          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7811          zName, zName, zSql
7812        );
7813        raw_printf(pState->out, "%s;\n", zPrint);
7814        sqlite3_free(zPrint);
7815      }else{
7816        raw_printf(pState->out, "%s;\n", zSql);
7817      }
7818    }
7819    shellFinalize(&rc, pStmt);
7820  }
7821
7822  if( rc==SQLITE_OK ){
7823    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7824    raw_printf(pState->out, "COMMIT;\n");
7825  }
7826  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7827  return rc;
7828}
7829#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7830
7831
7832/*
7833 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
7834 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
7835 *   close db and set it to 0, and return the columns spec, to later
7836 *   be sqlite3_free()'ed by the caller.
7837 * The return is 0 when either:
7838 *   (a) The db was not initialized and zCol==0 (There are no columns.)
7839 *   (b) zCol!=0  (Column was added, db initialized as needed.)
7840 * The 3rd argument, pRenamed, references an out parameter. If the
7841 * pointer is non-zero, its referent will be set to a summary of renames
7842 * done if renaming was necessary, or set to 0 if none was done. The out
7843 * string (if any) must be sqlite3_free()'ed by the caller.
7844 */
7845#ifdef SHELL_DEBUG
7846#define rc_err_oom_die(rc) \
7847  if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
7848  else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
7849    fprintf(stderr,"E:%d\n",rc), assert(0)
7850#else
7851static void rc_err_oom_die(int rc){
7852  if( rc==SQLITE_NOMEM ) shell_check_oom(0);
7853  assert(rc==SQLITE_OK||rc==SQLITE_DONE);
7854}
7855#endif
7856
7857#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
7858static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
7859#else  /* Otherwise, memory is faster/better for the transient DB. */
7860static const char *zCOL_DB = ":memory:";
7861#endif
7862
7863/* Define character (as C string) to separate generated column ordinal
7864 * from protected part of incoming column names. This defaults to "_"
7865 * so that incoming column identifiers that did not need not be quoted
7866 * remain usable without being quoted. It must be one character.
7867 */
7868#ifndef SHELL_AUTOCOLUMN_SEP
7869# define AUTOCOLUMN_SEP "_"
7870#else
7871# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
7872#endif
7873
7874static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
7875  /* Queries and D{D,M}L used here */
7876  static const char * const zTabMake = "\
7877CREATE TABLE ColNames(\
7878 cpos INTEGER PRIMARY KEY,\
7879 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
7880CREATE VIEW RepeatedNames AS \
7881SELECT DISTINCT t.name FROM ColNames t \
7882WHERE t.name COLLATE NOCASE IN (\
7883 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
7884);\
7885";
7886  static const char * const zTabFill = "\
7887INSERT INTO ColNames(name,nlen,chop,reps,suff)\
7888 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
7889";
7890  static const char * const zHasDupes = "\
7891SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
7892 <count(name) FROM ColNames\
7893";
7894#ifdef SHELL_COLUMN_RENAME_CLEAN
7895  static const char * const zDedoctor = "\
7896UPDATE ColNames SET chop=iif(\
7897  (substring(name,nlen,1) BETWEEN '0' AND '9')\
7898  AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
7899 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
7900 0\
7901)\
7902";
7903#endif
7904  static const char * const zSetReps = "\
7905UPDATE ColNames AS t SET reps=\
7906(SELECT count(*) FROM ColNames d \
7907 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
7908 COLLATE NOCASE\
7909)\
7910";
7911#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7912  static const char * const zColDigits = "\
7913SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
7914";
7915#endif
7916  static const char * const zRenameRank =
7917#ifdef SHELL_COLUMN_RENAME_CLEAN
7918    "UPDATE ColNames AS t SET suff="
7919    "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
7920#else /* ...RENAME_MINIMAL_ONE_PASS */
7921"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
7922"  SELECT 0 AS nlz"
7923"  UNION"
7924"  SELECT nlz+1 AS nlz FROM Lzn"
7925"  WHERE EXISTS("
7926"   SELECT 1"
7927"   FROM ColNames t, ColNames o"
7928"   WHERE"
7929"    iif(t.name IN (SELECT * FROM RepeatedNames),"
7930"     printf('%s"AUTOCOLUMN_SEP"%s',"
7931"      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
7932"     t.name"
7933"    )"
7934"    ="
7935"    iif(o.name IN (SELECT * FROM RepeatedNames),"
7936"     printf('%s"AUTOCOLUMN_SEP"%s',"
7937"      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
7938"     o.name"
7939"    )"
7940"    COLLATE NOCASE"
7941"    AND o.cpos<>t.cpos"
7942"   GROUP BY t.cpos"
7943"  )"
7944") UPDATE Colnames AS t SET"
7945" chop = 0," /* No chopping, never touch incoming names. */
7946" suff = iif(name IN (SELECT * FROM RepeatedNames),"
7947"  printf('"AUTOCOLUMN_SEP"%s', substring("
7948"   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
7949"  ''"
7950" )"
7951#endif
7952    ;
7953  static const char * const zCollectVar = "\
7954SELECT\
7955 '('||x'0a'\
7956 || group_concat(\
7957  cname||' TEXT',\
7958  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
7959 ||')' AS ColsSpec \
7960FROM (\
7961 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \
7962 FROM ColNames ORDER BY cpos\
7963)";
7964  static const char * const zRenamesDone =
7965    "SELECT group_concat("
7966    " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff)),"
7967    " ','||x'0a')"
7968    "FROM ColNames WHERE suff<>'' OR chop!=0"
7969    ;
7970  int rc;
7971  sqlite3_stmt *pStmt = 0;
7972  assert(pDb!=0);
7973  if( zColNew ){
7974    /* Add initial or additional column. Init db if necessary. */
7975    if( *pDb==0 ){
7976      if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
7977#ifdef SHELL_COLFIX_DB
7978      if(*zCOL_DB!=':')
7979        sqlite3_exec(*pDb,"drop table if exists ColNames;"
7980                     "drop view if exists RepeatedNames;",0,0,0);
7981#endif
7982      rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
7983      rc_err_oom_die(rc);
7984    }
7985    assert(*pDb!=0);
7986    rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
7987    rc_err_oom_die(rc);
7988    rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
7989    rc_err_oom_die(rc);
7990    rc = sqlite3_step(pStmt);
7991    rc_err_oom_die(rc);
7992    sqlite3_finalize(pStmt);
7993    return 0;
7994  }else if( *pDb==0 ){
7995    return 0;
7996  }else{
7997    /* Formulate the columns spec, close the DB, zero *pDb. */
7998    char *zColsSpec = 0;
7999    int hasDupes = db_int(*pDb, zHasDupes);
8000#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
8001    int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
8002#else
8003# define nDigits 2
8004#endif
8005    if( hasDupes ){
8006#ifdef SHELL_COLUMN_RENAME_CLEAN
8007      rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
8008      rc_err_oom_die(rc);
8009#endif
8010      rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
8011      rc_err_oom_die(rc);
8012      rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
8013      rc_err_oom_die(rc);
8014      sqlite3_bind_int(pStmt, 1, nDigits);
8015      rc = sqlite3_step(pStmt);
8016      sqlite3_finalize(pStmt);
8017      assert(rc==SQLITE_DONE);
8018    }
8019    assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
8020    rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
8021    rc_err_oom_die(rc);
8022    rc = sqlite3_step(pStmt);
8023    if( rc==SQLITE_ROW ){
8024      zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8025    }else{
8026      zColsSpec = 0;
8027    }
8028    if( pzRenamed!=0 ){
8029      if( !hasDupes ) *pzRenamed = 0;
8030      else{
8031        sqlite3_finalize(pStmt);
8032        if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
8033            && SQLITE_ROW==sqlite3_step(pStmt) ){
8034          *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8035        }else
8036          *pzRenamed = 0;
8037      }
8038    }
8039    sqlite3_finalize(pStmt);
8040    sqlite3_close(*pDb);
8041    *pDb = 0;
8042    return zColsSpec;
8043  }
8044}
8045
8046/*
8047** If an input line begins with "." then invoke this routine to
8048** process that line.
8049**
8050** Return 1 on error, 2 to exit, and 0 otherwise.
8051*/
8052static int do_meta_command(char *zLine, ShellState *p){
8053  int h = 1;
8054  int nArg = 0;
8055  int n, c;
8056  int rc = 0;
8057  char *azArg[52];
8058
8059#ifndef SQLITE_OMIT_VIRTUALTABLE
8060  if( p->expert.pExpert ){
8061    expertFinish(p, 1, 0);
8062  }
8063#endif
8064
8065  /* Parse the input line into tokens.
8066  */
8067  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
8068    while( IsSpace(zLine[h]) ){ h++; }
8069    if( zLine[h]==0 ) break;
8070    if( zLine[h]=='\'' || zLine[h]=='"' ){
8071      int delim = zLine[h++];
8072      azArg[nArg++] = &zLine[h];
8073      while( zLine[h] && zLine[h]!=delim ){
8074        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
8075        h++;
8076      }
8077      if( zLine[h]==delim ){
8078        zLine[h++] = 0;
8079      }
8080      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
8081    }else{
8082      azArg[nArg++] = &zLine[h];
8083      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
8084      if( zLine[h] ) zLine[h++] = 0;
8085      resolve_backslashes(azArg[nArg-1]);
8086    }
8087  }
8088  azArg[nArg] = 0;
8089
8090  /* Process the input line.
8091  */
8092  if( nArg==0 ) return 0; /* no tokens, no error */
8093  n = strlen30(azArg[0]);
8094  c = azArg[0][0];
8095  clearTempFile(p);
8096
8097#ifndef SQLITE_OMIT_AUTHORIZATION
8098  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
8099    if( nArg!=2 ){
8100      raw_printf(stderr, "Usage: .auth ON|OFF\n");
8101      rc = 1;
8102      goto meta_command_exit;
8103    }
8104    open_db(p, 0);
8105    if( booleanValue(azArg[1]) ){
8106      sqlite3_set_authorizer(p->db, shellAuth, p);
8107    }else if( p->bSafeModePersist ){
8108      sqlite3_set_authorizer(p->db, safeModeAuth, p);
8109    }else{
8110      sqlite3_set_authorizer(p->db, 0, 0);
8111    }
8112  }else
8113#endif
8114
8115#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8116  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
8117    open_db(p, 0);
8118    failIfSafeMode(p, "cannot run .archive in safe mode");
8119    rc = arDotCommand(p, 0, azArg, nArg);
8120  }else
8121#endif
8122
8123  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
8124   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
8125  ){
8126    const char *zDestFile = 0;
8127    const char *zDb = 0;
8128    sqlite3 *pDest;
8129    sqlite3_backup *pBackup;
8130    int j;
8131    int bAsync = 0;
8132    const char *zVfs = 0;
8133    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
8134    for(j=1; j<nArg; j++){
8135      const char *z = azArg[j];
8136      if( z[0]=='-' ){
8137        if( z[1]=='-' ) z++;
8138        if( strcmp(z, "-append")==0 ){
8139          zVfs = "apndvfs";
8140        }else
8141        if( strcmp(z, "-async")==0 ){
8142          bAsync = 1;
8143        }else
8144        {
8145          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
8146          return 1;
8147        }
8148      }else if( zDestFile==0 ){
8149        zDestFile = azArg[j];
8150      }else if( zDb==0 ){
8151        zDb = zDestFile;
8152        zDestFile = azArg[j];
8153      }else{
8154        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
8155        return 1;
8156      }
8157    }
8158    if( zDestFile==0 ){
8159      raw_printf(stderr, "missing FILENAME argument on .backup\n");
8160      return 1;
8161    }
8162    if( zDb==0 ) zDb = "main";
8163    rc = sqlite3_open_v2(zDestFile, &pDest,
8164                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
8165    if( rc!=SQLITE_OK ){
8166      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
8167      close_db(pDest);
8168      return 1;
8169    }
8170    if( bAsync ){
8171      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
8172                   0, 0, 0);
8173    }
8174    open_db(p, 0);
8175    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
8176    if( pBackup==0 ){
8177      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8178      close_db(pDest);
8179      return 1;
8180    }
8181    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
8182    sqlite3_backup_finish(pBackup);
8183    if( rc==SQLITE_DONE ){
8184      rc = 0;
8185    }else{
8186      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8187      rc = 1;
8188    }
8189    close_db(pDest);
8190  }else
8191
8192  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
8193    if( nArg==2 ){
8194      bail_on_error = booleanValue(azArg[1]);
8195    }else{
8196      raw_printf(stderr, "Usage: .bail on|off\n");
8197      rc = 1;
8198    }
8199  }else
8200
8201  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
8202    if( nArg==2 ){
8203      if( booleanValue(azArg[1]) ){
8204        setBinaryMode(p->out, 1);
8205      }else{
8206        setTextMode(p->out, 1);
8207      }
8208    }else{
8209      raw_printf(stderr, "Usage: .binary on|off\n");
8210      rc = 1;
8211    }
8212  }else
8213
8214  /* The undocumented ".breakpoint" command causes a call to the no-op
8215  ** routine named test_breakpoint().
8216  */
8217  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
8218    test_breakpoint();
8219  }else
8220
8221  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
8222    failIfSafeMode(p, "cannot run .cd in safe mode");
8223    if( nArg==2 ){
8224#if defined(_WIN32) || defined(WIN32)
8225      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
8226      rc = !SetCurrentDirectoryW(z);
8227      sqlite3_free(z);
8228#else
8229      rc = chdir(azArg[1]);
8230#endif
8231      if( rc ){
8232        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
8233        rc = 1;
8234      }
8235    }else{
8236      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
8237      rc = 1;
8238    }
8239  }else
8240
8241  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
8242    if( nArg==2 ){
8243      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
8244    }else{
8245      raw_printf(stderr, "Usage: .changes on|off\n");
8246      rc = 1;
8247    }
8248  }else
8249
8250  /* Cancel output redirection, if it is currently set (by .testcase)
8251  ** Then read the content of the testcase-out.txt file and compare against
8252  ** azArg[1].  If there are differences, report an error and exit.
8253  */
8254  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
8255    char *zRes = 0;
8256    output_reset(p);
8257    if( nArg!=2 ){
8258      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
8259      rc = 2;
8260    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
8261      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
8262      rc = 2;
8263    }else if( testcase_glob(azArg[1],zRes)==0 ){
8264      utf8_printf(stderr,
8265                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
8266                 p->zTestcase, azArg[1], zRes);
8267      rc = 1;
8268    }else{
8269      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
8270      p->nCheck++;
8271    }
8272    sqlite3_free(zRes);
8273  }else
8274
8275  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
8276    failIfSafeMode(p, "cannot run .clone in safe mode");
8277    if( nArg==2 ){
8278      tryToClone(p, azArg[1]);
8279    }else{
8280      raw_printf(stderr, "Usage: .clone FILENAME\n");
8281      rc = 1;
8282    }
8283  }else
8284
8285  if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
8286    if( nArg==1 ){
8287      /* List available connections */
8288      int i;
8289      for(i=0; i<ArraySize(p->aAuxDb); i++){
8290        const char *zFile = p->aAuxDb[i].zDbFilename;
8291        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
8292          zFile = "(not open)";
8293        }else if( zFile==0 ){
8294          zFile = "(memory)";
8295        }else if( zFile[0]==0 ){
8296          zFile = "(temporary-file)";
8297        }
8298        if( p->pAuxDb == &p->aAuxDb[i] ){
8299          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
8300        }else if( p->aAuxDb[i].db!=0 ){
8301          utf8_printf(stdout, "       %d: %s\n", i, zFile);
8302        }
8303      }
8304    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
8305      int i = azArg[1][0] - '0';
8306      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
8307        p->pAuxDb->db = p->db;
8308        p->pAuxDb = &p->aAuxDb[i];
8309        globalDb = p->db = p->pAuxDb->db;
8310        p->pAuxDb->db = 0;
8311      }
8312    }else if( nArg==3 && strcmp(azArg[1], "close")==0
8313           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
8314      int i = azArg[2][0] - '0';
8315      if( i<0 || i>=ArraySize(p->aAuxDb) ){
8316        /* No-op */
8317      }else if( p->pAuxDb == &p->aAuxDb[i] ){
8318        raw_printf(stderr, "cannot close the active database connection\n");
8319        rc = 1;
8320      }else if( p->aAuxDb[i].db ){
8321        session_close_all(p, i);
8322        close_db(p->aAuxDb[i].db);
8323        p->aAuxDb[i].db = 0;
8324      }
8325    }else{
8326      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
8327      rc = 1;
8328    }
8329  }else
8330
8331  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
8332    char **azName = 0;
8333    int nName = 0;
8334    sqlite3_stmt *pStmt;
8335    int i;
8336    open_db(p, 0);
8337    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
8338    if( rc ){
8339      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8340      rc = 1;
8341    }else{
8342      while( sqlite3_step(pStmt)==SQLITE_ROW ){
8343        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
8344        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
8345        if( zSchema==0 || zFile==0 ) continue;
8346        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
8347        shell_check_oom(azName);
8348        azName[nName*2] = strdup(zSchema);
8349        azName[nName*2+1] = strdup(zFile);
8350        nName++;
8351      }
8352    }
8353    sqlite3_finalize(pStmt);
8354    for(i=0; i<nName; i++){
8355      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
8356      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
8357      const char *z = azName[i*2+1];
8358      utf8_printf(p->out, "%s: %s %s%s\n",
8359         azName[i*2],
8360         z && z[0] ? z : "\"\"",
8361         bRdonly ? "r/o" : "r/w",
8362         eTxn==SQLITE_TXN_NONE ? "" :
8363            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
8364      free(azName[i*2]);
8365      free(azName[i*2+1]);
8366    }
8367    sqlite3_free(azName);
8368  }else
8369
8370  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
8371    static const struct DbConfigChoices {
8372      const char *zName;
8373      int op;
8374    } aDbConfig[] = {
8375        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
8376        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
8377        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
8378        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
8379        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
8380        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
8381        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
8382        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
8383        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
8384        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
8385        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
8386        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
8387        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
8388        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
8389        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
8390        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
8391    };
8392    int ii, v;
8393    open_db(p, 0);
8394    for(ii=0; ii<ArraySize(aDbConfig); ii++){
8395      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
8396      if( nArg>=3 ){
8397        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
8398      }
8399      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
8400      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
8401      if( nArg>1 ) break;
8402    }
8403    if( nArg>1 && ii==ArraySize(aDbConfig) ){
8404      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
8405      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
8406    }
8407  }else
8408
8409  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
8410    rc = shell_dbinfo_command(p, nArg, azArg);
8411  }else
8412
8413#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8414  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
8415    open_db(p, 0);
8416    rc = recoverDatabaseCmd(p, nArg, azArg);
8417  }else
8418#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
8419
8420  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
8421    char *zLike = 0;
8422    char *zSql;
8423    int i;
8424    int savedShowHeader = p->showHeader;
8425    int savedShellFlags = p->shellFlgs;
8426    ShellClearFlag(p,
8427       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
8428       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
8429    for(i=1; i<nArg; i++){
8430      if( azArg[i][0]=='-' ){
8431        const char *z = azArg[i]+1;
8432        if( z[0]=='-' ) z++;
8433        if( strcmp(z,"preserve-rowids")==0 ){
8434#ifdef SQLITE_OMIT_VIRTUALTABLE
8435          raw_printf(stderr, "The --preserve-rowids option is not compatible"
8436                             " with SQLITE_OMIT_VIRTUALTABLE\n");
8437          rc = 1;
8438          sqlite3_free(zLike);
8439          goto meta_command_exit;
8440#else
8441          ShellSetFlag(p, SHFLG_PreserveRowid);
8442#endif
8443        }else
8444        if( strcmp(z,"newlines")==0 ){
8445          ShellSetFlag(p, SHFLG_Newlines);
8446        }else
8447        if( strcmp(z,"data-only")==0 ){
8448          ShellSetFlag(p, SHFLG_DumpDataOnly);
8449        }else
8450        if( strcmp(z,"nosys")==0 ){
8451          ShellSetFlag(p, SHFLG_DumpNoSys);
8452        }else
8453        {
8454          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8455          rc = 1;
8456          sqlite3_free(zLike);
8457          goto meta_command_exit;
8458        }
8459      }else{
8460        /* azArg[i] contains a LIKE pattern. This ".dump" request should
8461        ** only dump data for tables for which either the table name matches
8462        ** the LIKE pattern, or the table appears to be a shadow table of
8463        ** a virtual table for which the name matches the LIKE pattern.
8464        */
8465        char *zExpr = sqlite3_mprintf(
8466            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8467            "  SELECT 1 FROM sqlite_schema WHERE "
8468            "    name LIKE %Q ESCAPE '\\' AND"
8469            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8470            "    substr(o.name, 1, length(name)+1) == (name||'_')"
8471            ")", azArg[i], azArg[i]
8472        );
8473
8474        if( zLike ){
8475          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8476        }else{
8477          zLike = zExpr;
8478        }
8479      }
8480    }
8481
8482    open_db(p, 0);
8483
8484    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8485      /* When playing back a "dump", the content might appear in an order
8486      ** which causes immediate foreign key constraints to be violated.
8487      ** So disable foreign-key constraint enforcement to prevent problems. */
8488      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8489      raw_printf(p->out, "BEGIN TRANSACTION;\n");
8490    }
8491    p->writableSchema = 0;
8492    p->showHeader = 0;
8493    /* Set writable_schema=ON since doing so forces SQLite to initialize
8494    ** as much of the schema as it can even if the sqlite_schema table is
8495    ** corrupt. */
8496    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8497    p->nErr = 0;
8498    if( zLike==0 ) zLike = sqlite3_mprintf("true");
8499    zSql = sqlite3_mprintf(
8500      "SELECT name, type, sql FROM sqlite_schema AS o "
8501      "WHERE (%s) AND type=='table'"
8502      "  AND sql NOT NULL"
8503      " ORDER BY tbl_name='sqlite_sequence', rowid",
8504      zLike
8505    );
8506    run_schema_dump_query(p,zSql);
8507    sqlite3_free(zSql);
8508    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8509      zSql = sqlite3_mprintf(
8510        "SELECT sql FROM sqlite_schema AS o "
8511        "WHERE (%s) AND sql NOT NULL"
8512        "  AND type IN ('index','trigger','view')",
8513        zLike
8514      );
8515      run_table_dump_query(p, zSql);
8516      sqlite3_free(zSql);
8517    }
8518    sqlite3_free(zLike);
8519    if( p->writableSchema ){
8520      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8521      p->writableSchema = 0;
8522    }
8523    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8524    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8525    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8526      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8527    }
8528    p->showHeader = savedShowHeader;
8529    p->shellFlgs = savedShellFlags;
8530  }else
8531
8532  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8533    if( nArg==2 ){
8534      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8535    }else{
8536      raw_printf(stderr, "Usage: .echo on|off\n");
8537      rc = 1;
8538    }
8539  }else
8540
8541  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8542    if( nArg==2 ){
8543      p->autoEQPtest = 0;
8544      if( p->autoEQPtrace ){
8545        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8546        p->autoEQPtrace = 0;
8547      }
8548      if( strcmp(azArg[1],"full")==0 ){
8549        p->autoEQP = AUTOEQP_full;
8550      }else if( strcmp(azArg[1],"trigger")==0 ){
8551        p->autoEQP = AUTOEQP_trigger;
8552#ifdef SQLITE_DEBUG
8553      }else if( strcmp(azArg[1],"test")==0 ){
8554        p->autoEQP = AUTOEQP_on;
8555        p->autoEQPtest = 1;
8556      }else if( strcmp(azArg[1],"trace")==0 ){
8557        p->autoEQP = AUTOEQP_full;
8558        p->autoEQPtrace = 1;
8559        open_db(p, 0);
8560        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8561        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8562#endif
8563      }else{
8564        p->autoEQP = (u8)booleanValue(azArg[1]);
8565      }
8566    }else{
8567      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8568      rc = 1;
8569    }
8570  }else
8571
8572  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8573    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8574    rc = 2;
8575  }else
8576
8577  /* The ".explain" command is automatic now.  It is largely pointless.  It
8578  ** retained purely for backwards compatibility */
8579  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8580    int val = 1;
8581    if( nArg>=2 ){
8582      if( strcmp(azArg[1],"auto")==0 ){
8583        val = 99;
8584      }else{
8585        val =  booleanValue(azArg[1]);
8586      }
8587    }
8588    if( val==1 && p->mode!=MODE_Explain ){
8589      p->normalMode = p->mode;
8590      p->mode = MODE_Explain;
8591      p->autoExplain = 0;
8592    }else if( val==0 ){
8593      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8594      p->autoExplain = 0;
8595    }else if( val==99 ){
8596      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8597      p->autoExplain = 1;
8598    }
8599  }else
8600
8601#ifndef SQLITE_OMIT_VIRTUALTABLE
8602  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8603    if( p->bSafeMode ){
8604      raw_printf(stderr,
8605        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8606        azArg[0]);
8607      rc = 1;
8608    }else{
8609      open_db(p, 0);
8610      expertDotCommand(p, azArg, nArg);
8611    }
8612  }else
8613#endif
8614
8615  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8616    static const struct {
8617       const char *zCtrlName;   /* Name of a test-control option */
8618       int ctrlCode;            /* Integer code for that option */
8619       const char *zUsage;      /* Usage notes */
8620    } aCtrl[] = {
8621      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8622      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8623      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8624      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8625      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8626   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8627      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8628      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8629      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8630      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8631   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8632    };
8633    int filectrl = -1;
8634    int iCtrl = -1;
8635    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8636    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8637    int n2, i;
8638    const char *zCmd = 0;
8639    const char *zSchema = 0;
8640
8641    open_db(p, 0);
8642    zCmd = nArg>=2 ? azArg[1] : "help";
8643
8644    if( zCmd[0]=='-'
8645     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8646     && nArg>=4
8647    ){
8648      zSchema = azArg[2];
8649      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8650      nArg -= 2;
8651      zCmd = azArg[1];
8652    }
8653
8654    /* The argument can optionally begin with "-" or "--" */
8655    if( zCmd[0]=='-' && zCmd[1] ){
8656      zCmd++;
8657      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8658    }
8659
8660    /* --help lists all file-controls */
8661    if( strcmp(zCmd,"help")==0 ){
8662      utf8_printf(p->out, "Available file-controls:\n");
8663      for(i=0; i<ArraySize(aCtrl); i++){
8664        utf8_printf(p->out, "  .filectrl %s %s\n",
8665                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8666      }
8667      rc = 1;
8668      goto meta_command_exit;
8669    }
8670
8671    /* convert filectrl text option to value. allow any unique prefix
8672    ** of the option name, or a numerical value. */
8673    n2 = strlen30(zCmd);
8674    for(i=0; i<ArraySize(aCtrl); i++){
8675      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8676        if( filectrl<0 ){
8677          filectrl = aCtrl[i].ctrlCode;
8678          iCtrl = i;
8679        }else{
8680          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8681                              "Use \".filectrl --help\" for help\n", zCmd);
8682          rc = 1;
8683          goto meta_command_exit;
8684        }
8685      }
8686    }
8687    if( filectrl<0 ){
8688      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8689                         "Use \".filectrl --help\" for help\n", zCmd);
8690    }else{
8691      switch(filectrl){
8692        case SQLITE_FCNTL_SIZE_LIMIT: {
8693          if( nArg!=2 && nArg!=3 ) break;
8694          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8695          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8696          isOk = 1;
8697          break;
8698        }
8699        case SQLITE_FCNTL_LOCK_TIMEOUT:
8700        case SQLITE_FCNTL_CHUNK_SIZE: {
8701          int x;
8702          if( nArg!=3 ) break;
8703          x = (int)integerValue(azArg[2]);
8704          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8705          isOk = 2;
8706          break;
8707        }
8708        case SQLITE_FCNTL_PERSIST_WAL:
8709        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8710          int x;
8711          if( nArg!=2 && nArg!=3 ) break;
8712          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8713          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8714          iRes = x;
8715          isOk = 1;
8716          break;
8717        }
8718        case SQLITE_FCNTL_DATA_VERSION:
8719        case SQLITE_FCNTL_HAS_MOVED: {
8720          int x;
8721          if( nArg!=2 ) break;
8722          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8723          iRes = x;
8724          isOk = 1;
8725          break;
8726        }
8727        case SQLITE_FCNTL_TEMPFILENAME: {
8728          char *z = 0;
8729          if( nArg!=2 ) break;
8730          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8731          if( z ){
8732            utf8_printf(p->out, "%s\n", z);
8733            sqlite3_free(z);
8734          }
8735          isOk = 2;
8736          break;
8737        }
8738        case SQLITE_FCNTL_RESERVE_BYTES: {
8739          int x;
8740          if( nArg>=3 ){
8741            x = atoi(azArg[2]);
8742            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8743          }
8744          x = -1;
8745          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8746          utf8_printf(p->out,"%d\n", x);
8747          isOk = 2;
8748          break;
8749        }
8750      }
8751    }
8752    if( isOk==0 && iCtrl>=0 ){
8753      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8754      rc = 1;
8755    }else if( isOk==1 ){
8756      char zBuf[100];
8757      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8758      raw_printf(p->out, "%s\n", zBuf);
8759    }
8760  }else
8761
8762  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8763    ShellState data;
8764    int doStats = 0;
8765    memcpy(&data, p, sizeof(data));
8766    data.showHeader = 0;
8767    data.cMode = data.mode = MODE_Semi;
8768    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8769      data.cMode = data.mode = MODE_Pretty;
8770      nArg = 1;
8771    }
8772    if( nArg!=1 ){
8773      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8774      rc = 1;
8775      goto meta_command_exit;
8776    }
8777    open_db(p, 0);
8778    rc = sqlite3_exec(p->db,
8779       "SELECT sql FROM"
8780       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8781       "     FROM sqlite_schema UNION ALL"
8782       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8783       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8784       "ORDER BY x",
8785       callback, &data, 0
8786    );
8787    if( rc==SQLITE_OK ){
8788      sqlite3_stmt *pStmt;
8789      rc = sqlite3_prepare_v2(p->db,
8790               "SELECT rowid FROM sqlite_schema"
8791               " WHERE name GLOB 'sqlite_stat[134]'",
8792               -1, &pStmt, 0);
8793      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8794      sqlite3_finalize(pStmt);
8795    }
8796    if( doStats==0 ){
8797      raw_printf(p->out, "/* No STAT tables available */\n");
8798    }else{
8799      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8800      data.cMode = data.mode = MODE_Insert;
8801      data.zDestTable = "sqlite_stat1";
8802      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8803      data.zDestTable = "sqlite_stat4";
8804      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8805      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8806    }
8807  }else
8808
8809  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8810    if( nArg==2 ){
8811      p->showHeader = booleanValue(azArg[1]);
8812      p->shellFlgs |= SHFLG_HeaderSet;
8813    }else{
8814      raw_printf(stderr, "Usage: .headers on|off\n");
8815      rc = 1;
8816    }
8817  }else
8818
8819  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8820    if( nArg>=2 ){
8821      n = showHelp(p->out, azArg[1]);
8822      if( n==0 ){
8823        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8824      }
8825    }else{
8826      showHelp(p->out, 0);
8827    }
8828  }else
8829
8830  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8831    char *zTable = 0;           /* Insert data into this table */
8832    char *zSchema = 0;          /* within this schema (may default to "main") */
8833    char *zFile = 0;            /* Name of file to extra content from */
8834    sqlite3_stmt *pStmt = NULL; /* A statement */
8835    int nCol;                   /* Number of columns in the table */
8836    int nByte;                  /* Number of bytes in an SQL string */
8837    int i, j;                   /* Loop counters */
8838    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8839    int nSep;                   /* Number of bytes in p->colSeparator[] */
8840    char *zSql;                 /* An SQL statement */
8841    char *zFullTabName;         /* Table name with schema if applicable */
8842    ImportCtx sCtx;             /* Reader context */
8843    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8844    int eVerbose = 0;           /* Larger for more console output */
8845    int nSkip = 0;              /* Initial lines to skip */
8846    int useOutputMode = 1;      /* Use output mode to determine separators */
8847    char *zCreate = 0;          /* CREATE TABLE statement text */
8848
8849    failIfSafeMode(p, "cannot run .import in safe mode");
8850    memset(&sCtx, 0, sizeof(sCtx));
8851    sCtx.z = sqlite3_malloc64(120);
8852    if( sCtx.z==0 ){
8853      import_cleanup(&sCtx);
8854      shell_out_of_memory();
8855    }
8856    if( p->mode==MODE_Ascii ){
8857      xRead = ascii_read_one_field;
8858    }else{
8859      xRead = csv_read_one_field;
8860    }
8861    for(i=1; i<nArg; i++){
8862      char *z = azArg[i];
8863      if( z[0]=='-' && z[1]=='-' ) z++;
8864      if( z[0]!='-' ){
8865        if( zFile==0 ){
8866          zFile = z;
8867        }else if( zTable==0 ){
8868          zTable = z;
8869        }else{
8870          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8871          showHelp(p->out, "import");
8872          rc = 1;
8873          goto meta_command_exit;
8874        }
8875      }else if( strcmp(z,"-v")==0 ){
8876        eVerbose++;
8877      }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){
8878        zSchema = azArg[++i];
8879      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8880        nSkip = integerValue(azArg[++i]);
8881      }else if( strcmp(z,"-ascii")==0 ){
8882        sCtx.cColSep = SEP_Unit[0];
8883        sCtx.cRowSep = SEP_Record[0];
8884        xRead = ascii_read_one_field;
8885        useOutputMode = 0;
8886      }else if( strcmp(z,"-csv")==0 ){
8887        sCtx.cColSep = ',';
8888        sCtx.cRowSep = '\n';
8889        xRead = csv_read_one_field;
8890        useOutputMode = 0;
8891      }else{
8892        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8893        showHelp(p->out, "import");
8894        rc = 1;
8895        goto meta_command_exit;
8896      }
8897    }
8898    if( zTable==0 ){
8899      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8900                  zFile==0 ? "FILE" : "TABLE");
8901      showHelp(p->out, "import");
8902      rc = 1;
8903      goto meta_command_exit;
8904    }
8905    seenInterrupt = 0;
8906    open_db(p, 0);
8907    if( useOutputMode ){
8908      /* If neither the --csv or --ascii options are specified, then set
8909      ** the column and row separator characters from the output mode. */
8910      nSep = strlen30(p->colSeparator);
8911      if( nSep==0 ){
8912        raw_printf(stderr,
8913                   "Error: non-null column separator required for import\n");
8914        rc = 1;
8915        goto meta_command_exit;
8916      }
8917      if( nSep>1 ){
8918        raw_printf(stderr,
8919              "Error: multi-character column separators not allowed"
8920              " for import\n");
8921        rc = 1;
8922        goto meta_command_exit;
8923      }
8924      nSep = strlen30(p->rowSeparator);
8925      if( nSep==0 ){
8926        raw_printf(stderr,
8927            "Error: non-null row separator required for import\n");
8928        rc = 1;
8929        goto meta_command_exit;
8930      }
8931      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8932        /* When importing CSV (only), if the row separator is set to the
8933        ** default output row separator, change it to the default input
8934        ** row separator.  This avoids having to maintain different input
8935        ** and output row separators. */
8936        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8937        nSep = strlen30(p->rowSeparator);
8938      }
8939      if( nSep>1 ){
8940        raw_printf(stderr, "Error: multi-character row separators not allowed"
8941                           " for import\n");
8942        rc = 1;
8943        goto meta_command_exit;
8944      }
8945      sCtx.cColSep = p->colSeparator[0];
8946      sCtx.cRowSep = p->rowSeparator[0];
8947    }
8948    sCtx.zFile = zFile;
8949    sCtx.nLine = 1;
8950    if( sCtx.zFile[0]=='|' ){
8951#ifdef SQLITE_OMIT_POPEN
8952      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8953      rc = 1;
8954      goto meta_command_exit;
8955#else
8956      sCtx.in = popen(sCtx.zFile+1, "r");
8957      sCtx.zFile = "<pipe>";
8958      sCtx.xCloser = pclose;
8959#endif
8960    }else{
8961      sCtx.in = fopen(sCtx.zFile, "rb");
8962      sCtx.xCloser = fclose;
8963    }
8964    if( sCtx.in==0 ){
8965      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8966      rc = 1;
8967      import_cleanup(&sCtx);
8968      goto meta_command_exit;
8969    }
8970    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8971      char zSep[2];
8972      zSep[1] = 0;
8973      zSep[0] = sCtx.cColSep;
8974      utf8_printf(p->out, "Column separator ");
8975      output_c_string(p->out, zSep);
8976      utf8_printf(p->out, ", row separator ");
8977      zSep[0] = sCtx.cRowSep;
8978      output_c_string(p->out, zSep);
8979      utf8_printf(p->out, "\n");
8980    }
8981    /* Below, resources must be freed before exit. */
8982    while( (nSkip--)>0 ){
8983      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8984    }
8985    if( zSchema!=0 ){
8986      zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
8987    }else{
8988      zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
8989    }
8990    zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
8991    if( zSql==0 || zFullTabName==0 ){
8992      import_cleanup(&sCtx);
8993      shell_out_of_memory();
8994    }
8995    nByte = strlen30(zSql);
8996    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8997    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8998    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8999      sqlite3 *dbCols = 0;
9000      char *zRenames = 0;
9001      char *zColDefs;
9002      zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
9003      while( xRead(&sCtx) ){
9004        zAutoColumn(sCtx.z, &dbCols, 0);
9005        if( sCtx.cTerm!=sCtx.cColSep ) break;
9006      }
9007      zColDefs = zAutoColumn(0, &dbCols, &zRenames);
9008      if( zRenames!=0 ){
9009        utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
9010                    "Columns renamed during .import %s due to duplicates:\n"
9011                    "%s\n", sCtx.zFile, zRenames);
9012        sqlite3_free(zRenames);
9013      }
9014      assert(dbCols==0);
9015      if( zColDefs==0 ){
9016        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
9017      import_fail:
9018        sqlite3_free(zCreate);
9019        sqlite3_free(zSql);
9020        sqlite3_free(zFullTabName);
9021        import_cleanup(&sCtx);
9022        rc = 1;
9023        goto meta_command_exit;
9024      }
9025      zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
9026      if( eVerbose>=1 ){
9027        utf8_printf(p->out, "%s\n", zCreate);
9028      }
9029      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
9030      if( rc ){
9031        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
9032        goto import_fail;
9033      }
9034      sqlite3_free(zCreate);
9035      zCreate = 0;
9036      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9037    }
9038    if( rc ){
9039      if (pStmt) sqlite3_finalize(pStmt);
9040      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
9041      goto import_fail;
9042    }
9043    sqlite3_free(zSql);
9044    nCol = sqlite3_column_count(pStmt);
9045    sqlite3_finalize(pStmt);
9046    pStmt = 0;
9047    if( nCol==0 ) return 0; /* no columns, no error */
9048    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
9049    if( zSql==0 ){
9050      import_cleanup(&sCtx);
9051      shell_out_of_memory();
9052    }
9053    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
9054    j = strlen30(zSql);
9055    for(i=1; i<nCol; i++){
9056      zSql[j++] = ',';
9057      zSql[j++] = '?';
9058    }
9059    zSql[j++] = ')';
9060    zSql[j] = 0;
9061    if( eVerbose>=2 ){
9062      utf8_printf(p->out, "Insert using: %s\n", zSql);
9063    }
9064    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9065    if( rc ){
9066      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9067      if (pStmt) sqlite3_finalize(pStmt);
9068      goto import_fail;
9069    }
9070    sqlite3_free(zSql);
9071    sqlite3_free(zFullTabName);
9072    needCommit = sqlite3_get_autocommit(p->db);
9073    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
9074    do{
9075      int startLine = sCtx.nLine;
9076      for(i=0; i<nCol; i++){
9077        char *z = xRead(&sCtx);
9078        /*
9079        ** Did we reach end-of-file before finding any columns?
9080        ** If so, stop instead of NULL filling the remaining columns.
9081        */
9082        if( z==0 && i==0 ) break;
9083        /*
9084        ** Did we reach end-of-file OR end-of-line before finding any
9085        ** columns in ASCII mode?  If so, stop instead of NULL filling
9086        ** the remaining columns.
9087        */
9088        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
9089        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
9090        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
9091          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9092                          "filling the rest with NULL\n",
9093                          sCtx.zFile, startLine, nCol, i+1);
9094          i += 2;
9095          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
9096        }
9097      }
9098      if( sCtx.cTerm==sCtx.cColSep ){
9099        do{
9100          xRead(&sCtx);
9101          i++;
9102        }while( sCtx.cTerm==sCtx.cColSep );
9103        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9104                        "extras ignored\n",
9105                        sCtx.zFile, startLine, nCol, i);
9106      }
9107      if( i>=nCol ){
9108        sqlite3_step(pStmt);
9109        rc = sqlite3_reset(pStmt);
9110        if( rc!=SQLITE_OK ){
9111          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
9112                      startLine, sqlite3_errmsg(p->db));
9113          sCtx.nErr++;
9114        }else{
9115          sCtx.nRow++;
9116        }
9117      }
9118    }while( sCtx.cTerm!=EOF );
9119
9120    import_cleanup(&sCtx);
9121    sqlite3_finalize(pStmt);
9122    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
9123    if( eVerbose>0 ){
9124      utf8_printf(p->out,
9125          "Added %d rows with %d errors using %d lines of input\n",
9126          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
9127    }
9128  }else
9129
9130#ifndef SQLITE_UNTESTABLE
9131  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
9132    char *zSql;
9133    char *zCollist = 0;
9134    sqlite3_stmt *pStmt;
9135    int tnum = 0;
9136    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
9137    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
9138    int i;
9139    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
9140      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
9141                          "       .imposter off\n");
9142      /* Also allowed, but not documented:
9143      **
9144      **    .imposter TABLE IMPOSTER
9145      **
9146      ** where TABLE is a WITHOUT ROWID table.  In that case, the
9147      ** imposter is another WITHOUT ROWID table with the columns in
9148      ** storage order. */
9149      rc = 1;
9150      goto meta_command_exit;
9151    }
9152    open_db(p, 0);
9153    if( nArg==2 ){
9154      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
9155      goto meta_command_exit;
9156    }
9157    zSql = sqlite3_mprintf(
9158      "SELECT rootpage, 0 FROM sqlite_schema"
9159      " WHERE name='%q' AND type='index'"
9160      "UNION ALL "
9161      "SELECT rootpage, 1 FROM sqlite_schema"
9162      " WHERE name='%q' AND type='table'"
9163      "   AND sql LIKE '%%without%%rowid%%'",
9164      azArg[1], azArg[1]
9165    );
9166    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9167    sqlite3_free(zSql);
9168    if( sqlite3_step(pStmt)==SQLITE_ROW ){
9169      tnum = sqlite3_column_int(pStmt, 0);
9170      isWO = sqlite3_column_int(pStmt, 1);
9171    }
9172    sqlite3_finalize(pStmt);
9173    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
9174    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9175    sqlite3_free(zSql);
9176    i = 0;
9177    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9178      char zLabel[20];
9179      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
9180      i++;
9181      if( zCol==0 ){
9182        if( sqlite3_column_int(pStmt,1)==-1 ){
9183          zCol = "_ROWID_";
9184        }else{
9185          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
9186          zCol = zLabel;
9187        }
9188      }
9189      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
9190        lenPK = (int)strlen(zCollist);
9191      }
9192      if( zCollist==0 ){
9193        zCollist = sqlite3_mprintf("\"%w\"", zCol);
9194      }else{
9195        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
9196      }
9197    }
9198    sqlite3_finalize(pStmt);
9199    if( i==0 || tnum==0 ){
9200      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
9201      rc = 1;
9202      sqlite3_free(zCollist);
9203      goto meta_command_exit;
9204    }
9205    if( lenPK==0 ) lenPK = 100000;
9206    zSql = sqlite3_mprintf(
9207          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
9208          azArg[2], zCollist, lenPK, zCollist);
9209    sqlite3_free(zCollist);
9210    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
9211    if( rc==SQLITE_OK ){
9212      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
9213      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
9214      if( rc ){
9215        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
9216      }else{
9217        utf8_printf(stdout, "%s;\n", zSql);
9218        raw_printf(stdout,
9219          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
9220          azArg[1], isWO ? "table" : "index"
9221        );
9222      }
9223    }else{
9224      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
9225      rc = 1;
9226    }
9227    sqlite3_free(zSql);
9228  }else
9229#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
9230
9231#ifdef SQLITE_ENABLE_IOTRACE
9232  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
9233    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
9234    if( iotrace && iotrace!=stdout ) fclose(iotrace);
9235    iotrace = 0;
9236    if( nArg<2 ){
9237      sqlite3IoTrace = 0;
9238    }else if( strcmp(azArg[1], "-")==0 ){
9239      sqlite3IoTrace = iotracePrintf;
9240      iotrace = stdout;
9241    }else{
9242      iotrace = fopen(azArg[1], "w");
9243      if( iotrace==0 ){
9244        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9245        sqlite3IoTrace = 0;
9246        rc = 1;
9247      }else{
9248        sqlite3IoTrace = iotracePrintf;
9249      }
9250    }
9251  }else
9252#endif
9253
9254  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
9255    static const struct {
9256       const char *zLimitName;   /* Name of a limit */
9257       int limitCode;            /* Integer code for that limit */
9258    } aLimit[] = {
9259      { "length",                SQLITE_LIMIT_LENGTH                    },
9260      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
9261      { "column",                SQLITE_LIMIT_COLUMN                    },
9262      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
9263      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
9264      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
9265      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
9266      { "attached",              SQLITE_LIMIT_ATTACHED                  },
9267      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
9268      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
9269      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
9270      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
9271    };
9272    int i, n2;
9273    open_db(p, 0);
9274    if( nArg==1 ){
9275      for(i=0; i<ArraySize(aLimit); i++){
9276        printf("%20s %d\n", aLimit[i].zLimitName,
9277               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
9278      }
9279    }else if( nArg>3 ){
9280      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
9281      rc = 1;
9282      goto meta_command_exit;
9283    }else{
9284      int iLimit = -1;
9285      n2 = strlen30(azArg[1]);
9286      for(i=0; i<ArraySize(aLimit); i++){
9287        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
9288          if( iLimit<0 ){
9289            iLimit = i;
9290          }else{
9291            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
9292            rc = 1;
9293            goto meta_command_exit;
9294          }
9295        }
9296      }
9297      if( iLimit<0 ){
9298        utf8_printf(stderr, "unknown limit: \"%s\"\n"
9299                        "enter \".limits\" with no arguments for a list.\n",
9300                         azArg[1]);
9301        rc = 1;
9302        goto meta_command_exit;
9303      }
9304      if( nArg==3 ){
9305        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
9306                      (int)integerValue(azArg[2]));
9307      }
9308      printf("%20s %d\n", aLimit[iLimit].zLimitName,
9309             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
9310    }
9311  }else
9312
9313  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
9314    open_db(p, 0);
9315    lintDotCommand(p, azArg, nArg);
9316  }else
9317
9318#ifndef SQLITE_OMIT_LOAD_EXTENSION
9319  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
9320    const char *zFile, *zProc;
9321    char *zErrMsg = 0;
9322    failIfSafeMode(p, "cannot run .load in safe mode");
9323    if( nArg<2 ){
9324      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
9325      rc = 1;
9326      goto meta_command_exit;
9327    }
9328    zFile = azArg[1];
9329    zProc = nArg>=3 ? azArg[2] : 0;
9330    open_db(p, 0);
9331    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
9332    if( rc!=SQLITE_OK ){
9333      utf8_printf(stderr, "Error: %s\n", zErrMsg);
9334      sqlite3_free(zErrMsg);
9335      rc = 1;
9336    }
9337  }else
9338#endif
9339
9340  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
9341    failIfSafeMode(p, "cannot run .log in safe mode");
9342    if( nArg!=2 ){
9343      raw_printf(stderr, "Usage: .log FILENAME\n");
9344      rc = 1;
9345    }else{
9346      const char *zFile = azArg[1];
9347      output_file_close(p->pLog);
9348      p->pLog = output_file_open(zFile, 0);
9349    }
9350  }else
9351
9352  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
9353    const char *zMode = 0;
9354    const char *zTabname = 0;
9355    int i, n2;
9356    ColModeOpts cmOpts = ColModeOpts_default;
9357    for(i=1; i<nArg; i++){
9358      const char *z = azArg[i];
9359      if( optionMatch(z,"wrap") && i+1<nArg ){
9360        cmOpts.iWrap = integerValue(azArg[++i]);
9361      }else if( optionMatch(z,"ww") ){
9362        cmOpts.bWordWrap = 1;
9363      }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
9364        cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
9365      }else if( optionMatch(z,"quote") ){
9366        cmOpts.bQuote = 1;
9367      }else if( optionMatch(z,"noquote") ){
9368        cmOpts.bQuote = 0;
9369      }else if( zMode==0 ){
9370        zMode = z;
9371        /* Apply defaults for qbox pseudo-mods. If that
9372         * overwrites already-set values, user was informed of this.
9373         */
9374        if( strcmp(z, "qbox")==0 ){
9375          ColModeOpts cmo = ColModeOpts_default_qbox;
9376          zMode = "box";
9377          cmOpts = cmo;
9378        }
9379      }else if( zTabname==0 ){
9380        zTabname = z;
9381      }else if( z[0]=='-' ){
9382        utf8_printf(stderr, "unknown option: %s\n", z);
9383        utf8_printf(stderr, "options:\n"
9384                            "  --noquote\n"
9385                            "  --quote\n"
9386                            "  --wordwrap on/off\n"
9387                            "  --wrap N\n"
9388                            "  --ww\n");
9389        rc = 1;
9390        goto meta_command_exit;
9391      }else{
9392        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9393        rc = 1;
9394        goto meta_command_exit;
9395      }
9396    }
9397    if( zMode==0 ){
9398      if( p->mode==MODE_Column
9399       || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
9400      ){
9401        raw_printf
9402          (p->out,
9403           "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
9404           modeDescr[p->mode], p->cmOpts.iWrap,
9405           p->cmOpts.bWordWrap ? "on" : "off",
9406           p->cmOpts.bQuote ? "" : "no");
9407      }else{
9408        raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
9409      }
9410      zMode = modeDescr[p->mode];
9411    }
9412    n2 = strlen30(zMode);
9413    if( strncmp(zMode,"lines",n2)==0 ){
9414      p->mode = MODE_Line;
9415      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9416    }else if( strncmp(zMode,"columns",n2)==0 ){
9417      p->mode = MODE_Column;
9418      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
9419        p->showHeader = 1;
9420      }
9421      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9422      p->cmOpts = cmOpts;
9423    }else if( strncmp(zMode,"list",n2)==0 ){
9424      p->mode = MODE_List;
9425      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
9426      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9427    }else if( strncmp(zMode,"html",n2)==0 ){
9428      p->mode = MODE_Html;
9429    }else if( strncmp(zMode,"tcl",n2)==0 ){
9430      p->mode = MODE_Tcl;
9431      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
9432      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9433    }else if( strncmp(zMode,"csv",n2)==0 ){
9434      p->mode = MODE_Csv;
9435      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9436      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9437    }else if( strncmp(zMode,"tabs",n2)==0 ){
9438      p->mode = MODE_List;
9439      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
9440    }else if( strncmp(zMode,"insert",n2)==0 ){
9441      p->mode = MODE_Insert;
9442      set_table_name(p, zTabname ? zTabname : "table");
9443    }else if( strncmp(zMode,"quote",n2)==0 ){
9444      p->mode = MODE_Quote;
9445      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9446      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9447    }else if( strncmp(zMode,"ascii",n2)==0 ){
9448      p->mode = MODE_Ascii;
9449      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
9450      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
9451    }else if( strncmp(zMode,"markdown",n2)==0 ){
9452      p->mode = MODE_Markdown;
9453      p->cmOpts = cmOpts;
9454    }else if( strncmp(zMode,"table",n2)==0 ){
9455      p->mode = MODE_Table;
9456      p->cmOpts = cmOpts;
9457    }else if( strncmp(zMode,"box",n2)==0 ){
9458      p->mode = MODE_Box;
9459      p->cmOpts = cmOpts;
9460    }else if( strncmp(zMode,"count",n2)==0 ){
9461      p->mode = MODE_Count;
9462    }else if( strncmp(zMode,"off",n2)==0 ){
9463      p->mode = MODE_Off;
9464    }else if( strncmp(zMode,"json",n2)==0 ){
9465      p->mode = MODE_Json;
9466    }else{
9467      raw_printf(stderr, "Error: mode should be one of: "
9468         "ascii box column csv html insert json line list markdown "
9469         "qbox quote table tabs tcl\n");
9470      rc = 1;
9471    }
9472    p->cMode = p->mode;
9473  }else
9474
9475  if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
9476    if( nArg!=2 ){
9477      raw_printf(stderr, "Usage: .nonce NONCE\n");
9478      rc = 1;
9479    }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
9480      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
9481                 p->lineno, azArg[1]);
9482      exit(1);
9483    }else{
9484      p->bSafeMode = 0;
9485      return 0;  /* Return immediately to bypass the safe mode reset
9486                 ** at the end of this procedure */
9487    }
9488  }else
9489
9490  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
9491    if( nArg==2 ){
9492      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
9493                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
9494    }else{
9495      raw_printf(stderr, "Usage: .nullvalue STRING\n");
9496      rc = 1;
9497    }
9498  }else
9499
9500  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
9501    const char *zFN = 0;     /* Pointer to constant filename */
9502    char *zNewFilename = 0;  /* Name of the database file to open */
9503    int iName = 1;           /* Index in azArg[] of the filename */
9504    int newFlag = 0;         /* True to delete file before opening */
9505    int openMode = SHELL_OPEN_UNSPEC;
9506
9507    /* Check for command-line arguments */
9508    for(iName=1; iName<nArg; iName++){
9509      const char *z = azArg[iName];
9510      if( optionMatch(z,"new") ){
9511        newFlag = 1;
9512#ifdef SQLITE_HAVE_ZLIB
9513      }else if( optionMatch(z, "zip") ){
9514        openMode = SHELL_OPEN_ZIPFILE;
9515#endif
9516      }else if( optionMatch(z, "append") ){
9517        openMode = SHELL_OPEN_APPENDVFS;
9518      }else if( optionMatch(z, "readonly") ){
9519        openMode = SHELL_OPEN_READONLY;
9520      }else if( optionMatch(z, "nofollow") ){
9521        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
9522#ifndef SQLITE_OMIT_DESERIALIZE
9523      }else if( optionMatch(z, "deserialize") ){
9524        openMode = SHELL_OPEN_DESERIALIZE;
9525      }else if( optionMatch(z, "hexdb") ){
9526        openMode = SHELL_OPEN_HEXDB;
9527      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
9528        p->szMax = integerValue(azArg[++iName]);
9529#endif /* SQLITE_OMIT_DESERIALIZE */
9530      }else if( z[0]=='-' ){
9531        utf8_printf(stderr, "unknown option: %s\n", z);
9532        rc = 1;
9533        goto meta_command_exit;
9534      }else if( zFN ){
9535        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9536        rc = 1;
9537        goto meta_command_exit;
9538      }else{
9539        zFN = z;
9540      }
9541    }
9542
9543    /* Close the existing database */
9544    session_close_all(p, -1);
9545    close_db(p->db);
9546    p->db = 0;
9547    p->pAuxDb->zDbFilename = 0;
9548    sqlite3_free(p->pAuxDb->zFreeOnClose);
9549    p->pAuxDb->zFreeOnClose = 0;
9550    p->openMode = openMode;
9551    p->openFlags = 0;
9552    p->szMax = 0;
9553
9554    /* If a filename is specified, try to open it first */
9555    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9556      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9557      if( p->bSafeMode
9558       && p->openMode!=SHELL_OPEN_HEXDB
9559       && zFN
9560       && strcmp(zFN,":memory:")!=0
9561      ){
9562        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9563      }
9564      if( zFN ){
9565        zNewFilename = sqlite3_mprintf("%s", zFN);
9566        shell_check_oom(zNewFilename);
9567      }else{
9568        zNewFilename = 0;
9569      }
9570      p->pAuxDb->zDbFilename = zNewFilename;
9571      open_db(p, OPEN_DB_KEEPALIVE);
9572      if( p->db==0 ){
9573        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9574        sqlite3_free(zNewFilename);
9575      }else{
9576        p->pAuxDb->zFreeOnClose = zNewFilename;
9577      }
9578    }
9579    if( p->db==0 ){
9580      /* As a fall-back open a TEMP database */
9581      p->pAuxDb->zDbFilename = 0;
9582      open_db(p, 0);
9583    }
9584  }else
9585
9586  if( (c=='o'
9587        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9588   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9589  ){
9590    char *zFile = 0;
9591    int bTxtMode = 0;
9592    int i;
9593    int eMode = 0;
9594    int bOnce = 0;            /* 0: .output, 1: .once, 2: .excel */
9595    unsigned char zBOM[4];    /* Byte-order mark to using if --bom is present */
9596
9597    zBOM[0] = 0;
9598    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9599    if( c=='e' ){
9600      eMode = 'x';
9601      bOnce = 2;
9602    }else if( strncmp(azArg[0],"once",n)==0 ){
9603      bOnce = 1;
9604    }
9605    for(i=1; i<nArg; i++){
9606      char *z = azArg[i];
9607      if( z[0]=='-' ){
9608        if( z[1]=='-' ) z++;
9609        if( strcmp(z,"-bom")==0 ){
9610          zBOM[0] = 0xef;
9611          zBOM[1] = 0xbb;
9612          zBOM[2] = 0xbf;
9613          zBOM[3] = 0;
9614        }else if( c!='e' && strcmp(z,"-x")==0 ){
9615          eMode = 'x';  /* spreadsheet */
9616        }else if( c!='e' && strcmp(z,"-e")==0 ){
9617          eMode = 'e';  /* text editor */
9618        }else{
9619          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9620                      azArg[i]);
9621          showHelp(p->out, azArg[0]);
9622          rc = 1;
9623          goto meta_command_exit;
9624        }
9625      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9626        zFile = sqlite3_mprintf("%s", z);
9627        if( zFile && zFile[0]=='|' ){
9628          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9629          break;
9630        }
9631      }else{
9632        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9633                    azArg[i]);
9634        showHelp(p->out, azArg[0]);
9635        rc = 1;
9636        sqlite3_free(zFile);
9637        goto meta_command_exit;
9638      }
9639    }
9640    if( zFile==0 ){
9641      zFile = sqlite3_mprintf("stdout");
9642    }
9643    if( bOnce ){
9644      p->outCount = 2;
9645    }else{
9646      p->outCount = 0;
9647    }
9648    output_reset(p);
9649#ifndef SQLITE_NOHAVE_SYSTEM
9650    if( eMode=='e' || eMode=='x' ){
9651      p->doXdgOpen = 1;
9652      outputModePush(p);
9653      if( eMode=='x' ){
9654        /* spreadsheet mode.  Output as CSV. */
9655        newTempFile(p, "csv");
9656        ShellClearFlag(p, SHFLG_Echo);
9657        p->mode = MODE_Csv;
9658        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9659        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9660      }else{
9661        /* text editor mode */
9662        newTempFile(p, "txt");
9663        bTxtMode = 1;
9664      }
9665      sqlite3_free(zFile);
9666      zFile = sqlite3_mprintf("%s", p->zTempFile);
9667    }
9668#endif /* SQLITE_NOHAVE_SYSTEM */
9669    shell_check_oom(zFile);
9670    if( zFile[0]=='|' ){
9671#ifdef SQLITE_OMIT_POPEN
9672      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9673      rc = 1;
9674      p->out = stdout;
9675#else
9676      p->out = popen(zFile + 1, "w");
9677      if( p->out==0 ){
9678        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9679        p->out = stdout;
9680        rc = 1;
9681      }else{
9682        if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
9683        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9684      }
9685#endif
9686    }else{
9687      p->out = output_file_open(zFile, bTxtMode);
9688      if( p->out==0 ){
9689        if( strcmp(zFile,"off")!=0 ){
9690          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9691        }
9692        p->out = stdout;
9693        rc = 1;
9694      } else {
9695        if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
9696        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9697      }
9698    }
9699    sqlite3_free(zFile);
9700  }else
9701
9702  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9703    open_db(p,0);
9704    if( nArg<=1 ) goto parameter_syntax_error;
9705
9706    /* .parameter clear
9707    ** Clear all bind parameters by dropping the TEMP table that holds them.
9708    */
9709    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9710      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9711                   0, 0, 0);
9712    }else
9713
9714    /* .parameter list
9715    ** List all bind parameters.
9716    */
9717    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9718      sqlite3_stmt *pStmt = 0;
9719      int rx;
9720      int len = 0;
9721      rx = sqlite3_prepare_v2(p->db,
9722             "SELECT max(length(key)) "
9723             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9724      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9725        len = sqlite3_column_int(pStmt, 0);
9726        if( len>40 ) len = 40;
9727      }
9728      sqlite3_finalize(pStmt);
9729      pStmt = 0;
9730      if( len ){
9731        rx = sqlite3_prepare_v2(p->db,
9732             "SELECT key, quote(value) "
9733             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9734        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9735          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9736                      sqlite3_column_text(pStmt,1));
9737        }
9738        sqlite3_finalize(pStmt);
9739      }
9740    }else
9741
9742    /* .parameter init
9743    ** Make sure the TEMP table used to hold bind parameters exists.
9744    ** Create it if necessary.
9745    */
9746    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9747      bind_table_init(p);
9748    }else
9749
9750    /* .parameter set NAME VALUE
9751    ** Set or reset a bind parameter.  NAME should be the full parameter
9752    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9753    ** VALUE can be in either SQL literal notation, or if not it will be
9754    ** understood to be a text string.
9755    */
9756    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9757      int rx;
9758      char *zSql;
9759      sqlite3_stmt *pStmt;
9760      const char *zKey = azArg[2];
9761      const char *zValue = azArg[3];
9762      bind_table_init(p);
9763      zSql = sqlite3_mprintf(
9764                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9765                  "VALUES(%Q,%s);", zKey, zValue);
9766      shell_check_oom(zSql);
9767      pStmt = 0;
9768      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9769      sqlite3_free(zSql);
9770      if( rx!=SQLITE_OK ){
9771        sqlite3_finalize(pStmt);
9772        pStmt = 0;
9773        zSql = sqlite3_mprintf(
9774                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9775                   "VALUES(%Q,%Q);", zKey, zValue);
9776        shell_check_oom(zSql);
9777        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9778        sqlite3_free(zSql);
9779        if( rx!=SQLITE_OK ){
9780          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9781          sqlite3_finalize(pStmt);
9782          pStmt = 0;
9783          rc = 1;
9784        }
9785      }
9786      sqlite3_step(pStmt);
9787      sqlite3_finalize(pStmt);
9788    }else
9789
9790    /* .parameter unset NAME
9791    ** Remove the NAME binding from the parameter binding table, if it
9792    ** exists.
9793    */
9794    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9795      char *zSql = sqlite3_mprintf(
9796          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9797      shell_check_oom(zSql);
9798      sqlite3_exec(p->db, zSql, 0, 0, 0);
9799      sqlite3_free(zSql);
9800    }else
9801    /* If no command name matches, show a syntax error */
9802    parameter_syntax_error:
9803    showHelp(p->out, "parameter");
9804  }else
9805
9806  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9807    int i;
9808    for(i=1; i<nArg; i++){
9809      if( i>1 ) raw_printf(p->out, " ");
9810      utf8_printf(p->out, "%s", azArg[i]);
9811    }
9812    raw_printf(p->out, "\n");
9813  }else
9814
9815#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9816  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9817    int i;
9818    int nn = 0;
9819    p->flgProgress = 0;
9820    p->mxProgress = 0;
9821    p->nProgress = 0;
9822    for(i=1; i<nArg; i++){
9823      const char *z = azArg[i];
9824      if( z[0]=='-' ){
9825        z++;
9826        if( z[0]=='-' ) z++;
9827        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9828          p->flgProgress |= SHELL_PROGRESS_QUIET;
9829          continue;
9830        }
9831        if( strcmp(z,"reset")==0 ){
9832          p->flgProgress |= SHELL_PROGRESS_RESET;
9833          continue;
9834        }
9835        if( strcmp(z,"once")==0 ){
9836          p->flgProgress |= SHELL_PROGRESS_ONCE;
9837          continue;
9838        }
9839        if( strcmp(z,"limit")==0 ){
9840          if( i+1>=nArg ){
9841            utf8_printf(stderr, "Error: missing argument on --limit\n");
9842            rc = 1;
9843            goto meta_command_exit;
9844          }else{
9845            p->mxProgress = (int)integerValue(azArg[++i]);
9846          }
9847          continue;
9848        }
9849        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9850        rc = 1;
9851        goto meta_command_exit;
9852      }else{
9853        nn = (int)integerValue(z);
9854      }
9855    }
9856    open_db(p, 0);
9857    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9858  }else
9859#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9860
9861  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9862    if( nArg >= 2) {
9863      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9864    }
9865    if( nArg >= 3) {
9866      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9867    }
9868  }else
9869
9870  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9871    rc = 2;
9872  }else
9873
9874  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9875    FILE *inSaved = p->in;
9876    int savedLineno = p->lineno;
9877    failIfSafeMode(p, "cannot run .read in safe mode");
9878    if( nArg!=2 ){
9879      raw_printf(stderr, "Usage: .read FILE\n");
9880      rc = 1;
9881      goto meta_command_exit;
9882    }
9883    if( azArg[1][0]=='|' ){
9884#ifdef SQLITE_OMIT_POPEN
9885      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9886      rc = 1;
9887      p->out = stdout;
9888#else
9889      p->in = popen(azArg[1]+1, "r");
9890      if( p->in==0 ){
9891        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9892        rc = 1;
9893      }else{
9894        rc = process_input(p);
9895        pclose(p->in);
9896      }
9897#endif
9898    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9899      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9900      rc = 1;
9901    }else{
9902      rc = process_input(p);
9903      fclose(p->in);
9904    }
9905    p->in = inSaved;
9906    p->lineno = savedLineno;
9907  }else
9908
9909  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9910    const char *zSrcFile;
9911    const char *zDb;
9912    sqlite3 *pSrc;
9913    sqlite3_backup *pBackup;
9914    int nTimeout = 0;
9915
9916    failIfSafeMode(p, "cannot run .restore in safe mode");
9917    if( nArg==2 ){
9918      zSrcFile = azArg[1];
9919      zDb = "main";
9920    }else if( nArg==3 ){
9921      zSrcFile = azArg[2];
9922      zDb = azArg[1];
9923    }else{
9924      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9925      rc = 1;
9926      goto meta_command_exit;
9927    }
9928    rc = sqlite3_open(zSrcFile, &pSrc);
9929    if( rc!=SQLITE_OK ){
9930      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9931      close_db(pSrc);
9932      return 1;
9933    }
9934    open_db(p, 0);
9935    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9936    if( pBackup==0 ){
9937      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9938      close_db(pSrc);
9939      return 1;
9940    }
9941    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9942          || rc==SQLITE_BUSY  ){
9943      if( rc==SQLITE_BUSY ){
9944        if( nTimeout++ >= 3 ) break;
9945        sqlite3_sleep(100);
9946      }
9947    }
9948    sqlite3_backup_finish(pBackup);
9949    if( rc==SQLITE_DONE ){
9950      rc = 0;
9951    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9952      raw_printf(stderr, "Error: source database is busy\n");
9953      rc = 1;
9954    }else{
9955      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9956      rc = 1;
9957    }
9958    close_db(pSrc);
9959  }else
9960
9961  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9962    if( nArg==2 ){
9963      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9964#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9965      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9966#endif
9967    }else{
9968      raw_printf(stderr, "Usage: .scanstats on|off\n");
9969      rc = 1;
9970    }
9971  }else
9972
9973  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9974    ShellText sSelect;
9975    ShellState data;
9976    char *zErrMsg = 0;
9977    const char *zDiv = "(";
9978    const char *zName = 0;
9979    int iSchema = 0;
9980    int bDebug = 0;
9981    int bNoSystemTabs = 0;
9982    int ii;
9983
9984    open_db(p, 0);
9985    memcpy(&data, p, sizeof(data));
9986    data.showHeader = 0;
9987    data.cMode = data.mode = MODE_Semi;
9988    initText(&sSelect);
9989    for(ii=1; ii<nArg; ii++){
9990      if( optionMatch(azArg[ii],"indent") ){
9991        data.cMode = data.mode = MODE_Pretty;
9992      }else if( optionMatch(azArg[ii],"debug") ){
9993        bDebug = 1;
9994      }else if( optionMatch(azArg[ii],"nosys") ){
9995        bNoSystemTabs = 1;
9996      }else if( azArg[ii][0]=='-' ){
9997        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9998        rc = 1;
9999        goto meta_command_exit;
10000      }else if( zName==0 ){
10001        zName = azArg[ii];
10002      }else{
10003        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
10004        rc = 1;
10005        goto meta_command_exit;
10006      }
10007    }
10008    if( zName!=0 ){
10009      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
10010                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
10011                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
10012                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
10013      if( isSchema ){
10014        char *new_argv[2], *new_colv[2];
10015        new_argv[0] = sqlite3_mprintf(
10016                      "CREATE TABLE %s (\n"
10017                      "  type text,\n"
10018                      "  name text,\n"
10019                      "  tbl_name text,\n"
10020                      "  rootpage integer,\n"
10021                      "  sql text\n"
10022                      ")", zName);
10023        shell_check_oom(new_argv[0]);
10024        new_argv[1] = 0;
10025        new_colv[0] = "sql";
10026        new_colv[1] = 0;
10027        callback(&data, 1, new_argv, new_colv);
10028        sqlite3_free(new_argv[0]);
10029      }
10030    }
10031    if( zDiv ){
10032      sqlite3_stmt *pStmt = 0;
10033      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
10034                              -1, &pStmt, 0);
10035      if( rc ){
10036        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
10037        sqlite3_finalize(pStmt);
10038        rc = 1;
10039        goto meta_command_exit;
10040      }
10041      appendText(&sSelect, "SELECT sql FROM", 0);
10042      iSchema = 0;
10043      while( sqlite3_step(pStmt)==SQLITE_ROW ){
10044        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
10045        char zScNum[30];
10046        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
10047        appendText(&sSelect, zDiv, 0);
10048        zDiv = " UNION ALL ";
10049        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
10050        if( sqlite3_stricmp(zDb, "main")!=0 ){
10051          appendText(&sSelect, zDb, '\'');
10052        }else{
10053          appendText(&sSelect, "NULL", 0);
10054        }
10055        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
10056        appendText(&sSelect, zScNum, 0);
10057        appendText(&sSelect, " AS snum, ", 0);
10058        appendText(&sSelect, zDb, '\'');
10059        appendText(&sSelect, " AS sname FROM ", 0);
10060        appendText(&sSelect, zDb, quoteChar(zDb));
10061        appendText(&sSelect, ".sqlite_schema", 0);
10062      }
10063      sqlite3_finalize(pStmt);
10064#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
10065      if( zName ){
10066        appendText(&sSelect,
10067           " UNION ALL SELECT shell_module_schema(name),"
10068           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
10069        0);
10070      }
10071#endif
10072      appendText(&sSelect, ") WHERE ", 0);
10073      if( zName ){
10074        char *zQarg = sqlite3_mprintf("%Q", zName);
10075        int bGlob;
10076        shell_check_oom(zQarg);
10077        bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
10078                strchr(zName, '[') != 0;
10079        if( strchr(zName, '.') ){
10080          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
10081        }else{
10082          appendText(&sSelect, "lower(tbl_name)", 0);
10083        }
10084        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
10085        appendText(&sSelect, zQarg, 0);
10086        if( !bGlob ){
10087          appendText(&sSelect, " ESCAPE '\\' ", 0);
10088        }
10089        appendText(&sSelect, " AND ", 0);
10090        sqlite3_free(zQarg);
10091      }
10092      if( bNoSystemTabs ){
10093        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
10094      }
10095      appendText(&sSelect, "sql IS NOT NULL"
10096                           " ORDER BY snum, rowid", 0);
10097      if( bDebug ){
10098        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
10099      }else{
10100        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
10101      }
10102      freeText(&sSelect);
10103    }
10104    if( zErrMsg ){
10105      utf8_printf(stderr,"Error: %s\n", zErrMsg);
10106      sqlite3_free(zErrMsg);
10107      rc = 1;
10108    }else if( rc != SQLITE_OK ){
10109      raw_printf(stderr,"Error: querying schema information\n");
10110      rc = 1;
10111    }else{
10112      rc = 0;
10113    }
10114  }else
10115
10116  if( (c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0)
10117   || (c=='t' && n==9  && strncmp(azArg[0], "treetrace", n)==0)
10118  ){
10119    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10120    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
10121  }else
10122
10123#if defined(SQLITE_ENABLE_SESSION)
10124  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
10125    struct AuxDb *pAuxDb = p->pAuxDb;
10126    OpenSession *pSession = &pAuxDb->aSession[0];
10127    char **azCmd = &azArg[1];
10128    int iSes = 0;
10129    int nCmd = nArg - 1;
10130    int i;
10131    if( nArg<=1 ) goto session_syntax_error;
10132    open_db(p, 0);
10133    if( nArg>=3 ){
10134      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
10135        if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
10136      }
10137      if( iSes<pAuxDb->nSession ){
10138        pSession = &pAuxDb->aSession[iSes];
10139        azCmd++;
10140        nCmd--;
10141      }else{
10142        pSession = &pAuxDb->aSession[0];
10143        iSes = 0;
10144      }
10145    }
10146
10147    /* .session attach TABLE
10148    ** Invoke the sqlite3session_attach() interface to attach a particular
10149    ** table so that it is never filtered.
10150    */
10151    if( strcmp(azCmd[0],"attach")==0 ){
10152      if( nCmd!=2 ) goto session_syntax_error;
10153      if( pSession->p==0 ){
10154        session_not_open:
10155        raw_printf(stderr, "ERROR: No sessions are open\n");
10156      }else{
10157        rc = sqlite3session_attach(pSession->p, azCmd[1]);
10158        if( rc ){
10159          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
10160          rc = 0;
10161        }
10162      }
10163    }else
10164
10165    /* .session changeset FILE
10166    ** .session patchset FILE
10167    ** Write a changeset or patchset into a file.  The file is overwritten.
10168    */
10169    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
10170      FILE *out = 0;
10171      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
10172      if( nCmd!=2 ) goto session_syntax_error;
10173      if( pSession->p==0 ) goto session_not_open;
10174      out = fopen(azCmd[1], "wb");
10175      if( out==0 ){
10176        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
10177                    azCmd[1]);
10178      }else{
10179        int szChng;
10180        void *pChng;
10181        if( azCmd[0][0]=='c' ){
10182          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
10183        }else{
10184          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
10185        }
10186        if( rc ){
10187          printf("Error: error code %d\n", rc);
10188          rc = 0;
10189        }
10190        if( pChng
10191          && fwrite(pChng, szChng, 1, out)!=1 ){
10192          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
10193                  szChng);
10194        }
10195        sqlite3_free(pChng);
10196        fclose(out);
10197      }
10198    }else
10199
10200    /* .session close
10201    ** Close the identified session
10202    */
10203    if( strcmp(azCmd[0], "close")==0 ){
10204      if( nCmd!=1 ) goto session_syntax_error;
10205      if( pAuxDb->nSession ){
10206        session_close(pSession);
10207        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
10208      }
10209    }else
10210
10211    /* .session enable ?BOOLEAN?
10212    ** Query or set the enable flag
10213    */
10214    if( strcmp(azCmd[0], "enable")==0 ){
10215      int ii;
10216      if( nCmd>2 ) goto session_syntax_error;
10217      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10218      if( pAuxDb->nSession ){
10219        ii = sqlite3session_enable(pSession->p, ii);
10220        utf8_printf(p->out, "session %s enable flag = %d\n",
10221                    pSession->zName, ii);
10222      }
10223    }else
10224
10225    /* .session filter GLOB ....
10226    ** Set a list of GLOB patterns of table names to be excluded.
10227    */
10228    if( strcmp(azCmd[0], "filter")==0 ){
10229      int ii, nByte;
10230      if( nCmd<2 ) goto session_syntax_error;
10231      if( pAuxDb->nSession ){
10232        for(ii=0; ii<pSession->nFilter; ii++){
10233          sqlite3_free(pSession->azFilter[ii]);
10234        }
10235        sqlite3_free(pSession->azFilter);
10236        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
10237        pSession->azFilter = sqlite3_malloc( nByte );
10238        if( pSession->azFilter==0 ){
10239          raw_printf(stderr, "Error: out or memory\n");
10240          exit(1);
10241        }
10242        for(ii=1; ii<nCmd; ii++){
10243          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
10244          shell_check_oom(x);
10245        }
10246        pSession->nFilter = ii-1;
10247      }
10248    }else
10249
10250    /* .session indirect ?BOOLEAN?
10251    ** Query or set the indirect flag
10252    */
10253    if( strcmp(azCmd[0], "indirect")==0 ){
10254      int ii;
10255      if( nCmd>2 ) goto session_syntax_error;
10256      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10257      if( pAuxDb->nSession ){
10258        ii = sqlite3session_indirect(pSession->p, ii);
10259        utf8_printf(p->out, "session %s indirect flag = %d\n",
10260                    pSession->zName, ii);
10261      }
10262    }else
10263
10264    /* .session isempty
10265    ** Determine if the session is empty
10266    */
10267    if( strcmp(azCmd[0], "isempty")==0 ){
10268      int ii;
10269      if( nCmd!=1 ) goto session_syntax_error;
10270      if( pAuxDb->nSession ){
10271        ii = sqlite3session_isempty(pSession->p);
10272        utf8_printf(p->out, "session %s isempty flag = %d\n",
10273                    pSession->zName, ii);
10274      }
10275    }else
10276
10277    /* .session list
10278    ** List all currently open sessions
10279    */
10280    if( strcmp(azCmd[0],"list")==0 ){
10281      for(i=0; i<pAuxDb->nSession; i++){
10282        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
10283      }
10284    }else
10285
10286    /* .session open DB NAME
10287    ** Open a new session called NAME on the attached database DB.
10288    ** DB is normally "main".
10289    */
10290    if( strcmp(azCmd[0],"open")==0 ){
10291      char *zName;
10292      if( nCmd!=3 ) goto session_syntax_error;
10293      zName = azCmd[2];
10294      if( zName[0]==0 ) goto session_syntax_error;
10295      for(i=0; i<pAuxDb->nSession; i++){
10296        if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
10297          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
10298          goto meta_command_exit;
10299        }
10300      }
10301      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
10302        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
10303        goto meta_command_exit;
10304      }
10305      pSession = &pAuxDb->aSession[pAuxDb->nSession];
10306      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
10307      if( rc ){
10308        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
10309        rc = 0;
10310        goto meta_command_exit;
10311      }
10312      pSession->nFilter = 0;
10313      sqlite3session_table_filter(pSession->p, session_filter, pSession);
10314      pAuxDb->nSession++;
10315      pSession->zName = sqlite3_mprintf("%s", zName);
10316      shell_check_oom(pSession->zName);
10317    }else
10318    /* If no command name matches, show a syntax error */
10319    session_syntax_error:
10320    showHelp(p->out, "session");
10321  }else
10322#endif
10323
10324#ifdef SQLITE_DEBUG
10325  /* Undocumented commands for internal testing.  Subject to change
10326  ** without notice. */
10327  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
10328    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
10329      int i, v;
10330      for(i=1; i<nArg; i++){
10331        v = booleanValue(azArg[i]);
10332        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
10333      }
10334    }
10335    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
10336      int i; sqlite3_int64 v;
10337      for(i=1; i<nArg; i++){
10338        char zBuf[200];
10339        v = integerValue(azArg[i]);
10340        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
10341        utf8_printf(p->out, "%s", zBuf);
10342      }
10343    }
10344  }else
10345#endif
10346
10347  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
10348    int bIsInit = 0;         /* True to initialize the SELFTEST table */
10349    int bVerbose = 0;        /* Verbose output */
10350    int bSelftestExists;     /* True if SELFTEST already exists */
10351    int i, k;                /* Loop counters */
10352    int nTest = 0;           /* Number of tests runs */
10353    int nErr = 0;            /* Number of errors seen */
10354    ShellText str;           /* Answer for a query */
10355    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
10356
10357    open_db(p,0);
10358    for(i=1; i<nArg; i++){
10359      const char *z = azArg[i];
10360      if( z[0]=='-' && z[1]=='-' ) z++;
10361      if( strcmp(z,"-init")==0 ){
10362        bIsInit = 1;
10363      }else
10364      if( strcmp(z,"-v")==0 ){
10365        bVerbose++;
10366      }else
10367      {
10368        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10369                    azArg[i], azArg[0]);
10370        raw_printf(stderr, "Should be one of: --init -v\n");
10371        rc = 1;
10372        goto meta_command_exit;
10373      }
10374    }
10375    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
10376           != SQLITE_OK ){
10377      bSelftestExists = 0;
10378    }else{
10379      bSelftestExists = 1;
10380    }
10381    if( bIsInit ){
10382      createSelftestTable(p);
10383      bSelftestExists = 1;
10384    }
10385    initText(&str);
10386    appendText(&str, "x", 0);
10387    for(k=bSelftestExists; k>=0; k--){
10388      if( k==1 ){
10389        rc = sqlite3_prepare_v2(p->db,
10390            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
10391            -1, &pStmt, 0);
10392      }else{
10393        rc = sqlite3_prepare_v2(p->db,
10394          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
10395          "      (1,'run','PRAGMA integrity_check','ok')",
10396          -1, &pStmt, 0);
10397      }
10398      if( rc ){
10399        raw_printf(stderr, "Error querying the selftest table\n");
10400        rc = 1;
10401        sqlite3_finalize(pStmt);
10402        goto meta_command_exit;
10403      }
10404      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
10405        int tno = sqlite3_column_int(pStmt, 0);
10406        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
10407        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
10408        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
10409
10410        if( zOp==0 ) continue;
10411        if( zSql==0 ) continue;
10412        if( zAns==0 ) continue;
10413        k = 0;
10414        if( bVerbose>0 ){
10415          printf("%d: %s %s\n", tno, zOp, zSql);
10416        }
10417        if( strcmp(zOp,"memo")==0 ){
10418          utf8_printf(p->out, "%s\n", zSql);
10419        }else
10420        if( strcmp(zOp,"run")==0 ){
10421          char *zErrMsg = 0;
10422          str.n = 0;
10423          str.z[0] = 0;
10424          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
10425          nTest++;
10426          if( bVerbose ){
10427            utf8_printf(p->out, "Result: %s\n", str.z);
10428          }
10429          if( rc || zErrMsg ){
10430            nErr++;
10431            rc = 1;
10432            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
10433            sqlite3_free(zErrMsg);
10434          }else if( strcmp(zAns,str.z)!=0 ){
10435            nErr++;
10436            rc = 1;
10437            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
10438            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
10439          }
10440        }else
10441        {
10442          utf8_printf(stderr,
10443            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
10444          rc = 1;
10445          break;
10446        }
10447      } /* End loop over rows of content from SELFTEST */
10448      sqlite3_finalize(pStmt);
10449    } /* End loop over k */
10450    freeText(&str);
10451    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
10452  }else
10453
10454  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
10455    if( nArg<2 || nArg>3 ){
10456      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
10457      rc = 1;
10458    }
10459    if( nArg>=2 ){
10460      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
10461                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
10462    }
10463    if( nArg>=3 ){
10464      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
10465                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
10466    }
10467  }else
10468
10469  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
10470    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
10471    int i;                   /* Loop counter */
10472    int bSchema = 0;         /* Also hash the schema */
10473    int bSeparate = 0;       /* Hash each table separately */
10474    int iSize = 224;         /* Hash algorithm to use */
10475    int bDebug = 0;          /* Only show the query that would have run */
10476    sqlite3_stmt *pStmt;     /* For querying tables names */
10477    char *zSql;              /* SQL to be run */
10478    char *zSep;              /* Separator */
10479    ShellText sSql;          /* Complete SQL for the query to run the hash */
10480    ShellText sQuery;        /* Set of queries used to read all content */
10481    open_db(p, 0);
10482    for(i=1; i<nArg; i++){
10483      const char *z = azArg[i];
10484      if( z[0]=='-' ){
10485        z++;
10486        if( z[0]=='-' ) z++;
10487        if( strcmp(z,"schema")==0 ){
10488          bSchema = 1;
10489        }else
10490        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
10491         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
10492        ){
10493          iSize = atoi(&z[5]);
10494        }else
10495        if( strcmp(z,"debug")==0 ){
10496          bDebug = 1;
10497        }else
10498        {
10499          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10500                      azArg[i], azArg[0]);
10501          showHelp(p->out, azArg[0]);
10502          rc = 1;
10503          goto meta_command_exit;
10504        }
10505      }else if( zLike ){
10506        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
10507        rc = 1;
10508        goto meta_command_exit;
10509      }else{
10510        zLike = z;
10511        bSeparate = 1;
10512        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
10513      }
10514    }
10515    if( bSchema ){
10516      zSql = "SELECT lower(name) FROM sqlite_schema"
10517             " WHERE type='table' AND coalesce(rootpage,0)>1"
10518             " UNION ALL SELECT 'sqlite_schema'"
10519             " ORDER BY 1 collate nocase";
10520    }else{
10521      zSql = "SELECT lower(name) FROM sqlite_schema"
10522             " WHERE type='table' AND coalesce(rootpage,0)>1"
10523             " AND name NOT LIKE 'sqlite_%'"
10524             " ORDER BY 1 collate nocase";
10525    }
10526    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10527    initText(&sQuery);
10528    initText(&sSql);
10529    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
10530    zSep = "VALUES(";
10531    while( SQLITE_ROW==sqlite3_step(pStmt) ){
10532      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
10533      if( zTab==0 ) continue;
10534      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
10535      if( strncmp(zTab, "sqlite_",7)!=0 ){
10536        appendText(&sQuery,"SELECT * FROM ", 0);
10537        appendText(&sQuery,zTab,'"');
10538        appendText(&sQuery," NOT INDEXED;", 0);
10539      }else if( strcmp(zTab, "sqlite_schema")==0 ){
10540        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10541                           " ORDER BY name;", 0);
10542      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
10543        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10544                           " ORDER BY name;", 0);
10545      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
10546        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10547                           " ORDER BY tbl,idx;", 0);
10548      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
10549        appendText(&sQuery, "SELECT * FROM ", 0);
10550        appendText(&sQuery, zTab, 0);
10551        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10552      }
10553      appendText(&sSql, zSep, 0);
10554      appendText(&sSql, sQuery.z, '\'');
10555      sQuery.n = 0;
10556      appendText(&sSql, ",", 0);
10557      appendText(&sSql, zTab, '\'');
10558      zSep = "),(";
10559    }
10560    sqlite3_finalize(pStmt);
10561    if( bSeparate ){
10562      zSql = sqlite3_mprintf(
10563          "%s))"
10564          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10565          "   FROM [sha3sum$query]",
10566          sSql.z, iSize);
10567    }else{
10568      zSql = sqlite3_mprintf(
10569          "%s))"
10570          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10571          "   FROM [sha3sum$query]",
10572          sSql.z, iSize);
10573    }
10574    shell_check_oom(zSql);
10575    freeText(&sQuery);
10576    freeText(&sSql);
10577    if( bDebug ){
10578      utf8_printf(p->out, "%s\n", zSql);
10579    }else{
10580      shell_exec(p, zSql, 0);
10581    }
10582    sqlite3_free(zSql);
10583  }else
10584
10585#ifndef SQLITE_NOHAVE_SYSTEM
10586  if( c=='s'
10587   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10588  ){
10589    char *zCmd;
10590    int i, x;
10591    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10592    if( nArg<2 ){
10593      raw_printf(stderr, "Usage: .system COMMAND\n");
10594      rc = 1;
10595      goto meta_command_exit;
10596    }
10597    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10598    for(i=2; i<nArg && zCmd!=0; i++){
10599      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10600                             zCmd, azArg[i]);
10601    }
10602    x = zCmd!=0 ? system(zCmd) : 1;
10603    sqlite3_free(zCmd);
10604    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10605  }else
10606#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10607
10608  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10609    static const char *azBool[] = { "off", "on", "trigger", "full"};
10610    const char *zOut;
10611    int i;
10612    if( nArg!=1 ){
10613      raw_printf(stderr, "Usage: .show\n");
10614      rc = 1;
10615      goto meta_command_exit;
10616    }
10617    utf8_printf(p->out, "%12.12s: %s\n","echo",
10618                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
10619    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10620    utf8_printf(p->out, "%12.12s: %s\n","explain",
10621         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10622    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10623    if( p->mode==MODE_Column
10624     || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
10625    ){
10626      utf8_printf
10627        (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
10628         modeDescr[p->mode], p->cmOpts.iWrap,
10629         p->cmOpts.bWordWrap ? "on" : "off",
10630         p->cmOpts.bQuote ? "" : "no");
10631    }else{
10632      utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10633    }
10634    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10635      output_c_string(p->out, p->nullValue);
10636      raw_printf(p->out, "\n");
10637    utf8_printf(p->out,"%12.12s: %s\n","output",
10638            strlen30(p->outfile) ? p->outfile : "stdout");
10639    utf8_printf(p->out,"%12.12s: ", "colseparator");
10640      output_c_string(p->out, p->colSeparator);
10641      raw_printf(p->out, "\n");
10642    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10643      output_c_string(p->out, p->rowSeparator);
10644      raw_printf(p->out, "\n");
10645    switch( p->statsOn ){
10646      case 0:  zOut = "off";     break;
10647      default: zOut = "on";      break;
10648      case 2:  zOut = "stmt";    break;
10649      case 3:  zOut = "vmstep";  break;
10650    }
10651    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10652    utf8_printf(p->out, "%12.12s: ", "width");
10653    for (i=0;i<p->nWidth;i++) {
10654      raw_printf(p->out, "%d ", p->colWidth[i]);
10655    }
10656    raw_printf(p->out, "\n");
10657    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10658                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10659  }else
10660
10661  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10662    if( nArg==2 ){
10663      if( strcmp(azArg[1],"stmt")==0 ){
10664        p->statsOn = 2;
10665      }else if( strcmp(azArg[1],"vmstep")==0 ){
10666        p->statsOn = 3;
10667      }else{
10668        p->statsOn = (u8)booleanValue(azArg[1]);
10669      }
10670    }else if( nArg==1 ){
10671      display_stats(p->db, p, 0);
10672    }else{
10673      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10674      rc = 1;
10675    }
10676  }else
10677
10678  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10679   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10680                 || strncmp(azArg[0], "indexes", n)==0) )
10681  ){
10682    sqlite3_stmt *pStmt;
10683    char **azResult;
10684    int nRow, nAlloc;
10685    int ii;
10686    ShellText s;
10687    initText(&s);
10688    open_db(p, 0);
10689    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10690    if( rc ){
10691      sqlite3_finalize(pStmt);
10692      return shellDatabaseError(p->db);
10693    }
10694
10695    if( nArg>2 && c=='i' ){
10696      /* It is an historical accident that the .indexes command shows an error
10697      ** when called with the wrong number of arguments whereas the .tables
10698      ** command does not. */
10699      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10700      rc = 1;
10701      sqlite3_finalize(pStmt);
10702      goto meta_command_exit;
10703    }
10704    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10705      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10706      if( zDbName==0 ) continue;
10707      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10708      if( sqlite3_stricmp(zDbName, "main")==0 ){
10709        appendText(&s, "SELECT name FROM ", 0);
10710      }else{
10711        appendText(&s, "SELECT ", 0);
10712        appendText(&s, zDbName, '\'');
10713        appendText(&s, "||'.'||name FROM ", 0);
10714      }
10715      appendText(&s, zDbName, '"');
10716      appendText(&s, ".sqlite_schema ", 0);
10717      if( c=='t' ){
10718        appendText(&s," WHERE type IN ('table','view')"
10719                      "   AND name NOT LIKE 'sqlite_%'"
10720                      "   AND name LIKE ?1", 0);
10721      }else{
10722        appendText(&s," WHERE type='index'"
10723                      "   AND tbl_name LIKE ?1", 0);
10724      }
10725    }
10726    rc = sqlite3_finalize(pStmt);
10727    if( rc==SQLITE_OK ){
10728      appendText(&s, " ORDER BY 1", 0);
10729      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10730    }
10731    freeText(&s);
10732    if( rc ) return shellDatabaseError(p->db);
10733
10734    /* Run the SQL statement prepared by the above block. Store the results
10735    ** as an array of nul-terminated strings in azResult[].  */
10736    nRow = nAlloc = 0;
10737    azResult = 0;
10738    if( nArg>1 ){
10739      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10740    }else{
10741      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10742    }
10743    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10744      if( nRow>=nAlloc ){
10745        char **azNew;
10746        int n2 = nAlloc*2 + 10;
10747        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10748        shell_check_oom(azNew);
10749        nAlloc = n2;
10750        azResult = azNew;
10751      }
10752      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10753      shell_check_oom(azResult[nRow]);
10754      nRow++;
10755    }
10756    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10757      rc = shellDatabaseError(p->db);
10758    }
10759
10760    /* Pretty-print the contents of array azResult[] to the output */
10761    if( rc==0 && nRow>0 ){
10762      int len, maxlen = 0;
10763      int i, j;
10764      int nPrintCol, nPrintRow;
10765      for(i=0; i<nRow; i++){
10766        len = strlen30(azResult[i]);
10767        if( len>maxlen ) maxlen = len;
10768      }
10769      nPrintCol = 80/(maxlen+2);
10770      if( nPrintCol<1 ) nPrintCol = 1;
10771      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10772      for(i=0; i<nPrintRow; i++){
10773        for(j=i; j<nRow; j+=nPrintRow){
10774          char *zSp = j<nPrintRow ? "" : "  ";
10775          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10776                      azResult[j] ? azResult[j]:"");
10777        }
10778        raw_printf(p->out, "\n");
10779      }
10780    }
10781
10782    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10783    sqlite3_free(azResult);
10784  }else
10785
10786  /* Begin redirecting output to the file "testcase-out.txt" */
10787  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10788    output_reset(p);
10789    p->out = output_file_open("testcase-out.txt", 0);
10790    if( p->out==0 ){
10791      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10792    }
10793    if( nArg>=2 ){
10794      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10795    }else{
10796      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10797    }
10798  }else
10799
10800#ifndef SQLITE_UNTESTABLE
10801  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10802    static const struct {
10803       const char *zCtrlName;   /* Name of a test-control option */
10804       int ctrlCode;            /* Integer code for that option */
10805       int unSafe;              /* Not valid for --safe mode */
10806       const char *zUsage;      /* Usage notes */
10807    } aCtrl[] = {
10808      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10809      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10810    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10811    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10812      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10813      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10814    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10815      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10816      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10817      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10818      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10819      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10820#ifdef YYCOVERAGE
10821      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10822#endif
10823      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10824      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10825      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10826      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10827      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10828      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10829      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10830    };
10831    int testctrl = -1;
10832    int iCtrl = -1;
10833    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10834    int isOk = 0;
10835    int i, n2;
10836    const char *zCmd = 0;
10837
10838    open_db(p, 0);
10839    zCmd = nArg>=2 ? azArg[1] : "help";
10840
10841    /* The argument can optionally begin with "-" or "--" */
10842    if( zCmd[0]=='-' && zCmd[1] ){
10843      zCmd++;
10844      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10845    }
10846
10847    /* --help lists all test-controls */
10848    if( strcmp(zCmd,"help")==0 ){
10849      utf8_printf(p->out, "Available test-controls:\n");
10850      for(i=0; i<ArraySize(aCtrl); i++){
10851        utf8_printf(p->out, "  .testctrl %s %s\n",
10852                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10853      }
10854      rc = 1;
10855      goto meta_command_exit;
10856    }
10857
10858    /* convert testctrl text option to value. allow any unique prefix
10859    ** of the option name, or a numerical value. */
10860    n2 = strlen30(zCmd);
10861    for(i=0; i<ArraySize(aCtrl); i++){
10862      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10863        if( testctrl<0 ){
10864          testctrl = aCtrl[i].ctrlCode;
10865          iCtrl = i;
10866        }else{
10867          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10868                              "Use \".testctrl --help\" for help\n", zCmd);
10869          rc = 1;
10870          goto meta_command_exit;
10871        }
10872      }
10873    }
10874    if( testctrl<0 ){
10875      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10876                         "Use \".testctrl --help\" for help\n", zCmd);
10877    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10878      utf8_printf(stderr,
10879         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10880         p->lineno, aCtrl[iCtrl].zCtrlName);
10881      exit(1);
10882    }else{
10883      switch(testctrl){
10884
10885        /* sqlite3_test_control(int, db, int) */
10886        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10887          if( nArg==3 ){
10888            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10889            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10890            isOk = 3;
10891          }
10892          break;
10893
10894        /* sqlite3_test_control(int) */
10895        case SQLITE_TESTCTRL_PRNG_SAVE:
10896        case SQLITE_TESTCTRL_PRNG_RESTORE:
10897        case SQLITE_TESTCTRL_BYTEORDER:
10898          if( nArg==2 ){
10899            rc2 = sqlite3_test_control(testctrl);
10900            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10901          }
10902          break;
10903
10904        /* sqlite3_test_control(int, uint) */
10905        case SQLITE_TESTCTRL_PENDING_BYTE:
10906          if( nArg==3 ){
10907            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10908            rc2 = sqlite3_test_control(testctrl, opt);
10909            isOk = 3;
10910          }
10911          break;
10912
10913        /* sqlite3_test_control(int, int, sqlite3*) */
10914        case SQLITE_TESTCTRL_PRNG_SEED:
10915          if( nArg==3 || nArg==4 ){
10916            int ii = (int)integerValue(azArg[2]);
10917            sqlite3 *db;
10918            if( ii==0 && strcmp(azArg[2],"random")==0 ){
10919              sqlite3_randomness(sizeof(ii),&ii);
10920              printf("-- random seed: %d\n", ii);
10921            }
10922            if( nArg==3 ){
10923              db = 0;
10924            }else{
10925              db = p->db;
10926              /* Make sure the schema has been loaded */
10927              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10928            }
10929            rc2 = sqlite3_test_control(testctrl, ii, db);
10930            isOk = 3;
10931          }
10932          break;
10933
10934        /* sqlite3_test_control(int, int) */
10935        case SQLITE_TESTCTRL_ASSERT:
10936        case SQLITE_TESTCTRL_ALWAYS:
10937          if( nArg==3 ){
10938            int opt = booleanValue(azArg[2]);
10939            rc2 = sqlite3_test_control(testctrl, opt);
10940            isOk = 1;
10941          }
10942          break;
10943
10944        /* sqlite3_test_control(int, int) */
10945        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10946        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10947          if( nArg==3 ){
10948            int opt = booleanValue(azArg[2]);
10949            rc2 = sqlite3_test_control(testctrl, opt);
10950            isOk = 3;
10951          }
10952          break;
10953
10954        /* sqlite3_test_control(sqlite3*) */
10955        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10956          rc2 = sqlite3_test_control(testctrl, p->db);
10957          isOk = 3;
10958          break;
10959
10960        case SQLITE_TESTCTRL_IMPOSTER:
10961          if( nArg==5 ){
10962            rc2 = sqlite3_test_control(testctrl, p->db,
10963                          azArg[2],
10964                          integerValue(azArg[3]),
10965                          integerValue(azArg[4]));
10966            isOk = 3;
10967          }
10968          break;
10969
10970        case SQLITE_TESTCTRL_SEEK_COUNT: {
10971          u64 x = 0;
10972          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10973          utf8_printf(p->out, "%llu\n", x);
10974          isOk = 3;
10975          break;
10976        }
10977
10978#ifdef YYCOVERAGE
10979        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10980          if( nArg==2 ){
10981            sqlite3_test_control(testctrl, p->out);
10982            isOk = 3;
10983          }
10984          break;
10985        }
10986#endif
10987#ifdef SQLITE_DEBUG
10988        case SQLITE_TESTCTRL_TUNE: {
10989          if( nArg==4 ){
10990            int id = (int)integerValue(azArg[2]);
10991            int val = (int)integerValue(azArg[3]);
10992            sqlite3_test_control(testctrl, id, &val);
10993            isOk = 3;
10994          }else if( nArg==3 ){
10995            int id = (int)integerValue(azArg[2]);
10996            sqlite3_test_control(testctrl, -id, &rc2);
10997            isOk = 1;
10998          }else if( nArg==2 ){
10999            int id = 1;
11000            while(1){
11001              int val = 0;
11002              rc2 = sqlite3_test_control(testctrl, -id, &val);
11003              if( rc2!=SQLITE_OK ) break;
11004              if( id>1 ) utf8_printf(p->out, "  ");
11005              utf8_printf(p->out, "%d: %d", id, val);
11006              id++;
11007            }
11008            if( id>1 ) utf8_printf(p->out, "\n");
11009            isOk = 3;
11010          }
11011          break;
11012        }
11013#endif
11014        case SQLITE_TESTCTRL_SORTER_MMAP:
11015          if( nArg==3 ){
11016            int opt = (unsigned int)integerValue(azArg[2]);
11017            rc2 = sqlite3_test_control(testctrl, p->db, opt);
11018            isOk = 3;
11019          }
11020          break;
11021      }
11022    }
11023    if( isOk==0 && iCtrl>=0 ){
11024      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
11025      rc = 1;
11026    }else if( isOk==1 ){
11027      raw_printf(p->out, "%d\n", rc2);
11028    }else if( isOk==2 ){
11029      raw_printf(p->out, "0x%08x\n", rc2);
11030    }
11031  }else
11032#endif /* !defined(SQLITE_UNTESTABLE) */
11033
11034  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
11035    open_db(p, 0);
11036    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
11037  }else
11038
11039  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
11040    if( nArg==2 ){
11041      enableTimer = booleanValue(azArg[1]);
11042      if( enableTimer && !HAS_TIMER ){
11043        raw_printf(stderr, "Error: timer not available on this system.\n");
11044        enableTimer = 0;
11045      }
11046    }else{
11047      raw_printf(stderr, "Usage: .timer on|off\n");
11048      rc = 1;
11049    }
11050  }else
11051
11052#ifndef SQLITE_OMIT_TRACE
11053  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
11054    int mType = 0;
11055    int jj;
11056    open_db(p, 0);
11057    for(jj=1; jj<nArg; jj++){
11058      const char *z = azArg[jj];
11059      if( z[0]=='-' ){
11060        if( optionMatch(z, "expanded") ){
11061          p->eTraceType = SHELL_TRACE_EXPANDED;
11062        }
11063#ifdef SQLITE_ENABLE_NORMALIZE
11064        else if( optionMatch(z, "normalized") ){
11065          p->eTraceType = SHELL_TRACE_NORMALIZED;
11066        }
11067#endif
11068        else if( optionMatch(z, "plain") ){
11069          p->eTraceType = SHELL_TRACE_PLAIN;
11070        }
11071        else if( optionMatch(z, "profile") ){
11072          mType |= SQLITE_TRACE_PROFILE;
11073        }
11074        else if( optionMatch(z, "row") ){
11075          mType |= SQLITE_TRACE_ROW;
11076        }
11077        else if( optionMatch(z, "stmt") ){
11078          mType |= SQLITE_TRACE_STMT;
11079        }
11080        else if( optionMatch(z, "close") ){
11081          mType |= SQLITE_TRACE_CLOSE;
11082        }
11083        else {
11084          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
11085          rc = 1;
11086          goto meta_command_exit;
11087        }
11088      }else{
11089        output_file_close(p->traceOut);
11090        p->traceOut = output_file_open(azArg[1], 0);
11091      }
11092    }
11093    if( p->traceOut==0 ){
11094      sqlite3_trace_v2(p->db, 0, 0, 0);
11095    }else{
11096      if( mType==0 ) mType = SQLITE_TRACE_STMT;
11097      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
11098    }
11099  }else
11100#endif /* !defined(SQLITE_OMIT_TRACE) */
11101
11102#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11103  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
11104    int ii;
11105    int lenOpt;
11106    char *zOpt;
11107    if( nArg<2 ){
11108      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
11109      rc = 1;
11110      goto meta_command_exit;
11111    }
11112    open_db(p, 0);
11113    zOpt = azArg[1];
11114    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
11115    lenOpt = (int)strlen(zOpt);
11116    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
11117      assert( azArg[nArg]==0 );
11118      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
11119    }else{
11120      for(ii=1; ii<nArg; ii++){
11121        sqlite3_create_module(p->db, azArg[ii], 0, 0);
11122      }
11123    }
11124  }else
11125#endif
11126
11127#if SQLITE_USER_AUTHENTICATION
11128  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
11129    if( nArg<2 ){
11130      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
11131      rc = 1;
11132      goto meta_command_exit;
11133    }
11134    open_db(p, 0);
11135    if( strcmp(azArg[1],"login")==0 ){
11136      if( nArg!=4 ){
11137        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
11138        rc = 1;
11139        goto meta_command_exit;
11140      }
11141      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
11142                                     strlen30(azArg[3]));
11143      if( rc ){
11144        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
11145        rc = 1;
11146      }
11147    }else if( strcmp(azArg[1],"add")==0 ){
11148      if( nArg!=5 ){
11149        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
11150        rc = 1;
11151        goto meta_command_exit;
11152      }
11153      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11154                            booleanValue(azArg[4]));
11155      if( rc ){
11156        raw_printf(stderr, "User-Add failed: %d\n", rc);
11157        rc = 1;
11158      }
11159    }else if( strcmp(azArg[1],"edit")==0 ){
11160      if( nArg!=5 ){
11161        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
11162        rc = 1;
11163        goto meta_command_exit;
11164      }
11165      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11166                              booleanValue(azArg[4]));
11167      if( rc ){
11168        raw_printf(stderr, "User-Edit failed: %d\n", rc);
11169        rc = 1;
11170      }
11171    }else if( strcmp(azArg[1],"delete")==0 ){
11172      if( nArg!=3 ){
11173        raw_printf(stderr, "Usage: .user delete USER\n");
11174        rc = 1;
11175        goto meta_command_exit;
11176      }
11177      rc = sqlite3_user_delete(p->db, azArg[2]);
11178      if( rc ){
11179        raw_printf(stderr, "User-Delete failed: %d\n", rc);
11180        rc = 1;
11181      }
11182    }else{
11183      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
11184      rc = 1;
11185      goto meta_command_exit;
11186    }
11187  }else
11188#endif /* SQLITE_USER_AUTHENTICATION */
11189
11190  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
11191    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
11192        sqlite3_libversion(), sqlite3_sourceid());
11193#if SQLITE_HAVE_ZLIB
11194    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
11195#endif
11196#define CTIMEOPT_VAL_(opt) #opt
11197#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
11198#if defined(__clang__) && defined(__clang_major__)
11199    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
11200                    CTIMEOPT_VAL(__clang_minor__) "."
11201                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
11202#elif defined(_MSC_VER)
11203    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
11204#elif defined(__GNUC__) && defined(__VERSION__)
11205    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
11206#endif
11207  }else
11208
11209  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
11210    const char *zDbName = nArg==2 ? azArg[1] : "main";
11211    sqlite3_vfs *pVfs = 0;
11212    if( p->db ){
11213      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
11214      if( pVfs ){
11215        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
11216        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11217        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11218        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11219      }
11220    }
11221  }else
11222
11223  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
11224    sqlite3_vfs *pVfs;
11225    sqlite3_vfs *pCurrent = 0;
11226    if( p->db ){
11227      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
11228    }
11229    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
11230      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
11231           pVfs==pCurrent ? "  <--- CURRENT" : "");
11232      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11233      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11234      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11235      if( pVfs->pNext ){
11236        raw_printf(p->out, "-----------------------------------\n");
11237      }
11238    }
11239  }else
11240
11241  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
11242    const char *zDbName = nArg==2 ? azArg[1] : "main";
11243    char *zVfsName = 0;
11244    if( p->db ){
11245      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
11246      if( zVfsName ){
11247        utf8_printf(p->out, "%s\n", zVfsName);
11248        sqlite3_free(zVfsName);
11249      }
11250    }
11251  }else
11252
11253  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
11254    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
11255    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
11256  }else
11257
11258  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
11259    int j;
11260    assert( nArg<=ArraySize(azArg) );
11261    p->nWidth = nArg-1;
11262    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
11263    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
11264    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
11265    for(j=1; j<nArg; j++){
11266      p->colWidth[j-1] = (int)integerValue(azArg[j]);
11267    }
11268  }else
11269
11270  {
11271    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
11272      " \"%s\". Enter \".help\" for help\n", azArg[0]);
11273    rc = 1;
11274  }
11275
11276meta_command_exit:
11277  if( p->outCount ){
11278    p->outCount--;
11279    if( p->outCount==0 ) output_reset(p);
11280  }
11281  p->bSafeMode = p->bSafeModePersist;
11282  return rc;
11283}
11284
11285/* Line scan result and intermediate states (supporting scan resumption)
11286*/
11287#ifndef CHAR_BIT
11288# define CHAR_BIT 8
11289#endif
11290typedef enum {
11291  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
11292  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
11293  QSS_Start = 0
11294} QuickScanState;
11295#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
11296#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
11297#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
11298#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
11299#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
11300
11301/*
11302** Scan line for classification to guide shell's handling.
11303** The scan is resumable for subsequent lines when prior
11304** return values are passed as the 2nd argument.
11305*/
11306static QuickScanState quickscan(char *zLine, QuickScanState qss){
11307  char cin;
11308  char cWait = (char)qss; /* intentional narrowing loss */
11309  if( cWait==0 ){
11310  PlainScan:
11311    assert( cWait==0 );
11312    while( (cin = *zLine++)!=0 ){
11313      if( IsSpace(cin) )
11314        continue;
11315      switch (cin){
11316      case '-':
11317        if( *zLine!='-' )
11318          break;
11319        while((cin = *++zLine)!=0 )
11320          if( cin=='\n')
11321            goto PlainScan;
11322        return qss;
11323      case ';':
11324        qss |= QSS_EndingSemi;
11325        continue;
11326      case '/':
11327        if( *zLine=='*' ){
11328          ++zLine;
11329          cWait = '*';
11330          qss = QSS_SETV(qss, cWait);
11331          goto TermScan;
11332        }
11333        break;
11334      case '[':
11335        cin = ']';
11336        /* fall thru */
11337      case '`': case '\'': case '"':
11338        cWait = cin;
11339        qss = QSS_HasDark | cWait;
11340        goto TermScan;
11341      default:
11342        break;
11343      }
11344      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
11345    }
11346  }else{
11347  TermScan:
11348    while( (cin = *zLine++)!=0 ){
11349      if( cin==cWait ){
11350        switch( cWait ){
11351        case '*':
11352          if( *zLine != '/' )
11353            continue;
11354          ++zLine;
11355          cWait = 0;
11356          qss = QSS_SETV(qss, 0);
11357          goto PlainScan;
11358        case '`': case '\'': case '"':
11359          if(*zLine==cWait){
11360            ++zLine;
11361            continue;
11362          }
11363          /* fall thru */
11364        case ']':
11365          cWait = 0;
11366          qss = QSS_SETV(qss, 0);
11367          goto PlainScan;
11368        default: assert(0);
11369        }
11370      }
11371    }
11372  }
11373  return qss;
11374}
11375
11376/*
11377** Return TRUE if the line typed in is an SQL command terminator other
11378** than a semi-colon.  The SQL Server style "go" command is understood
11379** as is the Oracle "/".
11380*/
11381static int line_is_command_terminator(char *zLine){
11382  while( IsSpace(zLine[0]) ){ zLine++; };
11383  if( zLine[0]=='/' )
11384    zLine += 1; /* Oracle */
11385  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
11386    zLine += 2; /* SQL Server */
11387  else
11388    return 0;
11389  return quickscan(zLine,QSS_Start)==QSS_Start;
11390}
11391
11392/*
11393** We need a default sqlite3_complete() implementation to use in case
11394** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
11395** any arbitrary text is a complete SQL statement.  This is not very
11396** user-friendly, but it does seem to work.
11397*/
11398#ifdef SQLITE_OMIT_COMPLETE
11399#define sqlite3_complete(x) 1
11400#endif
11401
11402/*
11403** Return true if zSql is a complete SQL statement.  Return false if it
11404** ends in the middle of a string literal or C-style comment.
11405*/
11406static int line_is_complete(char *zSql, int nSql){
11407  int rc;
11408  if( zSql==0 ) return 1;
11409  zSql[nSql] = ';';
11410  zSql[nSql+1] = 0;
11411  rc = sqlite3_complete(zSql);
11412  zSql[nSql] = 0;
11413  return rc;
11414}
11415
11416/*
11417** Run a single line of SQL.  Return the number of errors.
11418*/
11419static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
11420  int rc;
11421  char *zErrMsg = 0;
11422
11423  open_db(p, 0);
11424  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
11425  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
11426  BEGIN_TIMER;
11427  rc = shell_exec(p, zSql, &zErrMsg);
11428  END_TIMER;
11429  if( rc || zErrMsg ){
11430    char zPrefix[100];
11431    const char *zErrorTail;
11432    const char *zErrorType;
11433    if( zErrMsg==0 ){
11434      zErrorType = "Error";
11435      zErrorTail = sqlite3_errmsg(p->db);
11436    }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){
11437      zErrorType = "Parse error";
11438      zErrorTail = &zErrMsg[12];
11439    }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){
11440      zErrorType = "Runtime error";
11441      zErrorTail = &zErrMsg[10];
11442    }else{
11443      zErrorType = "Error";
11444      zErrorTail = zErrMsg;
11445    }
11446    if( in!=0 || !stdin_is_interactive ){
11447      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
11448                       "%s near line %d:", zErrorType, startline);
11449    }else{
11450      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
11451    }
11452    utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
11453    sqlite3_free(zErrMsg);
11454    zErrMsg = 0;
11455    return 1;
11456  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
11457    char zLineBuf[2000];
11458    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
11459            "changes: %lld   total_changes: %lld",
11460            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
11461    raw_printf(p->out, "%s\n", zLineBuf);
11462  }
11463  return 0;
11464}
11465
11466
11467/*
11468** Read input from *in and process it.  If *in==0 then input
11469** is interactive - the user is typing it it.  Otherwise, input
11470** is coming from a file or device.  A prompt is issued and history
11471** is saved only if input is interactive.  An interrupt signal will
11472** cause this routine to exit immediately, unless input is interactive.
11473**
11474** Return the number of errors.
11475*/
11476static int process_input(ShellState *p){
11477  char *zLine = 0;          /* A single input line */
11478  char *zSql = 0;           /* Accumulated SQL text */
11479  int nLine;                /* Length of current line */
11480  int nSql = 0;             /* Bytes of zSql[] used */
11481  int nAlloc = 0;           /* Allocated zSql[] space */
11482  int rc;                   /* Error code */
11483  int errCnt = 0;           /* Number of errors seen */
11484  int startline = 0;        /* Line number for start of current input */
11485  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
11486
11487  if( p->inputNesting==MAX_INPUT_NESTING ){
11488    /* This will be more informative in a later version. */
11489    utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
11490                " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
11491    return 1;
11492  }
11493  ++p->inputNesting;
11494  p->lineno = 0;
11495  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
11496    fflush(p->out);
11497    zLine = one_input_line(p->in, zLine, nSql>0);
11498    if( zLine==0 ){
11499      /* End of input */
11500      if( p->in==0 && stdin_is_interactive ) printf("\n");
11501      break;
11502    }
11503    if( seenInterrupt ){
11504      if( p->in!=0 ) break;
11505      seenInterrupt = 0;
11506    }
11507    p->lineno++;
11508    if( QSS_INPLAIN(qss)
11509        && line_is_command_terminator(zLine)
11510        && line_is_complete(zSql, nSql) ){
11511      memcpy(zLine,";",2);
11512    }
11513    qss = quickscan(zLine, qss);
11514    if( QSS_PLAINWHITE(qss) && nSql==0 ){
11515      if( ShellHasFlag(p, SHFLG_Echo) )
11516        printf("%s\n", zLine);
11517      /* Just swallow single-line whitespace */
11518      qss = QSS_Start;
11519      continue;
11520    }
11521    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
11522      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
11523      if( zLine[0]=='.' ){
11524        rc = do_meta_command(zLine, p);
11525        if( rc==2 ){ /* exit requested */
11526          break;
11527        }else if( rc ){
11528          errCnt++;
11529        }
11530      }
11531      qss = QSS_Start;
11532      continue;
11533    }
11534    /* No single-line dispositions remain; accumulate line(s). */
11535    nLine = strlen30(zLine);
11536    if( nSql+nLine+2>=nAlloc ){
11537      /* Grow buffer by half-again increments when big. */
11538      nAlloc = nSql+(nSql>>1)+nLine+100;
11539      zSql = realloc(zSql, nAlloc);
11540      shell_check_oom(zSql);
11541    }
11542    if( nSql==0 ){
11543      int i;
11544      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
11545      assert( nAlloc>0 && zSql!=0 );
11546      memcpy(zSql, zLine+i, nLine+1-i);
11547      startline = p->lineno;
11548      nSql = nLine-i;
11549    }else{
11550      zSql[nSql++] = '\n';
11551      memcpy(zSql+nSql, zLine, nLine+1);
11552      nSql += nLine;
11553    }
11554    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
11555      errCnt += runOneSqlLine(p, zSql, p->in, startline);
11556      nSql = 0;
11557      if( p->outCount ){
11558        output_reset(p);
11559        p->outCount = 0;
11560      }else{
11561        clearTempFile(p);
11562      }
11563      p->bSafeMode = p->bSafeModePersist;
11564      qss = QSS_Start;
11565    }else if( nSql && QSS_PLAINWHITE(qss) ){
11566      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
11567      nSql = 0;
11568      qss = QSS_Start;
11569    }
11570  }
11571  if( nSql ){
11572    /* This may be incomplete. Let the SQL parser deal with that. */
11573    errCnt += runOneSqlLine(p, zSql, p->in, startline);
11574  }
11575  free(zSql);
11576  free(zLine);
11577  --p->inputNesting;
11578  return errCnt>0;
11579}
11580
11581/*
11582** Return a pathname which is the user's home directory.  A
11583** 0 return indicates an error of some kind.
11584*/
11585static char *find_home_dir(int clearFlag){
11586  static char *home_dir = NULL;
11587  if( clearFlag ){
11588    free(home_dir);
11589    home_dir = 0;
11590    return 0;
11591  }
11592  if( home_dir ) return home_dir;
11593
11594#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11595     && !defined(__RTP__) && !defined(_WRS_KERNEL)
11596  {
11597    struct passwd *pwent;
11598    uid_t uid = getuid();
11599    if( (pwent=getpwuid(uid)) != NULL) {
11600      home_dir = pwent->pw_dir;
11601    }
11602  }
11603#endif
11604
11605#if defined(_WIN32_WCE)
11606  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11607   */
11608  home_dir = "/";
11609#else
11610
11611#if defined(_WIN32) || defined(WIN32)
11612  if (!home_dir) {
11613    home_dir = getenv("USERPROFILE");
11614  }
11615#endif
11616
11617  if (!home_dir) {
11618    home_dir = getenv("HOME");
11619  }
11620
11621#if defined(_WIN32) || defined(WIN32)
11622  if (!home_dir) {
11623    char *zDrive, *zPath;
11624    int n;
11625    zDrive = getenv("HOMEDRIVE");
11626    zPath = getenv("HOMEPATH");
11627    if( zDrive && zPath ){
11628      n = strlen30(zDrive) + strlen30(zPath) + 1;
11629      home_dir = malloc( n );
11630      if( home_dir==0 ) return 0;
11631      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11632      return home_dir;
11633    }
11634    home_dir = "c:\\";
11635  }
11636#endif
11637
11638#endif /* !_WIN32_WCE */
11639
11640  if( home_dir ){
11641    int n = strlen30(home_dir) + 1;
11642    char *z = malloc( n );
11643    if( z ) memcpy(z, home_dir, n);
11644    home_dir = z;
11645  }
11646
11647  return home_dir;
11648}
11649
11650/*
11651** Read input from the file given by sqliterc_override.  Or if that
11652** parameter is NULL, take input from ~/.sqliterc
11653**
11654** Returns the number of errors.
11655*/
11656static void process_sqliterc(
11657  ShellState *p,                  /* Configuration data */
11658  const char *sqliterc_override   /* Name of config file. NULL to use default */
11659){
11660  char *home_dir = NULL;
11661  const char *sqliterc = sqliterc_override;
11662  char *zBuf = 0;
11663  FILE *inSaved = p->in;
11664  int savedLineno = p->lineno;
11665
11666  if (sqliterc == NULL) {
11667    home_dir = find_home_dir(0);
11668    if( home_dir==0 ){
11669      raw_printf(stderr, "-- warning: cannot find home directory;"
11670                      " cannot read ~/.sqliterc\n");
11671      return;
11672    }
11673    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11674    shell_check_oom(zBuf);
11675    sqliterc = zBuf;
11676  }
11677  p->in = fopen(sqliterc,"rb");
11678  if( p->in ){
11679    if( stdin_is_interactive ){
11680      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11681    }
11682    if( process_input(p) && bail_on_error ) exit(1);
11683    fclose(p->in);
11684  }else if( sqliterc_override!=0 ){
11685    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11686    if( bail_on_error ) exit(1);
11687  }
11688  p->in = inSaved;
11689  p->lineno = savedLineno;
11690  sqlite3_free(zBuf);
11691}
11692
11693/*
11694** Show available command line options
11695*/
11696static const char zOptions[] =
11697#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11698  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11699#endif
11700  "   -append              append the database to the end of the file\n"
11701  "   -ascii               set output mode to 'ascii'\n"
11702  "   -bail                stop after hitting an error\n"
11703  "   -batch               force batch I/O\n"
11704  "   -box                 set output mode to 'box'\n"
11705  "   -column              set output mode to 'column'\n"
11706  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11707  "   -csv                 set output mode to 'csv'\n"
11708#if !defined(SQLITE_OMIT_DESERIALIZE)
11709  "   -deserialize         open the database using sqlite3_deserialize()\n"
11710#endif
11711  "   -echo                print commands before execution\n"
11712  "   -init FILENAME       read/process named file\n"
11713  "   -[no]header          turn headers on or off\n"
11714#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11715  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11716#endif
11717  "   -help                show this message\n"
11718  "   -html                set output mode to HTML\n"
11719  "   -interactive         force interactive I/O\n"
11720  "   -json                set output mode to 'json'\n"
11721  "   -line                set output mode to 'line'\n"
11722  "   -list                set output mode to 'list'\n"
11723  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11724  "   -markdown            set output mode to 'markdown'\n"
11725#if !defined(SQLITE_OMIT_DESERIALIZE)
11726  "   -maxsize N           maximum size for a --deserialize database\n"
11727#endif
11728  "   -memtrace            trace all memory allocations and deallocations\n"
11729  "   -mmap N              default mmap size set to N\n"
11730#ifdef SQLITE_ENABLE_MULTIPLEX
11731  "   -multiplex           enable the multiplexor VFS\n"
11732#endif
11733  "   -newline SEP         set output row separator. Default: '\\n'\n"
11734  "   -nofollow            refuse to open symbolic links to database files\n"
11735  "   -nonce STRING        set the safe-mode escape nonce\n"
11736  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11737  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11738  "   -quote               set output mode to 'quote'\n"
11739  "   -readonly            open the database read-only\n"
11740  "   -safe                enable safe-mode\n"
11741  "   -separator SEP       set output column separator. Default: '|'\n"
11742#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11743  "   -sorterref SIZE      sorter references threshold size\n"
11744#endif
11745  "   -stats               print memory stats before each finalize\n"
11746  "   -table               set output mode to 'table'\n"
11747  "   -tabs                set output mode to 'tabs'\n"
11748  "   -version             show SQLite version\n"
11749  "   -vfs NAME            use NAME as the default VFS\n"
11750#ifdef SQLITE_ENABLE_VFSTRACE
11751  "   -vfstrace            enable tracing of all VFS calls\n"
11752#endif
11753#ifdef SQLITE_HAVE_ZLIB
11754  "   -zip                 open the file as a ZIP Archive\n"
11755#endif
11756;
11757static void usage(int showDetail){
11758  utf8_printf(stderr,
11759      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11760      "FILENAME is the name of an SQLite database. A new database is created\n"
11761      "if the file does not previously exist.\n", Argv0);
11762  if( showDetail ){
11763    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11764  }else{
11765    raw_printf(stderr, "Use the -help option for additional information\n");
11766  }
11767  exit(1);
11768}
11769
11770/*
11771** Internal check:  Verify that the SQLite is uninitialized.  Print a
11772** error message if it is initialized.
11773*/
11774static void verify_uninitialized(void){
11775  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11776    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11777                        " initialization.\n");
11778  }
11779}
11780
11781/*
11782** Initialize the state information in data
11783*/
11784static void main_init(ShellState *data) {
11785  memset(data, 0, sizeof(*data));
11786  data->normalMode = data->cMode = data->mode = MODE_List;
11787  data->autoExplain = 1;
11788  data->pAuxDb = &data->aAuxDb[0];
11789  memcpy(data->colSeparator,SEP_Column, 2);
11790  memcpy(data->rowSeparator,SEP_Row, 2);
11791  data->showHeader = 0;
11792  data->shellFlgs = SHFLG_Lookaside;
11793  verify_uninitialized();
11794  sqlite3_config(SQLITE_CONFIG_URI, 1);
11795  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11796  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11797  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11798  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11799}
11800
11801/*
11802** Output text to the console in a font that attracts extra attention.
11803*/
11804#ifdef _WIN32
11805static void printBold(const char *zText){
11806#if !SQLITE_OS_WINRT
11807  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11808  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11809  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11810  SetConsoleTextAttribute(out,
11811         FOREGROUND_RED|FOREGROUND_INTENSITY
11812  );
11813#endif
11814  printf("%s", zText);
11815#if !SQLITE_OS_WINRT
11816  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11817#endif
11818}
11819#else
11820static void printBold(const char *zText){
11821  printf("\033[1m%s\033[0m", zText);
11822}
11823#endif
11824
11825/*
11826** Get the argument to an --option.  Throw an error and die if no argument
11827** is available.
11828*/
11829static char *cmdline_option_value(int argc, char **argv, int i){
11830  if( i==argc ){
11831    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11832            argv[0], argv[argc-1]);
11833    exit(1);
11834  }
11835  return argv[i];
11836}
11837
11838#ifndef SQLITE_SHELL_IS_UTF8
11839#  if (defined(_WIN32) || defined(WIN32)) \
11840   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11841#    define SQLITE_SHELL_IS_UTF8          (0)
11842#  else
11843#    define SQLITE_SHELL_IS_UTF8          (1)
11844#  endif
11845#endif
11846
11847#if SQLITE_SHELL_IS_UTF8
11848int SQLITE_CDECL main(int argc, char **argv){
11849#else
11850int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11851  char **argv;
11852#endif
11853  char *zErrMsg = 0;
11854  ShellState data;
11855  const char *zInitFile = 0;
11856  int i;
11857  int rc = 0;
11858  int warnInmemoryDb = 0;
11859  int readStdin = 1;
11860  int nCmd = 0;
11861  char **azCmd = 0;
11862  const char *zVfs = 0;           /* Value of -vfs command-line option */
11863#if !SQLITE_SHELL_IS_UTF8
11864  char **argvToFree = 0;
11865  int argcToFree = 0;
11866#endif
11867
11868  setBinaryMode(stdin, 0);
11869  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11870  stdin_is_interactive = isatty(0);
11871  stdout_is_console = isatty(1);
11872
11873#if !defined(_WIN32_WCE)
11874  if( getenv("SQLITE_DEBUG_BREAK") ){
11875    if( isatty(0) && isatty(2) ){
11876      fprintf(stderr,
11877          "attach debugger to process %d and press any key to continue.\n",
11878          GETPID());
11879      fgetc(stdin);
11880    }else{
11881#if defined(_WIN32) || defined(WIN32)
11882#if SQLITE_OS_WINRT
11883      __debugbreak();
11884#else
11885      DebugBreak();
11886#endif
11887#elif defined(SIGTRAP)
11888      raise(SIGTRAP);
11889#endif
11890    }
11891  }
11892#endif
11893
11894#if USE_SYSTEM_SQLITE+0!=1
11895  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11896    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11897            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11898    exit(1);
11899  }
11900#endif
11901  main_init(&data);
11902
11903  /* On Windows, we must translate command-line arguments into UTF-8.
11904  ** The SQLite memory allocator subsystem has to be enabled in order to
11905  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11906  ** subsequent sqlite3_config() calls will work.  So copy all results into
11907  ** memory that does not come from the SQLite memory allocator.
11908  */
11909#if !SQLITE_SHELL_IS_UTF8
11910  sqlite3_initialize();
11911  argvToFree = malloc(sizeof(argv[0])*argc*2);
11912  shell_check_oom(argvToFree);
11913  argcToFree = argc;
11914  argv = argvToFree + argc;
11915  for(i=0; i<argc; i++){
11916    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11917    int n;
11918    shell_check_oom(z);
11919    n = (int)strlen(z);
11920    argv[i] = malloc( n+1 );
11921    shell_check_oom(argv[i]);
11922    memcpy(argv[i], z, n+1);
11923    argvToFree[i] = argv[i];
11924    sqlite3_free(z);
11925  }
11926  sqlite3_shutdown();
11927#endif
11928
11929  assert( argc>=1 && argv && argv[0] );
11930  Argv0 = argv[0];
11931
11932  /* Make sure we have a valid signal handler early, before anything
11933  ** else is done.
11934  */
11935#ifdef SIGINT
11936  signal(SIGINT, interrupt_handler);
11937#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11938  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11939#endif
11940
11941#ifdef SQLITE_SHELL_DBNAME_PROC
11942  {
11943    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11944    ** of a C-function that will provide the name of the database file.  Use
11945    ** this compile-time option to embed this shell program in larger
11946    ** applications. */
11947    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11948    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11949    warnInmemoryDb = 0;
11950  }
11951#endif
11952
11953  /* Do an initial pass through the command-line argument to locate
11954  ** the name of the database file, the name of the initialization file,
11955  ** the size of the alternative malloc heap,
11956  ** and the first command to execute.
11957  */
11958  verify_uninitialized();
11959  for(i=1; i<argc; i++){
11960    char *z;
11961    z = argv[i];
11962    if( z[0]!='-' ){
11963      if( data.aAuxDb->zDbFilename==0 ){
11964        data.aAuxDb->zDbFilename = z;
11965      }else{
11966        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11967        ** mean that nothing is read from stdin */
11968        readStdin = 0;
11969        nCmd++;
11970        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11971        shell_check_oom(azCmd);
11972        azCmd[nCmd-1] = z;
11973      }
11974    }
11975    if( z[1]=='-' ) z++;
11976    if( strcmp(z,"-separator")==0
11977     || strcmp(z,"-nullvalue")==0
11978     || strcmp(z,"-newline")==0
11979     || strcmp(z,"-cmd")==0
11980    ){
11981      (void)cmdline_option_value(argc, argv, ++i);
11982    }else if( strcmp(z,"-init")==0 ){
11983      zInitFile = cmdline_option_value(argc, argv, ++i);
11984    }else if( strcmp(z,"-batch")==0 ){
11985      /* Need to check for batch mode here to so we can avoid printing
11986      ** informational messages (like from process_sqliterc) before
11987      ** we do the actual processing of arguments later in a second pass.
11988      */
11989      stdin_is_interactive = 0;
11990    }else if( strcmp(z,"-heap")==0 ){
11991#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11992      const char *zSize;
11993      sqlite3_int64 szHeap;
11994
11995      zSize = cmdline_option_value(argc, argv, ++i);
11996      szHeap = integerValue(zSize);
11997      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11998      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11999#else
12000      (void)cmdline_option_value(argc, argv, ++i);
12001#endif
12002    }else if( strcmp(z,"-pagecache")==0 ){
12003      sqlite3_int64 n, sz;
12004      sz = integerValue(cmdline_option_value(argc,argv,++i));
12005      if( sz>70000 ) sz = 70000;
12006      if( sz<0 ) sz = 0;
12007      n = integerValue(cmdline_option_value(argc,argv,++i));
12008      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
12009        n = 0xffffffffffffLL/sz;
12010      }
12011      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
12012                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
12013      data.shellFlgs |= SHFLG_Pagecache;
12014    }else if( strcmp(z,"-lookaside")==0 ){
12015      int n, sz;
12016      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
12017      if( sz<0 ) sz = 0;
12018      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12019      if( n<0 ) n = 0;
12020      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
12021      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
12022    }else if( strcmp(z,"-threadsafe")==0 ){
12023      int n;
12024      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12025      switch( n ){
12026         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
12027         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
12028         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
12029      }
12030#ifdef SQLITE_ENABLE_VFSTRACE
12031    }else if( strcmp(z,"-vfstrace")==0 ){
12032      extern int vfstrace_register(
12033         const char *zTraceName,
12034         const char *zOldVfsName,
12035         int (*xOut)(const char*,void*),
12036         void *pOutArg,
12037         int makeDefault
12038      );
12039      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
12040#endif
12041#ifdef SQLITE_ENABLE_MULTIPLEX
12042    }else if( strcmp(z,"-multiplex")==0 ){
12043      extern int sqlite3_multiple_initialize(const char*,int);
12044      sqlite3_multiplex_initialize(0, 1);
12045#endif
12046    }else if( strcmp(z,"-mmap")==0 ){
12047      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12048      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
12049#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12050    }else if( strcmp(z,"-sorterref")==0 ){
12051      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12052      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
12053#endif
12054    }else if( strcmp(z,"-vfs")==0 ){
12055      zVfs = cmdline_option_value(argc, argv, ++i);
12056#ifdef SQLITE_HAVE_ZLIB
12057    }else if( strcmp(z,"-zip")==0 ){
12058      data.openMode = SHELL_OPEN_ZIPFILE;
12059#endif
12060    }else if( strcmp(z,"-append")==0 ){
12061      data.openMode = SHELL_OPEN_APPENDVFS;
12062#ifndef SQLITE_OMIT_DESERIALIZE
12063    }else if( strcmp(z,"-deserialize")==0 ){
12064      data.openMode = SHELL_OPEN_DESERIALIZE;
12065    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12066      data.szMax = integerValue(argv[++i]);
12067#endif
12068    }else if( strcmp(z,"-readonly")==0 ){
12069      data.openMode = SHELL_OPEN_READONLY;
12070    }else if( strcmp(z,"-nofollow")==0 ){
12071      data.openFlags = SQLITE_OPEN_NOFOLLOW;
12072#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12073    }else if( strncmp(z, "-A",2)==0 ){
12074      /* All remaining command-line arguments are passed to the ".archive"
12075      ** command, so ignore them */
12076      break;
12077#endif
12078    }else if( strcmp(z, "-memtrace")==0 ){
12079      sqlite3MemTraceActivate(stderr);
12080    }else if( strcmp(z,"-bail")==0 ){
12081      bail_on_error = 1;
12082    }else if( strcmp(z,"-nonce")==0 ){
12083      free(data.zNonce);
12084      data.zNonce = strdup(argv[++i]);
12085    }else if( strcmp(z,"-safe")==0 ){
12086      /* no-op - catch this on the second pass */
12087    }
12088  }
12089  verify_uninitialized();
12090
12091
12092#ifdef SQLITE_SHELL_INIT_PROC
12093  {
12094    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
12095    ** of a C-function that will perform initialization actions on SQLite that
12096    ** occur just before or after sqlite3_initialize(). Use this compile-time
12097    ** option to embed this shell program in larger applications. */
12098    extern void SQLITE_SHELL_INIT_PROC(void);
12099    SQLITE_SHELL_INIT_PROC();
12100  }
12101#else
12102  /* All the sqlite3_config() calls have now been made. So it is safe
12103  ** to call sqlite3_initialize() and process any command line -vfs option. */
12104  sqlite3_initialize();
12105#endif
12106
12107  if( zVfs ){
12108    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
12109    if( pVfs ){
12110      sqlite3_vfs_register(pVfs, 1);
12111    }else{
12112      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
12113      exit(1);
12114    }
12115  }
12116
12117  if( data.pAuxDb->zDbFilename==0 ){
12118#ifndef SQLITE_OMIT_MEMORYDB
12119    data.pAuxDb->zDbFilename = ":memory:";
12120    warnInmemoryDb = argc==1;
12121#else
12122    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
12123    return 1;
12124#endif
12125  }
12126  data.out = stdout;
12127  sqlite3_appendvfs_init(0,0,0);
12128
12129  /* Go ahead and open the database file if it already exists.  If the
12130  ** file does not exist, delay opening it.  This prevents empty database
12131  ** files from being created if a user mistypes the database name argument
12132  ** to the sqlite command-line tool.
12133  */
12134  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
12135    open_db(&data, 0);
12136  }
12137
12138  /* Process the initialization file if there is one.  If no -init option
12139  ** is given on the command line, look for a file named ~/.sqliterc and
12140  ** try to process it.
12141  */
12142  process_sqliterc(&data,zInitFile);
12143
12144  /* Make a second pass through the command-line argument and set
12145  ** options.  This second pass is delayed until after the initialization
12146  ** file is processed so that the command-line arguments will override
12147  ** settings in the initialization file.
12148  */
12149  for(i=1; i<argc; i++){
12150    char *z = argv[i];
12151    if( z[0]!='-' ) continue;
12152    if( z[1]=='-' ){ z++; }
12153    if( strcmp(z,"-init")==0 ){
12154      i++;
12155    }else if( strcmp(z,"-html")==0 ){
12156      data.mode = MODE_Html;
12157    }else if( strcmp(z,"-list")==0 ){
12158      data.mode = MODE_List;
12159    }else if( strcmp(z,"-quote")==0 ){
12160      data.mode = MODE_Quote;
12161      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
12162      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12163    }else if( strcmp(z,"-line")==0 ){
12164      data.mode = MODE_Line;
12165    }else if( strcmp(z,"-column")==0 ){
12166      data.mode = MODE_Column;
12167    }else if( strcmp(z,"-json")==0 ){
12168      data.mode = MODE_Json;
12169    }else if( strcmp(z,"-markdown")==0 ){
12170      data.mode = MODE_Markdown;
12171    }else if( strcmp(z,"-table")==0 ){
12172      data.mode = MODE_Table;
12173    }else if( strcmp(z,"-box")==0 ){
12174      data.mode = MODE_Box;
12175    }else if( strcmp(z,"-csv")==0 ){
12176      data.mode = MODE_Csv;
12177      memcpy(data.colSeparator,",",2);
12178#ifdef SQLITE_HAVE_ZLIB
12179    }else if( strcmp(z,"-zip")==0 ){
12180      data.openMode = SHELL_OPEN_ZIPFILE;
12181#endif
12182    }else if( strcmp(z,"-append")==0 ){
12183      data.openMode = SHELL_OPEN_APPENDVFS;
12184#ifndef SQLITE_OMIT_DESERIALIZE
12185    }else if( strcmp(z,"-deserialize")==0 ){
12186      data.openMode = SHELL_OPEN_DESERIALIZE;
12187    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12188      data.szMax = integerValue(argv[++i]);
12189#endif
12190    }else if( strcmp(z,"-readonly")==0 ){
12191      data.openMode = SHELL_OPEN_READONLY;
12192    }else if( strcmp(z,"-nofollow")==0 ){
12193      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
12194    }else if( strcmp(z,"-ascii")==0 ){
12195      data.mode = MODE_Ascii;
12196      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
12197      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
12198    }else if( strcmp(z,"-tabs")==0 ){
12199      data.mode = MODE_List;
12200      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
12201      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12202    }else if( strcmp(z,"-separator")==0 ){
12203      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
12204                       "%s",cmdline_option_value(argc,argv,++i));
12205    }else if( strcmp(z,"-newline")==0 ){
12206      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
12207                       "%s",cmdline_option_value(argc,argv,++i));
12208    }else if( strcmp(z,"-nullvalue")==0 ){
12209      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
12210                       "%s",cmdline_option_value(argc,argv,++i));
12211    }else if( strcmp(z,"-header")==0 ){
12212      data.showHeader = 1;
12213      ShellSetFlag(&data, SHFLG_HeaderSet);
12214     }else if( strcmp(z,"-noheader")==0 ){
12215      data.showHeader = 0;
12216      ShellSetFlag(&data, SHFLG_HeaderSet);
12217    }else if( strcmp(z,"-echo")==0 ){
12218      ShellSetFlag(&data, SHFLG_Echo);
12219    }else if( strcmp(z,"-eqp")==0 ){
12220      data.autoEQP = AUTOEQP_on;
12221    }else if( strcmp(z,"-eqpfull")==0 ){
12222      data.autoEQP = AUTOEQP_full;
12223    }else if( strcmp(z,"-stats")==0 ){
12224      data.statsOn = 1;
12225    }else if( strcmp(z,"-scanstats")==0 ){
12226      data.scanstatsOn = 1;
12227    }else if( strcmp(z,"-backslash")==0 ){
12228      /* Undocumented command-line option: -backslash
12229      ** Causes C-style backslash escapes to be evaluated in SQL statements
12230      ** prior to sending the SQL into SQLite.  Useful for injecting
12231      ** crazy bytes in the middle of SQL statements for testing and debugging.
12232      */
12233      ShellSetFlag(&data, SHFLG_Backslash);
12234    }else if( strcmp(z,"-bail")==0 ){
12235      /* No-op.  The bail_on_error flag should already be set. */
12236    }else if( strcmp(z,"-version")==0 ){
12237      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
12238      return 0;
12239    }else if( strcmp(z,"-interactive")==0 ){
12240      stdin_is_interactive = 1;
12241    }else if( strcmp(z,"-batch")==0 ){
12242      stdin_is_interactive = 0;
12243    }else if( strcmp(z,"-heap")==0 ){
12244      i++;
12245    }else if( strcmp(z,"-pagecache")==0 ){
12246      i+=2;
12247    }else if( strcmp(z,"-lookaside")==0 ){
12248      i+=2;
12249    }else if( strcmp(z,"-threadsafe")==0 ){
12250      i+=2;
12251    }else if( strcmp(z,"-nonce")==0 ){
12252      i += 2;
12253    }else if( strcmp(z,"-mmap")==0 ){
12254      i++;
12255    }else if( strcmp(z,"-memtrace")==0 ){
12256      i++;
12257#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12258    }else if( strcmp(z,"-sorterref")==0 ){
12259      i++;
12260#endif
12261    }else if( strcmp(z,"-vfs")==0 ){
12262      i++;
12263#ifdef SQLITE_ENABLE_VFSTRACE
12264    }else if( strcmp(z,"-vfstrace")==0 ){
12265      i++;
12266#endif
12267#ifdef SQLITE_ENABLE_MULTIPLEX
12268    }else if( strcmp(z,"-multiplex")==0 ){
12269      i++;
12270#endif
12271    }else if( strcmp(z,"-help")==0 ){
12272      usage(1);
12273    }else if( strcmp(z,"-cmd")==0 ){
12274      /* Run commands that follow -cmd first and separately from commands
12275      ** that simply appear on the command-line.  This seems goofy.  It would
12276      ** be better if all commands ran in the order that they appear.  But
12277      ** we retain the goofy behavior for historical compatibility. */
12278      if( i==argc-1 ) break;
12279      z = cmdline_option_value(argc,argv,++i);
12280      if( z[0]=='.' ){
12281        rc = do_meta_command(z, &data);
12282        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
12283      }else{
12284        open_db(&data, 0);
12285        rc = shell_exec(&data, z, &zErrMsg);
12286        if( zErrMsg!=0 ){
12287          utf8_printf(stderr,"Error: %s\n", zErrMsg);
12288          if( bail_on_error ) return rc!=0 ? rc : 1;
12289        }else if( rc!=0 ){
12290          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
12291          if( bail_on_error ) return rc;
12292        }
12293      }
12294#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12295    }else if( strncmp(z, "-A", 2)==0 ){
12296      if( nCmd>0 ){
12297        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
12298                            " with \"%s\"\n", z);
12299        return 1;
12300      }
12301      open_db(&data, OPEN_DB_ZIPFILE);
12302      if( z[2] ){
12303        argv[i] = &z[2];
12304        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
12305      }else{
12306        arDotCommand(&data, 1, argv+i, argc-i);
12307      }
12308      readStdin = 0;
12309      break;
12310#endif
12311    }else if( strcmp(z,"-safe")==0 ){
12312      data.bSafeMode = data.bSafeModePersist = 1;
12313    }else{
12314      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
12315      raw_printf(stderr,"Use -help for a list of options.\n");
12316      return 1;
12317    }
12318    data.cMode = data.mode;
12319  }
12320
12321  if( !readStdin ){
12322    /* Run all arguments that do not begin with '-' as if they were separate
12323    ** command-line inputs, except for the argToSkip argument which contains
12324    ** the database filename.
12325    */
12326    for(i=0; i<nCmd; i++){
12327      if( azCmd[i][0]=='.' ){
12328        rc = do_meta_command(azCmd[i], &data);
12329        if( rc ){
12330          free(azCmd);
12331          return rc==2 ? 0 : rc;
12332        }
12333      }else{
12334        open_db(&data, 0);
12335        rc = shell_exec(&data, azCmd[i], &zErrMsg);
12336        if( zErrMsg || rc ){
12337          if( zErrMsg!=0 ){
12338            utf8_printf(stderr,"Error: %s\n", zErrMsg);
12339          }else{
12340            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
12341          }
12342          sqlite3_free(zErrMsg);
12343          free(azCmd);
12344          return rc!=0 ? rc : 1;
12345        }
12346      }
12347    }
12348  }else{
12349    /* Run commands received from standard input
12350    */
12351    if( stdin_is_interactive ){
12352      char *zHome;
12353      char *zHistory;
12354      int nHistory;
12355      printf(
12356        "SQLite version %s %.19s\n" /*extra-version-info*/
12357        "Enter \".help\" for usage hints.\n",
12358        sqlite3_libversion(), sqlite3_sourceid()
12359      );
12360      if( warnInmemoryDb ){
12361        printf("Connected to a ");
12362        printBold("transient in-memory database");
12363        printf(".\nUse \".open FILENAME\" to reopen on a "
12364               "persistent database.\n");
12365      }
12366      zHistory = getenv("SQLITE_HISTORY");
12367      if( zHistory ){
12368        zHistory = strdup(zHistory);
12369      }else if( (zHome = find_home_dir(0))!=0 ){
12370        nHistory = strlen30(zHome) + 20;
12371        if( (zHistory = malloc(nHistory))!=0 ){
12372          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
12373        }
12374      }
12375      if( zHistory ){ shell_read_history(zHistory); }
12376#if HAVE_READLINE || HAVE_EDITLINE
12377      rl_attempted_completion_function = readline_completion;
12378#elif HAVE_LINENOISE
12379      linenoiseSetCompletionCallback(linenoise_completion);
12380#endif
12381      data.in = 0;
12382      rc = process_input(&data);
12383      if( zHistory ){
12384        shell_stifle_history(2000);
12385        shell_write_history(zHistory);
12386        free(zHistory);
12387      }
12388    }else{
12389      data.in = stdin;
12390      rc = process_input(&data);
12391    }
12392  }
12393  free(azCmd);
12394  set_table_name(&data, 0);
12395  if( data.db ){
12396    session_close_all(&data, -1);
12397    close_db(data.db);
12398  }
12399  for(i=0; i<ArraySize(data.aAuxDb); i++){
12400    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
12401    if( data.aAuxDb[i].db ){
12402      session_close_all(&data, i);
12403      close_db(data.aAuxDb[i].db);
12404    }
12405  }
12406  find_home_dir(1);
12407  output_reset(&data);
12408  data.doXdgOpen = 0;
12409  clearTempFile(&data);
12410#if !SQLITE_SHELL_IS_UTF8
12411  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
12412  free(argvToFree);
12413#endif
12414  free(data.colWidth);
12415  free(data.zNonce);
12416  /* Clear the global data structure so that valgrind will detect memory
12417  ** leaks */
12418  memset(&data, 0, sizeof(data));
12419  return rc;
12420}
12421