xref: /sqlite-3.40.0/src/shell.c.in (revision 7ef4d75b)
1/*
2** 2001 September 15
3**
4** The author disclaims copyright to this source code.  In place of
5** a legal notice, here is a blessing:
6**
7**    May you do good and not evil.
8**    May you find forgiveness for yourself and forgive others.
9**    May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
14*/
15#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
20/*
21** Optionally #include a user-defined header, whereby compilation options
22** may be set prior to where they take effect, but after platform setup.
23** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
24** file. Note that this macro has a like effect on sqlite3.c compilation.
25*/
26# define SHELL_STRINGIFY_(f) #f
27# define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
28#ifdef SQLITE_CUSTOM_INCLUDE
29# include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
30#endif
31
32/*
33** Determine if we are dealing with WinRT, which provides only a subset of
34** the full Win32 API.
35*/
36#if !defined(SQLITE_OS_WINRT)
37# define SQLITE_OS_WINRT 0
38#endif
39
40/*
41** Warning pragmas copied from msvc.h in the core.
42*/
43#if defined(_MSC_VER)
44#pragma warning(disable : 4054)
45#pragma warning(disable : 4055)
46#pragma warning(disable : 4100)
47#pragma warning(disable : 4127)
48#pragma warning(disable : 4130)
49#pragma warning(disable : 4152)
50#pragma warning(disable : 4189)
51#pragma warning(disable : 4206)
52#pragma warning(disable : 4210)
53#pragma warning(disable : 4232)
54#pragma warning(disable : 4244)
55#pragma warning(disable : 4305)
56#pragma warning(disable : 4306)
57#pragma warning(disable : 4702)
58#pragma warning(disable : 4706)
59#endif /* defined(_MSC_VER) */
60
61/*
62** No support for loadable extensions in VxWorks.
63*/
64#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
65# define SQLITE_OMIT_LOAD_EXTENSION 1
66#endif
67
68/*
69** Enable large-file support for fopen() and friends on unix.
70*/
71#ifndef SQLITE_DISABLE_LFS
72# define _LARGE_FILE       1
73# ifndef _FILE_OFFSET_BITS
74#   define _FILE_OFFSET_BITS 64
75# endif
76# define _LARGEFILE_SOURCE 1
77#endif
78
79#include <stdlib.h>
80#include <string.h>
81#include <stdio.h>
82#include <assert.h>
83#include "sqlite3.h"
84typedef sqlite3_int64 i64;
85typedef sqlite3_uint64 u64;
86typedef unsigned char u8;
87#if SQLITE_USER_AUTHENTICATION
88# include "sqlite3userauth.h"
89#endif
90#include <ctype.h>
91#include <stdarg.h>
92
93#if !defined(_WIN32) && !defined(WIN32)
94# include <signal.h>
95# if !defined(__RTP__) && !defined(_WRS_KERNEL)
96#  include <pwd.h>
97# endif
98#endif
99#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
100# include <unistd.h>
101# include <dirent.h>
102# define GETPID getpid
103# if defined(__MINGW32__)
104#  define DIRENT dirent
105#  ifndef S_ISLNK
106#   define S_ISLNK(mode) (0)
107#  endif
108# endif
109#else
110# define GETPID (int)GetCurrentProcessId
111#endif
112#include <sys/types.h>
113#include <sys/stat.h>
114
115#if HAVE_READLINE
116# include <readline/readline.h>
117# include <readline/history.h>
118#endif
119
120#if HAVE_EDITLINE
121# include <editline/readline.h>
122#endif
123
124#if HAVE_EDITLINE || HAVE_READLINE
125
126# define shell_add_history(X) add_history(X)
127# define shell_read_history(X) read_history(X)
128# define shell_write_history(X) write_history(X)
129# define shell_stifle_history(X) stifle_history(X)
130# define shell_readline(X) readline(X)
131
132#elif HAVE_LINENOISE
133
134# include "linenoise.h"
135# define shell_add_history(X) linenoiseHistoryAdd(X)
136# define shell_read_history(X) linenoiseHistoryLoad(X)
137# define shell_write_history(X) linenoiseHistorySave(X)
138# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
139# define shell_readline(X) linenoise(X)
140
141#else
142
143# define shell_read_history(X)
144# define shell_write_history(X)
145# define shell_stifle_history(X)
146
147# define SHELL_USE_LOCAL_GETLINE 1
148#endif
149
150
151#if defined(_WIN32) || defined(WIN32)
152# if SQLITE_OS_WINRT
153#  define SQLITE_OMIT_POPEN 1
154# else
155#  include <io.h>
156#  include <fcntl.h>
157#  define isatty(h) _isatty(h)
158#  ifndef access
159#   define access(f,m) _access((f),(m))
160#  endif
161#  ifndef unlink
162#   define unlink _unlink
163#  endif
164#  ifndef strdup
165#   define strdup _strdup
166#  endif
167#  undef popen
168#  define popen _popen
169#  undef pclose
170#  define pclose _pclose
171# endif
172#else
173 /* Make sure isatty() has a prototype. */
174 extern int isatty(int);
175
176# if !defined(__RTP__) && !defined(_WRS_KERNEL)
177  /* popen and pclose are not C89 functions and so are
178  ** sometimes omitted from the <stdio.h> header */
179   extern FILE *popen(const char*,const char*);
180   extern int pclose(FILE*);
181# else
182#  define SQLITE_OMIT_POPEN 1
183# endif
184#endif
185
186#if defined(_WIN32_WCE)
187/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
188 * thus we always assume that we have a console. That can be
189 * overridden with the -batch command line option.
190 */
191#define isatty(x) 1
192#endif
193
194/* ctype macros that work with signed characters */
195#define IsSpace(X)  isspace((unsigned char)X)
196#define IsDigit(X)  isdigit((unsigned char)X)
197#define ToLower(X)  (char)tolower((unsigned char)X)
198
199#if defined(_WIN32) || defined(WIN32)
200#if SQLITE_OS_WINRT
201#include <intrin.h>
202#endif
203#include <windows.h>
204
205/* string conversion routines only needed on Win32 */
206extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
207extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
208extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
209extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
210#endif
211
212/* On Windows, we normally run with output mode of TEXT so that \n characters
213** are automatically translated into \r\n.  However, this behavior needs
214** to be disabled in some cases (ex: when generating CSV output and when
215** rendering quoted strings that contain \n characters).  The following
216** routines take care of that.
217*/
218#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
219static void setBinaryMode(FILE *file, int isOutput){
220  if( isOutput ) fflush(file);
221  _setmode(_fileno(file), _O_BINARY);
222}
223static void setTextMode(FILE *file, int isOutput){
224  if( isOutput ) fflush(file);
225  _setmode(_fileno(file), _O_TEXT);
226}
227#else
228# define setBinaryMode(X,Y)
229# define setTextMode(X,Y)
230#endif
231
232
233/* True if the timer is enabled */
234static int enableTimer = 0;
235
236/* Return the current wall-clock time */
237static sqlite3_int64 timeOfDay(void){
238  static sqlite3_vfs *clockVfs = 0;
239  sqlite3_int64 t;
240  if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
241  if( clockVfs==0 ) return 0;  /* Never actually happens */
242  if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
243    clockVfs->xCurrentTimeInt64(clockVfs, &t);
244  }else{
245    double r;
246    clockVfs->xCurrentTime(clockVfs, &r);
247    t = (sqlite3_int64)(r*86400000.0);
248  }
249  return t;
250}
251
252#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
253#include <sys/time.h>
254#include <sys/resource.h>
255
256/* VxWorks does not support getrusage() as far as we can determine */
257#if defined(_WRS_KERNEL) || defined(__RTP__)
258struct rusage {
259  struct timeval ru_utime; /* user CPU time used */
260  struct timeval ru_stime; /* system CPU time used */
261};
262#define getrusage(A,B) memset(B,0,sizeof(*B))
263#endif
264
265/* Saved resource information for the beginning of an operation */
266static struct rusage sBegin;  /* CPU time at start */
267static sqlite3_int64 iBegin;  /* Wall-clock time at start */
268
269/*
270** Begin timing an operation
271*/
272static void beginTimer(void){
273  if( enableTimer ){
274    getrusage(RUSAGE_SELF, &sBegin);
275    iBegin = timeOfDay();
276  }
277}
278
279/* Return the difference of two time_structs in seconds */
280static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
281  return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
282         (double)(pEnd->tv_sec - pStart->tv_sec);
283}
284
285/*
286** Print the timing results.
287*/
288static void endTimer(void){
289  if( enableTimer ){
290    sqlite3_int64 iEnd = timeOfDay();
291    struct rusage sEnd;
292    getrusage(RUSAGE_SELF, &sEnd);
293    printf("Run Time: real %.3f user %f sys %f\n",
294       (iEnd - iBegin)*0.001,
295       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
296       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
297  }
298}
299
300#define BEGIN_TIMER beginTimer()
301#define END_TIMER endTimer()
302#define HAS_TIMER 1
303
304#elif (defined(_WIN32) || defined(WIN32))
305
306/* Saved resource information for the beginning of an operation */
307static HANDLE hProcess;
308static FILETIME ftKernelBegin;
309static FILETIME ftUserBegin;
310static sqlite3_int64 ftWallBegin;
311typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
312                                    LPFILETIME, LPFILETIME);
313static GETPROCTIMES getProcessTimesAddr = NULL;
314
315/*
316** Check to see if we have timer support.  Return 1 if necessary
317** support found (or found previously).
318*/
319static int hasTimer(void){
320  if( getProcessTimesAddr ){
321    return 1;
322  } else {
323#if !SQLITE_OS_WINRT
324    /* GetProcessTimes() isn't supported in WIN95 and some other Windows
325    ** versions. See if the version we are running on has it, and if it
326    ** does, save off a pointer to it and the current process handle.
327    */
328    hProcess = GetCurrentProcess();
329    if( hProcess ){
330      HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
331      if( NULL != hinstLib ){
332        getProcessTimesAddr =
333            (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
334        if( NULL != getProcessTimesAddr ){
335          return 1;
336        }
337        FreeLibrary(hinstLib);
338      }
339    }
340#endif
341  }
342  return 0;
343}
344
345/*
346** Begin timing an operation
347*/
348static void beginTimer(void){
349  if( enableTimer && getProcessTimesAddr ){
350    FILETIME ftCreation, ftExit;
351    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
352                        &ftKernelBegin,&ftUserBegin);
353    ftWallBegin = timeOfDay();
354  }
355}
356
357/* Return the difference of two FILETIME structs in seconds */
358static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
359  sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
360  sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
361  return (double) ((i64End - i64Start) / 10000000.0);
362}
363
364/*
365** Print the timing results.
366*/
367static void endTimer(void){
368  if( enableTimer && getProcessTimesAddr){
369    FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
370    sqlite3_int64 ftWallEnd = timeOfDay();
371    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
372    printf("Run Time: real %.3f user %f sys %f\n",
373       (ftWallEnd - ftWallBegin)*0.001,
374       timeDiff(&ftUserBegin, &ftUserEnd),
375       timeDiff(&ftKernelBegin, &ftKernelEnd));
376  }
377}
378
379#define BEGIN_TIMER beginTimer()
380#define END_TIMER endTimer()
381#define HAS_TIMER hasTimer()
382
383#else
384#define BEGIN_TIMER
385#define END_TIMER
386#define HAS_TIMER 0
387#endif
388
389/*
390** Used to prevent warnings about unused parameters
391*/
392#define UNUSED_PARAMETER(x) (void)(x)
393
394/*
395** Number of elements in an array
396*/
397#define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
398
399/*
400** If the following flag is set, then command execution stops
401** at an error if we are not interactive.
402*/
403static int bail_on_error = 0;
404
405/*
406** Threat stdin as an interactive input if the following variable
407** is true.  Otherwise, assume stdin is connected to a file or pipe.
408*/
409static int stdin_is_interactive = 1;
410
411/*
412** On Windows systems we have to know if standard output is a console
413** in order to translate UTF-8 into MBCS.  The following variable is
414** true if translation is required.
415*/
416static int stdout_is_console = 1;
417
418/*
419** The following is the open SQLite database.  We make a pointer
420** to this database a static variable so that it can be accessed
421** by the SIGINT handler to interrupt database processing.
422*/
423static sqlite3 *globalDb = 0;
424
425/*
426** True if an interrupt (Control-C) has been received.
427*/
428static volatile int seenInterrupt = 0;
429
430/*
431** This is the name of our program. It is set in main(), used
432** in a number of other places, mostly for error messages.
433*/
434static char *Argv0;
435
436/*
437** Prompt strings. Initialized in main. Settable with
438**   .prompt main continue
439*/
440static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
441static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
442
443/*
444** Render output like fprintf().  Except, if the output is going to the
445** console and if this is running on a Windows machine, translate the
446** output from UTF-8 into MBCS.
447*/
448#if defined(_WIN32) || defined(WIN32)
449void utf8_printf(FILE *out, const char *zFormat, ...){
450  va_list ap;
451  va_start(ap, zFormat);
452  if( stdout_is_console && (out==stdout || out==stderr) ){
453    char *z1 = sqlite3_vmprintf(zFormat, ap);
454    char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
455    sqlite3_free(z1);
456    fputs(z2, out);
457    sqlite3_free(z2);
458  }else{
459    vfprintf(out, zFormat, ap);
460  }
461  va_end(ap);
462}
463#elif !defined(utf8_printf)
464# define utf8_printf fprintf
465#endif
466
467/*
468** Render output like fprintf().  This should not be used on anything that
469** includes string formatting (e.g. "%s").
470*/
471#if !defined(raw_printf)
472# define raw_printf fprintf
473#endif
474
475/* Indicate out-of-memory and exit. */
476static void shell_out_of_memory(void){
477  raw_printf(stderr,"Error: out of memory\n");
478  exit(1);
479}
480
481/* Check a pointer to see if it is NULL.  If it is NULL, exit with an
482** out-of-memory error.
483*/
484static void shell_check_oom(void *p){
485  if( p==0 ) shell_out_of_memory();
486}
487
488/*
489** Write I/O traces to the following stream.
490*/
491#ifdef SQLITE_ENABLE_IOTRACE
492static FILE *iotrace = 0;
493#endif
494
495/*
496** This routine works like printf in that its first argument is a
497** format string and subsequent arguments are values to be substituted
498** in place of % fields.  The result of formatting this string
499** is written to iotrace.
500*/
501#ifdef SQLITE_ENABLE_IOTRACE
502static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
503  va_list ap;
504  char *z;
505  if( iotrace==0 ) return;
506  va_start(ap, zFormat);
507  z = sqlite3_vmprintf(zFormat, ap);
508  va_end(ap);
509  utf8_printf(iotrace, "%s", z);
510  sqlite3_free(z);
511}
512#endif
513
514/*
515** Output string zUtf to stream pOut as w characters.  If w is negative,
516** then right-justify the text.  W is the width in UTF-8 characters, not
517** in bytes.  This is different from the %*.*s specification in printf
518** since with %*.*s the width is measured in bytes, not characters.
519*/
520static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
521  int i;
522  int n;
523  int aw = w<0 ? -w : w;
524  for(i=n=0; zUtf[i]; i++){
525    if( (zUtf[i]&0xc0)!=0x80 ){
526      n++;
527      if( n==aw ){
528        do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
529        break;
530      }
531    }
532  }
533  if( n>=aw ){
534    utf8_printf(pOut, "%.*s", i, zUtf);
535  }else if( w<0 ){
536    utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
537  }else{
538    utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
539  }
540}
541
542
543/*
544** Determines if a string is a number of not.
545*/
546static int isNumber(const char *z, int *realnum){
547  if( *z=='-' || *z=='+' ) z++;
548  if( !IsDigit(*z) ){
549    return 0;
550  }
551  z++;
552  if( realnum ) *realnum = 0;
553  while( IsDigit(*z) ){ z++; }
554  if( *z=='.' ){
555    z++;
556    if( !IsDigit(*z) ) return 0;
557    while( IsDigit(*z) ){ z++; }
558    if( realnum ) *realnum = 1;
559  }
560  if( *z=='e' || *z=='E' ){
561    z++;
562    if( *z=='+' || *z=='-' ) z++;
563    if( !IsDigit(*z) ) return 0;
564    while( IsDigit(*z) ){ z++; }
565    if( realnum ) *realnum = 1;
566  }
567  return *z==0;
568}
569
570/*
571** Compute a string length that is limited to what can be stored in
572** lower 30 bits of a 32-bit signed integer.
573*/
574static int strlen30(const char *z){
575  const char *z2 = z;
576  while( *z2 ){ z2++; }
577  return 0x3fffffff & (int)(z2 - z);
578}
579
580/*
581** Return the length of a string in characters.  Multibyte UTF8 characters
582** count as a single character.
583*/
584static int strlenChar(const char *z){
585  int n = 0;
586  while( *z ){
587    if( (0xc0&*(z++))!=0x80 ) n++;
588  }
589  return n;
590}
591
592/*
593** Return open FILE * if zFile exists, can be opened for read
594** and is an ordinary file or a character stream source.
595** Otherwise return 0.
596*/
597static FILE * openChrSource(const char *zFile){
598#ifdef _WIN32
599  struct _stat x = {0};
600# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
601  /* On Windows, open first, then check the stream nature. This order
602  ** is necessary because _stat() and sibs, when checking a named pipe,
603  ** effectively break the pipe as its supplier sees it. */
604  FILE *rv = fopen(zFile, "rb");
605  if( rv==0 ) return 0;
606  if( _fstat(_fileno(rv), &x) != 0
607      || !STAT_CHR_SRC(x.st_mode)){
608    fclose(rv);
609    rv = 0;
610  }
611  return rv;
612#else
613  struct stat x = {0};
614  int rc = stat(zFile, &x);
615# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
616  if( rc!=0 ) return 0;
617  if( STAT_CHR_SRC(x.st_mode) ){
618    return fopen(zFile, "rb");
619  }else{
620    return 0;
621  }
622#endif
623#undef STAT_CHR_SRC
624}
625
626/*
627** This routine reads a line of text from FILE in, stores
628** the text in memory obtained from malloc() and returns a pointer
629** to the text.  NULL is returned at end of file, or if malloc()
630** fails.
631**
632** If zLine is not NULL then it is a malloced buffer returned from
633** a previous call to this routine that may be reused.
634*/
635static char *local_getline(char *zLine, FILE *in){
636  int nLine = zLine==0 ? 0 : 100;
637  int n = 0;
638
639  while( 1 ){
640    if( n+100>nLine ){
641      nLine = nLine*2 + 100;
642      zLine = realloc(zLine, nLine);
643      shell_check_oom(zLine);
644    }
645    if( fgets(&zLine[n], nLine - n, in)==0 ){
646      if( n==0 ){
647        free(zLine);
648        return 0;
649      }
650      zLine[n] = 0;
651      break;
652    }
653    while( zLine[n] ) n++;
654    if( n>0 && zLine[n-1]=='\n' ){
655      n--;
656      if( n>0 && zLine[n-1]=='\r' ) n--;
657      zLine[n] = 0;
658      break;
659    }
660  }
661#if defined(_WIN32) || defined(WIN32)
662  /* For interactive input on Windows systems, translate the
663  ** multi-byte characterset characters into UTF-8. */
664  if( stdin_is_interactive && in==stdin ){
665    char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
666    if( zTrans ){
667      int nTrans = strlen30(zTrans)+1;
668      if( nTrans>nLine ){
669        zLine = realloc(zLine, nTrans);
670        shell_check_oom(zLine);
671      }
672      memcpy(zLine, zTrans, nTrans);
673      sqlite3_free(zTrans);
674    }
675  }
676#endif /* defined(_WIN32) || defined(WIN32) */
677  return zLine;
678}
679
680/*
681** Retrieve a single line of input text.
682**
683** If in==0 then read from standard input and prompt before each line.
684** If isContinuation is true, then a continuation prompt is appropriate.
685** If isContinuation is zero, then the main prompt should be used.
686**
687** If zPrior is not NULL then it is a buffer from a prior call to this
688** routine that can be reused.
689**
690** The result is stored in space obtained from malloc() and must either
691** be freed by the caller or else passed back into this routine via the
692** zPrior argument for reuse.
693*/
694static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
695  char *zPrompt;
696  char *zResult;
697  if( in!=0 ){
698    zResult = local_getline(zPrior, in);
699  }else{
700    zPrompt = isContinuation ? continuePrompt : mainPrompt;
701#if SHELL_USE_LOCAL_GETLINE
702    printf("%s", zPrompt);
703    fflush(stdout);
704    zResult = local_getline(zPrior, stdin);
705#else
706    free(zPrior);
707    zResult = shell_readline(zPrompt);
708    if( zResult && *zResult ) shell_add_history(zResult);
709#endif
710  }
711  return zResult;
712}
713
714
715/*
716** Return the value of a hexadecimal digit.  Return -1 if the input
717** is not a hex digit.
718*/
719static int hexDigitValue(char c){
720  if( c>='0' && c<='9' ) return c - '0';
721  if( c>='a' && c<='f' ) return c - 'a' + 10;
722  if( c>='A' && c<='F' ) return c - 'A' + 10;
723  return -1;
724}
725
726/*
727** Interpret zArg as an integer value, possibly with suffixes.
728*/
729static sqlite3_int64 integerValue(const char *zArg){
730  sqlite3_int64 v = 0;
731  static const struct { char *zSuffix; int iMult; } aMult[] = {
732    { "KiB", 1024 },
733    { "MiB", 1024*1024 },
734    { "GiB", 1024*1024*1024 },
735    { "KB",  1000 },
736    { "MB",  1000000 },
737    { "GB",  1000000000 },
738    { "K",   1000 },
739    { "M",   1000000 },
740    { "G",   1000000000 },
741  };
742  int i;
743  int isNeg = 0;
744  if( zArg[0]=='-' ){
745    isNeg = 1;
746    zArg++;
747  }else if( zArg[0]=='+' ){
748    zArg++;
749  }
750  if( zArg[0]=='0' && zArg[1]=='x' ){
751    int x;
752    zArg += 2;
753    while( (x = hexDigitValue(zArg[0]))>=0 ){
754      v = (v<<4) + x;
755      zArg++;
756    }
757  }else{
758    while( IsDigit(zArg[0]) ){
759      v = v*10 + zArg[0] - '0';
760      zArg++;
761    }
762  }
763  for(i=0; i<ArraySize(aMult); i++){
764    if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
765      v *= aMult[i].iMult;
766      break;
767    }
768  }
769  return isNeg? -v : v;
770}
771
772/*
773** A variable length string to which one can append text.
774*/
775typedef struct ShellText ShellText;
776struct ShellText {
777  char *z;
778  int n;
779  int nAlloc;
780};
781
782/*
783** Initialize and destroy a ShellText object
784*/
785static void initText(ShellText *p){
786  memset(p, 0, sizeof(*p));
787}
788static void freeText(ShellText *p){
789  free(p->z);
790  initText(p);
791}
792
793/* zIn is either a pointer to a NULL-terminated string in memory obtained
794** from malloc(), or a NULL pointer. The string pointed to by zAppend is
795** added to zIn, and the result returned in memory obtained from malloc().
796** zIn, if it was not NULL, is freed.
797**
798** If the third argument, quote, is not '\0', then it is used as a
799** quote character for zAppend.
800*/
801static void appendText(ShellText *p, char const *zAppend, char quote){
802  int len;
803  int i;
804  int nAppend = strlen30(zAppend);
805
806  len = nAppend+p->n+1;
807  if( quote ){
808    len += 2;
809    for(i=0; i<nAppend; i++){
810      if( zAppend[i]==quote ) len++;
811    }
812  }
813
814  if( p->z==0 || p->n+len>=p->nAlloc ){
815    p->nAlloc = p->nAlloc*2 + len + 20;
816    p->z = realloc(p->z, p->nAlloc);
817    shell_check_oom(p->z);
818  }
819
820  if( quote ){
821    char *zCsr = p->z+p->n;
822    *zCsr++ = quote;
823    for(i=0; i<nAppend; i++){
824      *zCsr++ = zAppend[i];
825      if( zAppend[i]==quote ) *zCsr++ = quote;
826    }
827    *zCsr++ = quote;
828    p->n = (int)(zCsr - p->z);
829    *zCsr = '\0';
830  }else{
831    memcpy(p->z+p->n, zAppend, nAppend);
832    p->n += nAppend;
833    p->z[p->n] = '\0';
834  }
835}
836
837/*
838** Attempt to determine if identifier zName needs to be quoted, either
839** because it contains non-alphanumeric characters, or because it is an
840** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
841** that quoting is required.
842**
843** Return '"' if quoting is required.  Return 0 if no quoting is required.
844*/
845static char quoteChar(const char *zName){
846  int i;
847  if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
848  for(i=0; zName[i]; i++){
849    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
850  }
851  return sqlite3_keyword_check(zName, i) ? '"' : 0;
852}
853
854/*
855** Construct a fake object name and column list to describe the structure
856** of the view, virtual table, or table valued function zSchema.zName.
857*/
858static char *shellFakeSchema(
859  sqlite3 *db,            /* The database connection containing the vtab */
860  const char *zSchema,    /* Schema of the database holding the vtab */
861  const char *zName       /* The name of the virtual table */
862){
863  sqlite3_stmt *pStmt = 0;
864  char *zSql;
865  ShellText s;
866  char cQuote;
867  char *zDiv = "(";
868  int nRow = 0;
869
870  zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
871                         zSchema ? zSchema : "main", zName);
872  shell_check_oom(zSql);
873  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
874  sqlite3_free(zSql);
875  initText(&s);
876  if( zSchema ){
877    cQuote = quoteChar(zSchema);
878    if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
879    appendText(&s, zSchema, cQuote);
880    appendText(&s, ".", 0);
881  }
882  cQuote = quoteChar(zName);
883  appendText(&s, zName, cQuote);
884  while( sqlite3_step(pStmt)==SQLITE_ROW ){
885    const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
886    nRow++;
887    appendText(&s, zDiv, 0);
888    zDiv = ",";
889    if( zCol==0 ) zCol = "";
890    cQuote = quoteChar(zCol);
891    appendText(&s, zCol, cQuote);
892  }
893  appendText(&s, ")", 0);
894  sqlite3_finalize(pStmt);
895  if( nRow==0 ){
896    freeText(&s);
897    s.z = 0;
898  }
899  return s.z;
900}
901
902/*
903** SQL function:  shell_module_schema(X)
904**
905** Return a fake schema for the table-valued function or eponymous virtual
906** table X.
907*/
908static void shellModuleSchema(
909  sqlite3_context *pCtx,
910  int nVal,
911  sqlite3_value **apVal
912){
913  const char *zName;
914  char *zFake;
915  UNUSED_PARAMETER(nVal);
916  zName = (const char*)sqlite3_value_text(apVal[0]);
917  zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
918  if( zFake ){
919    sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
920                        -1, sqlite3_free);
921    free(zFake);
922  }
923}
924
925/*
926** SQL function:  shell_add_schema(S,X)
927**
928** Add the schema name X to the CREATE statement in S and return the result.
929** Examples:
930**
931**    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
932**
933** Also works on
934**
935**    CREATE INDEX
936**    CREATE UNIQUE INDEX
937**    CREATE VIEW
938**    CREATE TRIGGER
939**    CREATE VIRTUAL TABLE
940**
941** This UDF is used by the .schema command to insert the schema name of
942** attached databases into the middle of the sqlite_schema.sql field.
943*/
944static void shellAddSchemaName(
945  sqlite3_context *pCtx,
946  int nVal,
947  sqlite3_value **apVal
948){
949  static const char *aPrefix[] = {
950     "TABLE",
951     "INDEX",
952     "UNIQUE INDEX",
953     "VIEW",
954     "TRIGGER",
955     "VIRTUAL TABLE"
956  };
957  int i = 0;
958  const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
959  const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
960  const char *zName = (const char*)sqlite3_value_text(apVal[2]);
961  sqlite3 *db = sqlite3_context_db_handle(pCtx);
962  UNUSED_PARAMETER(nVal);
963  if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
964    for(i=0; i<ArraySize(aPrefix); i++){
965      int n = strlen30(aPrefix[i]);
966      if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
967        char *z = 0;
968        char *zFake = 0;
969        if( zSchema ){
970          char cQuote = quoteChar(zSchema);
971          if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
972            z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
973          }else{
974            z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
975          }
976        }
977        if( zName
978         && aPrefix[i][0]=='V'
979         && (zFake = shellFakeSchema(db, zSchema, zName))!=0
980        ){
981          if( z==0 ){
982            z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
983          }else{
984            z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
985          }
986          free(zFake);
987        }
988        if( z ){
989          sqlite3_result_text(pCtx, z, -1, sqlite3_free);
990          return;
991        }
992      }
993    }
994  }
995  sqlite3_result_value(pCtx, apVal[0]);
996}
997
998/*
999** The source code for several run-time loadable extensions is inserted
1000** below by the ../tool/mkshellc.tcl script.  Before processing that included
1001** code, we need to override some macros to make the included program code
1002** work here in the middle of this regular program.
1003*/
1004#define SQLITE_EXTENSION_INIT1
1005#define SQLITE_EXTENSION_INIT2(X) (void)(X)
1006
1007#if defined(_WIN32) && defined(_MSC_VER)
1008INCLUDE test_windirent.h
1009INCLUDE test_windirent.c
1010#define dirent DIRENT
1011#endif
1012INCLUDE ../ext/misc/shathree.c
1013INCLUDE ../ext/misc/fileio.c
1014INCLUDE ../ext/misc/completion.c
1015INCLUDE ../ext/misc/appendvfs.c
1016INCLUDE ../ext/misc/memtrace.c
1017INCLUDE ../ext/misc/uint.c
1018INCLUDE ../ext/misc/decimal.c
1019INCLUDE ../ext/misc/ieee754.c
1020INCLUDE ../ext/misc/series.c
1021INCLUDE ../ext/misc/regexp.c
1022#ifdef SQLITE_HAVE_ZLIB
1023INCLUDE ../ext/misc/zipfile.c
1024INCLUDE ../ext/misc/sqlar.c
1025#endif
1026INCLUDE ../ext/expert/sqlite3expert.h
1027INCLUDE ../ext/expert/sqlite3expert.c
1028
1029#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
1030INCLUDE ../ext/misc/dbdata.c
1031#endif
1032
1033#if defined(SQLITE_ENABLE_SESSION)
1034/*
1035** State information for a single open session
1036*/
1037typedef struct OpenSession OpenSession;
1038struct OpenSession {
1039  char *zName;             /* Symbolic name for this session */
1040  int nFilter;             /* Number of xFilter rejection GLOB patterns */
1041  char **azFilter;         /* Array of xFilter rejection GLOB patterns */
1042  sqlite3_session *p;      /* The open session */
1043};
1044#endif
1045
1046typedef struct ExpertInfo ExpertInfo;
1047struct ExpertInfo {
1048  sqlite3expert *pExpert;
1049  int bVerbose;
1050};
1051
1052/* A single line in the EQP output */
1053typedef struct EQPGraphRow EQPGraphRow;
1054struct EQPGraphRow {
1055  int iEqpId;           /* ID for this row */
1056  int iParentId;        /* ID of the parent row */
1057  EQPGraphRow *pNext;   /* Next row in sequence */
1058  char zText[1];        /* Text to display for this row */
1059};
1060
1061/* All EQP output is collected into an instance of the following */
1062typedef struct EQPGraph EQPGraph;
1063struct EQPGraph {
1064  EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
1065  EQPGraphRow *pLast;   /* Last element of the pRow list */
1066  char zPrefix[100];    /* Graph prefix */
1067};
1068
1069/* Parameters affecting columnar mode result display (defaulting together) */
1070typedef struct ColModeOpts {
1071  int iWrap;            /* In columnar modes, wrap lines reaching this limit */
1072  u8 bQuote;            /* Quote results for .mode box and table */
1073  u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
1074} ColModeOpts;
1075#define ColModeOpts_default { 60, 0, 0 }
1076#define ColModeOpts_default_qbox { 60, 1, 0 }
1077
1078/*
1079** State information about the database connection is contained in an
1080** instance of the following structure.
1081*/
1082typedef struct ShellState ShellState;
1083struct ShellState {
1084  sqlite3 *db;           /* The database */
1085  u8 autoExplain;        /* Automatically turn on .explain mode */
1086  u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1087  u8 autoEQPtest;        /* autoEQP is in test mode */
1088  u8 autoEQPtrace;       /* autoEQP is in trace mode */
1089  u8 scanstatsOn;        /* True to display scan stats before each finalize */
1090  u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1091  u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
1092  u8 nEqpLevel;          /* Depth of the EQP output graph */
1093  u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
1094  u8 bSafeMode;          /* True to prohibit unsafe operations */
1095  u8 bSafeModePersist;   /* The long-term value of bSafeMode */
1096  ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
1097  unsigned statsOn;      /* True to display memory stats before each finalize */
1098  unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
1099  int inputNesting;      /* Track nesting level of .read and other redirects */
1100  int outCount;          /* Revert to stdout when reaching zero */
1101  int cnt;               /* Number of records displayed so far */
1102  int lineno;            /* Line number of last line read from in */
1103  int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
1104  FILE *in;              /* Read commands from this stream */
1105  FILE *out;             /* Write results here */
1106  FILE *traceOut;        /* Output for sqlite3_trace() */
1107  int nErr;              /* Number of errors seen */
1108  int mode;              /* An output mode setting */
1109  int modePrior;         /* Saved mode */
1110  int cMode;             /* temporary output mode for the current query */
1111  int normalMode;        /* Output mode before ".explain on" */
1112  int writableSchema;    /* True if PRAGMA writable_schema=ON */
1113  int showHeader;        /* True to show column names in List or Column mode */
1114  int nCheck;            /* Number of ".check" commands run */
1115  unsigned nProgress;    /* Number of progress callbacks encountered */
1116  unsigned mxProgress;   /* Maximum progress callbacks before failing */
1117  unsigned flgProgress;  /* Flags for the progress callback */
1118  unsigned shellFlgs;    /* Various flags */
1119  unsigned priorShFlgs;  /* Saved copy of flags */
1120  sqlite3_int64 szMax;   /* --maxsize argument to .open */
1121  char *zDestTable;      /* Name of destination table when MODE_Insert */
1122  char *zTempFile;       /* Temporary file that might need deleting */
1123  char zTestcase[30];    /* Name of current test case */
1124  char colSeparator[20]; /* Column separator character for several modes */
1125  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1126  char colSepPrior[20];  /* Saved column separator */
1127  char rowSepPrior[20];  /* Saved row separator */
1128  int *colWidth;         /* Requested width of each column in columnar modes */
1129  int *actualWidth;      /* Actual width of each column */
1130  int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
1131  char nullValue[20];    /* The text to print when a NULL comes back from
1132                         ** the database */
1133  char outfile[FILENAME_MAX]; /* Filename for *out */
1134  sqlite3_stmt *pStmt;   /* Current statement if any. */
1135  FILE *pLog;            /* Write log output here */
1136  struct AuxDb {         /* Storage space for auxiliary database connections */
1137    sqlite3 *db;               /* Connection pointer */
1138    const char *zDbFilename;   /* Filename used to open the connection */
1139    char *zFreeOnClose;        /* Free this memory allocation on close */
1140#if defined(SQLITE_ENABLE_SESSION)
1141    int nSession;              /* Number of active sessions */
1142    OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
1143#endif
1144  } aAuxDb[5],           /* Array of all database connections */
1145    *pAuxDb;             /* Currently active database connection */
1146  int *aiIndent;         /* Array of indents used in MODE_Explain */
1147  int nIndent;           /* Size of array aiIndent[] */
1148  int iIndent;           /* Index of current op in aiIndent[] */
1149  char *zNonce;          /* Nonce for temporary safe-mode excapes */
1150  EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
1151  ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
1152};
1153
1154
1155/* Allowed values for ShellState.autoEQP
1156*/
1157#define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
1158#define AUTOEQP_on       1           /* Automatic EQP is on */
1159#define AUTOEQP_trigger  2           /* On and also show plans for triggers */
1160#define AUTOEQP_full     3           /* Show full EXPLAIN */
1161
1162/* Allowed values for ShellState.openMode
1163*/
1164#define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
1165#define SHELL_OPEN_NORMAL      1      /* Normal database file */
1166#define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
1167#define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
1168#define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
1169#define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
1170#define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
1171
1172/* Allowed values for ShellState.eTraceType
1173*/
1174#define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
1175#define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
1176#define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
1177
1178/* Bits in the ShellState.flgProgress variable */
1179#define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
1180#define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
1181                                   ** callback limit is reached, and for each
1182                                   ** top-level SQL statement */
1183#define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
1184
1185/*
1186** These are the allowed shellFlgs values
1187*/
1188#define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
1189#define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
1190#define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
1191#define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
1192#define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
1193#define SHFLG_CountChanges   0x00000020 /* .changes setting */
1194#define SHFLG_Echo           0x00000040 /* .echo or --echo setting */
1195#define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
1196#define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
1197#define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
1198
1199/*
1200** Macros for testing and setting shellFlgs
1201*/
1202#define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
1203#define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
1204#define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
1205
1206/*
1207** These are the allowed modes.
1208*/
1209#define MODE_Line     0  /* One column per line.  Blank line between records */
1210#define MODE_Column   1  /* One record per line in neat columns */
1211#define MODE_List     2  /* One record per line with a separator */
1212#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
1213#define MODE_Html     4  /* Generate an XHTML table */
1214#define MODE_Insert   5  /* Generate SQL "insert" statements */
1215#define MODE_Quote    6  /* Quote values as for SQL */
1216#define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
1217#define MODE_Csv      8  /* Quote strings, numbers are plain */
1218#define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
1219#define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
1220#define MODE_Pretty  11  /* Pretty-print schemas */
1221#define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
1222#define MODE_Json    13  /* Output JSON */
1223#define MODE_Markdown 14 /* Markdown formatting */
1224#define MODE_Table   15  /* MySQL-style table formatting */
1225#define MODE_Box     16  /* Unicode box-drawing characters */
1226#define MODE_Count   17  /* Output only a count of the rows of output */
1227#define MODE_Off     18  /* No query output shown */
1228
1229static const char *modeDescr[] = {
1230  "line",
1231  "column",
1232  "list",
1233  "semi",
1234  "html",
1235  "insert",
1236  "quote",
1237  "tcl",
1238  "csv",
1239  "explain",
1240  "ascii",
1241  "prettyprint",
1242  "eqp",
1243  "json",
1244  "markdown",
1245  "table",
1246  "box",
1247  "count",
1248  "off"
1249};
1250
1251/*
1252** These are the column/row/line separators used by the various
1253** import/export modes.
1254*/
1255#define SEP_Column    "|"
1256#define SEP_Row       "\n"
1257#define SEP_Tab       "\t"
1258#define SEP_Space     " "
1259#define SEP_Comma     ","
1260#define SEP_CrLf      "\r\n"
1261#define SEP_Unit      "\x1F"
1262#define SEP_Record    "\x1E"
1263
1264/*
1265** Limit input nesting via .read or any other input redirect.
1266** It's not too expensive, so a generous allowance can be made.
1267*/
1268#define MAX_INPUT_NESTING 25
1269
1270/*
1271** A callback for the sqlite3_log() interface.
1272*/
1273static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1274  ShellState *p = (ShellState*)pArg;
1275  if( p->pLog==0 ) return;
1276  utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1277  fflush(p->pLog);
1278}
1279
1280/*
1281** SQL function:  shell_putsnl(X)
1282**
1283** Write the text X to the screen (or whatever output is being directed)
1284** adding a newline at the end, and then return X.
1285*/
1286static void shellPutsFunc(
1287  sqlite3_context *pCtx,
1288  int nVal,
1289  sqlite3_value **apVal
1290){
1291  ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1292  (void)nVal;
1293  utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1294  sqlite3_result_value(pCtx, apVal[0]);
1295}
1296
1297/*
1298** If in safe mode, print an error message described by the arguments
1299** and exit immediately.
1300*/
1301static void failIfSafeMode(
1302  ShellState *p,
1303  const char *zErrMsg,
1304  ...
1305){
1306  if( p->bSafeMode ){
1307    va_list ap;
1308    char *zMsg;
1309    va_start(ap, zErrMsg);
1310    zMsg = sqlite3_vmprintf(zErrMsg, ap);
1311    va_end(ap);
1312    raw_printf(stderr, "line %d: ", p->lineno);
1313    utf8_printf(stderr, "%s\n", zMsg);
1314    exit(1);
1315  }
1316}
1317
1318/*
1319** SQL function:   edit(VALUE)
1320**                 edit(VALUE,EDITOR)
1321**
1322** These steps:
1323**
1324**     (1) Write VALUE into a temporary file.
1325**     (2) Run program EDITOR on that temporary file.
1326**     (3) Read the temporary file back and return its content as the result.
1327**     (4) Delete the temporary file
1328**
1329** If the EDITOR argument is omitted, use the value in the VISUAL
1330** environment variable.  If still there is no EDITOR, through an error.
1331**
1332** Also throw an error if the EDITOR program returns a non-zero exit code.
1333*/
1334#ifndef SQLITE_NOHAVE_SYSTEM
1335static void editFunc(
1336  sqlite3_context *context,
1337  int argc,
1338  sqlite3_value **argv
1339){
1340  const char *zEditor;
1341  char *zTempFile = 0;
1342  sqlite3 *db;
1343  char *zCmd = 0;
1344  int bBin;
1345  int rc;
1346  int hasCRNL = 0;
1347  FILE *f = 0;
1348  sqlite3_int64 sz;
1349  sqlite3_int64 x;
1350  unsigned char *p = 0;
1351
1352  if( argc==2 ){
1353    zEditor = (const char*)sqlite3_value_text(argv[1]);
1354  }else{
1355    zEditor = getenv("VISUAL");
1356  }
1357  if( zEditor==0 ){
1358    sqlite3_result_error(context, "no editor for edit()", -1);
1359    return;
1360  }
1361  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1362    sqlite3_result_error(context, "NULL input to edit()", -1);
1363    return;
1364  }
1365  db = sqlite3_context_db_handle(context);
1366  zTempFile = 0;
1367  sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1368  if( zTempFile==0 ){
1369    sqlite3_uint64 r = 0;
1370    sqlite3_randomness(sizeof(r), &r);
1371    zTempFile = sqlite3_mprintf("temp%llx", r);
1372    if( zTempFile==0 ){
1373      sqlite3_result_error_nomem(context);
1374      return;
1375    }
1376  }
1377  bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1378  /* When writing the file to be edited, do \n to \r\n conversions on systems
1379  ** that want \r\n line endings */
1380  f = fopen(zTempFile, bBin ? "wb" : "w");
1381  if( f==0 ){
1382    sqlite3_result_error(context, "edit() cannot open temp file", -1);
1383    goto edit_func_end;
1384  }
1385  sz = sqlite3_value_bytes(argv[0]);
1386  if( bBin ){
1387    x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
1388  }else{
1389    const char *z = (const char*)sqlite3_value_text(argv[0]);
1390    /* Remember whether or not the value originally contained \r\n */
1391    if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
1392    x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
1393  }
1394  fclose(f);
1395  f = 0;
1396  if( x!=sz ){
1397    sqlite3_result_error(context, "edit() could not write the whole file", -1);
1398    goto edit_func_end;
1399  }
1400  zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1401  if( zCmd==0 ){
1402    sqlite3_result_error_nomem(context);
1403    goto edit_func_end;
1404  }
1405  rc = system(zCmd);
1406  sqlite3_free(zCmd);
1407  if( rc ){
1408    sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1409    goto edit_func_end;
1410  }
1411  f = fopen(zTempFile, "rb");
1412  if( f==0 ){
1413    sqlite3_result_error(context,
1414      "edit() cannot reopen temp file after edit", -1);
1415    goto edit_func_end;
1416  }
1417  fseek(f, 0, SEEK_END);
1418  sz = ftell(f);
1419  rewind(f);
1420  p = sqlite3_malloc64( sz+1 );
1421  if( p==0 ){
1422    sqlite3_result_error_nomem(context);
1423    goto edit_func_end;
1424  }
1425  x = fread(p, 1, (size_t)sz, f);
1426  fclose(f);
1427  f = 0;
1428  if( x!=sz ){
1429    sqlite3_result_error(context, "could not read back the whole file", -1);
1430    goto edit_func_end;
1431  }
1432  if( bBin ){
1433    sqlite3_result_blob64(context, p, sz, sqlite3_free);
1434  }else{
1435    sqlite3_int64 i, j;
1436    if( hasCRNL ){
1437      /* If the original contains \r\n then do no conversions back to \n */
1438    }else{
1439      /* If the file did not originally contain \r\n then convert any new
1440      ** \r\n back into \n */
1441      for(i=j=0; i<sz; i++){
1442        if( p[i]=='\r' && p[i+1]=='\n' ) i++;
1443        p[j++] = p[i];
1444      }
1445      sz = j;
1446      p[sz] = 0;
1447    }
1448    sqlite3_result_text64(context, (const char*)p, sz,
1449                          sqlite3_free, SQLITE_UTF8);
1450  }
1451  p = 0;
1452
1453edit_func_end:
1454  if( f ) fclose(f);
1455  unlink(zTempFile);
1456  sqlite3_free(zTempFile);
1457  sqlite3_free(p);
1458}
1459#endif /* SQLITE_NOHAVE_SYSTEM */
1460
1461/*
1462** Save or restore the current output mode
1463*/
1464static void outputModePush(ShellState *p){
1465  p->modePrior = p->mode;
1466  p->priorShFlgs = p->shellFlgs;
1467  memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1468  memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1469}
1470static void outputModePop(ShellState *p){
1471  p->mode = p->modePrior;
1472  p->shellFlgs = p->priorShFlgs;
1473  memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1474  memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1475}
1476
1477/*
1478** Output the given string as a hex-encoded blob (eg. X'1234' )
1479*/
1480static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1481  int i;
1482  char *zBlob = (char *)pBlob;
1483  raw_printf(out,"X'");
1484  for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1485  raw_printf(out,"'");
1486}
1487
1488/*
1489** Find a string that is not found anywhere in z[].  Return a pointer
1490** to that string.
1491**
1492** Try to use zA and zB first.  If both of those are already found in z[]
1493** then make up some string and store it in the buffer zBuf.
1494*/
1495static const char *unused_string(
1496  const char *z,                    /* Result must not appear anywhere in z */
1497  const char *zA, const char *zB,   /* Try these first */
1498  char *zBuf                        /* Space to store a generated string */
1499){
1500  unsigned i = 0;
1501  if( strstr(z, zA)==0 ) return zA;
1502  if( strstr(z, zB)==0 ) return zB;
1503  do{
1504    sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1505  }while( strstr(z,zBuf)!=0 );
1506  return zBuf;
1507}
1508
1509/*
1510** Output the given string as a quoted string using SQL quoting conventions.
1511**
1512** See also: output_quoted_escaped_string()
1513*/
1514static void output_quoted_string(FILE *out, const char *z){
1515  int i;
1516  char c;
1517  setBinaryMode(out, 1);
1518  for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1519  if( c==0 ){
1520    utf8_printf(out,"'%s'",z);
1521  }else{
1522    raw_printf(out, "'");
1523    while( *z ){
1524      for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1525      if( c=='\'' ) i++;
1526      if( i ){
1527        utf8_printf(out, "%.*s", i, z);
1528        z += i;
1529      }
1530      if( c=='\'' ){
1531        raw_printf(out, "'");
1532        continue;
1533      }
1534      if( c==0 ){
1535        break;
1536      }
1537      z++;
1538    }
1539    raw_printf(out, "'");
1540  }
1541  setTextMode(out, 1);
1542}
1543
1544/*
1545** Output the given string as a quoted string using SQL quoting conventions.
1546** Additionallly , escape the "\n" and "\r" characters so that they do not
1547** get corrupted by end-of-line translation facilities in some operating
1548** systems.
1549**
1550** This is like output_quoted_string() but with the addition of the \r\n
1551** escape mechanism.
1552*/
1553static void output_quoted_escaped_string(FILE *out, const char *z){
1554  int i;
1555  char c;
1556  setBinaryMode(out, 1);
1557  for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1558  if( c==0 ){
1559    utf8_printf(out,"'%s'",z);
1560  }else{
1561    const char *zNL = 0;
1562    const char *zCR = 0;
1563    int nNL = 0;
1564    int nCR = 0;
1565    char zBuf1[20], zBuf2[20];
1566    for(i=0; z[i]; i++){
1567      if( z[i]=='\n' ) nNL++;
1568      if( z[i]=='\r' ) nCR++;
1569    }
1570    if( nNL ){
1571      raw_printf(out, "replace(");
1572      zNL = unused_string(z, "\\n", "\\012", zBuf1);
1573    }
1574    if( nCR ){
1575      raw_printf(out, "replace(");
1576      zCR = unused_string(z, "\\r", "\\015", zBuf2);
1577    }
1578    raw_printf(out, "'");
1579    while( *z ){
1580      for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1581      if( c=='\'' ) i++;
1582      if( i ){
1583        utf8_printf(out, "%.*s", i, z);
1584        z += i;
1585      }
1586      if( c=='\'' ){
1587        raw_printf(out, "'");
1588        continue;
1589      }
1590      if( c==0 ){
1591        break;
1592      }
1593      z++;
1594      if( c=='\n' ){
1595        raw_printf(out, "%s", zNL);
1596        continue;
1597      }
1598      raw_printf(out, "%s", zCR);
1599    }
1600    raw_printf(out, "'");
1601    if( nCR ){
1602      raw_printf(out, ",'%s',char(13))", zCR);
1603    }
1604    if( nNL ){
1605      raw_printf(out, ",'%s',char(10))", zNL);
1606    }
1607  }
1608  setTextMode(out, 1);
1609}
1610
1611/*
1612** Output the given string as a quoted according to C or TCL quoting rules.
1613*/
1614static void output_c_string(FILE *out, const char *z){
1615  unsigned int c;
1616  fputc('"', out);
1617  while( (c = *(z++))!=0 ){
1618    if( c=='\\' ){
1619      fputc(c, out);
1620      fputc(c, out);
1621    }else if( c=='"' ){
1622      fputc('\\', out);
1623      fputc('"', out);
1624    }else if( c=='\t' ){
1625      fputc('\\', out);
1626      fputc('t', out);
1627    }else if( c=='\n' ){
1628      fputc('\\', out);
1629      fputc('n', out);
1630    }else if( c=='\r' ){
1631      fputc('\\', out);
1632      fputc('r', out);
1633    }else if( !isprint(c&0xff) ){
1634      raw_printf(out, "\\%03o", c&0xff);
1635    }else{
1636      fputc(c, out);
1637    }
1638  }
1639  fputc('"', out);
1640}
1641
1642/*
1643** Output the given string as a quoted according to JSON quoting rules.
1644*/
1645static void output_json_string(FILE *out, const char *z, int n){
1646  unsigned int c;
1647  if( n<0 ) n = (int)strlen(z);
1648  fputc('"', out);
1649  while( n-- ){
1650    c = *(z++);
1651    if( c=='\\' || c=='"' ){
1652      fputc('\\', out);
1653      fputc(c, out);
1654    }else if( c<=0x1f ){
1655      fputc('\\', out);
1656      if( c=='\b' ){
1657        fputc('b', out);
1658      }else if( c=='\f' ){
1659        fputc('f', out);
1660      }else if( c=='\n' ){
1661        fputc('n', out);
1662      }else if( c=='\r' ){
1663        fputc('r', out);
1664      }else if( c=='\t' ){
1665        fputc('t', out);
1666      }else{
1667         raw_printf(out, "u%04x",c);
1668      }
1669    }else{
1670      fputc(c, out);
1671    }
1672  }
1673  fputc('"', out);
1674}
1675
1676/*
1677** Output the given string with characters that are special to
1678** HTML escaped.
1679*/
1680static void output_html_string(FILE *out, const char *z){
1681  int i;
1682  if( z==0 ) z = "";
1683  while( *z ){
1684    for(i=0;   z[i]
1685            && z[i]!='<'
1686            && z[i]!='&'
1687            && z[i]!='>'
1688            && z[i]!='\"'
1689            && z[i]!='\'';
1690        i++){}
1691    if( i>0 ){
1692      utf8_printf(out,"%.*s",i,z);
1693    }
1694    if( z[i]=='<' ){
1695      raw_printf(out,"&lt;");
1696    }else if( z[i]=='&' ){
1697      raw_printf(out,"&amp;");
1698    }else if( z[i]=='>' ){
1699      raw_printf(out,"&gt;");
1700    }else if( z[i]=='\"' ){
1701      raw_printf(out,"&quot;");
1702    }else if( z[i]=='\'' ){
1703      raw_printf(out,"&#39;");
1704    }else{
1705      break;
1706    }
1707    z += i + 1;
1708  }
1709}
1710
1711/*
1712** If a field contains any character identified by a 1 in the following
1713** array, then the string must be quoted for CSV.
1714*/
1715static const char needCsvQuote[] = {
1716  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1717  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1718  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
1719  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1720  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1721  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1722  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1723  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
1724  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1725  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1726  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1727  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1728  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1729  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1730  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1731  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1732};
1733
1734/*
1735** Output a single term of CSV.  Actually, p->colSeparator is used for
1736** the separator, which may or may not be a comma.  p->nullValue is
1737** the null value.  Strings are quoted if necessary.  The separator
1738** is only issued if bSep is true.
1739*/
1740static void output_csv(ShellState *p, const char *z, int bSep){
1741  FILE *out = p->out;
1742  if( z==0 ){
1743    utf8_printf(out,"%s",p->nullValue);
1744  }else{
1745    unsigned i;
1746    for(i=0; z[i]; i++){
1747      if( needCsvQuote[((unsigned char*)z)[i]] ){
1748        i = 0;
1749        break;
1750      }
1751    }
1752    if( i==0 || strstr(z, p->colSeparator)!=0 ){
1753      char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1754      shell_check_oom(zQuoted);
1755      utf8_printf(out, "%s", zQuoted);
1756      sqlite3_free(zQuoted);
1757    }else{
1758      utf8_printf(out, "%s", z);
1759    }
1760  }
1761  if( bSep ){
1762    utf8_printf(p->out, "%s", p->colSeparator);
1763  }
1764}
1765
1766/*
1767** This routine runs when the user presses Ctrl-C
1768*/
1769static void interrupt_handler(int NotUsed){
1770  UNUSED_PARAMETER(NotUsed);
1771  seenInterrupt++;
1772  if( seenInterrupt>2 ) exit(1);
1773  if( globalDb ) sqlite3_interrupt(globalDb);
1774}
1775
1776#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1777/*
1778** This routine runs for console events (e.g. Ctrl-C) on Win32
1779*/
1780static BOOL WINAPI ConsoleCtrlHandler(
1781  DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1782){
1783  if( dwCtrlType==CTRL_C_EVENT ){
1784    interrupt_handler(0);
1785    return TRUE;
1786  }
1787  return FALSE;
1788}
1789#endif
1790
1791#ifndef SQLITE_OMIT_AUTHORIZATION
1792/*
1793** This authorizer runs in safe mode.
1794*/
1795static int safeModeAuth(
1796  void *pClientData,
1797  int op,
1798  const char *zA1,
1799  const char *zA2,
1800  const char *zA3,
1801  const char *zA4
1802){
1803  ShellState *p = (ShellState*)pClientData;
1804  static const char *azProhibitedFunctions[] = {
1805    "edit",
1806    "fts3_tokenizer",
1807    "load_extension",
1808    "readfile",
1809    "writefile",
1810    "zipfile",
1811    "zipfile_cds",
1812  };
1813  UNUSED_PARAMETER(zA2);
1814  UNUSED_PARAMETER(zA3);
1815  UNUSED_PARAMETER(zA4);
1816  switch( op ){
1817    case SQLITE_ATTACH: {
1818      failIfSafeMode(p, "cannot run ATTACH in safe mode");
1819      break;
1820    }
1821    case SQLITE_FUNCTION: {
1822      int i;
1823      for(i=0; i<ArraySize(azProhibitedFunctions); i++){
1824        if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
1825          failIfSafeMode(p, "cannot use the %s() function in safe mode",
1826                         azProhibitedFunctions[i]);
1827        }
1828      }
1829      break;
1830    }
1831  }
1832  return SQLITE_OK;
1833}
1834
1835/*
1836** When the ".auth ON" is set, the following authorizer callback is
1837** invoked.  It always returns SQLITE_OK.
1838*/
1839static int shellAuth(
1840  void *pClientData,
1841  int op,
1842  const char *zA1,
1843  const char *zA2,
1844  const char *zA3,
1845  const char *zA4
1846){
1847  ShellState *p = (ShellState*)pClientData;
1848  static const char *azAction[] = { 0,
1849     "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
1850     "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
1851     "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
1852     "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
1853     "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
1854     "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
1855     "PRAGMA",               "READ",                 "SELECT",
1856     "TRANSACTION",          "UPDATE",               "ATTACH",
1857     "DETACH",               "ALTER_TABLE",          "REINDEX",
1858     "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
1859     "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
1860  };
1861  int i;
1862  const char *az[4];
1863  az[0] = zA1;
1864  az[1] = zA2;
1865  az[2] = zA3;
1866  az[3] = zA4;
1867  utf8_printf(p->out, "authorizer: %s", azAction[op]);
1868  for(i=0; i<4; i++){
1869    raw_printf(p->out, " ");
1870    if( az[i] ){
1871      output_c_string(p->out, az[i]);
1872    }else{
1873      raw_printf(p->out, "NULL");
1874    }
1875  }
1876  raw_printf(p->out, "\n");
1877  if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
1878  return SQLITE_OK;
1879}
1880#endif
1881
1882/*
1883** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
1884**
1885** This routine converts some CREATE TABLE statements for shadow tables
1886** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1887*/
1888static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1889  if( z==0 ) return;
1890  if( zTail==0 ) return;
1891  if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1892    utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1893  }else{
1894    utf8_printf(out, "%s%s", z, zTail);
1895  }
1896}
1897static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1898  char c = z[n];
1899  z[n] = 0;
1900  printSchemaLine(out, z, zTail);
1901  z[n] = c;
1902}
1903
1904/*
1905** Return true if string z[] has nothing but whitespace and comments to the
1906** end of the first line.
1907*/
1908static int wsToEol(const char *z){
1909  int i;
1910  for(i=0; z[i]; i++){
1911    if( z[i]=='\n' ) return 1;
1912    if( IsSpace(z[i]) ) continue;
1913    if( z[i]=='-' && z[i+1]=='-' ) return 1;
1914    return 0;
1915  }
1916  return 1;
1917}
1918
1919/*
1920** Add a new entry to the EXPLAIN QUERY PLAN data
1921*/
1922static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
1923  EQPGraphRow *pNew;
1924  int nText = strlen30(zText);
1925  if( p->autoEQPtest ){
1926    utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1927  }
1928  pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1929  shell_check_oom(pNew);
1930  pNew->iEqpId = iEqpId;
1931  pNew->iParentId = p2;
1932  memcpy(pNew->zText, zText, nText+1);
1933  pNew->pNext = 0;
1934  if( p->sGraph.pLast ){
1935    p->sGraph.pLast->pNext = pNew;
1936  }else{
1937    p->sGraph.pRow = pNew;
1938  }
1939  p->sGraph.pLast = pNew;
1940}
1941
1942/*
1943** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1944** in p->sGraph.
1945*/
1946static void eqp_reset(ShellState *p){
1947  EQPGraphRow *pRow, *pNext;
1948  for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1949    pNext = pRow->pNext;
1950    sqlite3_free(pRow);
1951  }
1952  memset(&p->sGraph, 0, sizeof(p->sGraph));
1953}
1954
1955/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
1956** pOld, or return the first such line if pOld is NULL
1957*/
1958static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
1959  EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
1960  while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
1961  return pRow;
1962}
1963
1964/* Render a single level of the graph that has iEqpId as its parent.  Called
1965** recursively to render sublevels.
1966*/
1967static void eqp_render_level(ShellState *p, int iEqpId){
1968  EQPGraphRow *pRow, *pNext;
1969  int n = strlen30(p->sGraph.zPrefix);
1970  char *z;
1971  for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1972    pNext = eqp_next_row(p, iEqpId, pRow);
1973    z = pRow->zText;
1974    utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
1975                pNext ? "|--" : "`--", z);
1976    if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
1977      memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
1978      eqp_render_level(p, pRow->iEqpId);
1979      p->sGraph.zPrefix[n] = 0;
1980    }
1981  }
1982}
1983
1984/*
1985** Display and reset the EXPLAIN QUERY PLAN data
1986*/
1987static void eqp_render(ShellState *p){
1988  EQPGraphRow *pRow = p->sGraph.pRow;
1989  if( pRow ){
1990    if( pRow->zText[0]=='-' ){
1991      if( pRow->pNext==0 ){
1992        eqp_reset(p);
1993        return;
1994      }
1995      utf8_printf(p->out, "%s\n", pRow->zText+3);
1996      p->sGraph.pRow = pRow->pNext;
1997      sqlite3_free(pRow);
1998    }else{
1999      utf8_printf(p->out, "QUERY PLAN\n");
2000    }
2001    p->sGraph.zPrefix[0] = 0;
2002    eqp_render_level(p, 0);
2003    eqp_reset(p);
2004  }
2005}
2006
2007#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
2008/*
2009** Progress handler callback.
2010*/
2011static int progress_handler(void *pClientData) {
2012  ShellState *p = (ShellState*)pClientData;
2013  p->nProgress++;
2014  if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
2015    raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
2016    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
2017    if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
2018    return 1;
2019  }
2020  if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
2021    raw_printf(p->out, "Progress %u\n", p->nProgress);
2022  }
2023  return 0;
2024}
2025#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
2026
2027/*
2028** Print N dashes
2029*/
2030static void print_dashes(FILE *out, int N){
2031  const char zDash[] = "--------------------------------------------------";
2032  const int nDash = sizeof(zDash) - 1;
2033  while( N>nDash ){
2034    fputs(zDash, out);
2035    N -= nDash;
2036  }
2037  raw_printf(out, "%.*s", N, zDash);
2038}
2039
2040/*
2041** Print a markdown or table-style row separator using ascii-art
2042*/
2043static void print_row_separator(
2044  ShellState *p,
2045  int nArg,
2046  const char *zSep
2047){
2048  int i;
2049  if( nArg>0 ){
2050    fputs(zSep, p->out);
2051    print_dashes(p->out, p->actualWidth[0]+2);
2052    for(i=1; i<nArg; i++){
2053      fputs(zSep, p->out);
2054      print_dashes(p->out, p->actualWidth[i]+2);
2055    }
2056    fputs(zSep, p->out);
2057  }
2058  fputs("\n", p->out);
2059}
2060
2061/*
2062** This is the callback routine that the shell
2063** invokes for each row of a query result.
2064*/
2065static int shell_callback(
2066  void *pArg,
2067  int nArg,        /* Number of result columns */
2068  char **azArg,    /* Text of each result column */
2069  char **azCol,    /* Column names */
2070  int *aiType      /* Column types.  Might be NULL */
2071){
2072  int i;
2073  ShellState *p = (ShellState*)pArg;
2074
2075  if( azArg==0 ) return 0;
2076  switch( p->cMode ){
2077    case MODE_Count:
2078    case MODE_Off: {
2079      break;
2080    }
2081    case MODE_Line: {
2082      int w = 5;
2083      if( azArg==0 ) break;
2084      for(i=0; i<nArg; i++){
2085        int len = strlen30(azCol[i] ? azCol[i] : "");
2086        if( len>w ) w = len;
2087      }
2088      if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2089      for(i=0; i<nArg; i++){
2090        utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2091                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2092      }
2093      break;
2094    }
2095    case MODE_Explain: {
2096      static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
2097      if( nArg>ArraySize(aExplainWidth) ){
2098        nArg = ArraySize(aExplainWidth);
2099      }
2100      if( p->cnt++==0 ){
2101        for(i=0; i<nArg; i++){
2102          int w = aExplainWidth[i];
2103          utf8_width_print(p->out, w, azCol[i]);
2104          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2105        }
2106        for(i=0; i<nArg; i++){
2107          int w = aExplainWidth[i];
2108          print_dashes(p->out, w);
2109          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2110        }
2111      }
2112      if( azArg==0 ) break;
2113      for(i=0; i<nArg; i++){
2114        int w = aExplainWidth[i];
2115        if( i==nArg-1 ) w = 0;
2116        if( azArg[i] && strlenChar(azArg[i])>w ){
2117          w = strlenChar(azArg[i]);
2118        }
2119        if( i==1 && p->aiIndent && p->pStmt ){
2120          if( p->iIndent<p->nIndent ){
2121            utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2122          }
2123          p->iIndent++;
2124        }
2125        utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2126        fputs(i==nArg-1 ? "\n" : "  ", p->out);
2127      }
2128      break;
2129    }
2130    case MODE_Semi: {   /* .schema and .fullschema output */
2131      printSchemaLine(p->out, azArg[0], ";\n");
2132      break;
2133    }
2134    case MODE_Pretty: {  /* .schema and .fullschema with --indent */
2135      char *z;
2136      int j;
2137      int nParen = 0;
2138      char cEnd = 0;
2139      char c;
2140      int nLine = 0;
2141      assert( nArg==1 );
2142      if( azArg[0]==0 ) break;
2143      if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2144       || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2145      ){
2146        utf8_printf(p->out, "%s;\n", azArg[0]);
2147        break;
2148      }
2149      z = sqlite3_mprintf("%s", azArg[0]);
2150      shell_check_oom(z);
2151      j = 0;
2152      for(i=0; IsSpace(z[i]); i++){}
2153      for(; (c = z[i])!=0; i++){
2154        if( IsSpace(c) ){
2155          if( z[j-1]=='\r' ) z[j-1] = '\n';
2156          if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2157        }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2158          j--;
2159        }
2160        z[j++] = c;
2161      }
2162      while( j>0 && IsSpace(z[j-1]) ){ j--; }
2163      z[j] = 0;
2164      if( strlen30(z)>=79 ){
2165        for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
2166          if( c==cEnd ){
2167            cEnd = 0;
2168          }else if( c=='"' || c=='\'' || c=='`' ){
2169            cEnd = c;
2170          }else if( c=='[' ){
2171            cEnd = ']';
2172          }else if( c=='-' && z[i+1]=='-' ){
2173            cEnd = '\n';
2174          }else if( c=='(' ){
2175            nParen++;
2176          }else if( c==')' ){
2177            nParen--;
2178            if( nLine>0 && nParen==0 && j>0 ){
2179              printSchemaLineN(p->out, z, j, "\n");
2180              j = 0;
2181            }
2182          }
2183          z[j++] = c;
2184          if( nParen==1 && cEnd==0
2185           && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
2186          ){
2187            if( c=='\n' ) j--;
2188            printSchemaLineN(p->out, z, j, "\n  ");
2189            j = 0;
2190            nLine++;
2191            while( IsSpace(z[i+1]) ){ i++; }
2192          }
2193        }
2194        z[j] = 0;
2195      }
2196      printSchemaLine(p->out, z, ";\n");
2197      sqlite3_free(z);
2198      break;
2199    }
2200    case MODE_List: {
2201      if( p->cnt++==0 && p->showHeader ){
2202        for(i=0; i<nArg; i++){
2203          utf8_printf(p->out,"%s%s",azCol[i],
2204                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
2205        }
2206      }
2207      if( azArg==0 ) break;
2208      for(i=0; i<nArg; i++){
2209        char *z = azArg[i];
2210        if( z==0 ) z = p->nullValue;
2211        utf8_printf(p->out, "%s", z);
2212        if( i<nArg-1 ){
2213          utf8_printf(p->out, "%s", p->colSeparator);
2214        }else{
2215          utf8_printf(p->out, "%s", p->rowSeparator);
2216        }
2217      }
2218      break;
2219    }
2220    case MODE_Html: {
2221      if( p->cnt++==0 && p->showHeader ){
2222        raw_printf(p->out,"<TR>");
2223        for(i=0; i<nArg; i++){
2224          raw_printf(p->out,"<TH>");
2225          output_html_string(p->out, azCol[i]);
2226          raw_printf(p->out,"</TH>\n");
2227        }
2228        raw_printf(p->out,"</TR>\n");
2229      }
2230      if( azArg==0 ) break;
2231      raw_printf(p->out,"<TR>");
2232      for(i=0; i<nArg; i++){
2233        raw_printf(p->out,"<TD>");
2234        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2235        raw_printf(p->out,"</TD>\n");
2236      }
2237      raw_printf(p->out,"</TR>\n");
2238      break;
2239    }
2240    case MODE_Tcl: {
2241      if( p->cnt++==0 && p->showHeader ){
2242        for(i=0; i<nArg; i++){
2243          output_c_string(p->out,azCol[i] ? azCol[i] : "");
2244          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2245        }
2246        utf8_printf(p->out, "%s", p->rowSeparator);
2247      }
2248      if( azArg==0 ) break;
2249      for(i=0; i<nArg; i++){
2250        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2251        if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2252      }
2253      utf8_printf(p->out, "%s", p->rowSeparator);
2254      break;
2255    }
2256    case MODE_Csv: {
2257      setBinaryMode(p->out, 1);
2258      if( p->cnt++==0 && p->showHeader ){
2259        for(i=0; i<nArg; i++){
2260          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2261        }
2262        utf8_printf(p->out, "%s", p->rowSeparator);
2263      }
2264      if( nArg>0 ){
2265        for(i=0; i<nArg; i++){
2266          output_csv(p, azArg[i], i<nArg-1);
2267        }
2268        utf8_printf(p->out, "%s", p->rowSeparator);
2269      }
2270      setTextMode(p->out, 1);
2271      break;
2272    }
2273    case MODE_Insert: {
2274      if( azArg==0 ) break;
2275      utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2276      if( p->showHeader ){
2277        raw_printf(p->out,"(");
2278        for(i=0; i<nArg; i++){
2279          if( i>0 ) raw_printf(p->out, ",");
2280          if( quoteChar(azCol[i]) ){
2281            char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2282            shell_check_oom(z);
2283            utf8_printf(p->out, "%s", z);
2284            sqlite3_free(z);
2285          }else{
2286            raw_printf(p->out, "%s", azCol[i]);
2287          }
2288        }
2289        raw_printf(p->out,")");
2290      }
2291      p->cnt++;
2292      for(i=0; i<nArg; i++){
2293        raw_printf(p->out, i>0 ? "," : " VALUES(");
2294        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2295          utf8_printf(p->out,"NULL");
2296        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2297          if( ShellHasFlag(p, SHFLG_Newlines) ){
2298            output_quoted_string(p->out, azArg[i]);
2299          }else{
2300            output_quoted_escaped_string(p->out, azArg[i]);
2301          }
2302        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2303          utf8_printf(p->out,"%s", azArg[i]);
2304        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2305          char z[50];
2306          double r = sqlite3_column_double(p->pStmt, i);
2307          sqlite3_uint64 ur;
2308          memcpy(&ur,&r,sizeof(r));
2309          if( ur==0x7ff0000000000000LL ){
2310            raw_printf(p->out, "1e999");
2311          }else if( ur==0xfff0000000000000LL ){
2312            raw_printf(p->out, "-1e999");
2313          }else{
2314            sqlite3_int64 ir = (sqlite3_int64)r;
2315            if( r==(double)ir ){
2316              sqlite3_snprintf(50,z,"%lld.0", ir);
2317            }else{
2318              sqlite3_snprintf(50,z,"%!.20g", r);
2319            }
2320            raw_printf(p->out, "%s", z);
2321          }
2322        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2323          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2324          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2325          output_hex_blob(p->out, pBlob, nBlob);
2326        }else if( isNumber(azArg[i], 0) ){
2327          utf8_printf(p->out,"%s", azArg[i]);
2328        }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2329          output_quoted_string(p->out, azArg[i]);
2330        }else{
2331          output_quoted_escaped_string(p->out, azArg[i]);
2332        }
2333      }
2334      raw_printf(p->out,");\n");
2335      break;
2336    }
2337    case MODE_Json: {
2338      if( azArg==0 ) break;
2339      if( p->cnt==0 ){
2340        fputs("[{", p->out);
2341      }else{
2342        fputs(",\n{", p->out);
2343      }
2344      p->cnt++;
2345      for(i=0; i<nArg; i++){
2346        output_json_string(p->out, azCol[i], -1);
2347        putc(':', p->out);
2348        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2349          fputs("null",p->out);
2350        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2351          char z[50];
2352          double r = sqlite3_column_double(p->pStmt, i);
2353          sqlite3_uint64 ur;
2354          memcpy(&ur,&r,sizeof(r));
2355          if( ur==0x7ff0000000000000LL ){
2356            raw_printf(p->out, "1e999");
2357          }else if( ur==0xfff0000000000000LL ){
2358            raw_printf(p->out, "-1e999");
2359          }else{
2360            sqlite3_snprintf(50,z,"%!.20g", r);
2361            raw_printf(p->out, "%s", z);
2362          }
2363        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2364          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2365          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2366          output_json_string(p->out, pBlob, nBlob);
2367        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2368          output_json_string(p->out, azArg[i], -1);
2369        }else{
2370          utf8_printf(p->out,"%s", azArg[i]);
2371        }
2372        if( i<nArg-1 ){
2373          putc(',', p->out);
2374        }
2375      }
2376      putc('}', p->out);
2377      break;
2378    }
2379    case MODE_Quote: {
2380      if( azArg==0 ) break;
2381      if( p->cnt==0 && p->showHeader ){
2382        for(i=0; i<nArg; i++){
2383          if( i>0 ) fputs(p->colSeparator, p->out);
2384          output_quoted_string(p->out, azCol[i]);
2385        }
2386        fputs(p->rowSeparator, p->out);
2387      }
2388      p->cnt++;
2389      for(i=0; i<nArg; i++){
2390        if( i>0 ) fputs(p->colSeparator, p->out);
2391        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2392          utf8_printf(p->out,"NULL");
2393        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2394          output_quoted_string(p->out, azArg[i]);
2395        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2396          utf8_printf(p->out,"%s", azArg[i]);
2397        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2398          char z[50];
2399          double r = sqlite3_column_double(p->pStmt, i);
2400          sqlite3_snprintf(50,z,"%!.20g", r);
2401          raw_printf(p->out, "%s", z);
2402        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2403          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2404          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2405          output_hex_blob(p->out, pBlob, nBlob);
2406        }else if( isNumber(azArg[i], 0) ){
2407          utf8_printf(p->out,"%s", azArg[i]);
2408        }else{
2409          output_quoted_string(p->out, azArg[i]);
2410        }
2411      }
2412      fputs(p->rowSeparator, p->out);
2413      break;
2414    }
2415    case MODE_Ascii: {
2416      if( p->cnt++==0 && p->showHeader ){
2417        for(i=0; i<nArg; i++){
2418          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2419          utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2420        }
2421        utf8_printf(p->out, "%s", p->rowSeparator);
2422      }
2423      if( azArg==0 ) break;
2424      for(i=0; i<nArg; i++){
2425        if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2426        utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2427      }
2428      utf8_printf(p->out, "%s", p->rowSeparator);
2429      break;
2430    }
2431    case MODE_EQP: {
2432      eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2433      break;
2434    }
2435  }
2436  return 0;
2437}
2438
2439/*
2440** This is the callback routine that the SQLite library
2441** invokes for each row of a query result.
2442*/
2443static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2444  /* since we don't have type info, call the shell_callback with a NULL value */
2445  return shell_callback(pArg, nArg, azArg, azCol, NULL);
2446}
2447
2448/*
2449** This is the callback routine from sqlite3_exec() that appends all
2450** output onto the end of a ShellText object.
2451*/
2452static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2453  ShellText *p = (ShellText*)pArg;
2454  int i;
2455  UNUSED_PARAMETER(az);
2456  if( azArg==0 ) return 0;
2457  if( p->n ) appendText(p, "|", 0);
2458  for(i=0; i<nArg; i++){
2459    if( i ) appendText(p, ",", 0);
2460    if( azArg[i] ) appendText(p, azArg[i], 0);
2461  }
2462  return 0;
2463}
2464
2465/*
2466** Generate an appropriate SELFTEST table in the main database.
2467*/
2468static void createSelftestTable(ShellState *p){
2469  char *zErrMsg = 0;
2470  sqlite3_exec(p->db,
2471    "SAVEPOINT selftest_init;\n"
2472    "CREATE TABLE IF NOT EXISTS selftest(\n"
2473    "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
2474    "  op TEXT,\n"                   /* Operator:  memo run */
2475    "  cmd TEXT,\n"                  /* Command text */
2476    "  ans TEXT\n"                   /* Desired answer */
2477    ");"
2478    "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2479    "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2480    "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2481    "         'memo','Tests generated by --init');\n"
2482    "INSERT INTO [_shell$self]\n"
2483    "  SELECT 'run',\n"
2484    "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2485                                 "FROM sqlite_schema ORDER BY 2'',224))',\n"
2486    "    hex(sha3_query('SELECT type,name,tbl_name,sql "
2487                          "FROM sqlite_schema ORDER BY 2',224));\n"
2488    "INSERT INTO [_shell$self]\n"
2489    "  SELECT 'run',"
2490    "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2491    "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2492    "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2493    "  FROM (\n"
2494    "    SELECT name FROM sqlite_schema\n"
2495    "     WHERE type='table'\n"
2496    "       AND name<>'selftest'\n"
2497    "       AND coalesce(rootpage,0)>0\n"
2498    "  )\n"
2499    " ORDER BY name;\n"
2500    "INSERT INTO [_shell$self]\n"
2501    "  VALUES('run','PRAGMA integrity_check','ok');\n"
2502    "INSERT INTO selftest(tno,op,cmd,ans)"
2503    "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2504    "DROP TABLE [_shell$self];"
2505    ,0,0,&zErrMsg);
2506  if( zErrMsg ){
2507    utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2508    sqlite3_free(zErrMsg);
2509  }
2510  sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2511}
2512
2513
2514/*
2515** Set the destination table field of the ShellState structure to
2516** the name of the table given.  Escape any quote characters in the
2517** table name.
2518*/
2519static void set_table_name(ShellState *p, const char *zName){
2520  int i, n;
2521  char cQuote;
2522  char *z;
2523
2524  if( p->zDestTable ){
2525    free(p->zDestTable);
2526    p->zDestTable = 0;
2527  }
2528  if( zName==0 ) return;
2529  cQuote = quoteChar(zName);
2530  n = strlen30(zName);
2531  if( cQuote ) n += n+2;
2532  z = p->zDestTable = malloc( n+1 );
2533  shell_check_oom(z);
2534  n = 0;
2535  if( cQuote ) z[n++] = cQuote;
2536  for(i=0; zName[i]; i++){
2537    z[n++] = zName[i];
2538    if( zName[i]==cQuote ) z[n++] = cQuote;
2539  }
2540  if( cQuote ) z[n++] = cQuote;
2541  z[n] = 0;
2542}
2543
2544/*
2545** Maybe construct two lines of text that point out the position of a
2546** syntax error.  Return a pointer to the text, in memory obtained from
2547** sqlite3_malloc().  Or, if the most recent error does not involve a
2548** specific token that we can point to, return an empty string.
2549**
2550** In all cases, the memory returned is obtained from sqlite3_malloc64()
2551** and should be released by the caller invoking sqlite3_free().
2552*/
2553static char *shell_error_context(const char *zSql, sqlite3 *db){
2554  int iOffset;
2555  size_t len;
2556  char *zCode;
2557  char *zMsg;
2558  int i;
2559  if( db==0
2560   || zSql==0
2561   || (iOffset = sqlite3_error_offset(db))<0
2562  ){
2563    return sqlite3_mprintf("");
2564  }
2565  while( iOffset>50 ){
2566    iOffset--;
2567    zSql++;
2568    while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
2569  }
2570  len = strlen(zSql);
2571  if( len>78 ){
2572    len = 78;
2573    while( (zSql[len]&0xc0)==0x80 ) len--;
2574  }
2575  zCode = sqlite3_mprintf("%.*s", len, zSql);
2576  for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
2577  if( iOffset<25 ){
2578    zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode, iOffset, "");
2579  }else{
2580    zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode, iOffset-14, "");
2581  }
2582  return zMsg;
2583}
2584
2585
2586/*
2587** Execute a query statement that will generate SQL output.  Print
2588** the result columns, comma-separated, on a line and then add a
2589** semicolon terminator to the end of that line.
2590**
2591** If the number of columns is 1 and that column contains text "--"
2592** then write the semicolon on a separate line.  That way, if a
2593** "--" comment occurs at the end of the statement, the comment
2594** won't consume the semicolon terminator.
2595*/
2596static int run_table_dump_query(
2597  ShellState *p,           /* Query context */
2598  const char *zSelect      /* SELECT statement to extract content */
2599){
2600  sqlite3_stmt *pSelect;
2601  int rc;
2602  int nResult;
2603  int i;
2604  const char *z;
2605  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2606  if( rc!=SQLITE_OK || !pSelect ){
2607    char *zContext = shell_error_context(zSelect, p->db);
2608    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
2609                sqlite3_errmsg(p->db), zContext);
2610    sqlite3_free(zContext);
2611    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2612    return rc;
2613  }
2614  rc = sqlite3_step(pSelect);
2615  nResult = sqlite3_column_count(pSelect);
2616  while( rc==SQLITE_ROW ){
2617    z = (const char*)sqlite3_column_text(pSelect, 0);
2618    utf8_printf(p->out, "%s", z);
2619    for(i=1; i<nResult; i++){
2620      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2621    }
2622    if( z==0 ) z = "";
2623    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2624    if( z[0] ){
2625      raw_printf(p->out, "\n;\n");
2626    }else{
2627      raw_printf(p->out, ";\n");
2628    }
2629    rc = sqlite3_step(pSelect);
2630  }
2631  rc = sqlite3_finalize(pSelect);
2632  if( rc!=SQLITE_OK ){
2633    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2634                sqlite3_errmsg(p->db));
2635    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2636  }
2637  return rc;
2638}
2639
2640/*
2641** Allocate space and save off string indicating current error.
2642*/
2643static char *save_err_msg(
2644  sqlite3 *db,           /* Database to query */
2645  const char *zPhase,    /* When the error occcurs */
2646  int rc,                /* Error code returned from API */
2647  const char *zSql       /* SQL string, or NULL */
2648){
2649  char *zErr;
2650  char *zContext;
2651  sqlite3_str *pStr = sqlite3_str_new(0);
2652  sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
2653  if( rc>1 ){
2654    sqlite3_str_appendf(pStr, " (%d)", rc);
2655  }
2656  zContext = shell_error_context(zSql, db);
2657  if( zContext ){
2658    sqlite3_str_appendall(pStr, zContext);
2659    sqlite3_free(zContext);
2660  }
2661  zErr = sqlite3_str_finish(pStr);
2662  shell_check_oom(zErr);
2663  return zErr;
2664}
2665
2666#ifdef __linux__
2667/*
2668** Attempt to display I/O stats on Linux using /proc/PID/io
2669*/
2670static void displayLinuxIoStats(FILE *out){
2671  FILE *in;
2672  char z[200];
2673  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2674  in = fopen(z, "rb");
2675  if( in==0 ) return;
2676  while( fgets(z, sizeof(z), in)!=0 ){
2677    static const struct {
2678      const char *zPattern;
2679      const char *zDesc;
2680    } aTrans[] = {
2681      { "rchar: ",                  "Bytes received by read():" },
2682      { "wchar: ",                  "Bytes sent to write():"    },
2683      { "syscr: ",                  "Read() system calls:"      },
2684      { "syscw: ",                  "Write() system calls:"     },
2685      { "read_bytes: ",             "Bytes read from storage:"  },
2686      { "write_bytes: ",            "Bytes written to storage:" },
2687      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
2688    };
2689    int i;
2690    for(i=0; i<ArraySize(aTrans); i++){
2691      int n = strlen30(aTrans[i].zPattern);
2692      if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2693        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2694        break;
2695      }
2696    }
2697  }
2698  fclose(in);
2699}
2700#endif
2701
2702/*
2703** Display a single line of status using 64-bit values.
2704*/
2705static void displayStatLine(
2706  ShellState *p,            /* The shell context */
2707  char *zLabel,             /* Label for this one line */
2708  char *zFormat,            /* Format for the result */
2709  int iStatusCtrl,          /* Which status to display */
2710  int bReset                /* True to reset the stats */
2711){
2712  sqlite3_int64 iCur = -1;
2713  sqlite3_int64 iHiwtr = -1;
2714  int i, nPercent;
2715  char zLine[200];
2716  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2717  for(i=0, nPercent=0; zFormat[i]; i++){
2718    if( zFormat[i]=='%' ) nPercent++;
2719  }
2720  if( nPercent>1 ){
2721    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2722  }else{
2723    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2724  }
2725  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2726}
2727
2728/*
2729** Display memory stats.
2730*/
2731static int display_stats(
2732  sqlite3 *db,                /* Database to query */
2733  ShellState *pArg,           /* Pointer to ShellState */
2734  int bReset                  /* True to reset the stats */
2735){
2736  int iCur;
2737  int iHiwtr;
2738  FILE *out;
2739  if( pArg==0 || pArg->out==0 ) return 0;
2740  out = pArg->out;
2741
2742  if( pArg->pStmt && pArg->statsOn==2 ){
2743    int nCol, i, x;
2744    sqlite3_stmt *pStmt = pArg->pStmt;
2745    char z[100];
2746    nCol = sqlite3_column_count(pStmt);
2747    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2748    for(i=0; i<nCol; i++){
2749      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2750      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2751#ifndef SQLITE_OMIT_DECLTYPE
2752      sqlite3_snprintf(30, z+x, "declared type:");
2753      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2754#endif
2755#ifdef SQLITE_ENABLE_COLUMN_METADATA
2756      sqlite3_snprintf(30, z+x, "database name:");
2757      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2758      sqlite3_snprintf(30, z+x, "table name:");
2759      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2760      sqlite3_snprintf(30, z+x, "origin name:");
2761      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2762#endif
2763    }
2764  }
2765
2766  if( pArg->statsOn==3 ){
2767    if( pArg->pStmt ){
2768      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2769      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2770    }
2771    return 0;
2772  }
2773
2774  displayStatLine(pArg, "Memory Used:",
2775     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2776  displayStatLine(pArg, "Number of Outstanding Allocations:",
2777     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2778  if( pArg->shellFlgs & SHFLG_Pagecache ){
2779    displayStatLine(pArg, "Number of Pcache Pages Used:",
2780       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2781  }
2782  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2783     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2784  displayStatLine(pArg, "Largest Allocation:",
2785     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2786  displayStatLine(pArg, "Largest Pcache Allocation:",
2787     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2788#ifdef YYTRACKMAXSTACKDEPTH
2789  displayStatLine(pArg, "Deepest Parser Stack:",
2790     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2791#endif
2792
2793  if( db ){
2794    if( pArg->shellFlgs & SHFLG_Lookaside ){
2795      iHiwtr = iCur = -1;
2796      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2797                        &iCur, &iHiwtr, bReset);
2798      raw_printf(pArg->out,
2799              "Lookaside Slots Used:                %d (max %d)\n",
2800              iCur, iHiwtr);
2801      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2802                        &iCur, &iHiwtr, bReset);
2803      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
2804              iHiwtr);
2805      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2806                        &iCur, &iHiwtr, bReset);
2807      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
2808              iHiwtr);
2809      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2810                        &iCur, &iHiwtr, bReset);
2811      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
2812              iHiwtr);
2813    }
2814    iHiwtr = iCur = -1;
2815    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2816    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
2817            iCur);
2818    iHiwtr = iCur = -1;
2819    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2820    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
2821    iHiwtr = iCur = -1;
2822    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2823    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
2824    iHiwtr = iCur = -1;
2825    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2826    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
2827    iHiwtr = iCur = -1;
2828    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2829    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
2830    iHiwtr = iCur = -1;
2831    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2832    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
2833            iCur);
2834    iHiwtr = iCur = -1;
2835    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2836    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
2837            iCur);
2838  }
2839
2840  if( pArg->pStmt ){
2841    int iHit, iMiss;
2842    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2843                               bReset);
2844    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
2845    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2846    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
2847    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2848    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
2849    iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2850    iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2851    if( iHit || iMiss ){
2852      raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
2853            iHit, iHit+iMiss);
2854    }
2855    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2856    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
2857    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2858    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
2859    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2860    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
2861    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2862    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
2863  }
2864
2865#ifdef __linux__
2866  displayLinuxIoStats(pArg->out);
2867#endif
2868
2869  /* Do not remove this machine readable comment: extra-stats-output-here */
2870
2871  return 0;
2872}
2873
2874/*
2875** Display scan stats.
2876*/
2877static void display_scanstats(
2878  sqlite3 *db,                    /* Database to query */
2879  ShellState *pArg                /* Pointer to ShellState */
2880){
2881#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2882  UNUSED_PARAMETER(db);
2883  UNUSED_PARAMETER(pArg);
2884#else
2885  int i, k, n, mx;
2886  raw_printf(pArg->out, "-------- scanstats --------\n");
2887  mx = 0;
2888  for(k=0; k<=mx; k++){
2889    double rEstLoop = 1.0;
2890    for(i=n=0; 1; i++){
2891      sqlite3_stmt *p = pArg->pStmt;
2892      sqlite3_int64 nLoop, nVisit;
2893      double rEst;
2894      int iSid;
2895      const char *zExplain;
2896      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2897        break;
2898      }
2899      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2900      if( iSid>mx ) mx = iSid;
2901      if( iSid!=k ) continue;
2902      if( n==0 ){
2903        rEstLoop = (double)nLoop;
2904        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2905      }
2906      n++;
2907      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2908      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2909      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2910      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2911      rEstLoop *= rEst;
2912      raw_printf(pArg->out,
2913          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2914          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2915      );
2916    }
2917  }
2918  raw_printf(pArg->out, "---------------------------\n");
2919#endif
2920}
2921
2922/*
2923** Parameter azArray points to a zero-terminated array of strings. zStr
2924** points to a single nul-terminated string. Return non-zero if zStr
2925** is equal, according to strcmp(), to any of the strings in the array.
2926** Otherwise, return zero.
2927*/
2928static int str_in_array(const char *zStr, const char **azArray){
2929  int i;
2930  for(i=0; azArray[i]; i++){
2931    if( 0==strcmp(zStr, azArray[i]) ) return 1;
2932  }
2933  return 0;
2934}
2935
2936/*
2937** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2938** and populate the ShellState.aiIndent[] array with the number of
2939** spaces each opcode should be indented before it is output.
2940**
2941** The indenting rules are:
2942**
2943**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2944**       all opcodes that occur between the p2 jump destination and the opcode
2945**       itself by 2 spaces.
2946**
2947**     * For each "Goto", if the jump destination is earlier in the program
2948**       and ends on one of:
2949**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
2950**       or if the P1 parameter is one instead of zero,
2951**       then indent all opcodes between the earlier instruction
2952**       and "Goto" by 2 spaces.
2953*/
2954static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2955  const char *zSql;               /* The text of the SQL statement */
2956  const char *z;                  /* Used to check if this is an EXPLAIN */
2957  int *abYield = 0;               /* True if op is an OP_Yield */
2958  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
2959  int iOp;                        /* Index of operation in p->aiIndent[] */
2960
2961  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
2962  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2963                            "Rewind", 0 };
2964  const char *azGoto[] = { "Goto", 0 };
2965
2966  /* Try to figure out if this is really an EXPLAIN statement. If this
2967  ** cannot be verified, return early.  */
2968  if( sqlite3_column_count(pSql)!=8 ){
2969    p->cMode = p->mode;
2970    return;
2971  }
2972  zSql = sqlite3_sql(pSql);
2973  if( zSql==0 ) return;
2974  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2975  if( sqlite3_strnicmp(z, "explain", 7) ){
2976    p->cMode = p->mode;
2977    return;
2978  }
2979
2980  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2981    int i;
2982    int iAddr = sqlite3_column_int(pSql, 0);
2983    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2984
2985    /* Set p2 to the P2 field of the current opcode. Then, assuming that
2986    ** p2 is an instruction address, set variable p2op to the index of that
2987    ** instruction in the aiIndent[] array. p2 and p2op may be different if
2988    ** the current instruction is part of a sub-program generated by an
2989    ** SQL trigger or foreign key.  */
2990    int p2 = sqlite3_column_int(pSql, 3);
2991    int p2op = (p2 + (iOp-iAddr));
2992
2993    /* Grow the p->aiIndent array as required */
2994    if( iOp>=nAlloc ){
2995      if( iOp==0 ){
2996        /* Do further verfication that this is explain output.  Abort if
2997        ** it is not */
2998        static const char *explainCols[] = {
2999           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3000        int jj;
3001        for(jj=0; jj<ArraySize(explainCols); jj++){
3002          if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3003            p->cMode = p->mode;
3004            sqlite3_reset(pSql);
3005            return;
3006          }
3007        }
3008      }
3009      nAlloc += 100;
3010      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3011      shell_check_oom(p->aiIndent);
3012      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
3013      shell_check_oom(abYield);
3014    }
3015    abYield[iOp] = str_in_array(zOp, azYield);
3016    p->aiIndent[iOp] = 0;
3017    p->nIndent = iOp+1;
3018
3019    if( str_in_array(zOp, azNext) ){
3020      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3021    }
3022    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3023     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3024    ){
3025      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3026    }
3027  }
3028
3029  p->iIndent = 0;
3030  sqlite3_free(abYield);
3031  sqlite3_reset(pSql);
3032}
3033
3034/*
3035** Free the array allocated by explain_data_prepare().
3036*/
3037static void explain_data_delete(ShellState *p){
3038  sqlite3_free(p->aiIndent);
3039  p->aiIndent = 0;
3040  p->nIndent = 0;
3041  p->iIndent = 0;
3042}
3043
3044/*
3045** Disable and restore .wheretrace and .selecttrace settings.
3046*/
3047static unsigned int savedSelectTrace;
3048static unsigned int savedWhereTrace;
3049static void disable_debug_trace_modes(void){
3050  unsigned int zero = 0;
3051  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
3052  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
3053  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
3054  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
3055}
3056static void restore_debug_trace_modes(void){
3057  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
3058  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
3059}
3060
3061/* Create the TEMP table used to store parameter bindings */
3062static void bind_table_init(ShellState *p){
3063  int wrSchema = 0;
3064  int defensiveMode = 0;
3065  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
3066  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
3067  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
3068  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
3069  sqlite3_exec(p->db,
3070    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
3071    "  key TEXT PRIMARY KEY,\n"
3072    "  value\n"
3073    ") WITHOUT ROWID;",
3074    0, 0, 0);
3075  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3076  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3077}
3078
3079/*
3080** Bind parameters on a prepared statement.
3081**
3082** Parameter bindings are taken from a TEMP table of the form:
3083**
3084**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3085**    WITHOUT ROWID;
3086**
3087** No bindings occur if this table does not exist.  The name of the table
3088** begins with "sqlite_" so that it will not collide with ordinary application
3089** tables.  The table must be in the TEMP schema.
3090*/
3091static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3092  int nVar;
3093  int i;
3094  int rc;
3095  sqlite3_stmt *pQ = 0;
3096
3097  nVar = sqlite3_bind_parameter_count(pStmt);
3098  if( nVar==0 ) return;  /* Nothing to do */
3099  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3100                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3101    return; /* Parameter table does not exist */
3102  }
3103  rc = sqlite3_prepare_v2(pArg->db,
3104          "SELECT value FROM temp.sqlite_parameters"
3105          " WHERE key=?1", -1, &pQ, 0);
3106  if( rc || pQ==0 ) return;
3107  for(i=1; i<=nVar; i++){
3108    char zNum[30];
3109    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3110    if( zVar==0 ){
3111      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3112      zVar = zNum;
3113    }
3114    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3115    if( sqlite3_step(pQ)==SQLITE_ROW ){
3116      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3117    }else{
3118      sqlite3_bind_null(pStmt, i);
3119    }
3120    sqlite3_reset(pQ);
3121  }
3122  sqlite3_finalize(pQ);
3123}
3124
3125/*
3126** UTF8 box-drawing characters.  Imagine box lines like this:
3127**
3128**           1
3129**           |
3130**       4 --+-- 2
3131**           |
3132**           3
3133**
3134** Each box characters has between 2 and 4 of the lines leading from
3135** the center.  The characters are here identified by the numbers of
3136** their corresponding lines.
3137*/
3138#define BOX_24   "\342\224\200"  /* U+2500 --- */
3139#define BOX_13   "\342\224\202"  /* U+2502  |  */
3140#define BOX_23   "\342\224\214"  /* U+250c  ,- */
3141#define BOX_34   "\342\224\220"  /* U+2510 -,  */
3142#define BOX_12   "\342\224\224"  /* U+2514  '- */
3143#define BOX_14   "\342\224\230"  /* U+2518 -'  */
3144#define BOX_123  "\342\224\234"  /* U+251c  |- */
3145#define BOX_134  "\342\224\244"  /* U+2524 -|  */
3146#define BOX_234  "\342\224\254"  /* U+252c -,- */
3147#define BOX_124  "\342\224\264"  /* U+2534 -'- */
3148#define BOX_1234 "\342\224\274"  /* U+253c -|- */
3149
3150/* Draw horizontal line N characters long using unicode box
3151** characters
3152*/
3153static void print_box_line(FILE *out, int N){
3154  const char zDash[] =
3155      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3156      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3157  const int nDash = sizeof(zDash) - 1;
3158  N *= 3;
3159  while( N>nDash ){
3160    utf8_printf(out, zDash);
3161    N -= nDash;
3162  }
3163  utf8_printf(out, "%.*s", N, zDash);
3164}
3165
3166/*
3167** Draw a horizontal separator for a MODE_Box table.
3168*/
3169static void print_box_row_separator(
3170  ShellState *p,
3171  int nArg,
3172  const char *zSep1,
3173  const char *zSep2,
3174  const char *zSep3
3175){
3176  int i;
3177  if( nArg>0 ){
3178    utf8_printf(p->out, "%s", zSep1);
3179    print_box_line(p->out, p->actualWidth[0]+2);
3180    for(i=1; i<nArg; i++){
3181      utf8_printf(p->out, "%s", zSep2);
3182      print_box_line(p->out, p->actualWidth[i]+2);
3183    }
3184    utf8_printf(p->out, "%s", zSep3);
3185  }
3186  fputs("\n", p->out);
3187}
3188
3189/*
3190** z[] is a line of text that is to be displayed the .mode box or table or
3191** similar tabular formats.  z[] might contain control characters such
3192** as \n, \t, \f, or \r.
3193**
3194** Compute characters to display on the first line of z[].  Stop at the
3195** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
3196** from malloc()) of that first line, which caller should free sometime.
3197** Write anything to display on the next line into *pzTail.  If this is
3198** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
3199*/
3200static char *translateForDisplayAndDup(
3201  const unsigned char *z,            /* Input text to be transformed */
3202  const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
3203  int mxWidth,                       /* Max width.  0 means no limit */
3204  u8 bWordWrap                       /* If true, avoid breaking mid-word */
3205){
3206  int i;                 /* Input bytes consumed */
3207  int j;                 /* Output bytes generated */
3208  int k;                 /* Input bytes to be displayed */
3209  int n;                 /* Output column number */
3210  unsigned char *zOut;   /* Output text */
3211
3212  if( z==0 ){
3213    *pzTail = 0;
3214    return 0;
3215  }
3216  if( mxWidth<0 ) mxWidth = -mxWidth;
3217  if( mxWidth==0 ) mxWidth = 1000000;
3218  i = j = n = 0;
3219  while( n<mxWidth ){
3220    if( z[i]>=' ' ){
3221      n++;
3222      do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
3223      continue;
3224    }
3225    if( z[i]=='\t' ){
3226      do{
3227        n++;
3228        j++;
3229      }while( (n&7)!=0 && n<mxWidth );
3230      i++;
3231      continue;
3232    }
3233    break;
3234  }
3235  if( n>=mxWidth && bWordWrap  ){
3236    /* Perhaps try to back up to a better place to break the line */
3237    for(k=i; k>i/2; k--){
3238      if( isspace(z[k-1]) ) break;
3239    }
3240    if( k<=i/2 ){
3241      for(k=i; k>i/2; k--){
3242        if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
3243      }
3244    }
3245    if( k<=i/2 ){
3246      k = i;
3247    }else{
3248      i = k;
3249      while( z[i]==' ' ) i++;
3250    }
3251  }else{
3252    k = i;
3253  }
3254  if( n>=mxWidth && z[i]>=' ' ){
3255   *pzTail = &z[i];
3256  }else if( z[i]=='\r' && z[i+1]=='\n' ){
3257    *pzTail = z[i+2] ? &z[i+2] : 0;
3258  }else if( z[i]==0 || z[i+1]==0 ){
3259    *pzTail = 0;
3260  }else{
3261    *pzTail = &z[i+1];
3262  }
3263  zOut = malloc( j+1 );
3264  shell_check_oom(zOut);
3265  i = j = n = 0;
3266  while( i<k ){
3267    if( z[i]>=' ' ){
3268      n++;
3269      do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
3270      continue;
3271    }
3272    if( z[i]=='\t' ){
3273      do{
3274        n++;
3275        zOut[j++] = ' ';
3276      }while( (n&7)!=0 && n<mxWidth );
3277      i++;
3278      continue;
3279    }
3280    break;
3281  }
3282  zOut[j] = 0;
3283  return (char*)zOut;
3284}
3285
3286/* Extract the value of the i-th current column for pStmt as an SQL literal
3287** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
3288** the caller.
3289*/
3290static char *quoted_column(sqlite3_stmt *pStmt, int i){
3291  switch( sqlite3_column_type(pStmt, i) ){
3292    case SQLITE_NULL: {
3293      return sqlite3_mprintf("NULL");
3294    }
3295    case SQLITE_INTEGER:
3296    case SQLITE_FLOAT: {
3297      return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
3298    }
3299    case SQLITE_TEXT: {
3300      return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
3301    }
3302    case SQLITE_BLOB: {
3303      int j;
3304      sqlite3_str *pStr = sqlite3_str_new(0);
3305      const unsigned char *a = sqlite3_column_blob(pStmt,i);
3306      int n = sqlite3_column_bytes(pStmt,i);
3307      sqlite3_str_append(pStr, "x'", 2);
3308      for(j=0; j<n; j++){
3309        sqlite3_str_appendf(pStr, "%02x", a[j]);
3310      }
3311      sqlite3_str_append(pStr, "'", 1);
3312      return sqlite3_str_finish(pStr);
3313    }
3314  }
3315  return 0; /* Not reached */
3316}
3317
3318/*
3319** Run a prepared statement and output the result in one of the
3320** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3321** or MODE_Box.
3322**
3323** This is different from ordinary exec_prepared_stmt() in that
3324** it has to run the entire query and gather the results into memory
3325** first, in order to determine column widths, before providing
3326** any output.
3327*/
3328static void exec_prepared_stmt_columnar(
3329  ShellState *p,                        /* Pointer to ShellState */
3330  sqlite3_stmt *pStmt                   /* Statment to run */
3331){
3332  sqlite3_int64 nRow = 0;
3333  int nColumn = 0;
3334  char **azData = 0;
3335  sqlite3_int64 nAlloc = 0;
3336  char *abRowDiv = 0;
3337  const unsigned char *uz;
3338  const char *z;
3339  char **azQuoted = 0;
3340  int rc;
3341  sqlite3_int64 i, nData;
3342  int j, nTotal, w, n;
3343  const char *colSep = 0;
3344  const char *rowSep = 0;
3345  const unsigned char **azNextLine = 0;
3346  int bNextLine = 0;
3347  int bMultiLineRowExists = 0;
3348  int bw = p->cmOpts.bWordWrap;
3349
3350  rc = sqlite3_step(pStmt);
3351  if( rc!=SQLITE_ROW ) return;
3352  nColumn = sqlite3_column_count(pStmt);
3353  nAlloc = nColumn*4;
3354  if( nAlloc<=0 ) nAlloc = 1;
3355  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3356  shell_check_oom(azData);
3357  azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
3358  shell_check_oom((void*)azNextLine);
3359  memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
3360  if( p->cmOpts.bQuote ){
3361    azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
3362    shell_check_oom(azQuoted);
3363    memset(azQuoted, 0, nColumn*sizeof(char*) );
3364  }
3365  abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
3366  shell_check_oom(abRowDiv);
3367  if( nColumn>p->nWidth ){
3368    p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3369    shell_check_oom(p->colWidth);
3370    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3371    p->nWidth = nColumn;
3372    p->actualWidth = &p->colWidth[nColumn];
3373  }
3374  memset(p->actualWidth, 0, nColumn*sizeof(int));
3375  for(i=0; i<nColumn; i++){
3376    w = p->colWidth[i];
3377    if( w<0 ) w = -w;
3378    p->actualWidth[i] = w;
3379  }
3380  for(i=0; i<nColumn; i++){
3381    const unsigned char *zNotUsed;
3382    int wx = p->colWidth[i];
3383    if( wx==0 ){
3384      wx = p->cmOpts.iWrap;
3385    }
3386    if( wx<0 ) wx = -wx;
3387    uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
3388    azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
3389  }
3390  do{
3391    int useNextLine = bNextLine;
3392    bNextLine = 0;
3393    if( (nRow+2)*nColumn >= nAlloc ){
3394      nAlloc *= 2;
3395      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3396      shell_check_oom(azData);
3397      abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
3398      shell_check_oom(abRowDiv);
3399    }
3400    abRowDiv[nRow] = 1;
3401    nRow++;
3402    for(i=0; i<nColumn; i++){
3403      int wx = p->colWidth[i];
3404      if( wx==0 ){
3405        wx = p->cmOpts.iWrap;
3406      }
3407      if( wx<0 ) wx = -wx;
3408      if( useNextLine ){
3409        uz = azNextLine[i];
3410      }else if( p->cmOpts.bQuote ){
3411        sqlite3_free(azQuoted[i]);
3412        azQuoted[i] = quoted_column(pStmt,i);
3413        uz = (const unsigned char*)azQuoted[i];
3414      }else{
3415        uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
3416      }
3417      azData[nRow*nColumn + i]
3418        = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
3419      if( azNextLine[i] ){
3420        bNextLine = 1;
3421        abRowDiv[nRow-1] = 0;
3422        bMultiLineRowExists = 1;
3423      }
3424    }
3425  }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
3426  nTotal = nColumn*(nRow+1);
3427  for(i=0; i<nTotal; i++){
3428    z = azData[i];
3429    if( z==0 ) z = p->nullValue;
3430    n = strlenChar(z);
3431    j = i%nColumn;
3432    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3433  }
3434  if( seenInterrupt ) goto columnar_end;
3435  if( nColumn==0 ) goto columnar_end;
3436  switch( p->cMode ){
3437    case MODE_Column: {
3438      colSep = "  ";
3439      rowSep = "\n";
3440      if( p->showHeader ){
3441        for(i=0; i<nColumn; i++){
3442          w = p->actualWidth[i];
3443          if( p->colWidth[i]<0 ) w = -w;
3444          utf8_width_print(p->out, w, azData[i]);
3445          fputs(i==nColumn-1?"\n":"  ", p->out);
3446        }
3447        for(i=0; i<nColumn; i++){
3448          print_dashes(p->out, p->actualWidth[i]);
3449          fputs(i==nColumn-1?"\n":"  ", p->out);
3450        }
3451      }
3452      break;
3453    }
3454    case MODE_Table: {
3455      colSep = " | ";
3456      rowSep = " |\n";
3457      print_row_separator(p, nColumn, "+");
3458      fputs("| ", p->out);
3459      for(i=0; i<nColumn; i++){
3460        w = p->actualWidth[i];
3461        n = strlenChar(azData[i]);
3462        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3463        fputs(i==nColumn-1?" |\n":" | ", p->out);
3464      }
3465      print_row_separator(p, nColumn, "+");
3466      break;
3467    }
3468    case MODE_Markdown: {
3469      colSep = " | ";
3470      rowSep = " |\n";
3471      fputs("| ", p->out);
3472      for(i=0; i<nColumn; i++){
3473        w = p->actualWidth[i];
3474        n = strlenChar(azData[i]);
3475        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3476        fputs(i==nColumn-1?" |\n":" | ", p->out);
3477      }
3478      print_row_separator(p, nColumn, "|");
3479      break;
3480    }
3481    case MODE_Box: {
3482      colSep = " " BOX_13 " ";
3483      rowSep = " " BOX_13 "\n";
3484      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3485      utf8_printf(p->out, BOX_13 " ");
3486      for(i=0; i<nColumn; i++){
3487        w = p->actualWidth[i];
3488        n = strlenChar(azData[i]);
3489        utf8_printf(p->out, "%*s%s%*s%s",
3490            (w-n)/2, "", azData[i], (w-n+1)/2, "",
3491            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3492      }
3493      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3494      break;
3495    }
3496  }
3497  for(i=nColumn, j=0; i<nTotal; i++, j++){
3498    if( j==0 && p->cMode!=MODE_Column ){
3499      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3500    }
3501    z = azData[i];
3502    if( z==0 ) z = p->nullValue;
3503    w = p->actualWidth[j];
3504    if( p->colWidth[j]<0 ) w = -w;
3505    utf8_width_print(p->out, w, z);
3506    if( j==nColumn-1 ){
3507      utf8_printf(p->out, "%s", rowSep);
3508      if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
3509        if( p->cMode==MODE_Table ){
3510          print_row_separator(p, nColumn, "+");
3511        }else if( p->cMode==MODE_Box ){
3512          print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3513        }else if( p->cMode==MODE_Column ){
3514          raw_printf(p->out, "\n");
3515        }
3516      }
3517      j = -1;
3518      if( seenInterrupt ) goto columnar_end;
3519    }else{
3520      utf8_printf(p->out, "%s", colSep);
3521    }
3522  }
3523  if( p->cMode==MODE_Table ){
3524    print_row_separator(p, nColumn, "+");
3525  }else if( p->cMode==MODE_Box ){
3526    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3527  }
3528columnar_end:
3529  if( seenInterrupt ){
3530    utf8_printf(p->out, "Interrupt\n");
3531  }
3532  nData = (nRow+1)*nColumn;
3533  for(i=0; i<nData; i++) free(azData[i]);
3534  sqlite3_free(azData);
3535  sqlite3_free((void*)azNextLine);
3536  sqlite3_free(abRowDiv);
3537  if( azQuoted ){
3538    for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
3539    sqlite3_free(azQuoted);
3540  }
3541}
3542
3543/*
3544** Run a prepared statement
3545*/
3546static void exec_prepared_stmt(
3547  ShellState *pArg,                                /* Pointer to ShellState */
3548  sqlite3_stmt *pStmt                              /* Statment to run */
3549){
3550  int rc;
3551  sqlite3_uint64 nRow = 0;
3552
3553  if( pArg->cMode==MODE_Column
3554   || pArg->cMode==MODE_Table
3555   || pArg->cMode==MODE_Box
3556   || pArg->cMode==MODE_Markdown
3557  ){
3558    exec_prepared_stmt_columnar(pArg, pStmt);
3559    return;
3560  }
3561
3562  /* perform the first step.  this will tell us if we
3563  ** have a result set or not and how wide it is.
3564  */
3565  rc = sqlite3_step(pStmt);
3566  /* if we have a result set... */
3567  if( SQLITE_ROW == rc ){
3568    /* allocate space for col name ptr, value ptr, and type */
3569    int nCol = sqlite3_column_count(pStmt);
3570    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3571    if( !pData ){
3572      shell_out_of_memory();
3573    }else{
3574      char **azCols = (char **)pData;      /* Names of result columns */
3575      char **azVals = &azCols[nCol];       /* Results */
3576      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3577      int i, x;
3578      assert(sizeof(int) <= sizeof(char *));
3579      /* save off ptrs to column names */
3580      for(i=0; i<nCol; i++){
3581        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3582      }
3583      do{
3584        nRow++;
3585        /* extract the data and data types */
3586        for(i=0; i<nCol; i++){
3587          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3588          if( x==SQLITE_BLOB
3589           && pArg
3590           && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
3591          ){
3592            azVals[i] = "";
3593          }else{
3594            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3595          }
3596          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3597            rc = SQLITE_NOMEM;
3598            break; /* from for */
3599          }
3600        } /* end for */
3601
3602        /* if data and types extracted successfully... */
3603        if( SQLITE_ROW == rc ){
3604          /* call the supplied callback with the result row data */
3605          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3606            rc = SQLITE_ABORT;
3607          }else{
3608            rc = sqlite3_step(pStmt);
3609          }
3610        }
3611      } while( SQLITE_ROW == rc );
3612      sqlite3_free(pData);
3613      if( pArg->cMode==MODE_Json ){
3614        fputs("]\n", pArg->out);
3615      }else if( pArg->cMode==MODE_Count ){
3616        char zBuf[200];
3617        sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
3618                         nRow, nRow!=1 ? "s" : "");
3619        printf("%s", zBuf);
3620      }
3621    }
3622  }
3623}
3624
3625#ifndef SQLITE_OMIT_VIRTUALTABLE
3626/*
3627** This function is called to process SQL if the previous shell command
3628** was ".expert". It passes the SQL in the second argument directly to
3629** the sqlite3expert object.
3630**
3631** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3632** code. In this case, (*pzErr) may be set to point to a buffer containing
3633** an English language error message. It is the responsibility of the
3634** caller to eventually free this buffer using sqlite3_free().
3635*/
3636static int expertHandleSQL(
3637  ShellState *pState,
3638  const char *zSql,
3639  char **pzErr
3640){
3641  assert( pState->expert.pExpert );
3642  assert( pzErr==0 || *pzErr==0 );
3643  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3644}
3645
3646/*
3647** This function is called either to silently clean up the object
3648** created by the ".expert" command (if bCancel==1), or to generate a
3649** report from it and then clean it up (if bCancel==0).
3650**
3651** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3652** code. In this case, (*pzErr) may be set to point to a buffer containing
3653** an English language error message. It is the responsibility of the
3654** caller to eventually free this buffer using sqlite3_free().
3655*/
3656static int expertFinish(
3657  ShellState *pState,
3658  int bCancel,
3659  char **pzErr
3660){
3661  int rc = SQLITE_OK;
3662  sqlite3expert *p = pState->expert.pExpert;
3663  assert( p );
3664  assert( bCancel || pzErr==0 || *pzErr==0 );
3665  if( bCancel==0 ){
3666    FILE *out = pState->out;
3667    int bVerbose = pState->expert.bVerbose;
3668
3669    rc = sqlite3_expert_analyze(p, pzErr);
3670    if( rc==SQLITE_OK ){
3671      int nQuery = sqlite3_expert_count(p);
3672      int i;
3673
3674      if( bVerbose ){
3675        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3676        raw_printf(out, "-- Candidates -----------------------------\n");
3677        raw_printf(out, "%s\n", zCand);
3678      }
3679      for(i=0; i<nQuery; i++){
3680        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3681        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3682        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3683        if( zIdx==0 ) zIdx = "(no new indexes)\n";
3684        if( bVerbose ){
3685          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3686          raw_printf(out, "%s\n\n", zSql);
3687        }
3688        raw_printf(out, "%s\n", zIdx);
3689        raw_printf(out, "%s\n", zEQP);
3690      }
3691    }
3692  }
3693  sqlite3_expert_destroy(p);
3694  pState->expert.pExpert = 0;
3695  return rc;
3696}
3697
3698/*
3699** Implementation of ".expert" dot command.
3700*/
3701static int expertDotCommand(
3702  ShellState *pState,             /* Current shell tool state */
3703  char **azArg,                   /* Array of arguments passed to dot command */
3704  int nArg                        /* Number of entries in azArg[] */
3705){
3706  int rc = SQLITE_OK;
3707  char *zErr = 0;
3708  int i;
3709  int iSample = 0;
3710
3711  assert( pState->expert.pExpert==0 );
3712  memset(&pState->expert, 0, sizeof(ExpertInfo));
3713
3714  for(i=1; rc==SQLITE_OK && i<nArg; i++){
3715    char *z = azArg[i];
3716    int n;
3717    if( z[0]=='-' && z[1]=='-' ) z++;
3718    n = strlen30(z);
3719    if( n>=2 && 0==strncmp(z, "-verbose", n) ){
3720      pState->expert.bVerbose = 1;
3721    }
3722    else if( n>=2 && 0==strncmp(z, "-sample", n) ){
3723      if( i==(nArg-1) ){
3724        raw_printf(stderr, "option requires an argument: %s\n", z);
3725        rc = SQLITE_ERROR;
3726      }else{
3727        iSample = (int)integerValue(azArg[++i]);
3728        if( iSample<0 || iSample>100 ){
3729          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3730          rc = SQLITE_ERROR;
3731        }
3732      }
3733    }
3734    else{
3735      raw_printf(stderr, "unknown option: %s\n", z);
3736      rc = SQLITE_ERROR;
3737    }
3738  }
3739
3740  if( rc==SQLITE_OK ){
3741    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3742    if( pState->expert.pExpert==0 ){
3743      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3744      rc = SQLITE_ERROR;
3745    }else{
3746      sqlite3_expert_config(
3747          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3748      );
3749    }
3750  }
3751  sqlite3_free(zErr);
3752
3753  return rc;
3754}
3755#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3756
3757/*
3758** Execute a statement or set of statements.  Print
3759** any result rows/columns depending on the current mode
3760** set via the supplied callback.
3761**
3762** This is very similar to SQLite's built-in sqlite3_exec()
3763** function except it takes a slightly different callback
3764** and callback data argument.
3765*/
3766static int shell_exec(
3767  ShellState *pArg,                         /* Pointer to ShellState */
3768  const char *zSql,                         /* SQL to be evaluated */
3769  char **pzErrMsg                           /* Error msg written here */
3770){
3771  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
3772  int rc = SQLITE_OK;             /* Return Code */
3773  int rc2;
3774  const char *zLeftover;          /* Tail of unprocessed SQL */
3775  sqlite3 *db = pArg->db;
3776
3777  if( pzErrMsg ){
3778    *pzErrMsg = NULL;
3779  }
3780
3781#ifndef SQLITE_OMIT_VIRTUALTABLE
3782  if( pArg->expert.pExpert ){
3783    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3784    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3785  }
3786#endif
3787
3788  while( zSql[0] && (SQLITE_OK == rc) ){
3789    static const char *zStmtSql;
3790    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3791    if( SQLITE_OK != rc ){
3792      if( pzErrMsg ){
3793        *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
3794      }
3795    }else{
3796      if( !pStmt ){
3797        /* this happens for a comment or white-space */
3798        zSql = zLeftover;
3799        while( IsSpace(zSql[0]) ) zSql++;
3800        continue;
3801      }
3802      zStmtSql = sqlite3_sql(pStmt);
3803      if( zStmtSql==0 ) zStmtSql = "";
3804      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3805
3806      /* save off the prepared statment handle and reset row count */
3807      if( pArg ){
3808        pArg->pStmt = pStmt;
3809        pArg->cnt = 0;
3810      }
3811
3812      /* echo the sql statement if echo on */
3813      if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3814        utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3815      }
3816
3817      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3818      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3819        sqlite3_stmt *pExplain;
3820        char *zEQP;
3821        int triggerEQP = 0;
3822        disable_debug_trace_modes();
3823        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3824        if( pArg->autoEQP>=AUTOEQP_trigger ){
3825          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3826        }
3827        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3828        shell_check_oom(zEQP);
3829        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3830        if( rc==SQLITE_OK ){
3831          while( sqlite3_step(pExplain)==SQLITE_ROW ){
3832            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3833            int iEqpId = sqlite3_column_int(pExplain, 0);
3834            int iParentId = sqlite3_column_int(pExplain, 1);
3835            if( zEQPLine==0 ) zEQPLine = "";
3836            if( zEQPLine[0]=='-' ) eqp_render(pArg);
3837            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3838          }
3839          eqp_render(pArg);
3840        }
3841        sqlite3_finalize(pExplain);
3842        sqlite3_free(zEQP);
3843        if( pArg->autoEQP>=AUTOEQP_full ){
3844          /* Also do an EXPLAIN for ".eqp full" mode */
3845          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3846          shell_check_oom(zEQP);
3847          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3848          if( rc==SQLITE_OK ){
3849            pArg->cMode = MODE_Explain;
3850            explain_data_prepare(pArg, pExplain);
3851            exec_prepared_stmt(pArg, pExplain);
3852            explain_data_delete(pArg);
3853          }
3854          sqlite3_finalize(pExplain);
3855          sqlite3_free(zEQP);
3856        }
3857        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3858          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3859          /* Reprepare pStmt before reactiving trace modes */
3860          sqlite3_finalize(pStmt);
3861          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3862          if( pArg ) pArg->pStmt = pStmt;
3863        }
3864        restore_debug_trace_modes();
3865      }
3866
3867      if( pArg ){
3868        pArg->cMode = pArg->mode;
3869        if( pArg->autoExplain ){
3870          if( sqlite3_stmt_isexplain(pStmt)==1 ){
3871            pArg->cMode = MODE_Explain;
3872          }
3873          if( sqlite3_stmt_isexplain(pStmt)==2 ){
3874            pArg->cMode = MODE_EQP;
3875          }
3876        }
3877
3878        /* If the shell is currently in ".explain" mode, gather the extra
3879        ** data required to add indents to the output.*/
3880        if( pArg->cMode==MODE_Explain ){
3881          explain_data_prepare(pArg, pStmt);
3882        }
3883      }
3884
3885      bind_prepared_stmt(pArg, pStmt);
3886      exec_prepared_stmt(pArg, pStmt);
3887      explain_data_delete(pArg);
3888      eqp_render(pArg);
3889
3890      /* print usage stats if stats on */
3891      if( pArg && pArg->statsOn ){
3892        display_stats(db, pArg, 0);
3893      }
3894
3895      /* print loop-counters if required */
3896      if( pArg && pArg->scanstatsOn ){
3897        display_scanstats(db, pArg);
3898      }
3899
3900      /* Finalize the statement just executed. If this fails, save a
3901      ** copy of the error message. Otherwise, set zSql to point to the
3902      ** next statement to execute. */
3903      rc2 = sqlite3_finalize(pStmt);
3904      if( rc!=SQLITE_NOMEM ) rc = rc2;
3905      if( rc==SQLITE_OK ){
3906        zSql = zLeftover;
3907        while( IsSpace(zSql[0]) ) zSql++;
3908      }else if( pzErrMsg ){
3909        *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
3910      }
3911
3912      /* clear saved stmt handle */
3913      if( pArg ){
3914        pArg->pStmt = NULL;
3915      }
3916    }
3917  } /* end while */
3918
3919  return rc;
3920}
3921
3922/*
3923** Release memory previously allocated by tableColumnList().
3924*/
3925static void freeColumnList(char **azCol){
3926  int i;
3927  for(i=1; azCol[i]; i++){
3928    sqlite3_free(azCol[i]);
3929  }
3930  /* azCol[0] is a static string */
3931  sqlite3_free(azCol);
3932}
3933
3934/*
3935** Return a list of pointers to strings which are the names of all
3936** columns in table zTab.   The memory to hold the names is dynamically
3937** allocated and must be released by the caller using a subsequent call
3938** to freeColumnList().
3939**
3940** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
3941** value that needs to be preserved, then azCol[0] is filled in with the
3942** name of the rowid column.
3943**
3944** The first regular column in the table is azCol[1].  The list is terminated
3945** by an entry with azCol[i]==0.
3946*/
3947static char **tableColumnList(ShellState *p, const char *zTab){
3948  char **azCol = 0;
3949  sqlite3_stmt *pStmt;
3950  char *zSql;
3951  int nCol = 0;
3952  int nAlloc = 0;
3953  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
3954  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
3955  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3956  int rc;
3957
3958  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3959  shell_check_oom(zSql);
3960  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3961  sqlite3_free(zSql);
3962  if( rc ) return 0;
3963  while( sqlite3_step(pStmt)==SQLITE_ROW ){
3964    if( nCol>=nAlloc-2 ){
3965      nAlloc = nAlloc*2 + nCol + 10;
3966      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3967      shell_check_oom(azCol);
3968    }
3969    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3970    shell_check_oom(azCol[nCol]);
3971    if( sqlite3_column_int(pStmt, 5) ){
3972      nPK++;
3973      if( nPK==1
3974       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3975                          "INTEGER")==0
3976      ){
3977        isIPK = 1;
3978      }else{
3979        isIPK = 0;
3980      }
3981    }
3982  }
3983  sqlite3_finalize(pStmt);
3984  if( azCol==0 ) return 0;
3985  azCol[0] = 0;
3986  azCol[nCol+1] = 0;
3987
3988  /* The decision of whether or not a rowid really needs to be preserved
3989  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
3990  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
3991  ** rowids on tables where the rowid is inaccessible because there are other
3992  ** columns in the table named "rowid", "_rowid_", and "oid".
3993  */
3994  if( preserveRowid && isIPK ){
3995    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3996    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
3997    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3998    ** ROWID aliases.  To distinguish these cases, check to see if
3999    ** there is a "pk" entry in "PRAGMA index_list".  There will be
4000    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
4001    */
4002    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
4003                           " WHERE origin='pk'", zTab);
4004    shell_check_oom(zSql);
4005    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4006    sqlite3_free(zSql);
4007    if( rc ){
4008      freeColumnList(azCol);
4009      return 0;
4010    }
4011    rc = sqlite3_step(pStmt);
4012    sqlite3_finalize(pStmt);
4013    preserveRowid = rc==SQLITE_ROW;
4014  }
4015  if( preserveRowid ){
4016    /* Only preserve the rowid if we can find a name to use for the
4017    ** rowid */
4018    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
4019    int i, j;
4020    for(j=0; j<3; j++){
4021      for(i=1; i<=nCol; i++){
4022        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
4023      }
4024      if( i>nCol ){
4025        /* At this point, we know that azRowid[j] is not the name of any
4026        ** ordinary column in the table.  Verify that azRowid[j] is a valid
4027        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
4028        ** tables will fail this last check */
4029        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
4030        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
4031        break;
4032      }
4033    }
4034  }
4035  return azCol;
4036}
4037
4038/*
4039** Toggle the reverse_unordered_selects setting.
4040*/
4041static void toggleSelectOrder(sqlite3 *db){
4042  sqlite3_stmt *pStmt = 0;
4043  int iSetting = 0;
4044  char zStmt[100];
4045  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
4046  if( sqlite3_step(pStmt)==SQLITE_ROW ){
4047    iSetting = sqlite3_column_int(pStmt, 0);
4048  }
4049  sqlite3_finalize(pStmt);
4050  sqlite3_snprintf(sizeof(zStmt), zStmt,
4051       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
4052  sqlite3_exec(db, zStmt, 0, 0, 0);
4053}
4054
4055/*
4056** This is a different callback routine used for dumping the database.
4057** Each row received by this callback consists of a table name,
4058** the table type ("index" or "table") and SQL to create the table.
4059** This routine should print text sufficient to recreate the table.
4060*/
4061static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
4062  int rc;
4063  const char *zTable;
4064  const char *zType;
4065  const char *zSql;
4066  ShellState *p = (ShellState *)pArg;
4067  int dataOnly;
4068  int noSys;
4069
4070  UNUSED_PARAMETER(azNotUsed);
4071  if( nArg!=3 || azArg==0 ) return 0;
4072  zTable = azArg[0];
4073  zType = azArg[1];
4074  zSql = azArg[2];
4075  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
4076  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
4077
4078  if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
4079    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
4080  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
4081    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
4082  }else if( strncmp(zTable, "sqlite_", 7)==0 ){
4083    return 0;
4084  }else if( dataOnly ){
4085    /* no-op */
4086  }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
4087    char *zIns;
4088    if( !p->writableSchema ){
4089      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
4090      p->writableSchema = 1;
4091    }
4092    zIns = sqlite3_mprintf(
4093       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
4094       "VALUES('table','%q','%q',0,'%q');",
4095       zTable, zTable, zSql);
4096    shell_check_oom(zIns);
4097    utf8_printf(p->out, "%s\n", zIns);
4098    sqlite3_free(zIns);
4099    return 0;
4100  }else{
4101    printSchemaLine(p->out, zSql, ";\n");
4102  }
4103
4104  if( strcmp(zType, "table")==0 ){
4105    ShellText sSelect;
4106    ShellText sTable;
4107    char **azCol;
4108    int i;
4109    char *savedDestTable;
4110    int savedMode;
4111
4112    azCol = tableColumnList(p, zTable);
4113    if( azCol==0 ){
4114      p->nErr++;
4115      return 0;
4116    }
4117
4118    /* Always quote the table name, even if it appears to be pure ascii,
4119    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
4120    initText(&sTable);
4121    appendText(&sTable, zTable, quoteChar(zTable));
4122    /* If preserving the rowid, add a column list after the table name.
4123    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
4124    ** instead of the usual "INSERT INTO tab VALUES(...)".
4125    */
4126    if( azCol[0] ){
4127      appendText(&sTable, "(", 0);
4128      appendText(&sTable, azCol[0], 0);
4129      for(i=1; azCol[i]; i++){
4130        appendText(&sTable, ",", 0);
4131        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
4132      }
4133      appendText(&sTable, ")", 0);
4134    }
4135
4136    /* Build an appropriate SELECT statement */
4137    initText(&sSelect);
4138    appendText(&sSelect, "SELECT ", 0);
4139    if( azCol[0] ){
4140      appendText(&sSelect, azCol[0], 0);
4141      appendText(&sSelect, ",", 0);
4142    }
4143    for(i=1; azCol[i]; i++){
4144      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
4145      if( azCol[i+1] ){
4146        appendText(&sSelect, ",", 0);
4147      }
4148    }
4149    freeColumnList(azCol);
4150    appendText(&sSelect, " FROM ", 0);
4151    appendText(&sSelect, zTable, quoteChar(zTable));
4152
4153    savedDestTable = p->zDestTable;
4154    savedMode = p->mode;
4155    p->zDestTable = sTable.z;
4156    p->mode = p->cMode = MODE_Insert;
4157    rc = shell_exec(p, sSelect.z, 0);
4158    if( (rc&0xff)==SQLITE_CORRUPT ){
4159      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4160      toggleSelectOrder(p->db);
4161      shell_exec(p, sSelect.z, 0);
4162      toggleSelectOrder(p->db);
4163    }
4164    p->zDestTable = savedDestTable;
4165    p->mode = savedMode;
4166    freeText(&sTable);
4167    freeText(&sSelect);
4168    if( rc ) p->nErr++;
4169  }
4170  return 0;
4171}
4172
4173/*
4174** Run zQuery.  Use dump_callback() as the callback routine so that
4175** the contents of the query are output as SQL statements.
4176**
4177** If we get a SQLITE_CORRUPT error, rerun the query after appending
4178** "ORDER BY rowid DESC" to the end.
4179*/
4180static int run_schema_dump_query(
4181  ShellState *p,
4182  const char *zQuery
4183){
4184  int rc;
4185  char *zErr = 0;
4186  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
4187  if( rc==SQLITE_CORRUPT ){
4188    char *zQ2;
4189    int len = strlen30(zQuery);
4190    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4191    if( zErr ){
4192      utf8_printf(p->out, "/****** %s ******/\n", zErr);
4193      sqlite3_free(zErr);
4194      zErr = 0;
4195    }
4196    zQ2 = malloc( len+100 );
4197    if( zQ2==0 ) return rc;
4198    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
4199    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4200    if( rc ){
4201      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
4202    }else{
4203      rc = SQLITE_CORRUPT;
4204    }
4205    sqlite3_free(zErr);
4206    free(zQ2);
4207  }
4208  return rc;
4209}
4210
4211/*
4212** Text of help messages.
4213**
4214** The help text for each individual command begins with a line that starts
4215** with ".".  Subsequent lines are supplimental information.
4216**
4217** There must be two or more spaces between the end of the command and the
4218** start of the description of what that command does.
4219*/
4220static const char *(azHelp[]) = {
4221#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
4222  ".archive ...             Manage SQL archives",
4223  "   Each command must have exactly one of the following options:",
4224  "     -c, --create               Create a new archive",
4225  "     -u, --update               Add or update files with changed mtime",
4226  "     -i, --insert               Like -u but always add even if unchanged",
4227  "     -r, --remove               Remove files from archive",
4228  "     -t, --list                 List contents of archive",
4229  "     -x, --extract              Extract files from archive",
4230  "   Optional arguments:",
4231  "     -v, --verbose              Print each filename as it is processed",
4232  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
4233  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
4234  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
4235  "     -g, --glob                 Use glob matching for names in archive",
4236  "     -n, --dryrun               Show the SQL that would have occurred",
4237  "   Examples:",
4238  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
4239  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
4240  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
4241  "   See also:",
4242  "      http://sqlite.org/cli.html#sqlite_archive_support",
4243#endif
4244#ifndef SQLITE_OMIT_AUTHORIZATION
4245  ".auth ON|OFF             Show authorizer callbacks",
4246#endif
4247  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
4248  "   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    sqlite3_zipfile_init(p->db, 0, 0);
5001    sqlite3_sqlar_init(p->db, 0, 0);
5002#endif
5003    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
5004                            shellAddSchemaName, 0, 0);
5005    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
5006                            shellModuleSchema, 0, 0);
5007    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
5008                            shellPutsFunc, 0, 0);
5009    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
5010                            shellEscapeCrnl, 0, 0);
5011    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
5012                            shellInt32, 0, 0);
5013    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
5014                            shellIdQuote, 0, 0);
5015    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
5016                            shellUSleepFunc, 0, 0);
5017#ifndef SQLITE_NOHAVE_SYSTEM
5018    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
5019                            editFunc, 0, 0);
5020    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
5021                            editFunc, 0, 0);
5022#endif
5023    if( p->openMode==SHELL_OPEN_ZIPFILE ){
5024      char *zSql = sqlite3_mprintf(
5025         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
5026      shell_check_oom(zSql);
5027      sqlite3_exec(p->db, zSql, 0, 0, 0);
5028      sqlite3_free(zSql);
5029    }
5030#ifndef SQLITE_OMIT_DESERIALIZE
5031    else
5032    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
5033      int rc;
5034      int nData = 0;
5035      unsigned char *aData;
5036      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
5037        aData = (unsigned char*)readFile(zDbFilename, &nData);
5038      }else{
5039        aData = readHexDb(p, &nData);
5040        if( aData==0 ){
5041          return;
5042        }
5043      }
5044      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
5045                   SQLITE_DESERIALIZE_RESIZEABLE |
5046                   SQLITE_DESERIALIZE_FREEONCLOSE);
5047      if( rc ){
5048        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
5049      }
5050      if( p->szMax>0 ){
5051        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
5052      }
5053    }
5054#endif
5055  }
5056  if( p->bSafeModePersist && p->db!=0 ){
5057    sqlite3_set_authorizer(p->db, safeModeAuth, p);
5058  }
5059}
5060
5061/*
5062** Attempt to close the databaes connection.  Report errors.
5063*/
5064void close_db(sqlite3 *db){
5065  int rc = sqlite3_close(db);
5066  if( rc ){
5067    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
5068        rc, sqlite3_errmsg(db));
5069  }
5070}
5071
5072#if HAVE_READLINE || HAVE_EDITLINE
5073/*
5074** Readline completion callbacks
5075*/
5076static char *readline_completion_generator(const char *text, int state){
5077  static sqlite3_stmt *pStmt = 0;
5078  char *zRet;
5079  if( state==0 ){
5080    char *zSql;
5081    sqlite3_finalize(pStmt);
5082    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5083                           "  FROM completion(%Q) ORDER BY 1", text);
5084    shell_check_oom(zSql);
5085    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5086    sqlite3_free(zSql);
5087  }
5088  if( sqlite3_step(pStmt)==SQLITE_ROW ){
5089    const char *z = (const char*)sqlite3_column_text(pStmt,0);
5090    zRet = z ? strdup(z) : 0;
5091  }else{
5092    sqlite3_finalize(pStmt);
5093    pStmt = 0;
5094    zRet = 0;
5095  }
5096  return zRet;
5097}
5098static char **readline_completion(const char *zText, int iStart, int iEnd){
5099  rl_attempted_completion_over = 1;
5100  return rl_completion_matches(zText, readline_completion_generator);
5101}
5102
5103#elif HAVE_LINENOISE
5104/*
5105** Linenoise completion callback
5106*/
5107static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
5108  int nLine = strlen30(zLine);
5109  int i, iStart;
5110  sqlite3_stmt *pStmt = 0;
5111  char *zSql;
5112  char zBuf[1000];
5113
5114  if( nLine>sizeof(zBuf)-30 ) return;
5115  if( zLine[0]=='.' || zLine[0]=='#') return;
5116  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
5117  if( i==nLine-1 ) return;
5118  iStart = i+1;
5119  memcpy(zBuf, zLine, iStart);
5120  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5121                         "  FROM completion(%Q,%Q) ORDER BY 1",
5122                         &zLine[iStart], zLine);
5123  shell_check_oom(zSql);
5124  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5125  sqlite3_free(zSql);
5126  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
5127  while( sqlite3_step(pStmt)==SQLITE_ROW ){
5128    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
5129    int nCompletion = sqlite3_column_bytes(pStmt, 0);
5130    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
5131      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
5132      linenoiseAddCompletion(lc, zBuf);
5133    }
5134  }
5135  sqlite3_finalize(pStmt);
5136}
5137#endif
5138
5139/*
5140** Do C-language style dequoting.
5141**
5142**    \a    -> alarm
5143**    \b    -> backspace
5144**    \t    -> tab
5145**    \n    -> newline
5146**    \v    -> vertical tab
5147**    \f    -> form feed
5148**    \r    -> carriage return
5149**    \s    -> space
5150**    \"    -> "
5151**    \'    -> '
5152**    \\    -> backslash
5153**    \NNN  -> ascii character NNN in octal
5154*/
5155static void resolve_backslashes(char *z){
5156  int i, j;
5157  char c;
5158  while( *z && *z!='\\' ) z++;
5159  for(i=j=0; (c = z[i])!=0; i++, j++){
5160    if( c=='\\' && z[i+1]!=0 ){
5161      c = z[++i];
5162      if( c=='a' ){
5163        c = '\a';
5164      }else if( c=='b' ){
5165        c = '\b';
5166      }else if( c=='t' ){
5167        c = '\t';
5168      }else if( c=='n' ){
5169        c = '\n';
5170      }else if( c=='v' ){
5171        c = '\v';
5172      }else if( c=='f' ){
5173        c = '\f';
5174      }else if( c=='r' ){
5175        c = '\r';
5176      }else if( c=='"' ){
5177        c = '"';
5178      }else if( c=='\'' ){
5179        c = '\'';
5180      }else if( c=='\\' ){
5181        c = '\\';
5182      }else if( c>='0' && c<='7' ){
5183        c -= '0';
5184        if( z[i+1]>='0' && z[i+1]<='7' ){
5185          i++;
5186          c = (c<<3) + z[i] - '0';
5187          if( z[i+1]>='0' && z[i+1]<='7' ){
5188            i++;
5189            c = (c<<3) + z[i] - '0';
5190          }
5191        }
5192      }
5193    }
5194    z[j] = c;
5195  }
5196  if( j<i ) z[j] = 0;
5197}
5198
5199/*
5200** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
5201** for TRUE and FALSE.  Return the integer value if appropriate.
5202*/
5203static int booleanValue(const char *zArg){
5204  int i;
5205  if( zArg[0]=='0' && zArg[1]=='x' ){
5206    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
5207  }else{
5208    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
5209  }
5210  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
5211  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
5212    return 1;
5213  }
5214  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
5215    return 0;
5216  }
5217  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
5218          zArg);
5219  return 0;
5220}
5221
5222/*
5223** Set or clear a shell flag according to a boolean value.
5224*/
5225static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
5226  if( booleanValue(zArg) ){
5227    ShellSetFlag(p, mFlag);
5228  }else{
5229    ShellClearFlag(p, mFlag);
5230  }
5231}
5232
5233/*
5234** Close an output file, assuming it is not stderr or stdout
5235*/
5236static void output_file_close(FILE *f){
5237  if( f && f!=stdout && f!=stderr ) fclose(f);
5238}
5239
5240/*
5241** Try to open an output file.   The names "stdout" and "stderr" are
5242** recognized and do the right thing.  NULL is returned if the output
5243** filename is "off".
5244*/
5245static FILE *output_file_open(const char *zFile, int bTextMode){
5246  FILE *f;
5247  if( strcmp(zFile,"stdout")==0 ){
5248    f = stdout;
5249  }else if( strcmp(zFile, "stderr")==0 ){
5250    f = stderr;
5251  }else if( strcmp(zFile, "off")==0 ){
5252    f = 0;
5253  }else{
5254    f = fopen(zFile, bTextMode ? "w" : "wb");
5255    if( f==0 ){
5256      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5257    }
5258  }
5259  return f;
5260}
5261
5262#ifndef SQLITE_OMIT_TRACE
5263/*
5264** A routine for handling output from sqlite3_trace().
5265*/
5266static int sql_trace_callback(
5267  unsigned mType,         /* The trace type */
5268  void *pArg,             /* The ShellState pointer */
5269  void *pP,               /* Usually a pointer to sqlite_stmt */
5270  void *pX                /* Auxiliary output */
5271){
5272  ShellState *p = (ShellState*)pArg;
5273  sqlite3_stmt *pStmt;
5274  const char *zSql;
5275  int nSql;
5276  if( p->traceOut==0 ) return 0;
5277  if( mType==SQLITE_TRACE_CLOSE ){
5278    utf8_printf(p->traceOut, "-- closing database connection\n");
5279    return 0;
5280  }
5281  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5282    zSql = (const char*)pX;
5283  }else{
5284    pStmt = (sqlite3_stmt*)pP;
5285    switch( p->eTraceType ){
5286      case SHELL_TRACE_EXPANDED: {
5287        zSql = sqlite3_expanded_sql(pStmt);
5288        break;
5289      }
5290#ifdef SQLITE_ENABLE_NORMALIZE
5291      case SHELL_TRACE_NORMALIZED: {
5292        zSql = sqlite3_normalized_sql(pStmt);
5293        break;
5294      }
5295#endif
5296      default: {
5297        zSql = sqlite3_sql(pStmt);
5298        break;
5299      }
5300    }
5301  }
5302  if( zSql==0 ) return 0;
5303  nSql = strlen30(zSql);
5304  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5305  switch( mType ){
5306    case SQLITE_TRACE_ROW:
5307    case SQLITE_TRACE_STMT: {
5308      utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5309      break;
5310    }
5311    case SQLITE_TRACE_PROFILE: {
5312      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5313      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5314      break;
5315    }
5316  }
5317  return 0;
5318}
5319#endif
5320
5321/*
5322** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5323** a useful spot to set a debugger breakpoint.
5324*/
5325static void test_breakpoint(void){
5326  static int nCall = 0;
5327  nCall++;
5328}
5329
5330/*
5331** An object used to read a CSV and other files for import.
5332*/
5333typedef struct ImportCtx ImportCtx;
5334struct ImportCtx {
5335  const char *zFile;  /* Name of the input file */
5336  FILE *in;           /* Read the CSV text from this input stream */
5337  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5338  char *z;            /* Accumulated text for a field */
5339  int n;              /* Number of bytes in z */
5340  int nAlloc;         /* Space allocated for z[] */
5341  int nLine;          /* Current line number */
5342  int nRow;           /* Number of rows imported */
5343  int nErr;           /* Number of errors encountered */
5344  int bNotFirst;      /* True if one or more bytes already read */
5345  int cTerm;          /* Character that terminated the most recent field */
5346  int cColSep;        /* The column separator character.  (Usually ",") */
5347  int cRowSep;        /* The row separator character.  (Usually "\n") */
5348};
5349
5350/* Clean up resourced used by an ImportCtx */
5351static void import_cleanup(ImportCtx *p){
5352  if( p->in!=0 && p->xCloser!=0 ){
5353    p->xCloser(p->in);
5354    p->in = 0;
5355  }
5356  sqlite3_free(p->z);
5357  p->z = 0;
5358}
5359
5360/* Append a single byte to z[] */
5361static void import_append_char(ImportCtx *p, int c){
5362  if( p->n+1>=p->nAlloc ){
5363    p->nAlloc += p->nAlloc + 100;
5364    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5365    shell_check_oom(p->z);
5366  }
5367  p->z[p->n++] = (char)c;
5368}
5369
5370/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5371** with the option of having a separator other than ",".
5372**
5373**   +  Input comes from p->in.
5374**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5375**      from sqlite3_malloc64().
5376**   +  Use p->cSep as the column separator.  The default is ",".
5377**   +  Use p->rSep as the row separator.  The default is "\n".
5378**   +  Keep track of the line number in p->nLine.
5379**   +  Store the character that terminates the field in p->cTerm.  Store
5380**      EOF on end-of-file.
5381**   +  Report syntax errors on stderr
5382*/
5383static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5384  int c;
5385  int cSep = p->cColSep;
5386  int rSep = p->cRowSep;
5387  p->n = 0;
5388  c = fgetc(p->in);
5389  if( c==EOF || seenInterrupt ){
5390    p->cTerm = EOF;
5391    return 0;
5392  }
5393  if( c=='"' ){
5394    int pc, ppc;
5395    int startLine = p->nLine;
5396    int cQuote = c;
5397    pc = ppc = 0;
5398    while( 1 ){
5399      c = fgetc(p->in);
5400      if( c==rSep ) p->nLine++;
5401      if( c==cQuote ){
5402        if( pc==cQuote ){
5403          pc = 0;
5404          continue;
5405        }
5406      }
5407      if( (c==cSep && pc==cQuote)
5408       || (c==rSep && pc==cQuote)
5409       || (c==rSep && pc=='\r' && ppc==cQuote)
5410       || (c==EOF && pc==cQuote)
5411      ){
5412        do{ p->n--; }while( p->z[p->n]!=cQuote );
5413        p->cTerm = c;
5414        break;
5415      }
5416      if( pc==cQuote && c!='\r' ){
5417        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5418                p->zFile, p->nLine, cQuote);
5419      }
5420      if( c==EOF ){
5421        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5422                p->zFile, startLine, cQuote);
5423        p->cTerm = c;
5424        break;
5425      }
5426      import_append_char(p, c);
5427      ppc = pc;
5428      pc = c;
5429    }
5430  }else{
5431    /* If this is the first field being parsed and it begins with the
5432    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5433    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5434      import_append_char(p, c);
5435      c = fgetc(p->in);
5436      if( (c&0xff)==0xbb ){
5437        import_append_char(p, c);
5438        c = fgetc(p->in);
5439        if( (c&0xff)==0xbf ){
5440          p->bNotFirst = 1;
5441          p->n = 0;
5442          return csv_read_one_field(p);
5443        }
5444      }
5445    }
5446    while( c!=EOF && c!=cSep && c!=rSep ){
5447      import_append_char(p, c);
5448      c = fgetc(p->in);
5449    }
5450    if( c==rSep ){
5451      p->nLine++;
5452      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5453    }
5454    p->cTerm = c;
5455  }
5456  if( p->z ) p->z[p->n] = 0;
5457  p->bNotFirst = 1;
5458  return p->z;
5459}
5460
5461/* Read a single field of ASCII delimited text.
5462**
5463**   +  Input comes from p->in.
5464**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5465**      from sqlite3_malloc64().
5466**   +  Use p->cSep as the column separator.  The default is "\x1F".
5467**   +  Use p->rSep as the row separator.  The default is "\x1E".
5468**   +  Keep track of the row number in p->nLine.
5469**   +  Store the character that terminates the field in p->cTerm.  Store
5470**      EOF on end-of-file.
5471**   +  Report syntax errors on stderr
5472*/
5473static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5474  int c;
5475  int cSep = p->cColSep;
5476  int rSep = p->cRowSep;
5477  p->n = 0;
5478  c = fgetc(p->in);
5479  if( c==EOF || seenInterrupt ){
5480    p->cTerm = EOF;
5481    return 0;
5482  }
5483  while( c!=EOF && c!=cSep && c!=rSep ){
5484    import_append_char(p, c);
5485    c = fgetc(p->in);
5486  }
5487  if( c==rSep ){
5488    p->nLine++;
5489  }
5490  p->cTerm = c;
5491  if( p->z ) p->z[p->n] = 0;
5492  return p->z;
5493}
5494
5495/*
5496** Try to transfer data for table zTable.  If an error is seen while
5497** moving forward, try to go backwards.  The backwards movement won't
5498** work for WITHOUT ROWID tables.
5499*/
5500static void tryToCloneData(
5501  ShellState *p,
5502  sqlite3 *newDb,
5503  const char *zTable
5504){
5505  sqlite3_stmt *pQuery = 0;
5506  sqlite3_stmt *pInsert = 0;
5507  char *zQuery = 0;
5508  char *zInsert = 0;
5509  int rc;
5510  int i, j, n;
5511  int nTable = strlen30(zTable);
5512  int k = 0;
5513  int cnt = 0;
5514  const int spinRate = 10000;
5515
5516  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5517  shell_check_oom(zQuery);
5518  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5519  if( rc ){
5520    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5521            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5522            zQuery);
5523    goto end_data_xfer;
5524  }
5525  n = sqlite3_column_count(pQuery);
5526  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5527  shell_check_oom(zInsert);
5528  sqlite3_snprintf(200+nTable,zInsert,
5529                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5530  i = strlen30(zInsert);
5531  for(j=1; j<n; j++){
5532    memcpy(zInsert+i, ",?", 2);
5533    i += 2;
5534  }
5535  memcpy(zInsert+i, ");", 3);
5536  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5537  if( rc ){
5538    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5539            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5540            zQuery);
5541    goto end_data_xfer;
5542  }
5543  for(k=0; k<2; k++){
5544    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5545      for(i=0; i<n; i++){
5546        switch( sqlite3_column_type(pQuery, i) ){
5547          case SQLITE_NULL: {
5548            sqlite3_bind_null(pInsert, i+1);
5549            break;
5550          }
5551          case SQLITE_INTEGER: {
5552            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5553            break;
5554          }
5555          case SQLITE_FLOAT: {
5556            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5557            break;
5558          }
5559          case SQLITE_TEXT: {
5560            sqlite3_bind_text(pInsert, i+1,
5561                             (const char*)sqlite3_column_text(pQuery,i),
5562                             -1, SQLITE_STATIC);
5563            break;
5564          }
5565          case SQLITE_BLOB: {
5566            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5567                                            sqlite3_column_bytes(pQuery,i),
5568                                            SQLITE_STATIC);
5569            break;
5570          }
5571        }
5572      } /* End for */
5573      rc = sqlite3_step(pInsert);
5574      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5575        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5576                        sqlite3_errmsg(newDb));
5577      }
5578      sqlite3_reset(pInsert);
5579      cnt++;
5580      if( (cnt%spinRate)==0 ){
5581        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5582        fflush(stdout);
5583      }
5584    } /* End while */
5585    if( rc==SQLITE_DONE ) break;
5586    sqlite3_finalize(pQuery);
5587    sqlite3_free(zQuery);
5588    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5589                             zTable);
5590    shell_check_oom(zQuery);
5591    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5592    if( rc ){
5593      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5594      break;
5595    }
5596  } /* End for(k=0...) */
5597
5598end_data_xfer:
5599  sqlite3_finalize(pQuery);
5600  sqlite3_finalize(pInsert);
5601  sqlite3_free(zQuery);
5602  sqlite3_free(zInsert);
5603}
5604
5605
5606/*
5607** Try to transfer all rows of the schema that match zWhere.  For
5608** each row, invoke xForEach() on the object defined by that row.
5609** If an error is encountered while moving forward through the
5610** sqlite_schema table, try again moving backwards.
5611*/
5612static void tryToCloneSchema(
5613  ShellState *p,
5614  sqlite3 *newDb,
5615  const char *zWhere,
5616  void (*xForEach)(ShellState*,sqlite3*,const char*)
5617){
5618  sqlite3_stmt *pQuery = 0;
5619  char *zQuery = 0;
5620  int rc;
5621  const unsigned char *zName;
5622  const unsigned char *zSql;
5623  char *zErrMsg = 0;
5624
5625  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5626                           " WHERE %s", zWhere);
5627  shell_check_oom(zQuery);
5628  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5629  if( rc ){
5630    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5631                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5632                    zQuery);
5633    goto end_schema_xfer;
5634  }
5635  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5636    zName = sqlite3_column_text(pQuery, 0);
5637    zSql = sqlite3_column_text(pQuery, 1);
5638    if( zName==0 || zSql==0 ) continue;
5639    printf("%s... ", zName); fflush(stdout);
5640    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5641    if( zErrMsg ){
5642      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5643      sqlite3_free(zErrMsg);
5644      zErrMsg = 0;
5645    }
5646    if( xForEach ){
5647      xForEach(p, newDb, (const char*)zName);
5648    }
5649    printf("done\n");
5650  }
5651  if( rc!=SQLITE_DONE ){
5652    sqlite3_finalize(pQuery);
5653    sqlite3_free(zQuery);
5654    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5655                             " WHERE %s ORDER BY rowid DESC", zWhere);
5656    shell_check_oom(zQuery);
5657    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5658    if( rc ){
5659      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5660                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5661                      zQuery);
5662      goto end_schema_xfer;
5663    }
5664    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5665      zName = sqlite3_column_text(pQuery, 0);
5666      zSql = sqlite3_column_text(pQuery, 1);
5667      if( zName==0 || zSql==0 ) continue;
5668      printf("%s... ", zName); fflush(stdout);
5669      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5670      if( zErrMsg ){
5671        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5672        sqlite3_free(zErrMsg);
5673        zErrMsg = 0;
5674      }
5675      if( xForEach ){
5676        xForEach(p, newDb, (const char*)zName);
5677      }
5678      printf("done\n");
5679    }
5680  }
5681end_schema_xfer:
5682  sqlite3_finalize(pQuery);
5683  sqlite3_free(zQuery);
5684}
5685
5686/*
5687** Open a new database file named "zNewDb".  Try to recover as much information
5688** as possible out of the main database (which might be corrupt) and write it
5689** into zNewDb.
5690*/
5691static void tryToClone(ShellState *p, const char *zNewDb){
5692  int rc;
5693  sqlite3 *newDb = 0;
5694  if( access(zNewDb,0)==0 ){
5695    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5696    return;
5697  }
5698  rc = sqlite3_open(zNewDb, &newDb);
5699  if( rc ){
5700    utf8_printf(stderr, "Cannot create output database: %s\n",
5701            sqlite3_errmsg(newDb));
5702  }else{
5703    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5704    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5705    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5706    tryToCloneSchema(p, newDb, "type!='table'", 0);
5707    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5708    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5709  }
5710  close_db(newDb);
5711}
5712
5713/*
5714** Change the output file back to stdout.
5715**
5716** If the p->doXdgOpen flag is set, that means the output was being
5717** redirected to a temporary file named by p->zTempFile.  In that case,
5718** launch start/open/xdg-open on that temporary file.
5719*/
5720static void output_reset(ShellState *p){
5721  if( p->outfile[0]=='|' ){
5722#ifndef SQLITE_OMIT_POPEN
5723    pclose(p->out);
5724#endif
5725  }else{
5726    output_file_close(p->out);
5727#ifndef SQLITE_NOHAVE_SYSTEM
5728    if( p->doXdgOpen ){
5729      const char *zXdgOpenCmd =
5730#if defined(_WIN32)
5731      "start";
5732#elif defined(__APPLE__)
5733      "open";
5734#else
5735      "xdg-open";
5736#endif
5737      char *zCmd;
5738      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5739      if( system(zCmd) ){
5740        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5741      }else{
5742        /* Give the start/open/xdg-open command some time to get
5743        ** going before we continue, and potential delete the
5744        ** p->zTempFile data file out from under it */
5745        sqlite3_sleep(2000);
5746      }
5747      sqlite3_free(zCmd);
5748      outputModePop(p);
5749      p->doXdgOpen = 0;
5750    }
5751#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5752  }
5753  p->outfile[0] = 0;
5754  p->out = stdout;
5755}
5756
5757/*
5758** Run an SQL command and return the single integer result.
5759*/
5760static int db_int(sqlite3 *db, const char *zSql){
5761  sqlite3_stmt *pStmt;
5762  int res = 0;
5763  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
5764  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5765    res = sqlite3_column_int(pStmt,0);
5766  }
5767  sqlite3_finalize(pStmt);
5768  return res;
5769}
5770
5771/*
5772** Convert a 2-byte or 4-byte big-endian integer into a native integer
5773*/
5774static unsigned int get2byteInt(unsigned char *a){
5775  return (a[0]<<8) + a[1];
5776}
5777static unsigned int get4byteInt(unsigned char *a){
5778  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5779}
5780
5781/*
5782** Implementation of the ".dbinfo" command.
5783**
5784** Return 1 on error, 2 to exit, and 0 otherwise.
5785*/
5786static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5787  static const struct { const char *zName; int ofst; } aField[] = {
5788     { "file change counter:",  24  },
5789     { "database page count:",  28  },
5790     { "freelist page count:",  36  },
5791     { "schema cookie:",        40  },
5792     { "schema format:",        44  },
5793     { "default cache size:",   48  },
5794     { "autovacuum top root:",  52  },
5795     { "incremental vacuum:",   64  },
5796     { "text encoding:",        56  },
5797     { "user version:",         60  },
5798     { "application id:",       68  },
5799     { "software version:",     96  },
5800  };
5801  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5802     { "number of tables:",
5803       "SELECT count(*) FROM %s WHERE type='table'" },
5804     { "number of indexes:",
5805       "SELECT count(*) FROM %s WHERE type='index'" },
5806     { "number of triggers:",
5807       "SELECT count(*) FROM %s WHERE type='trigger'" },
5808     { "number of views:",
5809       "SELECT count(*) FROM %s WHERE type='view'" },
5810     { "schema size:",
5811       "SELECT total(length(sql)) FROM %s" },
5812  };
5813  int i, rc;
5814  unsigned iDataVersion;
5815  char *zSchemaTab;
5816  char *zDb = nArg>=2 ? azArg[1] : "main";
5817  sqlite3_stmt *pStmt = 0;
5818  unsigned char aHdr[100];
5819  open_db(p, 0);
5820  if( p->db==0 ) return 1;
5821  rc = sqlite3_prepare_v2(p->db,
5822             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5823             -1, &pStmt, 0);
5824  if( rc ){
5825    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5826    sqlite3_finalize(pStmt);
5827    return 1;
5828  }
5829  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5830  if( sqlite3_step(pStmt)==SQLITE_ROW
5831   && sqlite3_column_bytes(pStmt,0)>100
5832  ){
5833    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5834    sqlite3_finalize(pStmt);
5835  }else{
5836    raw_printf(stderr, "unable to read database header\n");
5837    sqlite3_finalize(pStmt);
5838    return 1;
5839  }
5840  i = get2byteInt(aHdr+16);
5841  if( i==1 ) i = 65536;
5842  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5843  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5844  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5845  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5846  for(i=0; i<ArraySize(aField); i++){
5847    int ofst = aField[i].ofst;
5848    unsigned int val = get4byteInt(aHdr + ofst);
5849    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5850    switch( ofst ){
5851      case 56: {
5852        if( val==1 ) raw_printf(p->out, " (utf8)");
5853        if( val==2 ) raw_printf(p->out, " (utf16le)");
5854        if( val==3 ) raw_printf(p->out, " (utf16be)");
5855      }
5856    }
5857    raw_printf(p->out, "\n");
5858  }
5859  if( zDb==0 ){
5860    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5861  }else if( strcmp(zDb,"temp")==0 ){
5862    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5863  }else{
5864    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5865  }
5866  for(i=0; i<ArraySize(aQuery); i++){
5867    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5868    int val = db_int(p->db, zSql);
5869    sqlite3_free(zSql);
5870    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5871  }
5872  sqlite3_free(zSchemaTab);
5873  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5874  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5875  return 0;
5876}
5877
5878/*
5879** Print the current sqlite3_errmsg() value to stderr and return 1.
5880*/
5881static int shellDatabaseError(sqlite3 *db){
5882  const char *zErr = sqlite3_errmsg(db);
5883  utf8_printf(stderr, "Error: %s\n", zErr);
5884  return 1;
5885}
5886
5887/*
5888** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
5889** if they match and FALSE (0) if they do not match.
5890**
5891** Globbing rules:
5892**
5893**      '*'       Matches any sequence of zero or more characters.
5894**
5895**      '?'       Matches exactly one character.
5896**
5897**     [...]      Matches one character from the enclosed list of
5898**                characters.
5899**
5900**     [^...]     Matches one character not in the enclosed list.
5901**
5902**      '#'       Matches any sequence of one or more digits with an
5903**                optional + or - sign in front
5904**
5905**      ' '       Any span of whitespace matches any other span of
5906**                whitespace.
5907**
5908** Extra whitespace at the end of z[] is ignored.
5909*/
5910static int testcase_glob(const char *zGlob, const char *z){
5911  int c, c2;
5912  int invert;
5913  int seen;
5914
5915  while( (c = (*(zGlob++)))!=0 ){
5916    if( IsSpace(c) ){
5917      if( !IsSpace(*z) ) return 0;
5918      while( IsSpace(*zGlob) ) zGlob++;
5919      while( IsSpace(*z) ) z++;
5920    }else if( c=='*' ){
5921      while( (c=(*(zGlob++))) == '*' || c=='?' ){
5922        if( c=='?' && (*(z++))==0 ) return 0;
5923      }
5924      if( c==0 ){
5925        return 1;
5926      }else if( c=='[' ){
5927        while( *z && testcase_glob(zGlob-1,z)==0 ){
5928          z++;
5929        }
5930        return (*z)!=0;
5931      }
5932      while( (c2 = (*(z++)))!=0 ){
5933        while( c2!=c ){
5934          c2 = *(z++);
5935          if( c2==0 ) return 0;
5936        }
5937        if( testcase_glob(zGlob,z) ) return 1;
5938      }
5939      return 0;
5940    }else if( c=='?' ){
5941      if( (*(z++))==0 ) return 0;
5942    }else if( c=='[' ){
5943      int prior_c = 0;
5944      seen = 0;
5945      invert = 0;
5946      c = *(z++);
5947      if( c==0 ) return 0;
5948      c2 = *(zGlob++);
5949      if( c2=='^' ){
5950        invert = 1;
5951        c2 = *(zGlob++);
5952      }
5953      if( c2==']' ){
5954        if( c==']' ) seen = 1;
5955        c2 = *(zGlob++);
5956      }
5957      while( c2 && c2!=']' ){
5958        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5959          c2 = *(zGlob++);
5960          if( c>=prior_c && c<=c2 ) seen = 1;
5961          prior_c = 0;
5962        }else{
5963          if( c==c2 ){
5964            seen = 1;
5965          }
5966          prior_c = c2;
5967        }
5968        c2 = *(zGlob++);
5969      }
5970      if( c2==0 || (seen ^ invert)==0 ) return 0;
5971    }else if( c=='#' ){
5972      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5973      if( !IsDigit(z[0]) ) return 0;
5974      z++;
5975      while( IsDigit(z[0]) ){ z++; }
5976    }else{
5977      if( c!=(*(z++)) ) return 0;
5978    }
5979  }
5980  while( IsSpace(*z) ){ z++; }
5981  return *z==0;
5982}
5983
5984
5985/*
5986** Compare the string as a command-line option with either one or two
5987** initial "-" characters.
5988*/
5989static int optionMatch(const char *zStr, const char *zOpt){
5990  if( zStr[0]!='-' ) return 0;
5991  zStr++;
5992  if( zStr[0]=='-' ) zStr++;
5993  return strcmp(zStr, zOpt)==0;
5994}
5995
5996/*
5997** Delete a file.
5998*/
5999int shellDeleteFile(const char *zFilename){
6000  int rc;
6001#ifdef _WIN32
6002  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
6003  rc = _wunlink(z);
6004  sqlite3_free(z);
6005#else
6006  rc = unlink(zFilename);
6007#endif
6008  return rc;
6009}
6010
6011/*
6012** Try to delete the temporary file (if there is one) and free the
6013** memory used to hold the name of the temp file.
6014*/
6015static void clearTempFile(ShellState *p){
6016  if( p->zTempFile==0 ) return;
6017  if( p->doXdgOpen ) return;
6018  if( shellDeleteFile(p->zTempFile) ) return;
6019  sqlite3_free(p->zTempFile);
6020  p->zTempFile = 0;
6021}
6022
6023/*
6024** Create a new temp file name with the given suffix.
6025*/
6026static void newTempFile(ShellState *p, const char *zSuffix){
6027  clearTempFile(p);
6028  sqlite3_free(p->zTempFile);
6029  p->zTempFile = 0;
6030  if( p->db ){
6031    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
6032  }
6033  if( p->zTempFile==0 ){
6034    /* If p->db is an in-memory database then the TEMPFILENAME file-control
6035    ** will not work and we will need to fallback to guessing */
6036    char *zTemp;
6037    sqlite3_uint64 r;
6038    sqlite3_randomness(sizeof(r), &r);
6039    zTemp = getenv("TEMP");
6040    if( zTemp==0 ) zTemp = getenv("TMP");
6041    if( zTemp==0 ){
6042#ifdef _WIN32
6043      zTemp = "\\tmp";
6044#else
6045      zTemp = "/tmp";
6046#endif
6047    }
6048    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
6049  }else{
6050    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
6051  }
6052  shell_check_oom(p->zTempFile);
6053}
6054
6055
6056/*
6057** The implementation of SQL scalar function fkey_collate_clause(), used
6058** by the ".lint fkey-indexes" command. This scalar function is always
6059** called with four arguments - the parent table name, the parent column name,
6060** the child table name and the child column name.
6061**
6062**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
6063**
6064** If either of the named tables or columns do not exist, this function
6065** returns an empty string. An empty string is also returned if both tables
6066** and columns exist but have the same default collation sequence. Or,
6067** if both exist but the default collation sequences are different, this
6068** function returns the string " COLLATE <parent-collation>", where
6069** <parent-collation> is the default collation sequence of the parent column.
6070*/
6071static void shellFkeyCollateClause(
6072  sqlite3_context *pCtx,
6073  int nVal,
6074  sqlite3_value **apVal
6075){
6076  sqlite3 *db = sqlite3_context_db_handle(pCtx);
6077  const char *zParent;
6078  const char *zParentCol;
6079  const char *zParentSeq;
6080  const char *zChild;
6081  const char *zChildCol;
6082  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
6083  int rc;
6084
6085  assert( nVal==4 );
6086  zParent = (const char*)sqlite3_value_text(apVal[0]);
6087  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
6088  zChild = (const char*)sqlite3_value_text(apVal[2]);
6089  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
6090
6091  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
6092  rc = sqlite3_table_column_metadata(
6093      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
6094  );
6095  if( rc==SQLITE_OK ){
6096    rc = sqlite3_table_column_metadata(
6097        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
6098    );
6099  }
6100
6101  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
6102    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
6103    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
6104    sqlite3_free(z);
6105  }
6106}
6107
6108
6109/*
6110** The implementation of dot-command ".lint fkey-indexes".
6111*/
6112static int lintFkeyIndexes(
6113  ShellState *pState,             /* Current shell tool state */
6114  char **azArg,                   /* Array of arguments passed to dot command */
6115  int nArg                        /* Number of entries in azArg[] */
6116){
6117  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
6118  FILE *out = pState->out;        /* Stream to write non-error output to */
6119  int bVerbose = 0;               /* If -verbose is present */
6120  int bGroupByParent = 0;         /* If -groupbyparent is present */
6121  int i;                          /* To iterate through azArg[] */
6122  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
6123  int rc;                         /* Return code */
6124  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
6125
6126  /*
6127  ** This SELECT statement returns one row for each foreign key constraint
6128  ** in the schema of the main database. The column values are:
6129  **
6130  ** 0. The text of an SQL statement similar to:
6131  **
6132  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
6133  **
6134  **    This SELECT is similar to the one that the foreign keys implementation
6135  **    needs to run internally on child tables. If there is an index that can
6136  **    be used to optimize this query, then it can also be used by the FK
6137  **    implementation to optimize DELETE or UPDATE statements on the parent
6138  **    table.
6139  **
6140  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
6141  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
6142  **    contains an index that can be used to optimize the query.
6143  **
6144  ** 2. Human readable text that describes the child table and columns. e.g.
6145  **
6146  **       "child_table(child_key1, child_key2)"
6147  **
6148  ** 3. Human readable text that describes the parent table and columns. e.g.
6149  **
6150  **       "parent_table(parent_key1, parent_key2)"
6151  **
6152  ** 4. A full CREATE INDEX statement for an index that could be used to
6153  **    optimize DELETE or UPDATE statements on the parent table. e.g.
6154  **
6155  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
6156  **
6157  ** 5. The name of the parent table.
6158  **
6159  ** These six values are used by the C logic below to generate the report.
6160  */
6161  const char *zSql =
6162  "SELECT "
6163    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
6164    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
6165    "  || fkey_collate_clause("
6166    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
6167    ", "
6168    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
6169    "  || group_concat('*=?', ' AND ') || ')'"
6170    ", "
6171    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
6172    ", "
6173    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
6174    ", "
6175    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
6176    "  || ' ON ' || quote(s.name) || '('"
6177    "  || group_concat(quote(f.[from]) ||"
6178    "        fkey_collate_clause("
6179    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
6180    "  || ');'"
6181    ", "
6182    "     f.[table] "
6183    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
6184    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
6185    "GROUP BY s.name, f.id "
6186    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
6187  ;
6188  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
6189
6190  for(i=2; i<nArg; i++){
6191    int n = strlen30(azArg[i]);
6192    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
6193      bVerbose = 1;
6194    }
6195    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
6196      bGroupByParent = 1;
6197      zIndent = "    ";
6198    }
6199    else{
6200      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
6201          azArg[0], azArg[1]
6202      );
6203      return SQLITE_ERROR;
6204    }
6205  }
6206
6207  /* Register the fkey_collate_clause() SQL function */
6208  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
6209      0, shellFkeyCollateClause, 0, 0
6210  );
6211
6212
6213  if( rc==SQLITE_OK ){
6214    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
6215  }
6216  if( rc==SQLITE_OK ){
6217    sqlite3_bind_int(pSql, 1, bGroupByParent);
6218  }
6219
6220  if( rc==SQLITE_OK ){
6221    int rc2;
6222    char *zPrev = 0;
6223    while( SQLITE_ROW==sqlite3_step(pSql) ){
6224      int res = -1;
6225      sqlite3_stmt *pExplain = 0;
6226      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
6227      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
6228      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
6229      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
6230      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
6231      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
6232
6233      if( zEQP==0 ) continue;
6234      if( zGlob==0 ) continue;
6235      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6236      if( rc!=SQLITE_OK ) break;
6237      if( SQLITE_ROW==sqlite3_step(pExplain) ){
6238        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6239        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
6240                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
6241      }
6242      rc = sqlite3_finalize(pExplain);
6243      if( rc!=SQLITE_OK ) break;
6244
6245      if( res<0 ){
6246        raw_printf(stderr, "Error: internal error");
6247        break;
6248      }else{
6249        if( bGroupByParent
6250        && (bVerbose || res==0)
6251        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6252        ){
6253          raw_printf(out, "-- Parent table %s\n", zParent);
6254          sqlite3_free(zPrev);
6255          zPrev = sqlite3_mprintf("%s", zParent);
6256        }
6257
6258        if( res==0 ){
6259          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6260        }else if( bVerbose ){
6261          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6262              zIndent, zFrom, zTarget
6263          );
6264        }
6265      }
6266    }
6267    sqlite3_free(zPrev);
6268
6269    if( rc!=SQLITE_OK ){
6270      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6271    }
6272
6273    rc2 = sqlite3_finalize(pSql);
6274    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6275      rc = rc2;
6276      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6277    }
6278  }else{
6279    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6280  }
6281
6282  return rc;
6283}
6284
6285/*
6286** Implementation of ".lint" dot command.
6287*/
6288static int lintDotCommand(
6289  ShellState *pState,             /* Current shell tool state */
6290  char **azArg,                   /* Array of arguments passed to dot command */
6291  int nArg                        /* Number of entries in azArg[] */
6292){
6293  int n;
6294  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6295  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6296  return lintFkeyIndexes(pState, azArg, nArg);
6297
6298 usage:
6299  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6300  raw_printf(stderr, "Where sub-commands are:\n");
6301  raw_printf(stderr, "    fkey-indexes\n");
6302  return SQLITE_ERROR;
6303}
6304
6305#if !defined SQLITE_OMIT_VIRTUALTABLE
6306static void shellPrepare(
6307  sqlite3 *db,
6308  int *pRc,
6309  const char *zSql,
6310  sqlite3_stmt **ppStmt
6311){
6312  *ppStmt = 0;
6313  if( *pRc==SQLITE_OK ){
6314    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6315    if( rc!=SQLITE_OK ){
6316      raw_printf(stderr, "sql error: %s (%d)\n",
6317          sqlite3_errmsg(db), sqlite3_errcode(db)
6318      );
6319      *pRc = rc;
6320    }
6321  }
6322}
6323
6324/*
6325** Create a prepared statement using printf-style arguments for the SQL.
6326**
6327** This routine is could be marked "static".  But it is not always used,
6328** depending on compile-time options.  By omitting the "static", we avoid
6329** nuisance compiler warnings about "defined but not used".
6330*/
6331void shellPreparePrintf(
6332  sqlite3 *db,
6333  int *pRc,
6334  sqlite3_stmt **ppStmt,
6335  const char *zFmt,
6336  ...
6337){
6338  *ppStmt = 0;
6339  if( *pRc==SQLITE_OK ){
6340    va_list ap;
6341    char *z;
6342    va_start(ap, zFmt);
6343    z = sqlite3_vmprintf(zFmt, ap);
6344    va_end(ap);
6345    if( z==0 ){
6346      *pRc = SQLITE_NOMEM;
6347    }else{
6348      shellPrepare(db, pRc, z, ppStmt);
6349      sqlite3_free(z);
6350    }
6351  }
6352}
6353
6354/* Finalize the prepared statement created using shellPreparePrintf().
6355**
6356** This routine is could be marked "static".  But it is not always used,
6357** depending on compile-time options.  By omitting the "static", we avoid
6358** nuisance compiler warnings about "defined but not used".
6359*/
6360void shellFinalize(
6361  int *pRc,
6362  sqlite3_stmt *pStmt
6363){
6364  if( pStmt ){
6365    sqlite3 *db = sqlite3_db_handle(pStmt);
6366    int rc = sqlite3_finalize(pStmt);
6367    if( *pRc==SQLITE_OK ){
6368      if( rc!=SQLITE_OK ){
6369        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6370      }
6371      *pRc = rc;
6372    }
6373  }
6374}
6375
6376/* Reset the prepared statement created using shellPreparePrintf().
6377**
6378** This routine is could be marked "static".  But it is not always used,
6379** depending on compile-time options.  By omitting the "static", we avoid
6380** nuisance compiler warnings about "defined but not used".
6381*/
6382void shellReset(
6383  int *pRc,
6384  sqlite3_stmt *pStmt
6385){
6386  int rc = sqlite3_reset(pStmt);
6387  if( *pRc==SQLITE_OK ){
6388    if( rc!=SQLITE_OK ){
6389      sqlite3 *db = sqlite3_db_handle(pStmt);
6390      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6391    }
6392    *pRc = rc;
6393  }
6394}
6395#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6396
6397#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6398/******************************************************************************
6399** The ".archive" or ".ar" command.
6400*/
6401/*
6402** Structure representing a single ".ar" command.
6403*/
6404typedef struct ArCommand ArCommand;
6405struct ArCommand {
6406  u8 eCmd;                        /* An AR_CMD_* value */
6407  u8 bVerbose;                    /* True if --verbose */
6408  u8 bZip;                        /* True if the archive is a ZIP */
6409  u8 bDryRun;                     /* True if --dry-run */
6410  u8 bAppend;                     /* True if --append */
6411  u8 bGlob;                       /* True if --glob */
6412  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6413  int nArg;                       /* Number of command arguments */
6414  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6415  const char *zFile;              /* --file argument, or NULL */
6416  const char *zDir;               /* --directory argument, or NULL */
6417  char **azArg;                   /* Array of command arguments */
6418  ShellState *p;                  /* Shell state */
6419  sqlite3 *db;                    /* Database containing the archive */
6420};
6421
6422/*
6423** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6424*/
6425static int arUsage(FILE *f){
6426  showHelp(f,"archive");
6427  return SQLITE_ERROR;
6428}
6429
6430/*
6431** Print an error message for the .ar command to stderr and return
6432** SQLITE_ERROR.
6433*/
6434static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6435  va_list ap;
6436  char *z;
6437  va_start(ap, zFmt);
6438  z = sqlite3_vmprintf(zFmt, ap);
6439  va_end(ap);
6440  utf8_printf(stderr, "Error: %s\n", z);
6441  if( pAr->fromCmdLine ){
6442    utf8_printf(stderr, "Use \"-A\" for more help\n");
6443  }else{
6444    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6445  }
6446  sqlite3_free(z);
6447  return SQLITE_ERROR;
6448}
6449
6450/*
6451** Values for ArCommand.eCmd.
6452*/
6453#define AR_CMD_CREATE       1
6454#define AR_CMD_UPDATE       2
6455#define AR_CMD_INSERT       3
6456#define AR_CMD_EXTRACT      4
6457#define AR_CMD_LIST         5
6458#define AR_CMD_HELP         6
6459#define AR_CMD_REMOVE       7
6460
6461/*
6462** Other (non-command) switches.
6463*/
6464#define AR_SWITCH_VERBOSE     8
6465#define AR_SWITCH_FILE        9
6466#define AR_SWITCH_DIRECTORY  10
6467#define AR_SWITCH_APPEND     11
6468#define AR_SWITCH_DRYRUN     12
6469#define AR_SWITCH_GLOB       13
6470
6471static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6472  switch( eSwitch ){
6473    case AR_CMD_CREATE:
6474    case AR_CMD_EXTRACT:
6475    case AR_CMD_LIST:
6476    case AR_CMD_REMOVE:
6477    case AR_CMD_UPDATE:
6478    case AR_CMD_INSERT:
6479    case AR_CMD_HELP:
6480      if( pAr->eCmd ){
6481        return arErrorMsg(pAr, "multiple command options");
6482      }
6483      pAr->eCmd = eSwitch;
6484      break;
6485
6486    case AR_SWITCH_DRYRUN:
6487      pAr->bDryRun = 1;
6488      break;
6489    case AR_SWITCH_GLOB:
6490      pAr->bGlob = 1;
6491      break;
6492    case AR_SWITCH_VERBOSE:
6493      pAr->bVerbose = 1;
6494      break;
6495    case AR_SWITCH_APPEND:
6496      pAr->bAppend = 1;
6497      /* Fall thru into --file */
6498    case AR_SWITCH_FILE:
6499      pAr->zFile = zArg;
6500      break;
6501    case AR_SWITCH_DIRECTORY:
6502      pAr->zDir = zArg;
6503      break;
6504  }
6505
6506  return SQLITE_OK;
6507}
6508
6509/*
6510** Parse the command line for an ".ar" command. The results are written into
6511** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6512** successfully, otherwise an error message is written to stderr and
6513** SQLITE_ERROR returned.
6514*/
6515static int arParseCommand(
6516  char **azArg,                   /* Array of arguments passed to dot command */
6517  int nArg,                       /* Number of entries in azArg[] */
6518  ArCommand *pAr                  /* Populate this object */
6519){
6520  struct ArSwitch {
6521    const char *zLong;
6522    char cShort;
6523    u8 eSwitch;
6524    u8 bArg;
6525  } aSwitch[] = {
6526    { "create",    'c', AR_CMD_CREATE,       0 },
6527    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6528    { "insert",    'i', AR_CMD_INSERT,       0 },
6529    { "list",      't', AR_CMD_LIST,         0 },
6530    { "remove",    'r', AR_CMD_REMOVE,       0 },
6531    { "update",    'u', AR_CMD_UPDATE,       0 },
6532    { "help",      'h', AR_CMD_HELP,         0 },
6533    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6534    { "file",      'f', AR_SWITCH_FILE,      1 },
6535    { "append",    'a', AR_SWITCH_APPEND,    1 },
6536    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6537    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6538    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6539  };
6540  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6541  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6542
6543  if( nArg<=1 ){
6544    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6545    return arUsage(stderr);
6546  }else{
6547    char *z = azArg[1];
6548    if( z[0]!='-' ){
6549      /* Traditional style [tar] invocation */
6550      int i;
6551      int iArg = 2;
6552      for(i=0; z[i]; i++){
6553        const char *zArg = 0;
6554        struct ArSwitch *pOpt;
6555        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6556          if( z[i]==pOpt->cShort ) break;
6557        }
6558        if( pOpt==pEnd ){
6559          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6560        }
6561        if( pOpt->bArg ){
6562          if( iArg>=nArg ){
6563            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6564          }
6565          zArg = azArg[iArg++];
6566        }
6567        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6568      }
6569      pAr->nArg = nArg-iArg;
6570      if( pAr->nArg>0 ){
6571        pAr->azArg = &azArg[iArg];
6572      }
6573    }else{
6574      /* Non-traditional invocation */
6575      int iArg;
6576      for(iArg=1; iArg<nArg; iArg++){
6577        int n;
6578        z = azArg[iArg];
6579        if( z[0]!='-' ){
6580          /* All remaining command line words are command arguments. */
6581          pAr->azArg = &azArg[iArg];
6582          pAr->nArg = nArg-iArg;
6583          break;
6584        }
6585        n = strlen30(z);
6586
6587        if( z[1]!='-' ){
6588          int i;
6589          /* One or more short options */
6590          for(i=1; i<n; i++){
6591            const char *zArg = 0;
6592            struct ArSwitch *pOpt;
6593            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6594              if( z[i]==pOpt->cShort ) break;
6595            }
6596            if( pOpt==pEnd ){
6597              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6598            }
6599            if( pOpt->bArg ){
6600              if( i<(n-1) ){
6601                zArg = &z[i+1];
6602                i = n;
6603              }else{
6604                if( iArg>=(nArg-1) ){
6605                  return arErrorMsg(pAr, "option requires an argument: %c",
6606                                    z[i]);
6607                }
6608                zArg = azArg[++iArg];
6609              }
6610            }
6611            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6612          }
6613        }else if( z[2]=='\0' ){
6614          /* A -- option, indicating that all remaining command line words
6615          ** are command arguments.  */
6616          pAr->azArg = &azArg[iArg+1];
6617          pAr->nArg = nArg-iArg-1;
6618          break;
6619        }else{
6620          /* A long option */
6621          const char *zArg = 0;             /* Argument for option, if any */
6622          struct ArSwitch *pMatch = 0;      /* Matching option */
6623          struct ArSwitch *pOpt;            /* Iterator */
6624          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6625            const char *zLong = pOpt->zLong;
6626            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6627              if( pMatch ){
6628                return arErrorMsg(pAr, "ambiguous option: %s",z);
6629              }else{
6630                pMatch = pOpt;
6631              }
6632            }
6633          }
6634
6635          if( pMatch==0 ){
6636            return arErrorMsg(pAr, "unrecognized option: %s", z);
6637          }
6638          if( pMatch->bArg ){
6639            if( iArg>=(nArg-1) ){
6640              return arErrorMsg(pAr, "option requires an argument: %s", z);
6641            }
6642            zArg = azArg[++iArg];
6643          }
6644          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6645        }
6646      }
6647    }
6648  }
6649
6650  return SQLITE_OK;
6651}
6652
6653/*
6654** This function assumes that all arguments within the ArCommand.azArg[]
6655** array refer to archive members, as for the --extract, --list or --remove
6656** commands. It checks that each of them are "present". If any specified
6657** file is not present in the archive, an error is printed to stderr and an
6658** error code returned. Otherwise, if all specified arguments are present
6659** in the archive, SQLITE_OK is returned. Here, "present" means either an
6660** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6661** when pAr->bGlob is true.
6662**
6663** This function strips any trailing '/' characters from each argument.
6664** This is consistent with the way the [tar] command seems to work on
6665** Linux.
6666*/
6667static int arCheckEntries(ArCommand *pAr){
6668  int rc = SQLITE_OK;
6669  if( pAr->nArg ){
6670    int i, j;
6671    sqlite3_stmt *pTest = 0;
6672    const char *zSel = (pAr->bGlob)
6673      ? "SELECT name FROM %s WHERE glob($name,name)"
6674      : "SELECT name FROM %s WHERE name=$name";
6675
6676    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6677    j = sqlite3_bind_parameter_index(pTest, "$name");
6678    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6679      char *z = pAr->azArg[i];
6680      int n = strlen30(z);
6681      int bOk = 0;
6682      while( n>0 && z[n-1]=='/' ) n--;
6683      z[n] = '\0';
6684      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6685      if( SQLITE_ROW==sqlite3_step(pTest) ){
6686        bOk = 1;
6687      }
6688      shellReset(&rc, pTest);
6689      if( rc==SQLITE_OK && bOk==0 ){
6690        utf8_printf(stderr, "not found in archive: %s\n", z);
6691        rc = SQLITE_ERROR;
6692      }
6693    }
6694    shellFinalize(&rc, pTest);
6695  }
6696  return rc;
6697}
6698
6699/*
6700** Format a WHERE clause that can be used against the "sqlar" table to
6701** identify all archive members that match the command arguments held
6702** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6703** The caller is responsible for eventually calling sqlite3_free() on
6704** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6705** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6706*/
6707static void arWhereClause(
6708  int *pRc,
6709  ArCommand *pAr,
6710  char **pzWhere                  /* OUT: New WHERE clause */
6711){
6712  char *zWhere = 0;
6713  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6714  if( *pRc==SQLITE_OK ){
6715    if( pAr->nArg==0 ){
6716      zWhere = sqlite3_mprintf("1");
6717    }else{
6718      int i;
6719      const char *zSep = "";
6720      for(i=0; i<pAr->nArg; i++){
6721        const char *z = pAr->azArg[i];
6722        zWhere = sqlite3_mprintf(
6723          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6724          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6725        );
6726        if( zWhere==0 ){
6727          *pRc = SQLITE_NOMEM;
6728          break;
6729        }
6730        zSep = " OR ";
6731      }
6732    }
6733  }
6734  *pzWhere = zWhere;
6735}
6736
6737/*
6738** Implementation of .ar "lisT" command.
6739*/
6740static int arListCommand(ArCommand *pAr){
6741  const char *zSql = "SELECT %s FROM %s WHERE %s";
6742  const char *azCols[] = {
6743    "name",
6744    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6745  };
6746
6747  char *zWhere = 0;
6748  sqlite3_stmt *pSql = 0;
6749  int rc;
6750
6751  rc = arCheckEntries(pAr);
6752  arWhereClause(&rc, pAr, &zWhere);
6753
6754  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6755                     pAr->zSrcTable, zWhere);
6756  if( pAr->bDryRun ){
6757    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6758  }else{
6759    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6760      if( pAr->bVerbose ){
6761        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6762            sqlite3_column_text(pSql, 0),
6763            sqlite3_column_int(pSql, 1),
6764            sqlite3_column_text(pSql, 2),
6765            sqlite3_column_text(pSql, 3)
6766        );
6767      }else{
6768        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6769      }
6770    }
6771  }
6772  shellFinalize(&rc, pSql);
6773  sqlite3_free(zWhere);
6774  return rc;
6775}
6776
6777
6778/*
6779** Implementation of .ar "Remove" command.
6780*/
6781static int arRemoveCommand(ArCommand *pAr){
6782  int rc = 0;
6783  char *zSql = 0;
6784  char *zWhere = 0;
6785
6786  if( pAr->nArg ){
6787    /* Verify that args actually exist within the archive before proceeding.
6788    ** And formulate a WHERE clause to match them.  */
6789    rc = arCheckEntries(pAr);
6790    arWhereClause(&rc, pAr, &zWhere);
6791  }
6792  if( rc==SQLITE_OK ){
6793    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6794                           pAr->zSrcTable, zWhere);
6795    if( pAr->bDryRun ){
6796      utf8_printf(pAr->p->out, "%s\n", zSql);
6797    }else{
6798      char *zErr = 0;
6799      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6800      if( rc==SQLITE_OK ){
6801        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6802        if( rc!=SQLITE_OK ){
6803          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6804        }else{
6805          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6806        }
6807      }
6808      if( zErr ){
6809        utf8_printf(stdout, "ERROR: %s\n", zErr);
6810        sqlite3_free(zErr);
6811      }
6812    }
6813  }
6814  sqlite3_free(zWhere);
6815  sqlite3_free(zSql);
6816  return rc;
6817}
6818
6819/*
6820** Implementation of .ar "eXtract" command.
6821*/
6822static int arExtractCommand(ArCommand *pAr){
6823  const char *zSql1 =
6824    "SELECT "
6825    " ($dir || name),"
6826    " writefile(($dir || name), %s, mode, mtime) "
6827    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6828    " AND name NOT GLOB '*..[/\\]*'";
6829
6830  const char *azExtraArg[] = {
6831    "sqlar_uncompress(data, sz)",
6832    "data"
6833  };
6834
6835  sqlite3_stmt *pSql = 0;
6836  int rc = SQLITE_OK;
6837  char *zDir = 0;
6838  char *zWhere = 0;
6839  int i, j;
6840
6841  /* If arguments are specified, check that they actually exist within
6842  ** the archive before proceeding. And formulate a WHERE clause to
6843  ** match them.  */
6844  rc = arCheckEntries(pAr);
6845  arWhereClause(&rc, pAr, &zWhere);
6846
6847  if( rc==SQLITE_OK ){
6848    if( pAr->zDir ){
6849      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6850    }else{
6851      zDir = sqlite3_mprintf("");
6852    }
6853    if( zDir==0 ) rc = SQLITE_NOMEM;
6854  }
6855
6856  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6857      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6858  );
6859
6860  if( rc==SQLITE_OK ){
6861    j = sqlite3_bind_parameter_index(pSql, "$dir");
6862    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6863
6864    /* Run the SELECT statement twice. The first time, writefile() is called
6865    ** for all archive members that should be extracted. The second time,
6866    ** only for the directories. This is because the timestamps for
6867    ** extracted directories must be reset after they are populated (as
6868    ** populating them changes the timestamp).  */
6869    for(i=0; i<2; i++){
6870      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6871      sqlite3_bind_int(pSql, j, i);
6872      if( pAr->bDryRun ){
6873        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6874      }else{
6875        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6876          if( i==0 && pAr->bVerbose ){
6877            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6878          }
6879        }
6880      }
6881      shellReset(&rc, pSql);
6882    }
6883    shellFinalize(&rc, pSql);
6884  }
6885
6886  sqlite3_free(zDir);
6887  sqlite3_free(zWhere);
6888  return rc;
6889}
6890
6891/*
6892** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
6893*/
6894static int arExecSql(ArCommand *pAr, const char *zSql){
6895  int rc;
6896  if( pAr->bDryRun ){
6897    utf8_printf(pAr->p->out, "%s\n", zSql);
6898    rc = SQLITE_OK;
6899  }else{
6900    char *zErr = 0;
6901    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6902    if( zErr ){
6903      utf8_printf(stdout, "ERROR: %s\n", zErr);
6904      sqlite3_free(zErr);
6905    }
6906  }
6907  return rc;
6908}
6909
6910
6911/*
6912** Implementation of .ar "create", "insert", and "update" commands.
6913**
6914**     create    ->     Create a new SQL archive
6915**     insert    ->     Insert or reinsert all files listed
6916**     update    ->     Insert files that have changed or that were not
6917**                      previously in the archive
6918**
6919** Create the "sqlar" table in the database if it does not already exist.
6920** Then add each file in the azFile[] array to the archive. Directories
6921** are added recursively. If argument bVerbose is non-zero, a message is
6922** printed on stdout for each file archived.
6923**
6924** The create command is the same as update, except that it drops
6925** any existing "sqlar" table before beginning.  The "insert" command
6926** always overwrites every file named on the command-line, where as
6927** "update" only overwrites if the size or mtime or mode has changed.
6928*/
6929static int arCreateOrUpdateCommand(
6930  ArCommand *pAr,                 /* Command arguments and options */
6931  int bUpdate,                    /* true for a --create. */
6932  int bOnlyIfChanged              /* Only update if file has changed */
6933){
6934  const char *zCreate =
6935      "CREATE TABLE IF NOT EXISTS sqlar(\n"
6936      "  name TEXT PRIMARY KEY,  -- name of the file\n"
6937      "  mode INT,               -- access permissions\n"
6938      "  mtime INT,              -- last modification time\n"
6939      "  sz INT,                 -- original file size\n"
6940      "  data BLOB               -- compressed content\n"
6941      ")";
6942  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6943  const char *zInsertFmt[2] = {
6944     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6945     "  SELECT\n"
6946     "    %s,\n"
6947     "    mode,\n"
6948     "    mtime,\n"
6949     "    CASE substr(lsmode(mode),1,1)\n"
6950     "      WHEN '-' THEN length(data)\n"
6951     "      WHEN 'd' THEN 0\n"
6952     "      ELSE -1 END,\n"
6953     "    sqlar_compress(data)\n"
6954     "  FROM fsdir(%Q,%Q) AS disk\n"
6955     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6956     ,
6957     "REPLACE INTO %s(name,mode,mtime,data)\n"
6958     "  SELECT\n"
6959     "    %s,\n"
6960     "    mode,\n"
6961     "    mtime,\n"
6962     "    data\n"
6963     "  FROM fsdir(%Q,%Q) AS disk\n"
6964     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6965  };
6966  int i;                          /* For iterating through azFile[] */
6967  int rc;                         /* Return code */
6968  const char *zTab = 0;           /* SQL table into which to insert */
6969  char *zSql;
6970  char zTemp[50];
6971  char *zExists = 0;
6972
6973  arExecSql(pAr, "PRAGMA page_size=512");
6974  rc = arExecSql(pAr, "SAVEPOINT ar;");
6975  if( rc!=SQLITE_OK ) return rc;
6976  zTemp[0] = 0;
6977  if( pAr->bZip ){
6978    /* Initialize the zipfile virtual table, if necessary */
6979    if( pAr->zFile ){
6980      sqlite3_uint64 r;
6981      sqlite3_randomness(sizeof(r),&r);
6982      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6983      zTab = zTemp;
6984      zSql = sqlite3_mprintf(
6985         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6986         zTab, pAr->zFile
6987      );
6988      rc = arExecSql(pAr, zSql);
6989      sqlite3_free(zSql);
6990    }else{
6991      zTab = "zip";
6992    }
6993  }else{
6994    /* Initialize the table for an SQLAR */
6995    zTab = "sqlar";
6996    if( bUpdate==0 ){
6997      rc = arExecSql(pAr, zDrop);
6998      if( rc!=SQLITE_OK ) goto end_ar_transaction;
6999    }
7000    rc = arExecSql(pAr, zCreate);
7001  }
7002  if( bOnlyIfChanged ){
7003    zExists = sqlite3_mprintf(
7004      " AND NOT EXISTS("
7005          "SELECT 1 FROM %s AS mem"
7006          " WHERE mem.name=disk.name"
7007          " AND mem.mtime=disk.mtime"
7008          " AND mem.mode=disk.mode)", zTab);
7009  }else{
7010    zExists = sqlite3_mprintf("");
7011  }
7012  if( zExists==0 ) rc = SQLITE_NOMEM;
7013  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
7014    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
7015        pAr->bVerbose ? "shell_putsnl(name)" : "name",
7016        pAr->azArg[i], pAr->zDir, zExists);
7017    rc = arExecSql(pAr, zSql2);
7018    sqlite3_free(zSql2);
7019  }
7020end_ar_transaction:
7021  if( rc!=SQLITE_OK ){
7022    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
7023  }else{
7024    rc = arExecSql(pAr, "RELEASE ar;");
7025    if( pAr->bZip && pAr->zFile ){
7026      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
7027      arExecSql(pAr, zSql);
7028      sqlite3_free(zSql);
7029    }
7030  }
7031  sqlite3_free(zExists);
7032  return rc;
7033}
7034
7035/*
7036** Implementation of ".ar" dot command.
7037*/
7038static int arDotCommand(
7039  ShellState *pState,          /* Current shell tool state */
7040  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
7041  char **azArg,                /* Array of arguments passed to dot command */
7042  int nArg                     /* Number of entries in azArg[] */
7043){
7044  ArCommand cmd;
7045  int rc;
7046  memset(&cmd, 0, sizeof(cmd));
7047  cmd.fromCmdLine = fromCmdLine;
7048  rc = arParseCommand(azArg, nArg, &cmd);
7049  if( rc==SQLITE_OK ){
7050    int eDbType = SHELL_OPEN_UNSPEC;
7051    cmd.p = pState;
7052    cmd.db = pState->db;
7053    if( cmd.zFile ){
7054      eDbType = deduceDatabaseType(cmd.zFile, 1);
7055    }else{
7056      eDbType = pState->openMode;
7057    }
7058    if( eDbType==SHELL_OPEN_ZIPFILE ){
7059      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
7060        if( cmd.zFile==0 ){
7061          cmd.zSrcTable = sqlite3_mprintf("zip");
7062        }else{
7063          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
7064        }
7065      }
7066      cmd.bZip = 1;
7067    }else if( cmd.zFile ){
7068      int flags;
7069      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
7070      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
7071           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
7072        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
7073      }else{
7074        flags = SQLITE_OPEN_READONLY;
7075      }
7076      cmd.db = 0;
7077      if( cmd.bDryRun ){
7078        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
7079             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
7080      }
7081      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
7082             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
7083      if( rc!=SQLITE_OK ){
7084        utf8_printf(stderr, "cannot open file: %s (%s)\n",
7085            cmd.zFile, sqlite3_errmsg(cmd.db)
7086        );
7087        goto end_ar_command;
7088      }
7089      sqlite3_fileio_init(cmd.db, 0, 0);
7090      sqlite3_sqlar_init(cmd.db, 0, 0);
7091      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
7092                              shellPutsFunc, 0, 0);
7093
7094    }
7095    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
7096      if( cmd.eCmd!=AR_CMD_CREATE
7097       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
7098      ){
7099        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
7100        rc = SQLITE_ERROR;
7101        goto end_ar_command;
7102      }
7103      cmd.zSrcTable = sqlite3_mprintf("sqlar");
7104    }
7105
7106    switch( cmd.eCmd ){
7107      case AR_CMD_CREATE:
7108        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
7109        break;
7110
7111      case AR_CMD_EXTRACT:
7112        rc = arExtractCommand(&cmd);
7113        break;
7114
7115      case AR_CMD_LIST:
7116        rc = arListCommand(&cmd);
7117        break;
7118
7119      case AR_CMD_HELP:
7120        arUsage(pState->out);
7121        break;
7122
7123      case AR_CMD_INSERT:
7124        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
7125        break;
7126
7127      case AR_CMD_REMOVE:
7128        rc = arRemoveCommand(&cmd);
7129        break;
7130
7131      default:
7132        assert( cmd.eCmd==AR_CMD_UPDATE );
7133        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
7134        break;
7135    }
7136  }
7137end_ar_command:
7138  if( cmd.db!=pState->db ){
7139    close_db(cmd.db);
7140  }
7141  sqlite3_free(cmd.zSrcTable);
7142
7143  return rc;
7144}
7145/* End of the ".archive" or ".ar" command logic
7146*******************************************************************************/
7147#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
7148
7149#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7150/*
7151** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
7152** Otherwise, the SQL statement or statements in zSql are executed using
7153** database connection db and the error code written to *pRc before
7154** this function returns.
7155*/
7156static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
7157  int rc = *pRc;
7158  if( rc==SQLITE_OK ){
7159    char *zErr = 0;
7160    rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
7161    if( rc!=SQLITE_OK ){
7162      raw_printf(stderr, "SQL error: %s\n", zErr);
7163    }
7164    sqlite3_free(zErr);
7165    *pRc = rc;
7166  }
7167}
7168
7169/*
7170** Like shellExec(), except that zFmt is a printf() style format string.
7171*/
7172static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
7173  char *z = 0;
7174  if( *pRc==SQLITE_OK ){
7175    va_list ap;
7176    va_start(ap, zFmt);
7177    z = sqlite3_vmprintf(zFmt, ap);
7178    va_end(ap);
7179    if( z==0 ){
7180      *pRc = SQLITE_NOMEM;
7181    }else{
7182      shellExec(db, pRc, z);
7183    }
7184    sqlite3_free(z);
7185  }
7186}
7187
7188/*
7189** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7190** Otherwise, an attempt is made to allocate, zero and return a pointer
7191** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
7192** to SQLITE_NOMEM and NULL returned.
7193*/
7194static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
7195  void *pRet = 0;
7196  if( *pRc==SQLITE_OK ){
7197    pRet = sqlite3_malloc64(nByte);
7198    if( pRet==0 ){
7199      *pRc = SQLITE_NOMEM;
7200    }else{
7201      memset(pRet, 0, nByte);
7202    }
7203  }
7204  return pRet;
7205}
7206
7207/*
7208** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7209** Otherwise, zFmt is treated as a printf() style string. The result of
7210** formatting it along with any trailing arguments is written into a
7211** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
7212** It is the responsibility of the caller to eventually free this buffer
7213** using a call to sqlite3_free().
7214**
7215** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
7216** pointer returned.
7217*/
7218static char *shellMPrintf(int *pRc, const char *zFmt, ...){
7219  char *z = 0;
7220  if( *pRc==SQLITE_OK ){
7221    va_list ap;
7222    va_start(ap, zFmt);
7223    z = sqlite3_vmprintf(zFmt, ap);
7224    va_end(ap);
7225    if( z==0 ){
7226      *pRc = SQLITE_NOMEM;
7227    }
7228  }
7229  return z;
7230}
7231
7232
7233/*
7234** When running the ".recover" command, each output table, and the special
7235** orphaned row table if it is required, is represented by an instance
7236** of the following struct.
7237*/
7238typedef struct RecoverTable RecoverTable;
7239struct RecoverTable {
7240  char *zQuoted;                  /* Quoted version of table name */
7241  int nCol;                       /* Number of columns in table */
7242  char **azlCol;                  /* Array of column lists */
7243  int iPk;                        /* Index of IPK column */
7244};
7245
7246/*
7247** Free a RecoverTable object allocated by recoverFindTable() or
7248** recoverOrphanTable().
7249*/
7250static void recoverFreeTable(RecoverTable *pTab){
7251  if( pTab ){
7252    sqlite3_free(pTab->zQuoted);
7253    if( pTab->azlCol ){
7254      int i;
7255      for(i=0; i<=pTab->nCol; i++){
7256        sqlite3_free(pTab->azlCol[i]);
7257      }
7258      sqlite3_free(pTab->azlCol);
7259    }
7260    sqlite3_free(pTab);
7261  }
7262}
7263
7264/*
7265** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
7266** Otherwise, it allocates and returns a RecoverTable object based on the
7267** final four arguments passed to this function. It is the responsibility
7268** of the caller to eventually free the returned object using
7269** recoverFreeTable().
7270*/
7271static RecoverTable *recoverNewTable(
7272  int *pRc,                       /* IN/OUT: Error code */
7273  const char *zName,              /* Name of table */
7274  const char *zSql,               /* CREATE TABLE statement */
7275  int bIntkey,
7276  int nCol
7277){
7278  sqlite3 *dbtmp = 0;             /* sqlite3 handle for testing CREATE TABLE */
7279  int rc = *pRc;
7280  RecoverTable *pTab = 0;
7281
7282  pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
7283  if( rc==SQLITE_OK ){
7284    int nSqlCol = 0;
7285    int bSqlIntkey = 0;
7286    sqlite3_stmt *pStmt = 0;
7287
7288    rc = sqlite3_open("", &dbtmp);
7289    if( rc==SQLITE_OK ){
7290      sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7291                              shellIdQuote, 0, 0);
7292    }
7293    if( rc==SQLITE_OK ){
7294      rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7295    }
7296    if( rc==SQLITE_OK ){
7297      rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7298      if( rc==SQLITE_ERROR ){
7299        rc = SQLITE_OK;
7300        goto finished;
7301      }
7302    }
7303    shellPreparePrintf(dbtmp, &rc, &pStmt,
7304        "SELECT count(*) FROM pragma_table_info(%Q)", zName
7305    );
7306    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7307      nSqlCol = sqlite3_column_int(pStmt, 0);
7308    }
7309    shellFinalize(&rc, pStmt);
7310
7311    if( rc!=SQLITE_OK || nSqlCol<nCol ){
7312      goto finished;
7313    }
7314
7315    shellPreparePrintf(dbtmp, &rc, &pStmt,
7316      "SELECT ("
7317      "  SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7318      ") FROM sqlite_schema WHERE name = %Q", zName
7319    );
7320    if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7321      bSqlIntkey = sqlite3_column_int(pStmt, 0);
7322    }
7323    shellFinalize(&rc, pStmt);
7324
7325    if( bIntkey==bSqlIntkey ){
7326      int i;
7327      const char *zPk = "_rowid_";
7328      sqlite3_stmt *pPkFinder = 0;
7329
7330      /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7331      ** set zPk to the name of the PK column, and pTab->iPk to the index
7332      ** of the column, where columns are 0-numbered from left to right.
7333      ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7334      ** leave zPk as "_rowid_" and pTab->iPk at -2.  */
7335      pTab->iPk = -2;
7336      if( bIntkey ){
7337        shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7338          "SELECT cid, name FROM pragma_table_info(%Q) "
7339          "  WHERE pk=1 AND type='integer' COLLATE nocase"
7340          "  AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7341          , zName, zName
7342        );
7343        if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7344          pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7345          zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7346          if( zPk==0 ){ zPk = "_";  /* Defensive.  Should never happen */ }
7347        }
7348      }
7349
7350      pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7351      pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7352      pTab->nCol = nSqlCol;
7353
7354      if( bIntkey ){
7355        pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7356      }else{
7357        pTab->azlCol[0] = shellMPrintf(&rc, "");
7358      }
7359      i = 1;
7360      shellPreparePrintf(dbtmp, &rc, &pStmt,
7361          "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7362          "  FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7363          "FROM pragma_table_info(%Q)",
7364          bIntkey ? ", " : "", pTab->iPk,
7365          bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7366          zName
7367      );
7368      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7369        const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7370        pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7371        i++;
7372      }
7373      shellFinalize(&rc, pStmt);
7374
7375      shellFinalize(&rc, pPkFinder);
7376    }
7377  }
7378
7379 finished:
7380  sqlite3_close(dbtmp);
7381  *pRc = rc;
7382  if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7383    recoverFreeTable(pTab);
7384    pTab = 0;
7385  }
7386  return pTab;
7387}
7388
7389/*
7390** This function is called to search the schema recovered from the
7391** sqlite_schema table of the (possibly) corrupt database as part
7392** of a ".recover" command. Specifically, for a table with root page
7393** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7394** table must be a WITHOUT ROWID table, or if non-zero, not one of
7395** those.
7396**
7397** If a table is found, a (RecoverTable*) object is returned. Or, if
7398** no such table is found, but bIntkey is false and iRoot is the
7399** root page of an index in the recovered schema, then (*pbNoop) is
7400** set to true and NULL returned. Or, if there is no such table or
7401** index, NULL is returned and (*pbNoop) set to 0, indicating that
7402** the caller should write data to the orphans table.
7403*/
7404static RecoverTable *recoverFindTable(
7405  ShellState *pState,             /* Shell state object */
7406  int *pRc,                       /* IN/OUT: Error code */
7407  int iRoot,                      /* Root page of table */
7408  int bIntkey,                    /* True for an intkey table */
7409  int nCol,                       /* Number of columns in table */
7410  int *pbNoop                     /* OUT: True if iRoot is root of index */
7411){
7412  sqlite3_stmt *pStmt = 0;
7413  RecoverTable *pRet = 0;
7414  int bNoop = 0;
7415  const char *zSql = 0;
7416  const char *zName = 0;
7417
7418  /* Search the recovered schema for an object with root page iRoot. */
7419  shellPreparePrintf(pState->db, pRc, &pStmt,
7420      "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7421  );
7422  while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7423    const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7424    if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7425      bNoop = 1;
7426      break;
7427    }
7428    if( sqlite3_stricmp(zType, "table")==0 ){
7429      zName = (const char*)sqlite3_column_text(pStmt, 1);
7430      zSql = (const char*)sqlite3_column_text(pStmt, 2);
7431      if( zName!=0 && zSql!=0 ){
7432        pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7433        break;
7434      }
7435    }
7436  }
7437
7438  shellFinalize(pRc, pStmt);
7439  *pbNoop = bNoop;
7440  return pRet;
7441}
7442
7443/*
7444** Return a RecoverTable object representing the orphans table.
7445*/
7446static RecoverTable *recoverOrphanTable(
7447  ShellState *pState,             /* Shell state object */
7448  int *pRc,                       /* IN/OUT: Error code */
7449  const char *zLostAndFound,      /* Base name for orphans table */
7450  int nCol                        /* Number of user data columns */
7451){
7452  RecoverTable *pTab = 0;
7453  if( nCol>=0 && *pRc==SQLITE_OK ){
7454    int i;
7455
7456    /* This block determines the name of the orphan table. The prefered
7457    ** name is zLostAndFound. But if that clashes with another name
7458    ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7459    ** and so on until a non-clashing name is found.  */
7460    int iTab = 0;
7461    char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7462    sqlite3_stmt *pTest = 0;
7463    shellPrepare(pState->db, pRc,
7464        "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7465    );
7466    if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7467    while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7468      shellReset(pRc, pTest);
7469      sqlite3_free(zTab);
7470      zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7471      sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7472    }
7473    shellFinalize(pRc, pTest);
7474
7475    pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7476    if( pTab ){
7477      pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7478      pTab->nCol = nCol;
7479      pTab->iPk = -2;
7480      if( nCol>0 ){
7481        pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7482        if( pTab->azlCol ){
7483          pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7484          for(i=nCol-1; i>=0; i--){
7485            pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7486          }
7487        }
7488      }
7489
7490      if( *pRc!=SQLITE_OK ){
7491        recoverFreeTable(pTab);
7492        pTab = 0;
7493      }else{
7494        raw_printf(pState->out,
7495            "CREATE TABLE %s(rootpgno INTEGER, "
7496            "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7497        );
7498        for(i=0; i<nCol; i++){
7499          raw_printf(pState->out, ", c%d", i);
7500        }
7501        raw_printf(pState->out, ");\n");
7502      }
7503    }
7504    sqlite3_free(zTab);
7505  }
7506  return pTab;
7507}
7508
7509/*
7510** This function is called to recover data from the database. A script
7511** to construct a new database containing all recovered data is output
7512** on stream pState->out.
7513*/
7514static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7515  int rc = SQLITE_OK;
7516  sqlite3_stmt *pLoop = 0;        /* Loop through all root pages */
7517  sqlite3_stmt *pPages = 0;       /* Loop through all pages in a group */
7518  sqlite3_stmt *pCells = 0;       /* Loop through all cells in a page */
7519  const char *zRecoveryDb = "";   /* Name of "recovery" database */
7520  const char *zLostAndFound = "lost_and_found";
7521  int i;
7522  int nOrphan = -1;
7523  RecoverTable *pOrphan = 0;
7524
7525  int bFreelist = 1;              /* 0 if --freelist-corrupt is specified */
7526  int bRowids = 1;                /* 0 if --no-rowids */
7527  for(i=1; i<nArg; i++){
7528    char *z = azArg[i];
7529    int n;
7530    if( z[0]=='-' && z[1]=='-' ) z++;
7531    n = strlen30(z);
7532    if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7533      bFreelist = 0;
7534    }else
7535    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7536      i++;
7537      zRecoveryDb = azArg[i];
7538    }else
7539    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7540      i++;
7541      zLostAndFound = azArg[i];
7542    }else
7543    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7544      bRowids = 0;
7545    }
7546    else{
7547      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7548      showHelp(pState->out, azArg[0]);
7549      return 1;
7550    }
7551  }
7552
7553  shellExecPrintf(pState->db, &rc,
7554    /* Attach an in-memory database named 'recovery'. Create an indexed
7555    ** cache of the sqlite_dbptr virtual table. */
7556    "PRAGMA writable_schema = on;"
7557    "ATTACH %Q AS recovery;"
7558    "DROP TABLE IF EXISTS recovery.dbptr;"
7559    "DROP TABLE IF EXISTS recovery.freelist;"
7560    "DROP TABLE IF EXISTS recovery.map;"
7561    "DROP TABLE IF EXISTS recovery.schema;"
7562    "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7563  );
7564
7565  if( bFreelist ){
7566    shellExec(pState->db, &rc,
7567      "WITH trunk(pgno) AS ("
7568      "  SELECT shell_int32("
7569      "      (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7570      "      WHERE x>0"
7571      "    UNION"
7572      "  SELECT shell_int32("
7573      "      (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7574      "      FROM trunk WHERE x>0"
7575      "),"
7576      "freelist(data, n, freepgno) AS ("
7577      "  SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7578      "      FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7579      "    UNION ALL"
7580      "  SELECT data, n-1, shell_int32(data, 2+n) "
7581      "      FROM freelist WHERE n>=0"
7582      ")"
7583      "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7584    );
7585  }
7586
7587  /* If this is an auto-vacuum database, add all pointer-map pages to
7588  ** the freelist table. Do this regardless of whether or not
7589  ** --freelist-corrupt was specified.  */
7590  shellExec(pState->db, &rc,
7591    "WITH ptrmap(pgno) AS ("
7592    "  SELECT 2 WHERE shell_int32("
7593    "    (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7594    "  )"
7595    "    UNION ALL "
7596    "  SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7597    "  FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7598    ")"
7599    "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7600  );
7601
7602  shellExec(pState->db, &rc,
7603    "CREATE TABLE recovery.dbptr("
7604    "      pgno, child, PRIMARY KEY(child, pgno)"
7605    ") WITHOUT ROWID;"
7606    "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7607    "    SELECT * FROM sqlite_dbptr"
7608    "      WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7609
7610    /* Delete any pointer to page 1. This ensures that page 1 is considered
7611    ** a root page, regardless of how corrupt the db is. */
7612    "DELETE FROM recovery.dbptr WHERE child = 1;"
7613
7614    /* Delete all pointers to any pages that have more than one pointer
7615    ** to them. Such pages will be treated as root pages when recovering
7616    ** data.  */
7617    "DELETE FROM recovery.dbptr WHERE child IN ("
7618    "  SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7619    ");"
7620
7621    /* Create the "map" table that will (eventually) contain instructions
7622    ** for dealing with each page in the db that contains one or more
7623    ** records. */
7624    "CREATE TABLE recovery.map("
7625      "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7626    ");"
7627
7628    /* Populate table [map]. If there are circular loops of pages in the
7629    ** database, the following adds all pages in such a loop to the map
7630    ** as individual root pages. This could be handled better.  */
7631    "WITH pages(i, maxlen) AS ("
7632    "  SELECT page_count, ("
7633    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7634    "  ) FROM pragma_page_count WHERE page_count>0"
7635    "    UNION ALL"
7636    "  SELECT i-1, ("
7637    "    SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7638    "  ) FROM pages WHERE i>=2"
7639    ")"
7640    "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7641    "  SELECT i, maxlen, NULL, ("
7642    "    WITH p(orig, pgno, parent) AS ("
7643    "      SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7644    "        UNION "
7645    "      SELECT i, p.parent, "
7646    "        (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7647    "    )"
7648    "    SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7649    ") "
7650    "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7651    "UPDATE recovery.map AS o SET intkey = ("
7652    "  SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7653    ");"
7654
7655    /* Extract data from page 1 and any linked pages into table
7656    ** recovery.schema. With the same schema as an sqlite_schema table.  */
7657    "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7658    "INSERT INTO recovery.schema SELECT "
7659    "  max(CASE WHEN field=0 THEN value ELSE NULL END),"
7660    "  max(CASE WHEN field=1 THEN value ELSE NULL END),"
7661    "  max(CASE WHEN field=2 THEN value ELSE NULL END),"
7662    "  max(CASE WHEN field=3 THEN value ELSE NULL END),"
7663    "  max(CASE WHEN field=4 THEN value ELSE NULL END)"
7664    "FROM sqlite_dbdata WHERE pgno IN ("
7665    "  SELECT pgno FROM recovery.map WHERE root=1"
7666    ")"
7667    "GROUP BY pgno, cell;"
7668    "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7669  );
7670
7671  /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7672  ** CREATE TABLE statements that extracted from the existing schema.  */
7673  if( rc==SQLITE_OK ){
7674    sqlite3_stmt *pStmt = 0;
7675    /* ".recover" might output content in an order which causes immediate
7676    ** foreign key constraints to be violated. So disable foreign-key
7677    ** constraint enforcement to prevent problems when running the output
7678    ** script. */
7679    raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7680    raw_printf(pState->out, "BEGIN;\n");
7681    raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7682    shellPrepare(pState->db, &rc,
7683        "SELECT sql FROM recovery.schema "
7684        "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7685    );
7686    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7687      const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7688      raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7689          &zCreateTable[12]
7690      );
7691    }
7692    shellFinalize(&rc, pStmt);
7693  }
7694
7695  /* Figure out if an orphan table will be required. And if so, how many
7696  ** user columns it should contain */
7697  shellPrepare(pState->db, &rc,
7698      "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7699      , &pLoop
7700  );
7701  if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7702    nOrphan = sqlite3_column_int(pLoop, 0);
7703  }
7704  shellFinalize(&rc, pLoop);
7705  pLoop = 0;
7706
7707  shellPrepare(pState->db, &rc,
7708      "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7709  );
7710
7711  shellPrepare(pState->db, &rc,
7712      "SELECT max(field), group_concat(shell_escape_crnl(quote"
7713      "(case when (? AND field<0) then NULL else value end)"
7714      "), ', ')"
7715      ", min(field) "
7716      "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7717      "GROUP BY cell", &pCells
7718  );
7719
7720  /* Loop through each root page. */
7721  shellPrepare(pState->db, &rc,
7722      "SELECT root, intkey, max(maxlen) FROM recovery.map"
7723      " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7724      "  SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7725      ")", &pLoop
7726  );
7727  while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7728    int iRoot = sqlite3_column_int(pLoop, 0);
7729    int bIntkey = sqlite3_column_int(pLoop, 1);
7730    int nCol = sqlite3_column_int(pLoop, 2);
7731    int bNoop = 0;
7732    RecoverTable *pTab;
7733
7734    assert( bIntkey==0 || bIntkey==1 );
7735    pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7736    if( bNoop || rc ) continue;
7737    if( pTab==0 ){
7738      if( pOrphan==0 ){
7739        pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7740      }
7741      pTab = pOrphan;
7742      if( pTab==0 ) break;
7743    }
7744
7745    if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7746      raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7747    }
7748    sqlite3_bind_int(pPages, 1, iRoot);
7749    if( bRowids==0 && pTab->iPk<0 ){
7750      sqlite3_bind_int(pCells, 1, 1);
7751    }else{
7752      sqlite3_bind_int(pCells, 1, 0);
7753    }
7754    sqlite3_bind_int(pCells, 3, pTab->iPk);
7755
7756    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7757      int iPgno = sqlite3_column_int(pPages, 0);
7758      sqlite3_bind_int(pCells, 2, iPgno);
7759      while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7760        int nField = sqlite3_column_int(pCells, 0);
7761        int iMin = sqlite3_column_int(pCells, 2);
7762        const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7763
7764        RecoverTable *pTab2 = pTab;
7765        if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7766          if( pOrphan==0 ){
7767            pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7768          }
7769          pTab2 = pOrphan;
7770          if( pTab2==0 ) break;
7771        }
7772
7773        nField = nField+1;
7774        if( pTab2==pOrphan ){
7775          raw_printf(pState->out,
7776              "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7777              pTab2->zQuoted, iRoot, iPgno, nField,
7778              iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7779          );
7780        }else{
7781          raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7782              pTab2->zQuoted, pTab2->azlCol[nField], zVal
7783          );
7784        }
7785      }
7786      shellReset(&rc, pCells);
7787    }
7788    shellReset(&rc, pPages);
7789    if( pTab!=pOrphan ) recoverFreeTable(pTab);
7790  }
7791  shellFinalize(&rc, pLoop);
7792  shellFinalize(&rc, pPages);
7793  shellFinalize(&rc, pCells);
7794  recoverFreeTable(pOrphan);
7795
7796  /* The rest of the schema */
7797  if( rc==SQLITE_OK ){
7798    sqlite3_stmt *pStmt = 0;
7799    shellPrepare(pState->db, &rc,
7800        "SELECT sql, name FROM recovery.schema "
7801        "WHERE sql NOT LIKE 'create table%'", &pStmt
7802    );
7803    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7804      const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7805      if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7806        const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7807        char *zPrint = shellMPrintf(&rc,
7808          "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7809          zName, zName, zSql
7810        );
7811        raw_printf(pState->out, "%s;\n", zPrint);
7812        sqlite3_free(zPrint);
7813      }else{
7814        raw_printf(pState->out, "%s;\n", zSql);
7815      }
7816    }
7817    shellFinalize(&rc, pStmt);
7818  }
7819
7820  if( rc==SQLITE_OK ){
7821    raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7822    raw_printf(pState->out, "COMMIT;\n");
7823  }
7824  sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7825  return rc;
7826}
7827#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7828
7829
7830/*
7831 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
7832 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
7833 *   close db and set it to 0, and return the columns spec, to later
7834 *   be sqlite3_free()'ed by the caller.
7835 * The return is 0 when either:
7836 *   (a) The db was not initialized and zCol==0 (There are no columns.)
7837 *   (b) zCol!=0  (Column was added, db initialized as needed.)
7838 * The 3rd argument, pRenamed, references an out parameter. If the
7839 * pointer is non-zero, its referent will be set to a summary of renames
7840 * done if renaming was necessary, or set to 0 if none was done. The out
7841 * string (if any) must be sqlite3_free()'ed by the caller.
7842 */
7843#ifdef SHELL_DEBUG
7844#define rc_err_oom_die(rc) \
7845  if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
7846  else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
7847    fprintf(stderr,"E:%d\n",rc), assert(0)
7848#else
7849static void rc_err_oom_die(int rc){
7850  if( rc==SQLITE_NOMEM ) shell_check_oom(0);
7851  assert(rc==SQLITE_OK||rc==SQLITE_DONE);
7852}
7853#endif
7854
7855#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
7856static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
7857#else  /* Otherwise, memory is faster/better for the transient DB. */
7858static const char *zCOL_DB = ":memory:";
7859#endif
7860
7861/* Define character (as C string) to separate generated column ordinal
7862 * from protected part of incoming column names. This defaults to "_"
7863 * so that incoming column identifiers that did not need not be quoted
7864 * remain usable without being quoted. It must be one character.
7865 */
7866#ifndef SHELL_AUTOCOLUMN_SEP
7867# define AUTOCOLUMN_SEP "_"
7868#else
7869# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
7870#endif
7871
7872static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
7873  /* Queries and D{D,M}L used here */
7874  static const char * const zTabMake = "\
7875CREATE TABLE ColNames(\
7876 cpos INTEGER PRIMARY KEY,\
7877 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
7878CREATE VIEW RepeatedNames AS \
7879SELECT DISTINCT t.name FROM ColNames t \
7880WHERE t.name COLLATE NOCASE IN (\
7881 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
7882);\
7883";
7884  static const char * const zTabFill = "\
7885INSERT INTO ColNames(name,nlen,chop,reps,suff)\
7886 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
7887";
7888  static const char * const zHasDupes = "\
7889SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
7890 <count(name) FROM ColNames\
7891";
7892#ifdef SHELL_COLUMN_RENAME_CLEAN
7893  static const char * const zDedoctor = "\
7894UPDATE ColNames SET chop=iif(\
7895  (substring(name,nlen,1) BETWEEN '0' AND '9')\
7896  AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
7897 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
7898 0\
7899)\
7900";
7901#endif
7902  static const char * const zSetReps = "\
7903UPDATE ColNames AS t SET reps=\
7904(SELECT count(*) FROM ColNames d \
7905 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
7906 COLLATE NOCASE\
7907)\
7908";
7909#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7910  static const char * const zColDigits = "\
7911SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
7912";
7913#endif
7914  static const char * const zRenameRank =
7915#ifdef SHELL_COLUMN_RENAME_CLEAN
7916    "UPDATE ColNames AS t SET suff="
7917    "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
7918#else /* ...RENAME_MINIMAL_ONE_PASS */
7919"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
7920"  SELECT 0 AS nlz"
7921"  UNION"
7922"  SELECT nlz+1 AS nlz FROM Lzn"
7923"  WHERE EXISTS("
7924"   SELECT 1"
7925"   FROM ColNames t, ColNames o"
7926"   WHERE"
7927"    iif(t.name IN (SELECT * FROM RepeatedNames),"
7928"     printf('%s"AUTOCOLUMN_SEP"%s',"
7929"      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
7930"     t.name"
7931"    )"
7932"    ="
7933"    iif(o.name IN (SELECT * FROM RepeatedNames),"
7934"     printf('%s"AUTOCOLUMN_SEP"%s',"
7935"      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
7936"     o.name"
7937"    )"
7938"    COLLATE NOCASE"
7939"    AND o.cpos<>t.cpos"
7940"   GROUP BY t.cpos"
7941"  )"
7942") UPDATE Colnames AS t SET"
7943" chop = 0," /* No chopping, never touch incoming names. */
7944" suff = iif(name IN (SELECT * FROM RepeatedNames),"
7945"  printf('"AUTOCOLUMN_SEP"%s', substring("
7946"   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
7947"  ''"
7948" )"
7949#endif
7950    ;
7951  static const char * const zCollectVar = "\
7952SELECT\
7953 '('||x'0a'\
7954 || group_concat(\
7955  cname||' TEXT',\
7956  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
7957 ||')' AS ColsSpec \
7958FROM (\
7959 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \
7960 FROM ColNames ORDER BY cpos\
7961)";
7962  static const char * const zRenamesDone =
7963    "SELECT group_concat("
7964    " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff)),"
7965    " ','||x'0a')"
7966    "FROM ColNames WHERE suff<>'' OR chop!=0"
7967    ;
7968  int rc;
7969  sqlite3_stmt *pStmt = 0;
7970  assert(pDb!=0);
7971  if( zColNew ){
7972    /* Add initial or additional column. Init db if necessary. */
7973    if( *pDb==0 ){
7974      if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
7975#ifdef SHELL_COLFIX_DB
7976      if(*zCOL_DB!=':')
7977        sqlite3_exec(*pDb,"drop table if exists ColNames;"
7978                     "drop view if exists RepeatedNames;",0,0,0);
7979#endif
7980      rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
7981      rc_err_oom_die(rc);
7982    }
7983    assert(*pDb!=0);
7984    rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
7985    rc_err_oom_die(rc);
7986    rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
7987    rc_err_oom_die(rc);
7988    rc = sqlite3_step(pStmt);
7989    rc_err_oom_die(rc);
7990    sqlite3_finalize(pStmt);
7991    return 0;
7992  }else if( *pDb==0 ){
7993    return 0;
7994  }else{
7995    /* Formulate the columns spec, close the DB, zero *pDb. */
7996    char *zColsSpec = 0;
7997    int hasDupes = db_int(*pDb, zHasDupes);
7998#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7999    int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
8000#else
8001# define nDigits 2
8002#endif
8003    if( hasDupes ){
8004#ifdef SHELL_COLUMN_RENAME_CLEAN
8005      rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
8006      rc_err_oom_die(rc);
8007#endif
8008      rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
8009      rc_err_oom_die(rc);
8010      rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
8011      rc_err_oom_die(rc);
8012      sqlite3_bind_int(pStmt, 1, nDigits);
8013      rc = sqlite3_step(pStmt);
8014      sqlite3_finalize(pStmt);
8015      assert(rc==SQLITE_DONE);
8016    }
8017    assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
8018    rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
8019    rc_err_oom_die(rc);
8020    rc = sqlite3_step(pStmt);
8021    if( rc==SQLITE_ROW ){
8022      zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8023    }else{
8024      zColsSpec = 0;
8025    }
8026    if( pzRenamed!=0 ){
8027      if( !hasDupes ) *pzRenamed = 0;
8028      else{
8029        sqlite3_finalize(pStmt);
8030        if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
8031            && SQLITE_ROW==sqlite3_step(pStmt) ){
8032          *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8033        }else
8034          *pzRenamed = 0;
8035      }
8036    }
8037    sqlite3_finalize(pStmt);
8038    sqlite3_close(*pDb);
8039    *pDb = 0;
8040    return zColsSpec;
8041  }
8042}
8043
8044/*
8045** If an input line begins with "." then invoke this routine to
8046** process that line.
8047**
8048** Return 1 on error, 2 to exit, and 0 otherwise.
8049*/
8050static int do_meta_command(char *zLine, ShellState *p){
8051  int h = 1;
8052  int nArg = 0;
8053  int n, c;
8054  int rc = 0;
8055  char *azArg[52];
8056
8057#ifndef SQLITE_OMIT_VIRTUALTABLE
8058  if( p->expert.pExpert ){
8059    expertFinish(p, 1, 0);
8060  }
8061#endif
8062
8063  /* Parse the input line into tokens.
8064  */
8065  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
8066    while( IsSpace(zLine[h]) ){ h++; }
8067    if( zLine[h]==0 ) break;
8068    if( zLine[h]=='\'' || zLine[h]=='"' ){
8069      int delim = zLine[h++];
8070      azArg[nArg++] = &zLine[h];
8071      while( zLine[h] && zLine[h]!=delim ){
8072        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
8073        h++;
8074      }
8075      if( zLine[h]==delim ){
8076        zLine[h++] = 0;
8077      }
8078      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
8079    }else{
8080      azArg[nArg++] = &zLine[h];
8081      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
8082      if( zLine[h] ) zLine[h++] = 0;
8083      resolve_backslashes(azArg[nArg-1]);
8084    }
8085  }
8086  azArg[nArg] = 0;
8087
8088  /* Process the input line.
8089  */
8090  if( nArg==0 ) return 0; /* no tokens, no error */
8091  n = strlen30(azArg[0]);
8092  c = azArg[0][0];
8093  clearTempFile(p);
8094
8095#ifndef SQLITE_OMIT_AUTHORIZATION
8096  if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
8097    if( nArg!=2 ){
8098      raw_printf(stderr, "Usage: .auth ON|OFF\n");
8099      rc = 1;
8100      goto meta_command_exit;
8101    }
8102    open_db(p, 0);
8103    if( booleanValue(azArg[1]) ){
8104      sqlite3_set_authorizer(p->db, shellAuth, p);
8105    }else if( p->bSafeModePersist ){
8106      sqlite3_set_authorizer(p->db, safeModeAuth, p);
8107    }else{
8108      sqlite3_set_authorizer(p->db, 0, 0);
8109    }
8110  }else
8111#endif
8112
8113#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8114  if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
8115    open_db(p, 0);
8116    failIfSafeMode(p, "cannot run .archive in safe mode");
8117    rc = arDotCommand(p, 0, azArg, nArg);
8118  }else
8119#endif
8120
8121  if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
8122   || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
8123  ){
8124    const char *zDestFile = 0;
8125    const char *zDb = 0;
8126    sqlite3 *pDest;
8127    sqlite3_backup *pBackup;
8128    int j;
8129    int bAsync = 0;
8130    const char *zVfs = 0;
8131    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
8132    for(j=1; j<nArg; j++){
8133      const char *z = azArg[j];
8134      if( z[0]=='-' ){
8135        if( z[1]=='-' ) z++;
8136        if( strcmp(z, "-append")==0 ){
8137          zVfs = "apndvfs";
8138        }else
8139        if( strcmp(z, "-async")==0 ){
8140          bAsync = 1;
8141        }else
8142        {
8143          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
8144          return 1;
8145        }
8146      }else if( zDestFile==0 ){
8147        zDestFile = azArg[j];
8148      }else if( zDb==0 ){
8149        zDb = zDestFile;
8150        zDestFile = azArg[j];
8151      }else{
8152        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
8153        return 1;
8154      }
8155    }
8156    if( zDestFile==0 ){
8157      raw_printf(stderr, "missing FILENAME argument on .backup\n");
8158      return 1;
8159    }
8160    if( zDb==0 ) zDb = "main";
8161    rc = sqlite3_open_v2(zDestFile, &pDest,
8162                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
8163    if( rc!=SQLITE_OK ){
8164      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
8165      close_db(pDest);
8166      return 1;
8167    }
8168    if( bAsync ){
8169      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
8170                   0, 0, 0);
8171    }
8172    open_db(p, 0);
8173    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
8174    if( pBackup==0 ){
8175      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8176      close_db(pDest);
8177      return 1;
8178    }
8179    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
8180    sqlite3_backup_finish(pBackup);
8181    if( rc==SQLITE_DONE ){
8182      rc = 0;
8183    }else{
8184      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8185      rc = 1;
8186    }
8187    close_db(pDest);
8188  }else
8189
8190  if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
8191    if( nArg==2 ){
8192      bail_on_error = booleanValue(azArg[1]);
8193    }else{
8194      raw_printf(stderr, "Usage: .bail on|off\n");
8195      rc = 1;
8196    }
8197  }else
8198
8199  if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
8200    if( nArg==2 ){
8201      if( booleanValue(azArg[1]) ){
8202        setBinaryMode(p->out, 1);
8203      }else{
8204        setTextMode(p->out, 1);
8205      }
8206    }else{
8207      raw_printf(stderr, "Usage: .binary on|off\n");
8208      rc = 1;
8209    }
8210  }else
8211
8212  /* The undocumented ".breakpoint" command causes a call to the no-op
8213  ** routine named test_breakpoint().
8214  */
8215  if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
8216    test_breakpoint();
8217  }else
8218
8219  if( c=='c' && strcmp(azArg[0],"cd")==0 ){
8220    failIfSafeMode(p, "cannot run .cd in safe mode");
8221    if( nArg==2 ){
8222#if defined(_WIN32) || defined(WIN32)
8223      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
8224      rc = !SetCurrentDirectoryW(z);
8225      sqlite3_free(z);
8226#else
8227      rc = chdir(azArg[1]);
8228#endif
8229      if( rc ){
8230        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
8231        rc = 1;
8232      }
8233    }else{
8234      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
8235      rc = 1;
8236    }
8237  }else
8238
8239  if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
8240    if( nArg==2 ){
8241      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
8242    }else{
8243      raw_printf(stderr, "Usage: .changes on|off\n");
8244      rc = 1;
8245    }
8246  }else
8247
8248  /* Cancel output redirection, if it is currently set (by .testcase)
8249  ** Then read the content of the testcase-out.txt file and compare against
8250  ** azArg[1].  If there are differences, report an error and exit.
8251  */
8252  if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
8253    char *zRes = 0;
8254    output_reset(p);
8255    if( nArg!=2 ){
8256      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
8257      rc = 2;
8258    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
8259      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
8260      rc = 2;
8261    }else if( testcase_glob(azArg[1],zRes)==0 ){
8262      utf8_printf(stderr,
8263                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
8264                 p->zTestcase, azArg[1], zRes);
8265      rc = 1;
8266    }else{
8267      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
8268      p->nCheck++;
8269    }
8270    sqlite3_free(zRes);
8271  }else
8272
8273  if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
8274    failIfSafeMode(p, "cannot run .clone in safe mode");
8275    if( nArg==2 ){
8276      tryToClone(p, azArg[1]);
8277    }else{
8278      raw_printf(stderr, "Usage: .clone FILENAME\n");
8279      rc = 1;
8280    }
8281  }else
8282
8283  if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
8284    if( nArg==1 ){
8285      /* List available connections */
8286      int i;
8287      for(i=0; i<ArraySize(p->aAuxDb); i++){
8288        const char *zFile = p->aAuxDb[i].zDbFilename;
8289        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
8290          zFile = "(not open)";
8291        }else if( zFile==0 ){
8292          zFile = "(memory)";
8293        }else if( zFile[0]==0 ){
8294          zFile = "(temporary-file)";
8295        }
8296        if( p->pAuxDb == &p->aAuxDb[i] ){
8297          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
8298        }else if( p->aAuxDb[i].db!=0 ){
8299          utf8_printf(stdout, "       %d: %s\n", i, zFile);
8300        }
8301      }
8302    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
8303      int i = azArg[1][0] - '0';
8304      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
8305        p->pAuxDb->db = p->db;
8306        p->pAuxDb = &p->aAuxDb[i];
8307        globalDb = p->db = p->pAuxDb->db;
8308        p->pAuxDb->db = 0;
8309      }
8310    }else if( nArg==3 && strcmp(azArg[1], "close")==0
8311           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
8312      int i = azArg[2][0] - '0';
8313      if( i<0 || i>=ArraySize(p->aAuxDb) ){
8314        /* No-op */
8315      }else if( p->pAuxDb == &p->aAuxDb[i] ){
8316        raw_printf(stderr, "cannot close the active database connection\n");
8317        rc = 1;
8318      }else if( p->aAuxDb[i].db ){
8319        session_close_all(p, i);
8320        close_db(p->aAuxDb[i].db);
8321        p->aAuxDb[i].db = 0;
8322      }
8323    }else{
8324      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
8325      rc = 1;
8326    }
8327  }else
8328
8329  if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
8330    char **azName = 0;
8331    int nName = 0;
8332    sqlite3_stmt *pStmt;
8333    int i;
8334    open_db(p, 0);
8335    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
8336    if( rc ){
8337      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8338      rc = 1;
8339    }else{
8340      while( sqlite3_step(pStmt)==SQLITE_ROW ){
8341        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
8342        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
8343        if( zSchema==0 || zFile==0 ) continue;
8344        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
8345        shell_check_oom(azName);
8346        azName[nName*2] = strdup(zSchema);
8347        azName[nName*2+1] = strdup(zFile);
8348        nName++;
8349      }
8350    }
8351    sqlite3_finalize(pStmt);
8352    for(i=0; i<nName; i++){
8353      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
8354      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
8355      const char *z = azName[i*2+1];
8356      utf8_printf(p->out, "%s: %s %s%s\n",
8357         azName[i*2],
8358         z && z[0] ? z : "\"\"",
8359         bRdonly ? "r/o" : "r/w",
8360         eTxn==SQLITE_TXN_NONE ? "" :
8361            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
8362      free(azName[i*2]);
8363      free(azName[i*2+1]);
8364    }
8365    sqlite3_free(azName);
8366  }else
8367
8368  if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
8369    static const struct DbConfigChoices {
8370      const char *zName;
8371      int op;
8372    } aDbConfig[] = {
8373        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
8374        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
8375        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
8376        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
8377        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
8378        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
8379        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
8380        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
8381        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
8382        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
8383        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
8384        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
8385        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
8386        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
8387        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
8388        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
8389    };
8390    int ii, v;
8391    open_db(p, 0);
8392    for(ii=0; ii<ArraySize(aDbConfig); ii++){
8393      if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
8394      if( nArg>=3 ){
8395        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
8396      }
8397      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
8398      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
8399      if( nArg>1 ) break;
8400    }
8401    if( nArg>1 && ii==ArraySize(aDbConfig) ){
8402      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
8403      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
8404    }
8405  }else
8406
8407  if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
8408    rc = shell_dbinfo_command(p, nArg, azArg);
8409  }else
8410
8411#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8412  if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
8413    open_db(p, 0);
8414    rc = recoverDatabaseCmd(p, nArg, azArg);
8415  }else
8416#endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
8417
8418  if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
8419    char *zLike = 0;
8420    char *zSql;
8421    int i;
8422    int savedShowHeader = p->showHeader;
8423    int savedShellFlags = p->shellFlgs;
8424    ShellClearFlag(p,
8425       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
8426       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
8427    for(i=1; i<nArg; i++){
8428      if( azArg[i][0]=='-' ){
8429        const char *z = azArg[i]+1;
8430        if( z[0]=='-' ) z++;
8431        if( strcmp(z,"preserve-rowids")==0 ){
8432#ifdef SQLITE_OMIT_VIRTUALTABLE
8433          raw_printf(stderr, "The --preserve-rowids option is not compatible"
8434                             " with SQLITE_OMIT_VIRTUALTABLE\n");
8435          rc = 1;
8436          sqlite3_free(zLike);
8437          goto meta_command_exit;
8438#else
8439          ShellSetFlag(p, SHFLG_PreserveRowid);
8440#endif
8441        }else
8442        if( strcmp(z,"newlines")==0 ){
8443          ShellSetFlag(p, SHFLG_Newlines);
8444        }else
8445        if( strcmp(z,"data-only")==0 ){
8446          ShellSetFlag(p, SHFLG_DumpDataOnly);
8447        }else
8448        if( strcmp(z,"nosys")==0 ){
8449          ShellSetFlag(p, SHFLG_DumpNoSys);
8450        }else
8451        {
8452          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8453          rc = 1;
8454          sqlite3_free(zLike);
8455          goto meta_command_exit;
8456        }
8457      }else{
8458        /* azArg[i] contains a LIKE pattern. This ".dump" request should
8459        ** only dump data for tables for which either the table name matches
8460        ** the LIKE pattern, or the table appears to be a shadow table of
8461        ** a virtual table for which the name matches the LIKE pattern.
8462        */
8463        char *zExpr = sqlite3_mprintf(
8464            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8465            "  SELECT 1 FROM sqlite_schema WHERE "
8466            "    name LIKE %Q ESCAPE '\\' AND"
8467            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8468            "    substr(o.name, 1, length(name)+1) == (name||'_')"
8469            ")", azArg[i], azArg[i]
8470        );
8471
8472        if( zLike ){
8473          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8474        }else{
8475          zLike = zExpr;
8476        }
8477      }
8478    }
8479
8480    open_db(p, 0);
8481
8482    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8483      /* When playing back a "dump", the content might appear in an order
8484      ** which causes immediate foreign key constraints to be violated.
8485      ** So disable foreign-key constraint enforcement to prevent problems. */
8486      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8487      raw_printf(p->out, "BEGIN TRANSACTION;\n");
8488    }
8489    p->writableSchema = 0;
8490    p->showHeader = 0;
8491    /* Set writable_schema=ON since doing so forces SQLite to initialize
8492    ** as much of the schema as it can even if the sqlite_schema table is
8493    ** corrupt. */
8494    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8495    p->nErr = 0;
8496    if( zLike==0 ) zLike = sqlite3_mprintf("true");
8497    zSql = sqlite3_mprintf(
8498      "SELECT name, type, sql FROM sqlite_schema AS o "
8499      "WHERE (%s) AND type=='table'"
8500      "  AND sql NOT NULL"
8501      " ORDER BY tbl_name='sqlite_sequence', rowid",
8502      zLike
8503    );
8504    run_schema_dump_query(p,zSql);
8505    sqlite3_free(zSql);
8506    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8507      zSql = sqlite3_mprintf(
8508        "SELECT sql FROM sqlite_schema AS o "
8509        "WHERE (%s) AND sql NOT NULL"
8510        "  AND type IN ('index','trigger','view')",
8511        zLike
8512      );
8513      run_table_dump_query(p, zSql);
8514      sqlite3_free(zSql);
8515    }
8516    sqlite3_free(zLike);
8517    if( p->writableSchema ){
8518      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8519      p->writableSchema = 0;
8520    }
8521    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8522    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8523    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8524      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8525    }
8526    p->showHeader = savedShowHeader;
8527    p->shellFlgs = savedShellFlags;
8528  }else
8529
8530  if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8531    if( nArg==2 ){
8532      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8533    }else{
8534      raw_printf(stderr, "Usage: .echo on|off\n");
8535      rc = 1;
8536    }
8537  }else
8538
8539  if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8540    if( nArg==2 ){
8541      p->autoEQPtest = 0;
8542      if( p->autoEQPtrace ){
8543        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8544        p->autoEQPtrace = 0;
8545      }
8546      if( strcmp(azArg[1],"full")==0 ){
8547        p->autoEQP = AUTOEQP_full;
8548      }else if( strcmp(azArg[1],"trigger")==0 ){
8549        p->autoEQP = AUTOEQP_trigger;
8550#ifdef SQLITE_DEBUG
8551      }else if( strcmp(azArg[1],"test")==0 ){
8552        p->autoEQP = AUTOEQP_on;
8553        p->autoEQPtest = 1;
8554      }else if( strcmp(azArg[1],"trace")==0 ){
8555        p->autoEQP = AUTOEQP_full;
8556        p->autoEQPtrace = 1;
8557        open_db(p, 0);
8558        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8559        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8560#endif
8561      }else{
8562        p->autoEQP = (u8)booleanValue(azArg[1]);
8563      }
8564    }else{
8565      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8566      rc = 1;
8567    }
8568  }else
8569
8570  if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8571    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8572    rc = 2;
8573  }else
8574
8575  /* The ".explain" command is automatic now.  It is largely pointless.  It
8576  ** retained purely for backwards compatibility */
8577  if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8578    int val = 1;
8579    if( nArg>=2 ){
8580      if( strcmp(azArg[1],"auto")==0 ){
8581        val = 99;
8582      }else{
8583        val =  booleanValue(azArg[1]);
8584      }
8585    }
8586    if( val==1 && p->mode!=MODE_Explain ){
8587      p->normalMode = p->mode;
8588      p->mode = MODE_Explain;
8589      p->autoExplain = 0;
8590    }else if( val==0 ){
8591      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8592      p->autoExplain = 0;
8593    }else if( val==99 ){
8594      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8595      p->autoExplain = 1;
8596    }
8597  }else
8598
8599#ifndef SQLITE_OMIT_VIRTUALTABLE
8600  if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8601    if( p->bSafeMode ){
8602      raw_printf(stderr,
8603        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8604        azArg[0]);
8605      rc = 1;
8606    }else{
8607      open_db(p, 0);
8608      expertDotCommand(p, azArg, nArg);
8609    }
8610  }else
8611#endif
8612
8613  if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8614    static const struct {
8615       const char *zCtrlName;   /* Name of a test-control option */
8616       int ctrlCode;            /* Integer code for that option */
8617       const char *zUsage;      /* Usage notes */
8618    } aCtrl[] = {
8619      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8620      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8621      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8622      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8623      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8624   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8625      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8626      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8627      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8628      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8629   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8630    };
8631    int filectrl = -1;
8632    int iCtrl = -1;
8633    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8634    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8635    int n2, i;
8636    const char *zCmd = 0;
8637    const char *zSchema = 0;
8638
8639    open_db(p, 0);
8640    zCmd = nArg>=2 ? azArg[1] : "help";
8641
8642    if( zCmd[0]=='-'
8643     && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8644     && nArg>=4
8645    ){
8646      zSchema = azArg[2];
8647      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8648      nArg -= 2;
8649      zCmd = azArg[1];
8650    }
8651
8652    /* The argument can optionally begin with "-" or "--" */
8653    if( zCmd[0]=='-' && zCmd[1] ){
8654      zCmd++;
8655      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8656    }
8657
8658    /* --help lists all file-controls */
8659    if( strcmp(zCmd,"help")==0 ){
8660      utf8_printf(p->out, "Available file-controls:\n");
8661      for(i=0; i<ArraySize(aCtrl); i++){
8662        utf8_printf(p->out, "  .filectrl %s %s\n",
8663                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8664      }
8665      rc = 1;
8666      goto meta_command_exit;
8667    }
8668
8669    /* convert filectrl text option to value. allow any unique prefix
8670    ** of the option name, or a numerical value. */
8671    n2 = strlen30(zCmd);
8672    for(i=0; i<ArraySize(aCtrl); i++){
8673      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8674        if( filectrl<0 ){
8675          filectrl = aCtrl[i].ctrlCode;
8676          iCtrl = i;
8677        }else{
8678          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8679                              "Use \".filectrl --help\" for help\n", zCmd);
8680          rc = 1;
8681          goto meta_command_exit;
8682        }
8683      }
8684    }
8685    if( filectrl<0 ){
8686      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8687                         "Use \".filectrl --help\" for help\n", zCmd);
8688    }else{
8689      switch(filectrl){
8690        case SQLITE_FCNTL_SIZE_LIMIT: {
8691          if( nArg!=2 && nArg!=3 ) break;
8692          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8693          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8694          isOk = 1;
8695          break;
8696        }
8697        case SQLITE_FCNTL_LOCK_TIMEOUT:
8698        case SQLITE_FCNTL_CHUNK_SIZE: {
8699          int x;
8700          if( nArg!=3 ) break;
8701          x = (int)integerValue(azArg[2]);
8702          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8703          isOk = 2;
8704          break;
8705        }
8706        case SQLITE_FCNTL_PERSIST_WAL:
8707        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8708          int x;
8709          if( nArg!=2 && nArg!=3 ) break;
8710          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8711          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8712          iRes = x;
8713          isOk = 1;
8714          break;
8715        }
8716        case SQLITE_FCNTL_DATA_VERSION:
8717        case SQLITE_FCNTL_HAS_MOVED: {
8718          int x;
8719          if( nArg!=2 ) break;
8720          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8721          iRes = x;
8722          isOk = 1;
8723          break;
8724        }
8725        case SQLITE_FCNTL_TEMPFILENAME: {
8726          char *z = 0;
8727          if( nArg!=2 ) break;
8728          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8729          if( z ){
8730            utf8_printf(p->out, "%s\n", z);
8731            sqlite3_free(z);
8732          }
8733          isOk = 2;
8734          break;
8735        }
8736        case SQLITE_FCNTL_RESERVE_BYTES: {
8737          int x;
8738          if( nArg>=3 ){
8739            x = atoi(azArg[2]);
8740            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8741          }
8742          x = -1;
8743          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8744          utf8_printf(p->out,"%d\n", x);
8745          isOk = 2;
8746          break;
8747        }
8748      }
8749    }
8750    if( isOk==0 && iCtrl>=0 ){
8751      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8752      rc = 1;
8753    }else if( isOk==1 ){
8754      char zBuf[100];
8755      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8756      raw_printf(p->out, "%s\n", zBuf);
8757    }
8758  }else
8759
8760  if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8761    ShellState data;
8762    int doStats = 0;
8763    memcpy(&data, p, sizeof(data));
8764    data.showHeader = 0;
8765    data.cMode = data.mode = MODE_Semi;
8766    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8767      data.cMode = data.mode = MODE_Pretty;
8768      nArg = 1;
8769    }
8770    if( nArg!=1 ){
8771      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8772      rc = 1;
8773      goto meta_command_exit;
8774    }
8775    open_db(p, 0);
8776    rc = sqlite3_exec(p->db,
8777       "SELECT sql FROM"
8778       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8779       "     FROM sqlite_schema UNION ALL"
8780       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8781       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8782       "ORDER BY x",
8783       callback, &data, 0
8784    );
8785    if( rc==SQLITE_OK ){
8786      sqlite3_stmt *pStmt;
8787      rc = sqlite3_prepare_v2(p->db,
8788               "SELECT rowid FROM sqlite_schema"
8789               " WHERE name GLOB 'sqlite_stat[134]'",
8790               -1, &pStmt, 0);
8791      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8792      sqlite3_finalize(pStmt);
8793    }
8794    if( doStats==0 ){
8795      raw_printf(p->out, "/* No STAT tables available */\n");
8796    }else{
8797      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8798      data.cMode = data.mode = MODE_Insert;
8799      data.zDestTable = "sqlite_stat1";
8800      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8801      data.zDestTable = "sqlite_stat4";
8802      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8803      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8804    }
8805  }else
8806
8807  if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8808    if( nArg==2 ){
8809      p->showHeader = booleanValue(azArg[1]);
8810      p->shellFlgs |= SHFLG_HeaderSet;
8811    }else{
8812      raw_printf(stderr, "Usage: .headers on|off\n");
8813      rc = 1;
8814    }
8815  }else
8816
8817  if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8818    if( nArg>=2 ){
8819      n = showHelp(p->out, azArg[1]);
8820      if( n==0 ){
8821        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8822      }
8823    }else{
8824      showHelp(p->out, 0);
8825    }
8826  }else
8827
8828  if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8829    char *zTable = 0;           /* Insert data into this table */
8830    char *zSchema = 0;          /* within this schema (may default to "main") */
8831    char *zFile = 0;            /* Name of file to extra content from */
8832    sqlite3_stmt *pStmt = NULL; /* A statement */
8833    int nCol;                   /* Number of columns in the table */
8834    int nByte;                  /* Number of bytes in an SQL string */
8835    int i, j;                   /* Loop counters */
8836    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8837    int nSep;                   /* Number of bytes in p->colSeparator[] */
8838    char *zSql;                 /* An SQL statement */
8839    char *zFullTabName;         /* Table name with schema if applicable */
8840    ImportCtx sCtx;             /* Reader context */
8841    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8842    int eVerbose = 0;           /* Larger for more console output */
8843    int nSkip = 0;              /* Initial lines to skip */
8844    int useOutputMode = 1;      /* Use output mode to determine separators */
8845    char *zCreate = 0;          /* CREATE TABLE statement text */
8846
8847    failIfSafeMode(p, "cannot run .import in safe mode");
8848    memset(&sCtx, 0, sizeof(sCtx));
8849    sCtx.z = sqlite3_malloc64(120);
8850    if( sCtx.z==0 ){
8851      import_cleanup(&sCtx);
8852      shell_out_of_memory();
8853    }
8854    if( p->mode==MODE_Ascii ){
8855      xRead = ascii_read_one_field;
8856    }else{
8857      xRead = csv_read_one_field;
8858    }
8859    for(i=1; i<nArg; i++){
8860      char *z = azArg[i];
8861      if( z[0]=='-' && z[1]=='-' ) z++;
8862      if( z[0]!='-' ){
8863        if( zFile==0 ){
8864          zFile = z;
8865        }else if( zTable==0 ){
8866          zTable = z;
8867        }else{
8868          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8869          showHelp(p->out, "import");
8870          rc = 1;
8871          goto meta_command_exit;
8872        }
8873      }else if( strcmp(z,"-v")==0 ){
8874        eVerbose++;
8875      }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){
8876        zSchema = azArg[++i];
8877      }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8878        nSkip = integerValue(azArg[++i]);
8879      }else if( strcmp(z,"-ascii")==0 ){
8880        sCtx.cColSep = SEP_Unit[0];
8881        sCtx.cRowSep = SEP_Record[0];
8882        xRead = ascii_read_one_field;
8883        useOutputMode = 0;
8884      }else if( strcmp(z,"-csv")==0 ){
8885        sCtx.cColSep = ',';
8886        sCtx.cRowSep = '\n';
8887        xRead = csv_read_one_field;
8888        useOutputMode = 0;
8889      }else{
8890        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8891        showHelp(p->out, "import");
8892        rc = 1;
8893        goto meta_command_exit;
8894      }
8895    }
8896    if( zTable==0 ){
8897      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8898                  zFile==0 ? "FILE" : "TABLE");
8899      showHelp(p->out, "import");
8900      rc = 1;
8901      goto meta_command_exit;
8902    }
8903    seenInterrupt = 0;
8904    open_db(p, 0);
8905    if( useOutputMode ){
8906      /* If neither the --csv or --ascii options are specified, then set
8907      ** the column and row separator characters from the output mode. */
8908      nSep = strlen30(p->colSeparator);
8909      if( nSep==0 ){
8910        raw_printf(stderr,
8911                   "Error: non-null column separator required for import\n");
8912        rc = 1;
8913        goto meta_command_exit;
8914      }
8915      if( nSep>1 ){
8916        raw_printf(stderr,
8917              "Error: multi-character column separators not allowed"
8918              " for import\n");
8919        rc = 1;
8920        goto meta_command_exit;
8921      }
8922      nSep = strlen30(p->rowSeparator);
8923      if( nSep==0 ){
8924        raw_printf(stderr,
8925            "Error: non-null row separator required for import\n");
8926        rc = 1;
8927        goto meta_command_exit;
8928      }
8929      if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8930        /* When importing CSV (only), if the row separator is set to the
8931        ** default output row separator, change it to the default input
8932        ** row separator.  This avoids having to maintain different input
8933        ** and output row separators. */
8934        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8935        nSep = strlen30(p->rowSeparator);
8936      }
8937      if( nSep>1 ){
8938        raw_printf(stderr, "Error: multi-character row separators not allowed"
8939                           " for import\n");
8940        rc = 1;
8941        goto meta_command_exit;
8942      }
8943      sCtx.cColSep = p->colSeparator[0];
8944      sCtx.cRowSep = p->rowSeparator[0];
8945    }
8946    sCtx.zFile = zFile;
8947    sCtx.nLine = 1;
8948    if( sCtx.zFile[0]=='|' ){
8949#ifdef SQLITE_OMIT_POPEN
8950      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8951      rc = 1;
8952      goto meta_command_exit;
8953#else
8954      sCtx.in = popen(sCtx.zFile+1, "r");
8955      sCtx.zFile = "<pipe>";
8956      sCtx.xCloser = pclose;
8957#endif
8958    }else{
8959      sCtx.in = fopen(sCtx.zFile, "rb");
8960      sCtx.xCloser = fclose;
8961    }
8962    if( sCtx.in==0 ){
8963      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8964      rc = 1;
8965      import_cleanup(&sCtx);
8966      goto meta_command_exit;
8967    }
8968    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8969      char zSep[2];
8970      zSep[1] = 0;
8971      zSep[0] = sCtx.cColSep;
8972      utf8_printf(p->out, "Column separator ");
8973      output_c_string(p->out, zSep);
8974      utf8_printf(p->out, ", row separator ");
8975      zSep[0] = sCtx.cRowSep;
8976      output_c_string(p->out, zSep);
8977      utf8_printf(p->out, "\n");
8978    }
8979    /* Below, resources must be freed before exit. */
8980    while( (nSkip--)>0 ){
8981      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8982    }
8983    if( zSchema!=0 ){
8984      zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
8985    }else{
8986      zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
8987    }
8988    zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
8989    if( zSql==0 || zFullTabName==0 ){
8990      import_cleanup(&sCtx);
8991      shell_out_of_memory();
8992    }
8993    nByte = strlen30(zSql);
8994    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8995    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8996    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8997      sqlite3 *dbCols = 0;
8998      char *zRenames = 0;
8999      char *zColDefs;
9000      zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
9001      while( xRead(&sCtx) ){
9002        zAutoColumn(sCtx.z, &dbCols, 0);
9003        if( sCtx.cTerm!=sCtx.cColSep ) break;
9004      }
9005      zColDefs = zAutoColumn(0, &dbCols, &zRenames);
9006      if( zRenames!=0 ){
9007        utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
9008                    "Columns renamed during .import %s due to duplicates:\n"
9009                    "%s\n", sCtx.zFile, zRenames);
9010        sqlite3_free(zRenames);
9011      }
9012      assert(dbCols==0);
9013      if( zColDefs==0 ){
9014        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
9015      import_fail:
9016        sqlite3_free(zCreate);
9017        sqlite3_free(zSql);
9018        sqlite3_free(zFullTabName);
9019        import_cleanup(&sCtx);
9020        rc = 1;
9021        goto meta_command_exit;
9022      }
9023      zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
9024      if( eVerbose>=1 ){
9025        utf8_printf(p->out, "%s\n", zCreate);
9026      }
9027      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
9028      if( rc ){
9029        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
9030        goto import_fail;
9031      }
9032      sqlite3_free(zCreate);
9033      zCreate = 0;
9034      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9035    }
9036    if( rc ){
9037      if (pStmt) sqlite3_finalize(pStmt);
9038      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
9039      goto import_fail;
9040    }
9041    sqlite3_free(zSql);
9042    nCol = sqlite3_column_count(pStmt);
9043    sqlite3_finalize(pStmt);
9044    pStmt = 0;
9045    if( nCol==0 ) return 0; /* no columns, no error */
9046    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
9047    if( zSql==0 ){
9048      import_cleanup(&sCtx);
9049      shell_out_of_memory();
9050    }
9051    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
9052    j = strlen30(zSql);
9053    for(i=1; i<nCol; i++){
9054      zSql[j++] = ',';
9055      zSql[j++] = '?';
9056    }
9057    zSql[j++] = ')';
9058    zSql[j] = 0;
9059    if( eVerbose>=2 ){
9060      utf8_printf(p->out, "Insert using: %s\n", zSql);
9061    }
9062    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9063    if( rc ){
9064      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9065      if (pStmt) sqlite3_finalize(pStmt);
9066      goto import_fail;
9067    }
9068    sqlite3_free(zSql);
9069    sqlite3_free(zFullTabName);
9070    needCommit = sqlite3_get_autocommit(p->db);
9071    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
9072    do{
9073      int startLine = sCtx.nLine;
9074      for(i=0; i<nCol; i++){
9075        char *z = xRead(&sCtx);
9076        /*
9077        ** Did we reach end-of-file before finding any columns?
9078        ** If so, stop instead of NULL filling the remaining columns.
9079        */
9080        if( z==0 && i==0 ) break;
9081        /*
9082        ** Did we reach end-of-file OR end-of-line before finding any
9083        ** columns in ASCII mode?  If so, stop instead of NULL filling
9084        ** the remaining columns.
9085        */
9086        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
9087        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
9088        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
9089          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9090                          "filling the rest with NULL\n",
9091                          sCtx.zFile, startLine, nCol, i+1);
9092          i += 2;
9093          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
9094        }
9095      }
9096      if( sCtx.cTerm==sCtx.cColSep ){
9097        do{
9098          xRead(&sCtx);
9099          i++;
9100        }while( sCtx.cTerm==sCtx.cColSep );
9101        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9102                        "extras ignored\n",
9103                        sCtx.zFile, startLine, nCol, i);
9104      }
9105      if( i>=nCol ){
9106        sqlite3_step(pStmt);
9107        rc = sqlite3_reset(pStmt);
9108        if( rc!=SQLITE_OK ){
9109          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
9110                      startLine, sqlite3_errmsg(p->db));
9111          sCtx.nErr++;
9112        }else{
9113          sCtx.nRow++;
9114        }
9115      }
9116    }while( sCtx.cTerm!=EOF );
9117
9118    import_cleanup(&sCtx);
9119    sqlite3_finalize(pStmt);
9120    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
9121    if( eVerbose>0 ){
9122      utf8_printf(p->out,
9123          "Added %d rows with %d errors using %d lines of input\n",
9124          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
9125    }
9126  }else
9127
9128#ifndef SQLITE_UNTESTABLE
9129  if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
9130    char *zSql;
9131    char *zCollist = 0;
9132    sqlite3_stmt *pStmt;
9133    int tnum = 0;
9134    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
9135    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
9136    int i;
9137    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
9138      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
9139                          "       .imposter off\n");
9140      /* Also allowed, but not documented:
9141      **
9142      **    .imposter TABLE IMPOSTER
9143      **
9144      ** where TABLE is a WITHOUT ROWID table.  In that case, the
9145      ** imposter is another WITHOUT ROWID table with the columns in
9146      ** storage order. */
9147      rc = 1;
9148      goto meta_command_exit;
9149    }
9150    open_db(p, 0);
9151    if( nArg==2 ){
9152      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
9153      goto meta_command_exit;
9154    }
9155    zSql = sqlite3_mprintf(
9156      "SELECT rootpage, 0 FROM sqlite_schema"
9157      " WHERE name='%q' AND type='index'"
9158      "UNION ALL "
9159      "SELECT rootpage, 1 FROM sqlite_schema"
9160      " WHERE name='%q' AND type='table'"
9161      "   AND sql LIKE '%%without%%rowid%%'",
9162      azArg[1], azArg[1]
9163    );
9164    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9165    sqlite3_free(zSql);
9166    if( sqlite3_step(pStmt)==SQLITE_ROW ){
9167      tnum = sqlite3_column_int(pStmt, 0);
9168      isWO = sqlite3_column_int(pStmt, 1);
9169    }
9170    sqlite3_finalize(pStmt);
9171    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
9172    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9173    sqlite3_free(zSql);
9174    i = 0;
9175    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9176      char zLabel[20];
9177      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
9178      i++;
9179      if( zCol==0 ){
9180        if( sqlite3_column_int(pStmt,1)==-1 ){
9181          zCol = "_ROWID_";
9182        }else{
9183          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
9184          zCol = zLabel;
9185        }
9186      }
9187      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
9188        lenPK = (int)strlen(zCollist);
9189      }
9190      if( zCollist==0 ){
9191        zCollist = sqlite3_mprintf("\"%w\"", zCol);
9192      }else{
9193        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
9194      }
9195    }
9196    sqlite3_finalize(pStmt);
9197    if( i==0 || tnum==0 ){
9198      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
9199      rc = 1;
9200      sqlite3_free(zCollist);
9201      goto meta_command_exit;
9202    }
9203    if( lenPK==0 ) lenPK = 100000;
9204    zSql = sqlite3_mprintf(
9205          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
9206          azArg[2], zCollist, lenPK, zCollist);
9207    sqlite3_free(zCollist);
9208    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
9209    if( rc==SQLITE_OK ){
9210      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
9211      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
9212      if( rc ){
9213        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
9214      }else{
9215        utf8_printf(stdout, "%s;\n", zSql);
9216        raw_printf(stdout,
9217          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
9218          azArg[1], isWO ? "table" : "index"
9219        );
9220      }
9221    }else{
9222      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
9223      rc = 1;
9224    }
9225    sqlite3_free(zSql);
9226  }else
9227#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
9228
9229#ifdef SQLITE_ENABLE_IOTRACE
9230  if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
9231    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
9232    if( iotrace && iotrace!=stdout ) fclose(iotrace);
9233    iotrace = 0;
9234    if( nArg<2 ){
9235      sqlite3IoTrace = 0;
9236    }else if( strcmp(azArg[1], "-")==0 ){
9237      sqlite3IoTrace = iotracePrintf;
9238      iotrace = stdout;
9239    }else{
9240      iotrace = fopen(azArg[1], "w");
9241      if( iotrace==0 ){
9242        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9243        sqlite3IoTrace = 0;
9244        rc = 1;
9245      }else{
9246        sqlite3IoTrace = iotracePrintf;
9247      }
9248    }
9249  }else
9250#endif
9251
9252  if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
9253    static const struct {
9254       const char *zLimitName;   /* Name of a limit */
9255       int limitCode;            /* Integer code for that limit */
9256    } aLimit[] = {
9257      { "length",                SQLITE_LIMIT_LENGTH                    },
9258      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
9259      { "column",                SQLITE_LIMIT_COLUMN                    },
9260      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
9261      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
9262      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
9263      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
9264      { "attached",              SQLITE_LIMIT_ATTACHED                  },
9265      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
9266      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
9267      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
9268      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
9269    };
9270    int i, n2;
9271    open_db(p, 0);
9272    if( nArg==1 ){
9273      for(i=0; i<ArraySize(aLimit); i++){
9274        printf("%20s %d\n", aLimit[i].zLimitName,
9275               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
9276      }
9277    }else if( nArg>3 ){
9278      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
9279      rc = 1;
9280      goto meta_command_exit;
9281    }else{
9282      int iLimit = -1;
9283      n2 = strlen30(azArg[1]);
9284      for(i=0; i<ArraySize(aLimit); i++){
9285        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
9286          if( iLimit<0 ){
9287            iLimit = i;
9288          }else{
9289            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
9290            rc = 1;
9291            goto meta_command_exit;
9292          }
9293        }
9294      }
9295      if( iLimit<0 ){
9296        utf8_printf(stderr, "unknown limit: \"%s\"\n"
9297                        "enter \".limits\" with no arguments for a list.\n",
9298                         azArg[1]);
9299        rc = 1;
9300        goto meta_command_exit;
9301      }
9302      if( nArg==3 ){
9303        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
9304                      (int)integerValue(azArg[2]));
9305      }
9306      printf("%20s %d\n", aLimit[iLimit].zLimitName,
9307             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
9308    }
9309  }else
9310
9311  if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
9312    open_db(p, 0);
9313    lintDotCommand(p, azArg, nArg);
9314  }else
9315
9316#ifndef SQLITE_OMIT_LOAD_EXTENSION
9317  if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
9318    const char *zFile, *zProc;
9319    char *zErrMsg = 0;
9320    failIfSafeMode(p, "cannot run .load in safe mode");
9321    if( nArg<2 ){
9322      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
9323      rc = 1;
9324      goto meta_command_exit;
9325    }
9326    zFile = azArg[1];
9327    zProc = nArg>=3 ? azArg[2] : 0;
9328    open_db(p, 0);
9329    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
9330    if( rc!=SQLITE_OK ){
9331      utf8_printf(stderr, "Error: %s\n", zErrMsg);
9332      sqlite3_free(zErrMsg);
9333      rc = 1;
9334    }
9335  }else
9336#endif
9337
9338  if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
9339    failIfSafeMode(p, "cannot run .log in safe mode");
9340    if( nArg!=2 ){
9341      raw_printf(stderr, "Usage: .log FILENAME\n");
9342      rc = 1;
9343    }else{
9344      const char *zFile = azArg[1];
9345      output_file_close(p->pLog);
9346      p->pLog = output_file_open(zFile, 0);
9347    }
9348  }else
9349
9350  if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
9351    const char *zMode = 0;
9352    const char *zTabname = 0;
9353    int i, n2;
9354    ColModeOpts cmOpts = ColModeOpts_default;
9355    for(i=1; i<nArg; i++){
9356      const char *z = azArg[i];
9357      if( optionMatch(z,"wrap") && i+1<nArg ){
9358        cmOpts.iWrap = integerValue(azArg[++i]);
9359      }else if( optionMatch(z,"ww") ){
9360        cmOpts.bWordWrap = 1;
9361      }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
9362        cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
9363      }else if( optionMatch(z,"quote") ){
9364        cmOpts.bQuote = 1;
9365      }else if( optionMatch(z,"noquote") ){
9366        cmOpts.bQuote = 0;
9367      }else if( zMode==0 ){
9368        zMode = z;
9369        /* Apply defaults for qbox pseudo-mods. If that
9370         * overwrites already-set values, user was informed of this.
9371         */
9372        if( strcmp(z, "qbox")==0 ){
9373          ColModeOpts cmo = ColModeOpts_default_qbox;
9374          zMode = "box";
9375          cmOpts = cmo;
9376        }
9377      }else if( zTabname==0 ){
9378        zTabname = z;
9379      }else if( z[0]=='-' ){
9380        utf8_printf(stderr, "unknown option: %s\n", z);
9381        utf8_printf(stderr, "options:\n"
9382                            "  --noquote\n"
9383                            "  --quote\n"
9384                            "  --wordwrap on/off\n"
9385                            "  --wrap N\n"
9386                            "  --ww\n");
9387        rc = 1;
9388        goto meta_command_exit;
9389      }else{
9390        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9391        rc = 1;
9392        goto meta_command_exit;
9393      }
9394    }
9395    if( zMode==0 ){
9396      if( p->mode==MODE_Column
9397       || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
9398      ){
9399        raw_printf
9400          (p->out,
9401           "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
9402           modeDescr[p->mode], p->cmOpts.iWrap,
9403           p->cmOpts.bWordWrap ? "on" : "off",
9404           p->cmOpts.bQuote ? "" : "no");
9405      }else{
9406        raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
9407      }
9408      zMode = modeDescr[p->mode];
9409    }
9410    n2 = strlen30(zMode);
9411    if( strncmp(zMode,"lines",n2)==0 ){
9412      p->mode = MODE_Line;
9413      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9414    }else if( strncmp(zMode,"columns",n2)==0 ){
9415      p->mode = MODE_Column;
9416      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
9417        p->showHeader = 1;
9418      }
9419      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9420      p->cmOpts = cmOpts;
9421    }else if( strncmp(zMode,"list",n2)==0 ){
9422      p->mode = MODE_List;
9423      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
9424      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9425    }else if( strncmp(zMode,"html",n2)==0 ){
9426      p->mode = MODE_Html;
9427    }else if( strncmp(zMode,"tcl",n2)==0 ){
9428      p->mode = MODE_Tcl;
9429      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
9430      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9431    }else if( strncmp(zMode,"csv",n2)==0 ){
9432      p->mode = MODE_Csv;
9433      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9434      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9435    }else if( strncmp(zMode,"tabs",n2)==0 ){
9436      p->mode = MODE_List;
9437      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
9438    }else if( strncmp(zMode,"insert",n2)==0 ){
9439      p->mode = MODE_Insert;
9440      set_table_name(p, zTabname ? zTabname : "table");
9441    }else if( strncmp(zMode,"quote",n2)==0 ){
9442      p->mode = MODE_Quote;
9443      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9444      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9445    }else if( strncmp(zMode,"ascii",n2)==0 ){
9446      p->mode = MODE_Ascii;
9447      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
9448      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
9449    }else if( strncmp(zMode,"markdown",n2)==0 ){
9450      p->mode = MODE_Markdown;
9451      p->cmOpts = cmOpts;
9452    }else if( strncmp(zMode,"table",n2)==0 ){
9453      p->mode = MODE_Table;
9454      p->cmOpts = cmOpts;
9455    }else if( strncmp(zMode,"box",n2)==0 ){
9456      p->mode = MODE_Box;
9457      p->cmOpts = cmOpts;
9458    }else if( strncmp(zMode,"count",n2)==0 ){
9459      p->mode = MODE_Count;
9460    }else if( strncmp(zMode,"off",n2)==0 ){
9461      p->mode = MODE_Off;
9462    }else if( strncmp(zMode,"json",n2)==0 ){
9463      p->mode = MODE_Json;
9464    }else{
9465      raw_printf(stderr, "Error: mode should be one of: "
9466         "ascii box column csv html insert json line list markdown "
9467         "qbox quote table tabs tcl\n");
9468      rc = 1;
9469    }
9470    p->cMode = p->mode;
9471  }else
9472
9473  if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
9474    if( nArg!=2 ){
9475      raw_printf(stderr, "Usage: .nonce NONCE\n");
9476      rc = 1;
9477    }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
9478      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
9479                 p->lineno, azArg[1]);
9480      exit(1);
9481    }else{
9482      p->bSafeMode = 0;
9483      return 0;  /* Return immediately to bypass the safe mode reset
9484                 ** at the end of this procedure */
9485    }
9486  }else
9487
9488  if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
9489    if( nArg==2 ){
9490      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
9491                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
9492    }else{
9493      raw_printf(stderr, "Usage: .nullvalue STRING\n");
9494      rc = 1;
9495    }
9496  }else
9497
9498  if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
9499    const char *zFN = 0;     /* Pointer to constant filename */
9500    char *zNewFilename = 0;  /* Name of the database file to open */
9501    int iName = 1;           /* Index in azArg[] of the filename */
9502    int newFlag = 0;         /* True to delete file before opening */
9503    int openMode = SHELL_OPEN_UNSPEC;
9504
9505    /* Check for command-line arguments */
9506    for(iName=1; iName<nArg; iName++){
9507      const char *z = azArg[iName];
9508      if( optionMatch(z,"new") ){
9509        newFlag = 1;
9510#ifdef SQLITE_HAVE_ZLIB
9511      }else if( optionMatch(z, "zip") ){
9512        openMode = SHELL_OPEN_ZIPFILE;
9513#endif
9514      }else if( optionMatch(z, "append") ){
9515        openMode = SHELL_OPEN_APPENDVFS;
9516      }else if( optionMatch(z, "readonly") ){
9517        openMode = SHELL_OPEN_READONLY;
9518      }else if( optionMatch(z, "nofollow") ){
9519        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
9520#ifndef SQLITE_OMIT_DESERIALIZE
9521      }else if( optionMatch(z, "deserialize") ){
9522        openMode = SHELL_OPEN_DESERIALIZE;
9523      }else if( optionMatch(z, "hexdb") ){
9524        openMode = SHELL_OPEN_HEXDB;
9525      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
9526        p->szMax = integerValue(azArg[++iName]);
9527#endif /* SQLITE_OMIT_DESERIALIZE */
9528      }else if( z[0]=='-' ){
9529        utf8_printf(stderr, "unknown option: %s\n", z);
9530        rc = 1;
9531        goto meta_command_exit;
9532      }else if( zFN ){
9533        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9534        rc = 1;
9535        goto meta_command_exit;
9536      }else{
9537        zFN = z;
9538      }
9539    }
9540
9541    /* Close the existing database */
9542    session_close_all(p, -1);
9543    close_db(p->db);
9544    p->db = 0;
9545    p->pAuxDb->zDbFilename = 0;
9546    sqlite3_free(p->pAuxDb->zFreeOnClose);
9547    p->pAuxDb->zFreeOnClose = 0;
9548    p->openMode = openMode;
9549    p->openFlags = 0;
9550    p->szMax = 0;
9551
9552    /* If a filename is specified, try to open it first */
9553    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9554      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9555      if( p->bSafeMode
9556       && p->openMode!=SHELL_OPEN_HEXDB
9557       && zFN
9558       && strcmp(zFN,":memory:")!=0
9559      ){
9560        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9561      }
9562      if( zFN ){
9563        zNewFilename = sqlite3_mprintf("%s", zFN);
9564        shell_check_oom(zNewFilename);
9565      }else{
9566        zNewFilename = 0;
9567      }
9568      p->pAuxDb->zDbFilename = zNewFilename;
9569      open_db(p, OPEN_DB_KEEPALIVE);
9570      if( p->db==0 ){
9571        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9572        sqlite3_free(zNewFilename);
9573      }else{
9574        p->pAuxDb->zFreeOnClose = zNewFilename;
9575      }
9576    }
9577    if( p->db==0 ){
9578      /* As a fall-back open a TEMP database */
9579      p->pAuxDb->zDbFilename = 0;
9580      open_db(p, 0);
9581    }
9582  }else
9583
9584  if( (c=='o'
9585        && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9586   || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9587  ){
9588    char *zFile = 0;
9589    int bTxtMode = 0;
9590    int i;
9591    int eMode = 0;
9592    int bBOM = 0;
9593    int bOnce = 0;  /* 0: .output, 1: .once, 2: .excel */
9594
9595    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9596    if( c=='e' ){
9597      eMode = 'x';
9598      bOnce = 2;
9599    }else if( strncmp(azArg[0],"once",n)==0 ){
9600      bOnce = 1;
9601    }
9602    for(i=1; i<nArg; i++){
9603      char *z = azArg[i];
9604      if( z[0]=='-' ){
9605        if( z[1]=='-' ) z++;
9606        if( strcmp(z,"-bom")==0 ){
9607          bBOM = 1;
9608        }else if( c!='e' && strcmp(z,"-x")==0 ){
9609          eMode = 'x';  /* spreadsheet */
9610        }else if( c!='e' && strcmp(z,"-e")==0 ){
9611          eMode = 'e';  /* text editor */
9612        }else{
9613          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9614                      azArg[i]);
9615          showHelp(p->out, azArg[0]);
9616          rc = 1;
9617          goto meta_command_exit;
9618        }
9619      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9620        zFile = sqlite3_mprintf("%s", z);
9621        if( zFile && zFile[0]=='|' ){
9622          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9623          break;
9624        }
9625      }else{
9626        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9627                    azArg[i]);
9628        showHelp(p->out, azArg[0]);
9629        rc = 1;
9630        sqlite3_free(zFile);
9631        goto meta_command_exit;
9632      }
9633    }
9634    if( zFile==0 ){
9635      zFile = sqlite3_mprintf("stdout");
9636    }
9637    if( bOnce ){
9638      p->outCount = 2;
9639    }else{
9640      p->outCount = 0;
9641    }
9642    output_reset(p);
9643#ifndef SQLITE_NOHAVE_SYSTEM
9644    if( eMode=='e' || eMode=='x' ){
9645      p->doXdgOpen = 1;
9646      outputModePush(p);
9647      if( eMode=='x' ){
9648        /* spreadsheet mode.  Output as CSV. */
9649        newTempFile(p, "csv");
9650        ShellClearFlag(p, SHFLG_Echo);
9651        p->mode = MODE_Csv;
9652        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9653        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9654      }else{
9655        /* text editor mode */
9656        newTempFile(p, "txt");
9657        bTxtMode = 1;
9658      }
9659      sqlite3_free(zFile);
9660      zFile = sqlite3_mprintf("%s", p->zTempFile);
9661    }
9662#endif /* SQLITE_NOHAVE_SYSTEM */
9663    shell_check_oom(zFile);
9664    if( zFile[0]=='|' ){
9665#ifdef SQLITE_OMIT_POPEN
9666      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9667      rc = 1;
9668      p->out = stdout;
9669#else
9670      p->out = popen(zFile + 1, "w");
9671      if( p->out==0 ){
9672        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9673        p->out = stdout;
9674        rc = 1;
9675      }else{
9676        if( bBOM ) fprintf(p->out,"\357\273\277");
9677        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9678      }
9679#endif
9680    }else{
9681      p->out = output_file_open(zFile, bTxtMode);
9682      if( p->out==0 ){
9683        if( strcmp(zFile,"off")!=0 ){
9684          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9685        }
9686        p->out = stdout;
9687        rc = 1;
9688      } else {
9689        if( bBOM ) fprintf(p->out,"\357\273\277");
9690        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9691      }
9692    }
9693    sqlite3_free(zFile);
9694  }else
9695
9696  if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9697    open_db(p,0);
9698    if( nArg<=1 ) goto parameter_syntax_error;
9699
9700    /* .parameter clear
9701    ** Clear all bind parameters by dropping the TEMP table that holds them.
9702    */
9703    if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9704      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9705                   0, 0, 0);
9706    }else
9707
9708    /* .parameter list
9709    ** List all bind parameters.
9710    */
9711    if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9712      sqlite3_stmt *pStmt = 0;
9713      int rx;
9714      int len = 0;
9715      rx = sqlite3_prepare_v2(p->db,
9716             "SELECT max(length(key)) "
9717             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9718      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9719        len = sqlite3_column_int(pStmt, 0);
9720        if( len>40 ) len = 40;
9721      }
9722      sqlite3_finalize(pStmt);
9723      pStmt = 0;
9724      if( len ){
9725        rx = sqlite3_prepare_v2(p->db,
9726             "SELECT key, quote(value) "
9727             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9728        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9729          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9730                      sqlite3_column_text(pStmt,1));
9731        }
9732        sqlite3_finalize(pStmt);
9733      }
9734    }else
9735
9736    /* .parameter init
9737    ** Make sure the TEMP table used to hold bind parameters exists.
9738    ** Create it if necessary.
9739    */
9740    if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9741      bind_table_init(p);
9742    }else
9743
9744    /* .parameter set NAME VALUE
9745    ** Set or reset a bind parameter.  NAME should be the full parameter
9746    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9747    ** VALUE can be in either SQL literal notation, or if not it will be
9748    ** understood to be a text string.
9749    */
9750    if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9751      int rx;
9752      char *zSql;
9753      sqlite3_stmt *pStmt;
9754      const char *zKey = azArg[2];
9755      const char *zValue = azArg[3];
9756      bind_table_init(p);
9757      zSql = sqlite3_mprintf(
9758                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9759                  "VALUES(%Q,%s);", zKey, zValue);
9760      shell_check_oom(zSql);
9761      pStmt = 0;
9762      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9763      sqlite3_free(zSql);
9764      if( rx!=SQLITE_OK ){
9765        sqlite3_finalize(pStmt);
9766        pStmt = 0;
9767        zSql = sqlite3_mprintf(
9768                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9769                   "VALUES(%Q,%Q);", zKey, zValue);
9770        shell_check_oom(zSql);
9771        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9772        sqlite3_free(zSql);
9773        if( rx!=SQLITE_OK ){
9774          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9775          sqlite3_finalize(pStmt);
9776          pStmt = 0;
9777          rc = 1;
9778        }
9779      }
9780      sqlite3_step(pStmt);
9781      sqlite3_finalize(pStmt);
9782    }else
9783
9784    /* .parameter unset NAME
9785    ** Remove the NAME binding from the parameter binding table, if it
9786    ** exists.
9787    */
9788    if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9789      char *zSql = sqlite3_mprintf(
9790          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9791      shell_check_oom(zSql);
9792      sqlite3_exec(p->db, zSql, 0, 0, 0);
9793      sqlite3_free(zSql);
9794    }else
9795    /* If no command name matches, show a syntax error */
9796    parameter_syntax_error:
9797    showHelp(p->out, "parameter");
9798  }else
9799
9800  if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9801    int i;
9802    for(i=1; i<nArg; i++){
9803      if( i>1 ) raw_printf(p->out, " ");
9804      utf8_printf(p->out, "%s", azArg[i]);
9805    }
9806    raw_printf(p->out, "\n");
9807  }else
9808
9809#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9810  if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9811    int i;
9812    int nn = 0;
9813    p->flgProgress = 0;
9814    p->mxProgress = 0;
9815    p->nProgress = 0;
9816    for(i=1; i<nArg; i++){
9817      const char *z = azArg[i];
9818      if( z[0]=='-' ){
9819        z++;
9820        if( z[0]=='-' ) z++;
9821        if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9822          p->flgProgress |= SHELL_PROGRESS_QUIET;
9823          continue;
9824        }
9825        if( strcmp(z,"reset")==0 ){
9826          p->flgProgress |= SHELL_PROGRESS_RESET;
9827          continue;
9828        }
9829        if( strcmp(z,"once")==0 ){
9830          p->flgProgress |= SHELL_PROGRESS_ONCE;
9831          continue;
9832        }
9833        if( strcmp(z,"limit")==0 ){
9834          if( i+1>=nArg ){
9835            utf8_printf(stderr, "Error: missing argument on --limit\n");
9836            rc = 1;
9837            goto meta_command_exit;
9838          }else{
9839            p->mxProgress = (int)integerValue(azArg[++i]);
9840          }
9841          continue;
9842        }
9843        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9844        rc = 1;
9845        goto meta_command_exit;
9846      }else{
9847        nn = (int)integerValue(z);
9848      }
9849    }
9850    open_db(p, 0);
9851    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9852  }else
9853#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9854
9855  if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9856    if( nArg >= 2) {
9857      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9858    }
9859    if( nArg >= 3) {
9860      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9861    }
9862  }else
9863
9864  if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9865    rc = 2;
9866  }else
9867
9868  if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9869    FILE *inSaved = p->in;
9870    int savedLineno = p->lineno;
9871    failIfSafeMode(p, "cannot run .read in safe mode");
9872    if( nArg!=2 ){
9873      raw_printf(stderr, "Usage: .read FILE\n");
9874      rc = 1;
9875      goto meta_command_exit;
9876    }
9877    if( azArg[1][0]=='|' ){
9878#ifdef SQLITE_OMIT_POPEN
9879      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9880      rc = 1;
9881      p->out = stdout;
9882#else
9883      p->in = popen(azArg[1]+1, "r");
9884      if( p->in==0 ){
9885        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9886        rc = 1;
9887      }else{
9888        rc = process_input(p);
9889        pclose(p->in);
9890      }
9891#endif
9892    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9893      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9894      rc = 1;
9895    }else{
9896      rc = process_input(p);
9897      fclose(p->in);
9898    }
9899    p->in = inSaved;
9900    p->lineno = savedLineno;
9901  }else
9902
9903  if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9904    const char *zSrcFile;
9905    const char *zDb;
9906    sqlite3 *pSrc;
9907    sqlite3_backup *pBackup;
9908    int nTimeout = 0;
9909
9910    failIfSafeMode(p, "cannot run .restore in safe mode");
9911    if( nArg==2 ){
9912      zSrcFile = azArg[1];
9913      zDb = "main";
9914    }else if( nArg==3 ){
9915      zSrcFile = azArg[2];
9916      zDb = azArg[1];
9917    }else{
9918      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9919      rc = 1;
9920      goto meta_command_exit;
9921    }
9922    rc = sqlite3_open(zSrcFile, &pSrc);
9923    if( rc!=SQLITE_OK ){
9924      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9925      close_db(pSrc);
9926      return 1;
9927    }
9928    open_db(p, 0);
9929    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9930    if( pBackup==0 ){
9931      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9932      close_db(pSrc);
9933      return 1;
9934    }
9935    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9936          || rc==SQLITE_BUSY  ){
9937      if( rc==SQLITE_BUSY ){
9938        if( nTimeout++ >= 3 ) break;
9939        sqlite3_sleep(100);
9940      }
9941    }
9942    sqlite3_backup_finish(pBackup);
9943    if( rc==SQLITE_DONE ){
9944      rc = 0;
9945    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9946      raw_printf(stderr, "Error: source database is busy\n");
9947      rc = 1;
9948    }else{
9949      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9950      rc = 1;
9951    }
9952    close_db(pSrc);
9953  }else
9954
9955  if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9956    if( nArg==2 ){
9957      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9958#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9959      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9960#endif
9961    }else{
9962      raw_printf(stderr, "Usage: .scanstats on|off\n");
9963      rc = 1;
9964    }
9965  }else
9966
9967  if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9968    ShellText sSelect;
9969    ShellState data;
9970    char *zErrMsg = 0;
9971    const char *zDiv = "(";
9972    const char *zName = 0;
9973    int iSchema = 0;
9974    int bDebug = 0;
9975    int bNoSystemTabs = 0;
9976    int ii;
9977
9978    open_db(p, 0);
9979    memcpy(&data, p, sizeof(data));
9980    data.showHeader = 0;
9981    data.cMode = data.mode = MODE_Semi;
9982    initText(&sSelect);
9983    for(ii=1; ii<nArg; ii++){
9984      if( optionMatch(azArg[ii],"indent") ){
9985        data.cMode = data.mode = MODE_Pretty;
9986      }else if( optionMatch(azArg[ii],"debug") ){
9987        bDebug = 1;
9988      }else if( optionMatch(azArg[ii],"nosys") ){
9989        bNoSystemTabs = 1;
9990      }else if( azArg[ii][0]=='-' ){
9991        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9992        rc = 1;
9993        goto meta_command_exit;
9994      }else if( zName==0 ){
9995        zName = azArg[ii];
9996      }else{
9997        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9998        rc = 1;
9999        goto meta_command_exit;
10000      }
10001    }
10002    if( zName!=0 ){
10003      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
10004                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
10005                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
10006                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
10007      if( isSchema ){
10008        char *new_argv[2], *new_colv[2];
10009        new_argv[0] = sqlite3_mprintf(
10010                      "CREATE TABLE %s (\n"
10011                      "  type text,\n"
10012                      "  name text,\n"
10013                      "  tbl_name text,\n"
10014                      "  rootpage integer,\n"
10015                      "  sql text\n"
10016                      ")", zName);
10017        shell_check_oom(new_argv[0]);
10018        new_argv[1] = 0;
10019        new_colv[0] = "sql";
10020        new_colv[1] = 0;
10021        callback(&data, 1, new_argv, new_colv);
10022        sqlite3_free(new_argv[0]);
10023      }
10024    }
10025    if( zDiv ){
10026      sqlite3_stmt *pStmt = 0;
10027      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
10028                              -1, &pStmt, 0);
10029      if( rc ){
10030        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
10031        sqlite3_finalize(pStmt);
10032        rc = 1;
10033        goto meta_command_exit;
10034      }
10035      appendText(&sSelect, "SELECT sql FROM", 0);
10036      iSchema = 0;
10037      while( sqlite3_step(pStmt)==SQLITE_ROW ){
10038        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
10039        char zScNum[30];
10040        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
10041        appendText(&sSelect, zDiv, 0);
10042        zDiv = " UNION ALL ";
10043        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
10044        if( sqlite3_stricmp(zDb, "main")!=0 ){
10045          appendText(&sSelect, zDb, '\'');
10046        }else{
10047          appendText(&sSelect, "NULL", 0);
10048        }
10049        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
10050        appendText(&sSelect, zScNum, 0);
10051        appendText(&sSelect, " AS snum, ", 0);
10052        appendText(&sSelect, zDb, '\'');
10053        appendText(&sSelect, " AS sname FROM ", 0);
10054        appendText(&sSelect, zDb, quoteChar(zDb));
10055        appendText(&sSelect, ".sqlite_schema", 0);
10056      }
10057      sqlite3_finalize(pStmt);
10058#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
10059      if( zName ){
10060        appendText(&sSelect,
10061           " UNION ALL SELECT shell_module_schema(name),"
10062           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
10063        0);
10064      }
10065#endif
10066      appendText(&sSelect, ") WHERE ", 0);
10067      if( zName ){
10068        char *zQarg = sqlite3_mprintf("%Q", zName);
10069        int bGlob;
10070        shell_check_oom(zQarg);
10071        bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
10072                strchr(zName, '[') != 0;
10073        if( strchr(zName, '.') ){
10074          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
10075        }else{
10076          appendText(&sSelect, "lower(tbl_name)", 0);
10077        }
10078        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
10079        appendText(&sSelect, zQarg, 0);
10080        if( !bGlob ){
10081          appendText(&sSelect, " ESCAPE '\\' ", 0);
10082        }
10083        appendText(&sSelect, " AND ", 0);
10084        sqlite3_free(zQarg);
10085      }
10086      if( bNoSystemTabs ){
10087        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
10088      }
10089      appendText(&sSelect, "sql IS NOT NULL"
10090                           " ORDER BY snum, rowid", 0);
10091      if( bDebug ){
10092        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
10093      }else{
10094        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
10095      }
10096      freeText(&sSelect);
10097    }
10098    if( zErrMsg ){
10099      utf8_printf(stderr,"Error: %s\n", zErrMsg);
10100      sqlite3_free(zErrMsg);
10101      rc = 1;
10102    }else if( rc != SQLITE_OK ){
10103      raw_printf(stderr,"Error: querying schema information\n");
10104      rc = 1;
10105    }else{
10106      rc = 0;
10107    }
10108  }else
10109
10110  if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
10111    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10112    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
10113  }else
10114
10115#if defined(SQLITE_ENABLE_SESSION)
10116  if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
10117    struct AuxDb *pAuxDb = p->pAuxDb;
10118    OpenSession *pSession = &pAuxDb->aSession[0];
10119    char **azCmd = &azArg[1];
10120    int iSes = 0;
10121    int nCmd = nArg - 1;
10122    int i;
10123    if( nArg<=1 ) goto session_syntax_error;
10124    open_db(p, 0);
10125    if( nArg>=3 ){
10126      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
10127        if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
10128      }
10129      if( iSes<pAuxDb->nSession ){
10130        pSession = &pAuxDb->aSession[iSes];
10131        azCmd++;
10132        nCmd--;
10133      }else{
10134        pSession = &pAuxDb->aSession[0];
10135        iSes = 0;
10136      }
10137    }
10138
10139    /* .session attach TABLE
10140    ** Invoke the sqlite3session_attach() interface to attach a particular
10141    ** table so that it is never filtered.
10142    */
10143    if( strcmp(azCmd[0],"attach")==0 ){
10144      if( nCmd!=2 ) goto session_syntax_error;
10145      if( pSession->p==0 ){
10146        session_not_open:
10147        raw_printf(stderr, "ERROR: No sessions are open\n");
10148      }else{
10149        rc = sqlite3session_attach(pSession->p, azCmd[1]);
10150        if( rc ){
10151          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
10152          rc = 0;
10153        }
10154      }
10155    }else
10156
10157    /* .session changeset FILE
10158    ** .session patchset FILE
10159    ** Write a changeset or patchset into a file.  The file is overwritten.
10160    */
10161    if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
10162      FILE *out = 0;
10163      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
10164      if( nCmd!=2 ) goto session_syntax_error;
10165      if( pSession->p==0 ) goto session_not_open;
10166      out = fopen(azCmd[1], "wb");
10167      if( out==0 ){
10168        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
10169                    azCmd[1]);
10170      }else{
10171        int szChng;
10172        void *pChng;
10173        if( azCmd[0][0]=='c' ){
10174          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
10175        }else{
10176          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
10177        }
10178        if( rc ){
10179          printf("Error: error code %d\n", rc);
10180          rc = 0;
10181        }
10182        if( pChng
10183          && fwrite(pChng, szChng, 1, out)!=1 ){
10184          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
10185                  szChng);
10186        }
10187        sqlite3_free(pChng);
10188        fclose(out);
10189      }
10190    }else
10191
10192    /* .session close
10193    ** Close the identified session
10194    */
10195    if( strcmp(azCmd[0], "close")==0 ){
10196      if( nCmd!=1 ) goto session_syntax_error;
10197      if( pAuxDb->nSession ){
10198        session_close(pSession);
10199        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
10200      }
10201    }else
10202
10203    /* .session enable ?BOOLEAN?
10204    ** Query or set the enable flag
10205    */
10206    if( strcmp(azCmd[0], "enable")==0 ){
10207      int ii;
10208      if( nCmd>2 ) goto session_syntax_error;
10209      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10210      if( pAuxDb->nSession ){
10211        ii = sqlite3session_enable(pSession->p, ii);
10212        utf8_printf(p->out, "session %s enable flag = %d\n",
10213                    pSession->zName, ii);
10214      }
10215    }else
10216
10217    /* .session filter GLOB ....
10218    ** Set a list of GLOB patterns of table names to be excluded.
10219    */
10220    if( strcmp(azCmd[0], "filter")==0 ){
10221      int ii, nByte;
10222      if( nCmd<2 ) goto session_syntax_error;
10223      if( pAuxDb->nSession ){
10224        for(ii=0; ii<pSession->nFilter; ii++){
10225          sqlite3_free(pSession->azFilter[ii]);
10226        }
10227        sqlite3_free(pSession->azFilter);
10228        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
10229        pSession->azFilter = sqlite3_malloc( nByte );
10230        if( pSession->azFilter==0 ){
10231          raw_printf(stderr, "Error: out or memory\n");
10232          exit(1);
10233        }
10234        for(ii=1; ii<nCmd; ii++){
10235          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
10236          shell_check_oom(x);
10237        }
10238        pSession->nFilter = ii-1;
10239      }
10240    }else
10241
10242    /* .session indirect ?BOOLEAN?
10243    ** Query or set the indirect flag
10244    */
10245    if( strcmp(azCmd[0], "indirect")==0 ){
10246      int ii;
10247      if( nCmd>2 ) goto session_syntax_error;
10248      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10249      if( pAuxDb->nSession ){
10250        ii = sqlite3session_indirect(pSession->p, ii);
10251        utf8_printf(p->out, "session %s indirect flag = %d\n",
10252                    pSession->zName, ii);
10253      }
10254    }else
10255
10256    /* .session isempty
10257    ** Determine if the session is empty
10258    */
10259    if( strcmp(azCmd[0], "isempty")==0 ){
10260      int ii;
10261      if( nCmd!=1 ) goto session_syntax_error;
10262      if( pAuxDb->nSession ){
10263        ii = sqlite3session_isempty(pSession->p);
10264        utf8_printf(p->out, "session %s isempty flag = %d\n",
10265                    pSession->zName, ii);
10266      }
10267    }else
10268
10269    /* .session list
10270    ** List all currently open sessions
10271    */
10272    if( strcmp(azCmd[0],"list")==0 ){
10273      for(i=0; i<pAuxDb->nSession; i++){
10274        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
10275      }
10276    }else
10277
10278    /* .session open DB NAME
10279    ** Open a new session called NAME on the attached database DB.
10280    ** DB is normally "main".
10281    */
10282    if( strcmp(azCmd[0],"open")==0 ){
10283      char *zName;
10284      if( nCmd!=3 ) goto session_syntax_error;
10285      zName = azCmd[2];
10286      if( zName[0]==0 ) goto session_syntax_error;
10287      for(i=0; i<pAuxDb->nSession; i++){
10288        if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
10289          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
10290          goto meta_command_exit;
10291        }
10292      }
10293      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
10294        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
10295        goto meta_command_exit;
10296      }
10297      pSession = &pAuxDb->aSession[pAuxDb->nSession];
10298      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
10299      if( rc ){
10300        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
10301        rc = 0;
10302        goto meta_command_exit;
10303      }
10304      pSession->nFilter = 0;
10305      sqlite3session_table_filter(pSession->p, session_filter, pSession);
10306      pAuxDb->nSession++;
10307      pSession->zName = sqlite3_mprintf("%s", zName);
10308      shell_check_oom(pSession->zName);
10309    }else
10310    /* If no command name matches, show a syntax error */
10311    session_syntax_error:
10312    showHelp(p->out, "session");
10313  }else
10314#endif
10315
10316#ifdef SQLITE_DEBUG
10317  /* Undocumented commands for internal testing.  Subject to change
10318  ** without notice. */
10319  if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
10320    if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
10321      int i, v;
10322      for(i=1; i<nArg; i++){
10323        v = booleanValue(azArg[i]);
10324        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
10325      }
10326    }
10327    if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
10328      int i; sqlite3_int64 v;
10329      for(i=1; i<nArg; i++){
10330        char zBuf[200];
10331        v = integerValue(azArg[i]);
10332        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
10333        utf8_printf(p->out, "%s", zBuf);
10334      }
10335    }
10336  }else
10337#endif
10338
10339  if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
10340    int bIsInit = 0;         /* True to initialize the SELFTEST table */
10341    int bVerbose = 0;        /* Verbose output */
10342    int bSelftestExists;     /* True if SELFTEST already exists */
10343    int i, k;                /* Loop counters */
10344    int nTest = 0;           /* Number of tests runs */
10345    int nErr = 0;            /* Number of errors seen */
10346    ShellText str;           /* Answer for a query */
10347    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
10348
10349    open_db(p,0);
10350    for(i=1; i<nArg; i++){
10351      const char *z = azArg[i];
10352      if( z[0]=='-' && z[1]=='-' ) z++;
10353      if( strcmp(z,"-init")==0 ){
10354        bIsInit = 1;
10355      }else
10356      if( strcmp(z,"-v")==0 ){
10357        bVerbose++;
10358      }else
10359      {
10360        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10361                    azArg[i], azArg[0]);
10362        raw_printf(stderr, "Should be one of: --init -v\n");
10363        rc = 1;
10364        goto meta_command_exit;
10365      }
10366    }
10367    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
10368           != SQLITE_OK ){
10369      bSelftestExists = 0;
10370    }else{
10371      bSelftestExists = 1;
10372    }
10373    if( bIsInit ){
10374      createSelftestTable(p);
10375      bSelftestExists = 1;
10376    }
10377    initText(&str);
10378    appendText(&str, "x", 0);
10379    for(k=bSelftestExists; k>=0; k--){
10380      if( k==1 ){
10381        rc = sqlite3_prepare_v2(p->db,
10382            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
10383            -1, &pStmt, 0);
10384      }else{
10385        rc = sqlite3_prepare_v2(p->db,
10386          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
10387          "      (1,'run','PRAGMA integrity_check','ok')",
10388          -1, &pStmt, 0);
10389      }
10390      if( rc ){
10391        raw_printf(stderr, "Error querying the selftest table\n");
10392        rc = 1;
10393        sqlite3_finalize(pStmt);
10394        goto meta_command_exit;
10395      }
10396      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
10397        int tno = sqlite3_column_int(pStmt, 0);
10398        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
10399        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
10400        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
10401
10402        if( zOp==0 ) continue;
10403        if( zSql==0 ) continue;
10404        if( zAns==0 ) continue;
10405        k = 0;
10406        if( bVerbose>0 ){
10407          printf("%d: %s %s\n", tno, zOp, zSql);
10408        }
10409        if( strcmp(zOp,"memo")==0 ){
10410          utf8_printf(p->out, "%s\n", zSql);
10411        }else
10412        if( strcmp(zOp,"run")==0 ){
10413          char *zErrMsg = 0;
10414          str.n = 0;
10415          str.z[0] = 0;
10416          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
10417          nTest++;
10418          if( bVerbose ){
10419            utf8_printf(p->out, "Result: %s\n", str.z);
10420          }
10421          if( rc || zErrMsg ){
10422            nErr++;
10423            rc = 1;
10424            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
10425            sqlite3_free(zErrMsg);
10426          }else if( strcmp(zAns,str.z)!=0 ){
10427            nErr++;
10428            rc = 1;
10429            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
10430            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
10431          }
10432        }else
10433        {
10434          utf8_printf(stderr,
10435            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
10436          rc = 1;
10437          break;
10438        }
10439      } /* End loop over rows of content from SELFTEST */
10440      sqlite3_finalize(pStmt);
10441    } /* End loop over k */
10442    freeText(&str);
10443    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
10444  }else
10445
10446  if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
10447    if( nArg<2 || nArg>3 ){
10448      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
10449      rc = 1;
10450    }
10451    if( nArg>=2 ){
10452      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
10453                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
10454    }
10455    if( nArg>=3 ){
10456      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
10457                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
10458    }
10459  }else
10460
10461  if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
10462    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
10463    int i;                   /* Loop counter */
10464    int bSchema = 0;         /* Also hash the schema */
10465    int bSeparate = 0;       /* Hash each table separately */
10466    int iSize = 224;         /* Hash algorithm to use */
10467    int bDebug = 0;          /* Only show the query that would have run */
10468    sqlite3_stmt *pStmt;     /* For querying tables names */
10469    char *zSql;              /* SQL to be run */
10470    char *zSep;              /* Separator */
10471    ShellText sSql;          /* Complete SQL for the query to run the hash */
10472    ShellText sQuery;        /* Set of queries used to read all content */
10473    open_db(p, 0);
10474    for(i=1; i<nArg; i++){
10475      const char *z = azArg[i];
10476      if( z[0]=='-' ){
10477        z++;
10478        if( z[0]=='-' ) z++;
10479        if( strcmp(z,"schema")==0 ){
10480          bSchema = 1;
10481        }else
10482        if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
10483         || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
10484        ){
10485          iSize = atoi(&z[5]);
10486        }else
10487        if( strcmp(z,"debug")==0 ){
10488          bDebug = 1;
10489        }else
10490        {
10491          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10492                      azArg[i], azArg[0]);
10493          showHelp(p->out, azArg[0]);
10494          rc = 1;
10495          goto meta_command_exit;
10496        }
10497      }else if( zLike ){
10498        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
10499        rc = 1;
10500        goto meta_command_exit;
10501      }else{
10502        zLike = z;
10503        bSeparate = 1;
10504        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
10505      }
10506    }
10507    if( bSchema ){
10508      zSql = "SELECT lower(name) FROM sqlite_schema"
10509             " WHERE type='table' AND coalesce(rootpage,0)>1"
10510             " UNION ALL SELECT 'sqlite_schema'"
10511             " ORDER BY 1 collate nocase";
10512    }else{
10513      zSql = "SELECT lower(name) FROM sqlite_schema"
10514             " WHERE type='table' AND coalesce(rootpage,0)>1"
10515             " AND name NOT LIKE 'sqlite_%'"
10516             " ORDER BY 1 collate nocase";
10517    }
10518    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10519    initText(&sQuery);
10520    initText(&sSql);
10521    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
10522    zSep = "VALUES(";
10523    while( SQLITE_ROW==sqlite3_step(pStmt) ){
10524      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
10525      if( zTab==0 ) continue;
10526      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
10527      if( strncmp(zTab, "sqlite_",7)!=0 ){
10528        appendText(&sQuery,"SELECT * FROM ", 0);
10529        appendText(&sQuery,zTab,'"');
10530        appendText(&sQuery," NOT INDEXED;", 0);
10531      }else if( strcmp(zTab, "sqlite_schema")==0 ){
10532        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10533                           " ORDER BY name;", 0);
10534      }else if( strcmp(zTab, "sqlite_sequence")==0 ){
10535        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10536                           " ORDER BY name;", 0);
10537      }else if( strcmp(zTab, "sqlite_stat1")==0 ){
10538        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10539                           " ORDER BY tbl,idx;", 0);
10540      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
10541        appendText(&sQuery, "SELECT * FROM ", 0);
10542        appendText(&sQuery, zTab, 0);
10543        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10544      }
10545      appendText(&sSql, zSep, 0);
10546      appendText(&sSql, sQuery.z, '\'');
10547      sQuery.n = 0;
10548      appendText(&sSql, ",", 0);
10549      appendText(&sSql, zTab, '\'');
10550      zSep = "),(";
10551    }
10552    sqlite3_finalize(pStmt);
10553    if( bSeparate ){
10554      zSql = sqlite3_mprintf(
10555          "%s))"
10556          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10557          "   FROM [sha3sum$query]",
10558          sSql.z, iSize);
10559    }else{
10560      zSql = sqlite3_mprintf(
10561          "%s))"
10562          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10563          "   FROM [sha3sum$query]",
10564          sSql.z, iSize);
10565    }
10566    shell_check_oom(zSql);
10567    freeText(&sQuery);
10568    freeText(&sSql);
10569    if( bDebug ){
10570      utf8_printf(p->out, "%s\n", zSql);
10571    }else{
10572      shell_exec(p, zSql, 0);
10573    }
10574    sqlite3_free(zSql);
10575  }else
10576
10577#ifndef SQLITE_NOHAVE_SYSTEM
10578  if( c=='s'
10579   && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10580  ){
10581    char *zCmd;
10582    int i, x;
10583    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10584    if( nArg<2 ){
10585      raw_printf(stderr, "Usage: .system COMMAND\n");
10586      rc = 1;
10587      goto meta_command_exit;
10588    }
10589    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10590    for(i=2; i<nArg && zCmd!=0; i++){
10591      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10592                             zCmd, azArg[i]);
10593    }
10594    x = zCmd!=0 ? system(zCmd) : 1;
10595    sqlite3_free(zCmd);
10596    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10597  }else
10598#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10599
10600  if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10601    static const char *azBool[] = { "off", "on", "trigger", "full"};
10602    const char *zOut;
10603    int i;
10604    if( nArg!=1 ){
10605      raw_printf(stderr, "Usage: .show\n");
10606      rc = 1;
10607      goto meta_command_exit;
10608    }
10609    utf8_printf(p->out, "%12.12s: %s\n","echo",
10610                                  azBool[ShellHasFlag(p, SHFLG_Echo)]);
10611    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10612    utf8_printf(p->out, "%12.12s: %s\n","explain",
10613         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10614    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10615    if( p->mode==MODE_Column
10616     || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
10617    ){
10618      utf8_printf
10619        (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
10620         modeDescr[p->mode], p->cmOpts.iWrap,
10621         p->cmOpts.bWordWrap ? "on" : "off",
10622         p->cmOpts.bQuote ? "" : "no");
10623    }else{
10624      utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10625    }
10626    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10627      output_c_string(p->out, p->nullValue);
10628      raw_printf(p->out, "\n");
10629    utf8_printf(p->out,"%12.12s: %s\n","output",
10630            strlen30(p->outfile) ? p->outfile : "stdout");
10631    utf8_printf(p->out,"%12.12s: ", "colseparator");
10632      output_c_string(p->out, p->colSeparator);
10633      raw_printf(p->out, "\n");
10634    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10635      output_c_string(p->out, p->rowSeparator);
10636      raw_printf(p->out, "\n");
10637    switch( p->statsOn ){
10638      case 0:  zOut = "off";     break;
10639      default: zOut = "on";      break;
10640      case 2:  zOut = "stmt";    break;
10641      case 3:  zOut = "vmstep";  break;
10642    }
10643    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10644    utf8_printf(p->out, "%12.12s: ", "width");
10645    for (i=0;i<p->nWidth;i++) {
10646      raw_printf(p->out, "%d ", p->colWidth[i]);
10647    }
10648    raw_printf(p->out, "\n");
10649    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10650                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10651  }else
10652
10653  if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10654    if( nArg==2 ){
10655      if( strcmp(azArg[1],"stmt")==0 ){
10656        p->statsOn = 2;
10657      }else if( strcmp(azArg[1],"vmstep")==0 ){
10658        p->statsOn = 3;
10659      }else{
10660        p->statsOn = (u8)booleanValue(azArg[1]);
10661      }
10662    }else if( nArg==1 ){
10663      display_stats(p->db, p, 0);
10664    }else{
10665      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10666      rc = 1;
10667    }
10668  }else
10669
10670  if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10671   || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10672                 || strncmp(azArg[0], "indexes", n)==0) )
10673  ){
10674    sqlite3_stmt *pStmt;
10675    char **azResult;
10676    int nRow, nAlloc;
10677    int ii;
10678    ShellText s;
10679    initText(&s);
10680    open_db(p, 0);
10681    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10682    if( rc ){
10683      sqlite3_finalize(pStmt);
10684      return shellDatabaseError(p->db);
10685    }
10686
10687    if( nArg>2 && c=='i' ){
10688      /* It is an historical accident that the .indexes command shows an error
10689      ** when called with the wrong number of arguments whereas the .tables
10690      ** command does not. */
10691      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10692      rc = 1;
10693      sqlite3_finalize(pStmt);
10694      goto meta_command_exit;
10695    }
10696    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10697      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10698      if( zDbName==0 ) continue;
10699      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10700      if( sqlite3_stricmp(zDbName, "main")==0 ){
10701        appendText(&s, "SELECT name FROM ", 0);
10702      }else{
10703        appendText(&s, "SELECT ", 0);
10704        appendText(&s, zDbName, '\'');
10705        appendText(&s, "||'.'||name FROM ", 0);
10706      }
10707      appendText(&s, zDbName, '"');
10708      appendText(&s, ".sqlite_schema ", 0);
10709      if( c=='t' ){
10710        appendText(&s," WHERE type IN ('table','view')"
10711                      "   AND name NOT LIKE 'sqlite_%'"
10712                      "   AND name LIKE ?1", 0);
10713      }else{
10714        appendText(&s," WHERE type='index'"
10715                      "   AND tbl_name LIKE ?1", 0);
10716      }
10717    }
10718    rc = sqlite3_finalize(pStmt);
10719    if( rc==SQLITE_OK ){
10720      appendText(&s, " ORDER BY 1", 0);
10721      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10722    }
10723    freeText(&s);
10724    if( rc ) return shellDatabaseError(p->db);
10725
10726    /* Run the SQL statement prepared by the above block. Store the results
10727    ** as an array of nul-terminated strings in azResult[].  */
10728    nRow = nAlloc = 0;
10729    azResult = 0;
10730    if( nArg>1 ){
10731      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10732    }else{
10733      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10734    }
10735    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10736      if( nRow>=nAlloc ){
10737        char **azNew;
10738        int n2 = nAlloc*2 + 10;
10739        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10740        shell_check_oom(azNew);
10741        nAlloc = n2;
10742        azResult = azNew;
10743      }
10744      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10745      shell_check_oom(azResult[nRow]);
10746      nRow++;
10747    }
10748    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10749      rc = shellDatabaseError(p->db);
10750    }
10751
10752    /* Pretty-print the contents of array azResult[] to the output */
10753    if( rc==0 && nRow>0 ){
10754      int len, maxlen = 0;
10755      int i, j;
10756      int nPrintCol, nPrintRow;
10757      for(i=0; i<nRow; i++){
10758        len = strlen30(azResult[i]);
10759        if( len>maxlen ) maxlen = len;
10760      }
10761      nPrintCol = 80/(maxlen+2);
10762      if( nPrintCol<1 ) nPrintCol = 1;
10763      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10764      for(i=0; i<nPrintRow; i++){
10765        for(j=i; j<nRow; j+=nPrintRow){
10766          char *zSp = j<nPrintRow ? "" : "  ";
10767          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10768                      azResult[j] ? azResult[j]:"");
10769        }
10770        raw_printf(p->out, "\n");
10771      }
10772    }
10773
10774    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10775    sqlite3_free(azResult);
10776  }else
10777
10778  /* Begin redirecting output to the file "testcase-out.txt" */
10779  if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10780    output_reset(p);
10781    p->out = output_file_open("testcase-out.txt", 0);
10782    if( p->out==0 ){
10783      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10784    }
10785    if( nArg>=2 ){
10786      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10787    }else{
10788      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10789    }
10790  }else
10791
10792#ifndef SQLITE_UNTESTABLE
10793  if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10794    static const struct {
10795       const char *zCtrlName;   /* Name of a test-control option */
10796       int ctrlCode;            /* Integer code for that option */
10797       int unSafe;              /* Not valid for --safe mode */
10798       const char *zUsage;      /* Usage notes */
10799    } aCtrl[] = {
10800      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10801      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10802    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10803    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10804      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10805      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10806    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10807      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10808      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10809      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10810      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10811      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10812#ifdef YYCOVERAGE
10813      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10814#endif
10815      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10816      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10817      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10818      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10819      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10820      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10821      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10822    };
10823    int testctrl = -1;
10824    int iCtrl = -1;
10825    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10826    int isOk = 0;
10827    int i, n2;
10828    const char *zCmd = 0;
10829
10830    open_db(p, 0);
10831    zCmd = nArg>=2 ? azArg[1] : "help";
10832
10833    /* The argument can optionally begin with "-" or "--" */
10834    if( zCmd[0]=='-' && zCmd[1] ){
10835      zCmd++;
10836      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10837    }
10838
10839    /* --help lists all test-controls */
10840    if( strcmp(zCmd,"help")==0 ){
10841      utf8_printf(p->out, "Available test-controls:\n");
10842      for(i=0; i<ArraySize(aCtrl); i++){
10843        utf8_printf(p->out, "  .testctrl %s %s\n",
10844                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10845      }
10846      rc = 1;
10847      goto meta_command_exit;
10848    }
10849
10850    /* convert testctrl text option to value. allow any unique prefix
10851    ** of the option name, or a numerical value. */
10852    n2 = strlen30(zCmd);
10853    for(i=0; i<ArraySize(aCtrl); i++){
10854      if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10855        if( testctrl<0 ){
10856          testctrl = aCtrl[i].ctrlCode;
10857          iCtrl = i;
10858        }else{
10859          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10860                              "Use \".testctrl --help\" for help\n", zCmd);
10861          rc = 1;
10862          goto meta_command_exit;
10863        }
10864      }
10865    }
10866    if( testctrl<0 ){
10867      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10868                         "Use \".testctrl --help\" for help\n", zCmd);
10869    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10870      utf8_printf(stderr,
10871         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10872         p->lineno, aCtrl[iCtrl].zCtrlName);
10873      exit(1);
10874    }else{
10875      switch(testctrl){
10876
10877        /* sqlite3_test_control(int, db, int) */
10878        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10879          if( nArg==3 ){
10880            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10881            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10882            isOk = 3;
10883          }
10884          break;
10885
10886        /* sqlite3_test_control(int) */
10887        case SQLITE_TESTCTRL_PRNG_SAVE:
10888        case SQLITE_TESTCTRL_PRNG_RESTORE:
10889        case SQLITE_TESTCTRL_BYTEORDER:
10890          if( nArg==2 ){
10891            rc2 = sqlite3_test_control(testctrl);
10892            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10893          }
10894          break;
10895
10896        /* sqlite3_test_control(int, uint) */
10897        case SQLITE_TESTCTRL_PENDING_BYTE:
10898          if( nArg==3 ){
10899            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10900            rc2 = sqlite3_test_control(testctrl, opt);
10901            isOk = 3;
10902          }
10903          break;
10904
10905        /* sqlite3_test_control(int, int, sqlite3*) */
10906        case SQLITE_TESTCTRL_PRNG_SEED:
10907          if( nArg==3 || nArg==4 ){
10908            int ii = (int)integerValue(azArg[2]);
10909            sqlite3 *db;
10910            if( ii==0 && strcmp(azArg[2],"random")==0 ){
10911              sqlite3_randomness(sizeof(ii),&ii);
10912              printf("-- random seed: %d\n", ii);
10913            }
10914            if( nArg==3 ){
10915              db = 0;
10916            }else{
10917              db = p->db;
10918              /* Make sure the schema has been loaded */
10919              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10920            }
10921            rc2 = sqlite3_test_control(testctrl, ii, db);
10922            isOk = 3;
10923          }
10924          break;
10925
10926        /* sqlite3_test_control(int, int) */
10927        case SQLITE_TESTCTRL_ASSERT:
10928        case SQLITE_TESTCTRL_ALWAYS:
10929          if( nArg==3 ){
10930            int opt = booleanValue(azArg[2]);
10931            rc2 = sqlite3_test_control(testctrl, opt);
10932            isOk = 1;
10933          }
10934          break;
10935
10936        /* sqlite3_test_control(int, int) */
10937        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10938        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10939          if( nArg==3 ){
10940            int opt = booleanValue(azArg[2]);
10941            rc2 = sqlite3_test_control(testctrl, opt);
10942            isOk = 3;
10943          }
10944          break;
10945
10946        /* sqlite3_test_control(sqlite3*) */
10947        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10948          rc2 = sqlite3_test_control(testctrl, p->db);
10949          isOk = 3;
10950          break;
10951
10952        case SQLITE_TESTCTRL_IMPOSTER:
10953          if( nArg==5 ){
10954            rc2 = sqlite3_test_control(testctrl, p->db,
10955                          azArg[2],
10956                          integerValue(azArg[3]),
10957                          integerValue(azArg[4]));
10958            isOk = 3;
10959          }
10960          break;
10961
10962        case SQLITE_TESTCTRL_SEEK_COUNT: {
10963          u64 x = 0;
10964          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10965          utf8_printf(p->out, "%llu\n", x);
10966          isOk = 3;
10967          break;
10968        }
10969
10970#ifdef YYCOVERAGE
10971        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10972          if( nArg==2 ){
10973            sqlite3_test_control(testctrl, p->out);
10974            isOk = 3;
10975          }
10976          break;
10977        }
10978#endif
10979#ifdef SQLITE_DEBUG
10980        case SQLITE_TESTCTRL_TUNE: {
10981          if( nArg==4 ){
10982            int id = (int)integerValue(azArg[2]);
10983            int val = (int)integerValue(azArg[3]);
10984            sqlite3_test_control(testctrl, id, &val);
10985            isOk = 3;
10986          }else if( nArg==3 ){
10987            int id = (int)integerValue(azArg[2]);
10988            sqlite3_test_control(testctrl, -id, &rc2);
10989            isOk = 1;
10990          }else if( nArg==2 ){
10991            int id = 1;
10992            while(1){
10993              int val = 0;
10994              rc2 = sqlite3_test_control(testctrl, -id, &val);
10995              if( rc2!=SQLITE_OK ) break;
10996              if( id>1 ) utf8_printf(p->out, "  ");
10997              utf8_printf(p->out, "%d: %d", id, val);
10998              id++;
10999            }
11000            if( id>1 ) utf8_printf(p->out, "\n");
11001            isOk = 3;
11002          }
11003          break;
11004        }
11005#endif
11006        case SQLITE_TESTCTRL_SORTER_MMAP:
11007          if( nArg==3 ){
11008            int opt = (unsigned int)integerValue(azArg[2]);
11009            rc2 = sqlite3_test_control(testctrl, p->db, opt);
11010            isOk = 3;
11011          }
11012          break;
11013      }
11014    }
11015    if( isOk==0 && iCtrl>=0 ){
11016      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
11017      rc = 1;
11018    }else if( isOk==1 ){
11019      raw_printf(p->out, "%d\n", rc2);
11020    }else if( isOk==2 ){
11021      raw_printf(p->out, "0x%08x\n", rc2);
11022    }
11023  }else
11024#endif /* !defined(SQLITE_UNTESTABLE) */
11025
11026  if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
11027    open_db(p, 0);
11028    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
11029  }else
11030
11031  if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
11032    if( nArg==2 ){
11033      enableTimer = booleanValue(azArg[1]);
11034      if( enableTimer && !HAS_TIMER ){
11035        raw_printf(stderr, "Error: timer not available on this system.\n");
11036        enableTimer = 0;
11037      }
11038    }else{
11039      raw_printf(stderr, "Usage: .timer on|off\n");
11040      rc = 1;
11041    }
11042  }else
11043
11044#ifndef SQLITE_OMIT_TRACE
11045  if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
11046    int mType = 0;
11047    int jj;
11048    open_db(p, 0);
11049    for(jj=1; jj<nArg; jj++){
11050      const char *z = azArg[jj];
11051      if( z[0]=='-' ){
11052        if( optionMatch(z, "expanded") ){
11053          p->eTraceType = SHELL_TRACE_EXPANDED;
11054        }
11055#ifdef SQLITE_ENABLE_NORMALIZE
11056        else if( optionMatch(z, "normalized") ){
11057          p->eTraceType = SHELL_TRACE_NORMALIZED;
11058        }
11059#endif
11060        else if( optionMatch(z, "plain") ){
11061          p->eTraceType = SHELL_TRACE_PLAIN;
11062        }
11063        else if( optionMatch(z, "profile") ){
11064          mType |= SQLITE_TRACE_PROFILE;
11065        }
11066        else if( optionMatch(z, "row") ){
11067          mType |= SQLITE_TRACE_ROW;
11068        }
11069        else if( optionMatch(z, "stmt") ){
11070          mType |= SQLITE_TRACE_STMT;
11071        }
11072        else if( optionMatch(z, "close") ){
11073          mType |= SQLITE_TRACE_CLOSE;
11074        }
11075        else {
11076          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
11077          rc = 1;
11078          goto meta_command_exit;
11079        }
11080      }else{
11081        output_file_close(p->traceOut);
11082        p->traceOut = output_file_open(azArg[1], 0);
11083      }
11084    }
11085    if( p->traceOut==0 ){
11086      sqlite3_trace_v2(p->db, 0, 0, 0);
11087    }else{
11088      if( mType==0 ) mType = SQLITE_TRACE_STMT;
11089      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
11090    }
11091  }else
11092#endif /* !defined(SQLITE_OMIT_TRACE) */
11093
11094#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11095  if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
11096    int ii;
11097    int lenOpt;
11098    char *zOpt;
11099    if( nArg<2 ){
11100      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
11101      rc = 1;
11102      goto meta_command_exit;
11103    }
11104    open_db(p, 0);
11105    zOpt = azArg[1];
11106    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
11107    lenOpt = (int)strlen(zOpt);
11108    if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
11109      assert( azArg[nArg]==0 );
11110      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
11111    }else{
11112      for(ii=1; ii<nArg; ii++){
11113        sqlite3_create_module(p->db, azArg[ii], 0, 0);
11114      }
11115    }
11116  }else
11117#endif
11118
11119#if SQLITE_USER_AUTHENTICATION
11120  if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
11121    if( nArg<2 ){
11122      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
11123      rc = 1;
11124      goto meta_command_exit;
11125    }
11126    open_db(p, 0);
11127    if( strcmp(azArg[1],"login")==0 ){
11128      if( nArg!=4 ){
11129        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
11130        rc = 1;
11131        goto meta_command_exit;
11132      }
11133      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
11134                                     strlen30(azArg[3]));
11135      if( rc ){
11136        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
11137        rc = 1;
11138      }
11139    }else if( strcmp(azArg[1],"add")==0 ){
11140      if( nArg!=5 ){
11141        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
11142        rc = 1;
11143        goto meta_command_exit;
11144      }
11145      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11146                            booleanValue(azArg[4]));
11147      if( rc ){
11148        raw_printf(stderr, "User-Add failed: %d\n", rc);
11149        rc = 1;
11150      }
11151    }else if( strcmp(azArg[1],"edit")==0 ){
11152      if( nArg!=5 ){
11153        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
11154        rc = 1;
11155        goto meta_command_exit;
11156      }
11157      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11158                              booleanValue(azArg[4]));
11159      if( rc ){
11160        raw_printf(stderr, "User-Edit failed: %d\n", rc);
11161        rc = 1;
11162      }
11163    }else if( strcmp(azArg[1],"delete")==0 ){
11164      if( nArg!=3 ){
11165        raw_printf(stderr, "Usage: .user delete USER\n");
11166        rc = 1;
11167        goto meta_command_exit;
11168      }
11169      rc = sqlite3_user_delete(p->db, azArg[2]);
11170      if( rc ){
11171        raw_printf(stderr, "User-Delete failed: %d\n", rc);
11172        rc = 1;
11173      }
11174    }else{
11175      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
11176      rc = 1;
11177      goto meta_command_exit;
11178    }
11179  }else
11180#endif /* SQLITE_USER_AUTHENTICATION */
11181
11182  if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
11183    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
11184        sqlite3_libversion(), sqlite3_sourceid());
11185#if SQLITE_HAVE_ZLIB
11186    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
11187#endif
11188#define CTIMEOPT_VAL_(opt) #opt
11189#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
11190#if defined(__clang__) && defined(__clang_major__)
11191    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
11192                    CTIMEOPT_VAL(__clang_minor__) "."
11193                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
11194#elif defined(_MSC_VER)
11195    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
11196#elif defined(__GNUC__) && defined(__VERSION__)
11197    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
11198#endif
11199  }else
11200
11201  if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
11202    const char *zDbName = nArg==2 ? azArg[1] : "main";
11203    sqlite3_vfs *pVfs = 0;
11204    if( p->db ){
11205      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
11206      if( pVfs ){
11207        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
11208        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11209        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11210        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11211      }
11212    }
11213  }else
11214
11215  if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
11216    sqlite3_vfs *pVfs;
11217    sqlite3_vfs *pCurrent = 0;
11218    if( p->db ){
11219      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
11220    }
11221    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
11222      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
11223           pVfs==pCurrent ? "  <--- CURRENT" : "");
11224      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
11225      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
11226      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11227      if( pVfs->pNext ){
11228        raw_printf(p->out, "-----------------------------------\n");
11229      }
11230    }
11231  }else
11232
11233  if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
11234    const char *zDbName = nArg==2 ? azArg[1] : "main";
11235    char *zVfsName = 0;
11236    if( p->db ){
11237      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
11238      if( zVfsName ){
11239        utf8_printf(p->out, "%s\n", zVfsName);
11240        sqlite3_free(zVfsName);
11241      }
11242    }
11243  }else
11244
11245  if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
11246    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
11247    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
11248  }else
11249
11250  if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
11251    int j;
11252    assert( nArg<=ArraySize(azArg) );
11253    p->nWidth = nArg-1;
11254    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
11255    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
11256    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
11257    for(j=1; j<nArg; j++){
11258      p->colWidth[j-1] = (int)integerValue(azArg[j]);
11259    }
11260  }else
11261
11262  {
11263    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
11264      " \"%s\". Enter \".help\" for help\n", azArg[0]);
11265    rc = 1;
11266  }
11267
11268meta_command_exit:
11269  if( p->outCount ){
11270    p->outCount--;
11271    if( p->outCount==0 ) output_reset(p);
11272  }
11273  p->bSafeMode = p->bSafeModePersist;
11274  return rc;
11275}
11276
11277/* Line scan result and intermediate states (supporting scan resumption)
11278*/
11279#ifndef CHAR_BIT
11280# define CHAR_BIT 8
11281#endif
11282typedef enum {
11283  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
11284  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
11285  QSS_Start = 0
11286} QuickScanState;
11287#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
11288#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
11289#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
11290#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
11291#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
11292
11293/*
11294** Scan line for classification to guide shell's handling.
11295** The scan is resumable for subsequent lines when prior
11296** return values are passed as the 2nd argument.
11297*/
11298static QuickScanState quickscan(char *zLine, QuickScanState qss){
11299  char cin;
11300  char cWait = (char)qss; /* intentional narrowing loss */
11301  if( cWait==0 ){
11302  PlainScan:
11303    assert( cWait==0 );
11304    while( (cin = *zLine++)!=0 ){
11305      if( IsSpace(cin) )
11306        continue;
11307      switch (cin){
11308      case '-':
11309        if( *zLine!='-' )
11310          break;
11311        while((cin = *++zLine)!=0 )
11312          if( cin=='\n')
11313            goto PlainScan;
11314        return qss;
11315      case ';':
11316        qss |= QSS_EndingSemi;
11317        continue;
11318      case '/':
11319        if( *zLine=='*' ){
11320          ++zLine;
11321          cWait = '*';
11322          qss = QSS_SETV(qss, cWait);
11323          goto TermScan;
11324        }
11325        break;
11326      case '[':
11327        cin = ']';
11328        /* fall thru */
11329      case '`': case '\'': case '"':
11330        cWait = cin;
11331        qss = QSS_HasDark | cWait;
11332        goto TermScan;
11333      default:
11334        break;
11335      }
11336      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
11337    }
11338  }else{
11339  TermScan:
11340    while( (cin = *zLine++)!=0 ){
11341      if( cin==cWait ){
11342        switch( cWait ){
11343        case '*':
11344          if( *zLine != '/' )
11345            continue;
11346          ++zLine;
11347          cWait = 0;
11348          qss = QSS_SETV(qss, 0);
11349          goto PlainScan;
11350        case '`': case '\'': case '"':
11351          if(*zLine==cWait){
11352            ++zLine;
11353            continue;
11354          }
11355          /* fall thru */
11356        case ']':
11357          cWait = 0;
11358          qss = QSS_SETV(qss, 0);
11359          goto PlainScan;
11360        default: assert(0);
11361        }
11362      }
11363    }
11364  }
11365  return qss;
11366}
11367
11368/*
11369** Return TRUE if the line typed in is an SQL command terminator other
11370** than a semi-colon.  The SQL Server style "go" command is understood
11371** as is the Oracle "/".
11372*/
11373static int line_is_command_terminator(char *zLine){
11374  while( IsSpace(zLine[0]) ){ zLine++; };
11375  if( zLine[0]=='/' )
11376    zLine += 1; /* Oracle */
11377  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
11378    zLine += 2; /* SQL Server */
11379  else
11380    return 0;
11381  return quickscan(zLine,QSS_Start)==QSS_Start;
11382}
11383
11384/*
11385** We need a default sqlite3_complete() implementation to use in case
11386** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
11387** any arbitrary text is a complete SQL statement.  This is not very
11388** user-friendly, but it does seem to work.
11389*/
11390#ifdef SQLITE_OMIT_COMPLETE
11391#define sqlite3_complete(x) 1
11392#endif
11393
11394/*
11395** Return true if zSql is a complete SQL statement.  Return false if it
11396** ends in the middle of a string literal or C-style comment.
11397*/
11398static int line_is_complete(char *zSql, int nSql){
11399  int rc;
11400  if( zSql==0 ) return 1;
11401  zSql[nSql] = ';';
11402  zSql[nSql+1] = 0;
11403  rc = sqlite3_complete(zSql);
11404  zSql[nSql] = 0;
11405  return rc;
11406}
11407
11408/*
11409** Run a single line of SQL.  Return the number of errors.
11410*/
11411static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
11412  int rc;
11413  char *zErrMsg = 0;
11414
11415  open_db(p, 0);
11416  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
11417  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
11418  BEGIN_TIMER;
11419  rc = shell_exec(p, zSql, &zErrMsg);
11420  END_TIMER;
11421  if( rc || zErrMsg ){
11422    char zPrefix[100];
11423    const char *zErrorTail;
11424    const char *zErrorType;
11425    if( zErrMsg==0 ){
11426      zErrorType = "Error";
11427      zErrorTail = sqlite3_errmsg(p->db);
11428    }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){
11429      zErrorType = "Parse error";
11430      zErrorTail = &zErrMsg[12];
11431    }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){
11432      zErrorType = "Runtime error";
11433      zErrorTail = &zErrMsg[10];
11434    }else{
11435      zErrorType = "Error";
11436      zErrorTail = zErrMsg;
11437    }
11438    if( in!=0 || !stdin_is_interactive ){
11439      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
11440                       "%s near line %d:", zErrorType, startline);
11441    }else{
11442      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
11443    }
11444    utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
11445    sqlite3_free(zErrMsg);
11446    zErrMsg = 0;
11447    return 1;
11448  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
11449    char zLineBuf[2000];
11450    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
11451            "changes: %lld   total_changes: %lld",
11452            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
11453    raw_printf(p->out, "%s\n", zLineBuf);
11454  }
11455  return 0;
11456}
11457
11458
11459/*
11460** Read input from *in and process it.  If *in==0 then input
11461** is interactive - the user is typing it it.  Otherwise, input
11462** is coming from a file or device.  A prompt is issued and history
11463** is saved only if input is interactive.  An interrupt signal will
11464** cause this routine to exit immediately, unless input is interactive.
11465**
11466** Return the number of errors.
11467*/
11468static int process_input(ShellState *p){
11469  char *zLine = 0;          /* A single input line */
11470  char *zSql = 0;           /* Accumulated SQL text */
11471  int nLine;                /* Length of current line */
11472  int nSql = 0;             /* Bytes of zSql[] used */
11473  int nAlloc = 0;           /* Allocated zSql[] space */
11474  int rc;                   /* Error code */
11475  int errCnt = 0;           /* Number of errors seen */
11476  int startline = 0;        /* Line number for start of current input */
11477  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
11478
11479  if( p->inputNesting==MAX_INPUT_NESTING ){
11480    /* This will be more informative in a later version. */
11481    utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
11482                " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
11483    return 1;
11484  }
11485  ++p->inputNesting;
11486  p->lineno = 0;
11487  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
11488    fflush(p->out);
11489    zLine = one_input_line(p->in, zLine, nSql>0);
11490    if( zLine==0 ){
11491      /* End of input */
11492      if( p->in==0 && stdin_is_interactive ) printf("\n");
11493      break;
11494    }
11495    if( seenInterrupt ){
11496      if( p->in!=0 ) break;
11497      seenInterrupt = 0;
11498    }
11499    p->lineno++;
11500    if( QSS_INPLAIN(qss)
11501        && line_is_command_terminator(zLine)
11502        && line_is_complete(zSql, nSql) ){
11503      memcpy(zLine,";",2);
11504    }
11505    qss = quickscan(zLine, qss);
11506    if( QSS_PLAINWHITE(qss) && nSql==0 ){
11507      if( ShellHasFlag(p, SHFLG_Echo) )
11508        printf("%s\n", zLine);
11509      /* Just swallow single-line whitespace */
11510      qss = QSS_Start;
11511      continue;
11512    }
11513    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
11514      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
11515      if( zLine[0]=='.' ){
11516        rc = do_meta_command(zLine, p);
11517        if( rc==2 ){ /* exit requested */
11518          break;
11519        }else if( rc ){
11520          errCnt++;
11521        }
11522      }
11523      qss = QSS_Start;
11524      continue;
11525    }
11526    /* No single-line dispositions remain; accumulate line(s). */
11527    nLine = strlen30(zLine);
11528    if( nSql+nLine+2>=nAlloc ){
11529      /* Grow buffer by half-again increments when big. */
11530      nAlloc = nSql+(nSql>>1)+nLine+100;
11531      zSql = realloc(zSql, nAlloc);
11532      shell_check_oom(zSql);
11533    }
11534    if( nSql==0 ){
11535      int i;
11536      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
11537      assert( nAlloc>0 && zSql!=0 );
11538      memcpy(zSql, zLine+i, nLine+1-i);
11539      startline = p->lineno;
11540      nSql = nLine-i;
11541    }else{
11542      zSql[nSql++] = '\n';
11543      memcpy(zSql+nSql, zLine, nLine+1);
11544      nSql += nLine;
11545    }
11546    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
11547      errCnt += runOneSqlLine(p, zSql, p->in, startline);
11548      nSql = 0;
11549      if( p->outCount ){
11550        output_reset(p);
11551        p->outCount = 0;
11552      }else{
11553        clearTempFile(p);
11554      }
11555      p->bSafeMode = p->bSafeModePersist;
11556      qss = QSS_Start;
11557    }else if( nSql && QSS_PLAINWHITE(qss) ){
11558      if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
11559      nSql = 0;
11560      qss = QSS_Start;
11561    }
11562  }
11563  if( nSql && QSS_PLAINDARK(qss) ){
11564    errCnt += runOneSqlLine(p, zSql, p->in, startline);
11565  }
11566  free(zSql);
11567  free(zLine);
11568  --p->inputNesting;
11569  return errCnt>0;
11570}
11571
11572/*
11573** Return a pathname which is the user's home directory.  A
11574** 0 return indicates an error of some kind.
11575*/
11576static char *find_home_dir(int clearFlag){
11577  static char *home_dir = NULL;
11578  if( clearFlag ){
11579    free(home_dir);
11580    home_dir = 0;
11581    return 0;
11582  }
11583  if( home_dir ) return home_dir;
11584
11585#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11586     && !defined(__RTP__) && !defined(_WRS_KERNEL)
11587  {
11588    struct passwd *pwent;
11589    uid_t uid = getuid();
11590    if( (pwent=getpwuid(uid)) != NULL) {
11591      home_dir = pwent->pw_dir;
11592    }
11593  }
11594#endif
11595
11596#if defined(_WIN32_WCE)
11597  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11598   */
11599  home_dir = "/";
11600#else
11601
11602#if defined(_WIN32) || defined(WIN32)
11603  if (!home_dir) {
11604    home_dir = getenv("USERPROFILE");
11605  }
11606#endif
11607
11608  if (!home_dir) {
11609    home_dir = getenv("HOME");
11610  }
11611
11612#if defined(_WIN32) || defined(WIN32)
11613  if (!home_dir) {
11614    char *zDrive, *zPath;
11615    int n;
11616    zDrive = getenv("HOMEDRIVE");
11617    zPath = getenv("HOMEPATH");
11618    if( zDrive && zPath ){
11619      n = strlen30(zDrive) + strlen30(zPath) + 1;
11620      home_dir = malloc( n );
11621      if( home_dir==0 ) return 0;
11622      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11623      return home_dir;
11624    }
11625    home_dir = "c:\\";
11626  }
11627#endif
11628
11629#endif /* !_WIN32_WCE */
11630
11631  if( home_dir ){
11632    int n = strlen30(home_dir) + 1;
11633    char *z = malloc( n );
11634    if( z ) memcpy(z, home_dir, n);
11635    home_dir = z;
11636  }
11637
11638  return home_dir;
11639}
11640
11641/*
11642** Read input from the file given by sqliterc_override.  Or if that
11643** parameter is NULL, take input from ~/.sqliterc
11644**
11645** Returns the number of errors.
11646*/
11647static void process_sqliterc(
11648  ShellState *p,                  /* Configuration data */
11649  const char *sqliterc_override   /* Name of config file. NULL to use default */
11650){
11651  char *home_dir = NULL;
11652  const char *sqliterc = sqliterc_override;
11653  char *zBuf = 0;
11654  FILE *inSaved = p->in;
11655  int savedLineno = p->lineno;
11656
11657  if (sqliterc == NULL) {
11658    home_dir = find_home_dir(0);
11659    if( home_dir==0 ){
11660      raw_printf(stderr, "-- warning: cannot find home directory;"
11661                      " cannot read ~/.sqliterc\n");
11662      return;
11663    }
11664    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11665    shell_check_oom(zBuf);
11666    sqliterc = zBuf;
11667  }
11668  p->in = fopen(sqliterc,"rb");
11669  if( p->in ){
11670    if( stdin_is_interactive ){
11671      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11672    }
11673    if( process_input(p) && bail_on_error ) exit(1);
11674    fclose(p->in);
11675  }else if( sqliterc_override!=0 ){
11676    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11677    if( bail_on_error ) exit(1);
11678  }
11679  p->in = inSaved;
11680  p->lineno = savedLineno;
11681  sqlite3_free(zBuf);
11682}
11683
11684/*
11685** Show available command line options
11686*/
11687static const char zOptions[] =
11688#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11689  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11690#endif
11691  "   -append              append the database to the end of the file\n"
11692  "   -ascii               set output mode to 'ascii'\n"
11693  "   -bail                stop after hitting an error\n"
11694  "   -batch               force batch I/O\n"
11695  "   -box                 set output mode to 'box'\n"
11696  "   -column              set output mode to 'column'\n"
11697  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11698  "   -csv                 set output mode to 'csv'\n"
11699#if !defined(SQLITE_OMIT_DESERIALIZE)
11700  "   -deserialize         open the database using sqlite3_deserialize()\n"
11701#endif
11702  "   -echo                print commands before execution\n"
11703  "   -init FILENAME       read/process named file\n"
11704  "   -[no]header          turn headers on or off\n"
11705#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11706  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11707#endif
11708  "   -help                show this message\n"
11709  "   -html                set output mode to HTML\n"
11710  "   -interactive         force interactive I/O\n"
11711  "   -json                set output mode to 'json'\n"
11712  "   -line                set output mode to 'line'\n"
11713  "   -list                set output mode to 'list'\n"
11714  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11715  "   -markdown            set output mode to 'markdown'\n"
11716#if !defined(SQLITE_OMIT_DESERIALIZE)
11717  "   -maxsize N           maximum size for a --deserialize database\n"
11718#endif
11719  "   -memtrace            trace all memory allocations and deallocations\n"
11720  "   -mmap N              default mmap size set to N\n"
11721#ifdef SQLITE_ENABLE_MULTIPLEX
11722  "   -multiplex           enable the multiplexor VFS\n"
11723#endif
11724  "   -newline SEP         set output row separator. Default: '\\n'\n"
11725  "   -nofollow            refuse to open symbolic links to database files\n"
11726  "   -nonce STRING        set the safe-mode escape nonce\n"
11727  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11728  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11729  "   -quote               set output mode to 'quote'\n"
11730  "   -readonly            open the database read-only\n"
11731  "   -safe                enable safe-mode\n"
11732  "   -separator SEP       set output column separator. Default: '|'\n"
11733#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11734  "   -sorterref SIZE      sorter references threshold size\n"
11735#endif
11736  "   -stats               print memory stats before each finalize\n"
11737  "   -table               set output mode to 'table'\n"
11738  "   -tabs                set output mode to 'tabs'\n"
11739  "   -version             show SQLite version\n"
11740  "   -vfs NAME            use NAME as the default VFS\n"
11741#ifdef SQLITE_ENABLE_VFSTRACE
11742  "   -vfstrace            enable tracing of all VFS calls\n"
11743#endif
11744#ifdef SQLITE_HAVE_ZLIB
11745  "   -zip                 open the file as a ZIP Archive\n"
11746#endif
11747;
11748static void usage(int showDetail){
11749  utf8_printf(stderr,
11750      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11751      "FILENAME is the name of an SQLite database. A new database is created\n"
11752      "if the file does not previously exist.\n", Argv0);
11753  if( showDetail ){
11754    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11755  }else{
11756    raw_printf(stderr, "Use the -help option for additional information\n");
11757  }
11758  exit(1);
11759}
11760
11761/*
11762** Internal check:  Verify that the SQLite is uninitialized.  Print a
11763** error message if it is initialized.
11764*/
11765static void verify_uninitialized(void){
11766  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11767    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11768                        " initialization.\n");
11769  }
11770}
11771
11772/*
11773** Initialize the state information in data
11774*/
11775static void main_init(ShellState *data) {
11776  memset(data, 0, sizeof(*data));
11777  data->normalMode = data->cMode = data->mode = MODE_List;
11778  data->autoExplain = 1;
11779  data->pAuxDb = &data->aAuxDb[0];
11780  memcpy(data->colSeparator,SEP_Column, 2);
11781  memcpy(data->rowSeparator,SEP_Row, 2);
11782  data->showHeader = 0;
11783  data->shellFlgs = SHFLG_Lookaside;
11784  verify_uninitialized();
11785  sqlite3_config(SQLITE_CONFIG_URI, 1);
11786  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11787  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11788  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11789  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11790}
11791
11792/*
11793** Output text to the console in a font that attracts extra attention.
11794*/
11795#ifdef _WIN32
11796static void printBold(const char *zText){
11797#if !SQLITE_OS_WINRT
11798  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11799  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11800  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11801  SetConsoleTextAttribute(out,
11802         FOREGROUND_RED|FOREGROUND_INTENSITY
11803  );
11804#endif
11805  printf("%s", zText);
11806#if !SQLITE_OS_WINRT
11807  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11808#endif
11809}
11810#else
11811static void printBold(const char *zText){
11812  printf("\033[1m%s\033[0m", zText);
11813}
11814#endif
11815
11816/*
11817** Get the argument to an --option.  Throw an error and die if no argument
11818** is available.
11819*/
11820static char *cmdline_option_value(int argc, char **argv, int i){
11821  if( i==argc ){
11822    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11823            argv[0], argv[argc-1]);
11824    exit(1);
11825  }
11826  return argv[i];
11827}
11828
11829#ifndef SQLITE_SHELL_IS_UTF8
11830#  if (defined(_WIN32) || defined(WIN32)) \
11831   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11832#    define SQLITE_SHELL_IS_UTF8          (0)
11833#  else
11834#    define SQLITE_SHELL_IS_UTF8          (1)
11835#  endif
11836#endif
11837
11838#if SQLITE_SHELL_IS_UTF8
11839int SQLITE_CDECL main(int argc, char **argv){
11840#else
11841int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11842  char **argv;
11843#endif
11844  char *zErrMsg = 0;
11845  ShellState data;
11846  const char *zInitFile = 0;
11847  int i;
11848  int rc = 0;
11849  int warnInmemoryDb = 0;
11850  int readStdin = 1;
11851  int nCmd = 0;
11852  char **azCmd = 0;
11853  const char *zVfs = 0;           /* Value of -vfs command-line option */
11854#if !SQLITE_SHELL_IS_UTF8
11855  char **argvToFree = 0;
11856  int argcToFree = 0;
11857#endif
11858
11859  setBinaryMode(stdin, 0);
11860  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11861  stdin_is_interactive = isatty(0);
11862  stdout_is_console = isatty(1);
11863
11864#if !defined(_WIN32_WCE)
11865  if( getenv("SQLITE_DEBUG_BREAK") ){
11866    if( isatty(0) && isatty(2) ){
11867      fprintf(stderr,
11868          "attach debugger to process %d and press any key to continue.\n",
11869          GETPID());
11870      fgetc(stdin);
11871    }else{
11872#if defined(_WIN32) || defined(WIN32)
11873#if SQLITE_OS_WINRT
11874      __debugbreak();
11875#else
11876      DebugBreak();
11877#endif
11878#elif defined(SIGTRAP)
11879      raise(SIGTRAP);
11880#endif
11881    }
11882  }
11883#endif
11884
11885#if USE_SYSTEM_SQLITE+0!=1
11886  if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11887    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11888            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11889    exit(1);
11890  }
11891#endif
11892  main_init(&data);
11893
11894  /* On Windows, we must translate command-line arguments into UTF-8.
11895  ** The SQLite memory allocator subsystem has to be enabled in order to
11896  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11897  ** subsequent sqlite3_config() calls will work.  So copy all results into
11898  ** memory that does not come from the SQLite memory allocator.
11899  */
11900#if !SQLITE_SHELL_IS_UTF8
11901  sqlite3_initialize();
11902  argvToFree = malloc(sizeof(argv[0])*argc*2);
11903  shell_check_oom(argvToFree);
11904  argcToFree = argc;
11905  argv = argvToFree + argc;
11906  for(i=0; i<argc; i++){
11907    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11908    int n;
11909    shell_check_oom(z);
11910    n = (int)strlen(z);
11911    argv[i] = malloc( n+1 );
11912    shell_check_oom(argv[i]);
11913    memcpy(argv[i], z, n+1);
11914    argvToFree[i] = argv[i];
11915    sqlite3_free(z);
11916  }
11917  sqlite3_shutdown();
11918#endif
11919
11920  assert( argc>=1 && argv && argv[0] );
11921  Argv0 = argv[0];
11922
11923  /* Make sure we have a valid signal handler early, before anything
11924  ** else is done.
11925  */
11926#ifdef SIGINT
11927  signal(SIGINT, interrupt_handler);
11928#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11929  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11930#endif
11931
11932#ifdef SQLITE_SHELL_DBNAME_PROC
11933  {
11934    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11935    ** of a C-function that will provide the name of the database file.  Use
11936    ** this compile-time option to embed this shell program in larger
11937    ** applications. */
11938    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11939    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11940    warnInmemoryDb = 0;
11941  }
11942#endif
11943
11944  /* Do an initial pass through the command-line argument to locate
11945  ** the name of the database file, the name of the initialization file,
11946  ** the size of the alternative malloc heap,
11947  ** and the first command to execute.
11948  */
11949  verify_uninitialized();
11950  for(i=1; i<argc; i++){
11951    char *z;
11952    z = argv[i];
11953    if( z[0]!='-' ){
11954      if( data.aAuxDb->zDbFilename==0 ){
11955        data.aAuxDb->zDbFilename = z;
11956      }else{
11957        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11958        ** mean that nothing is read from stdin */
11959        readStdin = 0;
11960        nCmd++;
11961        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11962        shell_check_oom(azCmd);
11963        azCmd[nCmd-1] = z;
11964      }
11965    }
11966    if( z[1]=='-' ) z++;
11967    if( strcmp(z,"-separator")==0
11968     || strcmp(z,"-nullvalue")==0
11969     || strcmp(z,"-newline")==0
11970     || strcmp(z,"-cmd")==0
11971    ){
11972      (void)cmdline_option_value(argc, argv, ++i);
11973    }else if( strcmp(z,"-init")==0 ){
11974      zInitFile = cmdline_option_value(argc, argv, ++i);
11975    }else if( strcmp(z,"-batch")==0 ){
11976      /* Need to check for batch mode here to so we can avoid printing
11977      ** informational messages (like from process_sqliterc) before
11978      ** we do the actual processing of arguments later in a second pass.
11979      */
11980      stdin_is_interactive = 0;
11981    }else if( strcmp(z,"-heap")==0 ){
11982#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11983      const char *zSize;
11984      sqlite3_int64 szHeap;
11985
11986      zSize = cmdline_option_value(argc, argv, ++i);
11987      szHeap = integerValue(zSize);
11988      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11989      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11990#else
11991      (void)cmdline_option_value(argc, argv, ++i);
11992#endif
11993    }else if( strcmp(z,"-pagecache")==0 ){
11994      sqlite3_int64 n, sz;
11995      sz = integerValue(cmdline_option_value(argc,argv,++i));
11996      if( sz>70000 ) sz = 70000;
11997      if( sz<0 ) sz = 0;
11998      n = integerValue(cmdline_option_value(argc,argv,++i));
11999      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
12000        n = 0xffffffffffffLL/sz;
12001      }
12002      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
12003                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
12004      data.shellFlgs |= SHFLG_Pagecache;
12005    }else if( strcmp(z,"-lookaside")==0 ){
12006      int n, sz;
12007      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
12008      if( sz<0 ) sz = 0;
12009      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12010      if( n<0 ) n = 0;
12011      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
12012      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
12013    }else if( strcmp(z,"-threadsafe")==0 ){
12014      int n;
12015      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12016      switch( n ){
12017         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
12018         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
12019         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
12020      }
12021#ifdef SQLITE_ENABLE_VFSTRACE
12022    }else if( strcmp(z,"-vfstrace")==0 ){
12023      extern int vfstrace_register(
12024         const char *zTraceName,
12025         const char *zOldVfsName,
12026         int (*xOut)(const char*,void*),
12027         void *pOutArg,
12028         int makeDefault
12029      );
12030      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
12031#endif
12032#ifdef SQLITE_ENABLE_MULTIPLEX
12033    }else if( strcmp(z,"-multiplex")==0 ){
12034      extern int sqlite3_multiple_initialize(const char*,int);
12035      sqlite3_multiplex_initialize(0, 1);
12036#endif
12037    }else if( strcmp(z,"-mmap")==0 ){
12038      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12039      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
12040#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12041    }else if( strcmp(z,"-sorterref")==0 ){
12042      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12043      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
12044#endif
12045    }else if( strcmp(z,"-vfs")==0 ){
12046      zVfs = cmdline_option_value(argc, argv, ++i);
12047#ifdef SQLITE_HAVE_ZLIB
12048    }else if( strcmp(z,"-zip")==0 ){
12049      data.openMode = SHELL_OPEN_ZIPFILE;
12050#endif
12051    }else if( strcmp(z,"-append")==0 ){
12052      data.openMode = SHELL_OPEN_APPENDVFS;
12053#ifndef SQLITE_OMIT_DESERIALIZE
12054    }else if( strcmp(z,"-deserialize")==0 ){
12055      data.openMode = SHELL_OPEN_DESERIALIZE;
12056    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12057      data.szMax = integerValue(argv[++i]);
12058#endif
12059    }else if( strcmp(z,"-readonly")==0 ){
12060      data.openMode = SHELL_OPEN_READONLY;
12061    }else if( strcmp(z,"-nofollow")==0 ){
12062      data.openFlags = SQLITE_OPEN_NOFOLLOW;
12063#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12064    }else if( strncmp(z, "-A",2)==0 ){
12065      /* All remaining command-line arguments are passed to the ".archive"
12066      ** command, so ignore them */
12067      break;
12068#endif
12069    }else if( strcmp(z, "-memtrace")==0 ){
12070      sqlite3MemTraceActivate(stderr);
12071    }else if( strcmp(z,"-bail")==0 ){
12072      bail_on_error = 1;
12073    }else if( strcmp(z,"-nonce")==0 ){
12074      free(data.zNonce);
12075      data.zNonce = strdup(argv[++i]);
12076    }else if( strcmp(z,"-safe")==0 ){
12077      /* no-op - catch this on the second pass */
12078    }
12079  }
12080  verify_uninitialized();
12081
12082
12083#ifdef SQLITE_SHELL_INIT_PROC
12084  {
12085    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
12086    ** of a C-function that will perform initialization actions on SQLite that
12087    ** occur just before or after sqlite3_initialize(). Use this compile-time
12088    ** option to embed this shell program in larger applications. */
12089    extern void SQLITE_SHELL_INIT_PROC(void);
12090    SQLITE_SHELL_INIT_PROC();
12091  }
12092#else
12093  /* All the sqlite3_config() calls have now been made. So it is safe
12094  ** to call sqlite3_initialize() and process any command line -vfs option. */
12095  sqlite3_initialize();
12096#endif
12097
12098  if( zVfs ){
12099    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
12100    if( pVfs ){
12101      sqlite3_vfs_register(pVfs, 1);
12102    }else{
12103      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
12104      exit(1);
12105    }
12106  }
12107
12108  if( data.pAuxDb->zDbFilename==0 ){
12109#ifndef SQLITE_OMIT_MEMORYDB
12110    data.pAuxDb->zDbFilename = ":memory:";
12111    warnInmemoryDb = argc==1;
12112#else
12113    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
12114    return 1;
12115#endif
12116  }
12117  data.out = stdout;
12118  sqlite3_appendvfs_init(0,0,0);
12119
12120  /* Go ahead and open the database file if it already exists.  If the
12121  ** file does not exist, delay opening it.  This prevents empty database
12122  ** files from being created if a user mistypes the database name argument
12123  ** to the sqlite command-line tool.
12124  */
12125  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
12126    open_db(&data, 0);
12127  }
12128
12129  /* Process the initialization file if there is one.  If no -init option
12130  ** is given on the command line, look for a file named ~/.sqliterc and
12131  ** try to process it.
12132  */
12133  process_sqliterc(&data,zInitFile);
12134
12135  /* Make a second pass through the command-line argument and set
12136  ** options.  This second pass is delayed until after the initialization
12137  ** file is processed so that the command-line arguments will override
12138  ** settings in the initialization file.
12139  */
12140  for(i=1; i<argc; i++){
12141    char *z = argv[i];
12142    if( z[0]!='-' ) continue;
12143    if( z[1]=='-' ){ z++; }
12144    if( strcmp(z,"-init")==0 ){
12145      i++;
12146    }else if( strcmp(z,"-html")==0 ){
12147      data.mode = MODE_Html;
12148    }else if( strcmp(z,"-list")==0 ){
12149      data.mode = MODE_List;
12150    }else if( strcmp(z,"-quote")==0 ){
12151      data.mode = MODE_Quote;
12152      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
12153      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12154    }else if( strcmp(z,"-line")==0 ){
12155      data.mode = MODE_Line;
12156    }else if( strcmp(z,"-column")==0 ){
12157      data.mode = MODE_Column;
12158    }else if( strcmp(z,"-json")==0 ){
12159      data.mode = MODE_Json;
12160    }else if( strcmp(z,"-markdown")==0 ){
12161      data.mode = MODE_Markdown;
12162    }else if( strcmp(z,"-table")==0 ){
12163      data.mode = MODE_Table;
12164    }else if( strcmp(z,"-box")==0 ){
12165      data.mode = MODE_Box;
12166    }else if( strcmp(z,"-csv")==0 ){
12167      data.mode = MODE_Csv;
12168      memcpy(data.colSeparator,",",2);
12169#ifdef SQLITE_HAVE_ZLIB
12170    }else if( strcmp(z,"-zip")==0 ){
12171      data.openMode = SHELL_OPEN_ZIPFILE;
12172#endif
12173    }else if( strcmp(z,"-append")==0 ){
12174      data.openMode = SHELL_OPEN_APPENDVFS;
12175#ifndef SQLITE_OMIT_DESERIALIZE
12176    }else if( strcmp(z,"-deserialize")==0 ){
12177      data.openMode = SHELL_OPEN_DESERIALIZE;
12178    }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12179      data.szMax = integerValue(argv[++i]);
12180#endif
12181    }else if( strcmp(z,"-readonly")==0 ){
12182      data.openMode = SHELL_OPEN_READONLY;
12183    }else if( strcmp(z,"-nofollow")==0 ){
12184      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
12185    }else if( strcmp(z,"-ascii")==0 ){
12186      data.mode = MODE_Ascii;
12187      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
12188      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
12189    }else if( strcmp(z,"-tabs")==0 ){
12190      data.mode = MODE_List;
12191      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
12192      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12193    }else if( strcmp(z,"-separator")==0 ){
12194      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
12195                       "%s",cmdline_option_value(argc,argv,++i));
12196    }else if( strcmp(z,"-newline")==0 ){
12197      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
12198                       "%s",cmdline_option_value(argc,argv,++i));
12199    }else if( strcmp(z,"-nullvalue")==0 ){
12200      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
12201                       "%s",cmdline_option_value(argc,argv,++i));
12202    }else if( strcmp(z,"-header")==0 ){
12203      data.showHeader = 1;
12204      ShellSetFlag(&data, SHFLG_HeaderSet);
12205     }else if( strcmp(z,"-noheader")==0 ){
12206      data.showHeader = 0;
12207      ShellSetFlag(&data, SHFLG_HeaderSet);
12208    }else if( strcmp(z,"-echo")==0 ){
12209      ShellSetFlag(&data, SHFLG_Echo);
12210    }else if( strcmp(z,"-eqp")==0 ){
12211      data.autoEQP = AUTOEQP_on;
12212    }else if( strcmp(z,"-eqpfull")==0 ){
12213      data.autoEQP = AUTOEQP_full;
12214    }else if( strcmp(z,"-stats")==0 ){
12215      data.statsOn = 1;
12216    }else if( strcmp(z,"-scanstats")==0 ){
12217      data.scanstatsOn = 1;
12218    }else if( strcmp(z,"-backslash")==0 ){
12219      /* Undocumented command-line option: -backslash
12220      ** Causes C-style backslash escapes to be evaluated in SQL statements
12221      ** prior to sending the SQL into SQLite.  Useful for injecting
12222      ** crazy bytes in the middle of SQL statements for testing and debugging.
12223      */
12224      ShellSetFlag(&data, SHFLG_Backslash);
12225    }else if( strcmp(z,"-bail")==0 ){
12226      /* No-op.  The bail_on_error flag should already be set. */
12227    }else if( strcmp(z,"-version")==0 ){
12228      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
12229      return 0;
12230    }else if( strcmp(z,"-interactive")==0 ){
12231      stdin_is_interactive = 1;
12232    }else if( strcmp(z,"-batch")==0 ){
12233      stdin_is_interactive = 0;
12234    }else if( strcmp(z,"-heap")==0 ){
12235      i++;
12236    }else if( strcmp(z,"-pagecache")==0 ){
12237      i+=2;
12238    }else if( strcmp(z,"-lookaside")==0 ){
12239      i+=2;
12240    }else if( strcmp(z,"-threadsafe")==0 ){
12241      i+=2;
12242    }else if( strcmp(z,"-nonce")==0 ){
12243      i += 2;
12244    }else if( strcmp(z,"-mmap")==0 ){
12245      i++;
12246    }else if( strcmp(z,"-memtrace")==0 ){
12247      i++;
12248#ifdef SQLITE_ENABLE_SORTER_REFERENCES
12249    }else if( strcmp(z,"-sorterref")==0 ){
12250      i++;
12251#endif
12252    }else if( strcmp(z,"-vfs")==0 ){
12253      i++;
12254#ifdef SQLITE_ENABLE_VFSTRACE
12255    }else if( strcmp(z,"-vfstrace")==0 ){
12256      i++;
12257#endif
12258#ifdef SQLITE_ENABLE_MULTIPLEX
12259    }else if( strcmp(z,"-multiplex")==0 ){
12260      i++;
12261#endif
12262    }else if( strcmp(z,"-help")==0 ){
12263      usage(1);
12264    }else if( strcmp(z,"-cmd")==0 ){
12265      /* Run commands that follow -cmd first and separately from commands
12266      ** that simply appear on the command-line.  This seems goofy.  It would
12267      ** be better if all commands ran in the order that they appear.  But
12268      ** we retain the goofy behavior for historical compatibility. */
12269      if( i==argc-1 ) break;
12270      z = cmdline_option_value(argc,argv,++i);
12271      if( z[0]=='.' ){
12272        rc = do_meta_command(z, &data);
12273        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
12274      }else{
12275        open_db(&data, 0);
12276        rc = shell_exec(&data, z, &zErrMsg);
12277        if( zErrMsg!=0 ){
12278          utf8_printf(stderr,"Error: %s\n", zErrMsg);
12279          if( bail_on_error ) return rc!=0 ? rc : 1;
12280        }else if( rc!=0 ){
12281          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
12282          if( bail_on_error ) return rc;
12283        }
12284      }
12285#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12286    }else if( strncmp(z, "-A", 2)==0 ){
12287      if( nCmd>0 ){
12288        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
12289                            " with \"%s\"\n", z);
12290        return 1;
12291      }
12292      open_db(&data, OPEN_DB_ZIPFILE);
12293      if( z[2] ){
12294        argv[i] = &z[2];
12295        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
12296      }else{
12297        arDotCommand(&data, 1, argv+i, argc-i);
12298      }
12299      readStdin = 0;
12300      break;
12301#endif
12302    }else if( strcmp(z,"-safe")==0 ){
12303      data.bSafeMode = data.bSafeModePersist = 1;
12304    }else{
12305      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
12306      raw_printf(stderr,"Use -help for a list of options.\n");
12307      return 1;
12308    }
12309    data.cMode = data.mode;
12310  }
12311
12312  if( !readStdin ){
12313    /* Run all arguments that do not begin with '-' as if they were separate
12314    ** command-line inputs, except for the argToSkip argument which contains
12315    ** the database filename.
12316    */
12317    for(i=0; i<nCmd; i++){
12318      if( azCmd[i][0]=='.' ){
12319        rc = do_meta_command(azCmd[i], &data);
12320        if( rc ){
12321          free(azCmd);
12322          return rc==2 ? 0 : rc;
12323        }
12324      }else{
12325        open_db(&data, 0);
12326        rc = shell_exec(&data, azCmd[i], &zErrMsg);
12327        if( zErrMsg || rc ){
12328          if( zErrMsg!=0 ){
12329            utf8_printf(stderr,"Error: %s\n", zErrMsg);
12330          }else{
12331            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
12332          }
12333          sqlite3_free(zErrMsg);
12334          free(azCmd);
12335          return rc!=0 ? rc : 1;
12336        }
12337      }
12338    }
12339  }else{
12340    /* Run commands received from standard input
12341    */
12342    if( stdin_is_interactive ){
12343      char *zHome;
12344      char *zHistory;
12345      int nHistory;
12346      printf(
12347        "SQLite version %s %.19s\n" /*extra-version-info*/
12348        "Enter \".help\" for usage hints.\n",
12349        sqlite3_libversion(), sqlite3_sourceid()
12350      );
12351      if( warnInmemoryDb ){
12352        printf("Connected to a ");
12353        printBold("transient in-memory database");
12354        printf(".\nUse \".open FILENAME\" to reopen on a "
12355               "persistent database.\n");
12356      }
12357      zHistory = getenv("SQLITE_HISTORY");
12358      if( zHistory ){
12359        zHistory = strdup(zHistory);
12360      }else if( (zHome = find_home_dir(0))!=0 ){
12361        nHistory = strlen30(zHome) + 20;
12362        if( (zHistory = malloc(nHistory))!=0 ){
12363          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
12364        }
12365      }
12366      if( zHistory ){ shell_read_history(zHistory); }
12367#if HAVE_READLINE || HAVE_EDITLINE
12368      rl_attempted_completion_function = readline_completion;
12369#elif HAVE_LINENOISE
12370      linenoiseSetCompletionCallback(linenoise_completion);
12371#endif
12372      data.in = 0;
12373      rc = process_input(&data);
12374      if( zHistory ){
12375        shell_stifle_history(2000);
12376        shell_write_history(zHistory);
12377        free(zHistory);
12378      }
12379    }else{
12380      data.in = stdin;
12381      rc = process_input(&data);
12382    }
12383  }
12384  free(azCmd);
12385  set_table_name(&data, 0);
12386  if( data.db ){
12387    session_close_all(&data, -1);
12388    close_db(data.db);
12389  }
12390  for(i=0; i<ArraySize(data.aAuxDb); i++){
12391    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
12392    if( data.aAuxDb[i].db ){
12393      session_close_all(&data, i);
12394      close_db(data.aAuxDb[i].db);
12395    }
12396  }
12397  find_home_dir(1);
12398  output_reset(&data);
12399  data.doXdgOpen = 0;
12400  clearTempFile(&data);
12401#if !SQLITE_SHELL_IS_UTF8
12402  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
12403  free(argvToFree);
12404#endif
12405  free(data.colWidth);
12406  free(data.zNonce);
12407  /* Clear the global data structure so that valgrind will detect memory
12408  ** leaks */
12409  memset(&data, 0, sizeof(data));
12410  return rc;
12411}
12412