xref: /sqlite-3.40.0/src/shell.c.in (revision 80fafc25)
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
19typedef unsigned int u32;
20typedef unsigned short int u16;
21
22/*
23** Optionally #include a user-defined header, whereby compilation options
24** may be set prior to where they take effect, but after platform setup.
25** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
26** file. Note that this macro has a like effect on sqlite3.c compilation.
27*/
28# define SHELL_STRINGIFY_(f) #f
29# define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
30#ifdef SQLITE_CUSTOM_INCLUDE
31# include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
32#endif
33
34/*
35** Determine if we are dealing with WinRT, which provides only a subset of
36** the full Win32 API.
37*/
38#if !defined(SQLITE_OS_WINRT)
39# define SQLITE_OS_WINRT 0
40#endif
41
42/*
43** If SQLITE_SHELL_FIDDLE is defined then the shell is modified
44** somewhat for use as a WASM module in a web browser. This flag
45** should only be used when building the "fiddle" web application, as
46** the browser-mode build has much different user input requirements
47** and this build mode rewires the user input subsystem to account for
48** that.
49*/
50
51/*
52** Warning pragmas copied from msvc.h in the core.
53*/
54#if defined(_MSC_VER)
55#pragma warning(disable : 4054)
56#pragma warning(disable : 4055)
57#pragma warning(disable : 4100)
58#pragma warning(disable : 4127)
59#pragma warning(disable : 4130)
60#pragma warning(disable : 4152)
61#pragma warning(disable : 4189)
62#pragma warning(disable : 4206)
63#pragma warning(disable : 4210)
64#pragma warning(disable : 4232)
65#pragma warning(disable : 4244)
66#pragma warning(disable : 4305)
67#pragma warning(disable : 4306)
68#pragma warning(disable : 4702)
69#pragma warning(disable : 4706)
70#endif /* defined(_MSC_VER) */
71
72/*
73** No support for loadable extensions in VxWorks.
74*/
75#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
76# define SQLITE_OMIT_LOAD_EXTENSION 1
77#endif
78
79/*
80** Enable large-file support for fopen() and friends on unix.
81*/
82#ifndef SQLITE_DISABLE_LFS
83# define _LARGE_FILE       1
84# ifndef _FILE_OFFSET_BITS
85#   define _FILE_OFFSET_BITS 64
86# endif
87# define _LARGEFILE_SOURCE 1
88#endif
89
90#if defined(SQLITE_SHELL_FIDDLE) && !defined(_POSIX_SOURCE)
91/*
92** emcc requires _POSIX_SOURCE (or one of several similar defines)
93** to expose strdup().
94*/
95# define _POSIX_SOURCE
96#endif
97
98#include <stdlib.h>
99#include <string.h>
100#include <stdio.h>
101#include <assert.h>
102#include "sqlite3.h"
103typedef sqlite3_int64 i64;
104typedef sqlite3_uint64 u64;
105typedef unsigned char u8;
106#if SQLITE_USER_AUTHENTICATION
107# include "sqlite3userauth.h"
108#endif
109#include <ctype.h>
110#include <stdarg.h>
111
112#if !defined(_WIN32) && !defined(WIN32)
113# include <signal.h>
114# if !defined(__RTP__) && !defined(_WRS_KERNEL)
115#  include <pwd.h>
116# endif
117#endif
118#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
119# include <unistd.h>
120# include <dirent.h>
121# define GETPID getpid
122# if defined(__MINGW32__)
123#  define DIRENT dirent
124#  ifndef S_ISLNK
125#   define S_ISLNK(mode) (0)
126#  endif
127# endif
128#else
129# define GETPID (int)GetCurrentProcessId
130#endif
131#include <sys/types.h>
132#include <sys/stat.h>
133
134#if HAVE_READLINE
135# include <readline/readline.h>
136# include <readline/history.h>
137#endif
138
139#if HAVE_EDITLINE
140# include <editline/readline.h>
141#endif
142
143#if HAVE_EDITLINE || HAVE_READLINE
144
145# define shell_add_history(X) add_history(X)
146# define shell_read_history(X) read_history(X)
147# define shell_write_history(X) write_history(X)
148# define shell_stifle_history(X) stifle_history(X)
149# define shell_readline(X) readline(X)
150
151#elif HAVE_LINENOISE
152
153# include "linenoise.h"
154# define shell_add_history(X) linenoiseHistoryAdd(X)
155# define shell_read_history(X) linenoiseHistoryLoad(X)
156# define shell_write_history(X) linenoiseHistorySave(X)
157# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
158# define shell_readline(X) linenoise(X)
159
160#else
161
162# define shell_read_history(X)
163# define shell_write_history(X)
164# define shell_stifle_history(X)
165
166# define SHELL_USE_LOCAL_GETLINE 1
167#endif
168
169
170#if defined(_WIN32) || defined(WIN32)
171# if SQLITE_OS_WINRT
172#  define SQLITE_OMIT_POPEN 1
173# else
174#  include <io.h>
175#  include <fcntl.h>
176#  define isatty(h) _isatty(h)
177#  ifndef access
178#   define access(f,m) _access((f),(m))
179#  endif
180#  ifndef unlink
181#   define unlink _unlink
182#  endif
183#  ifndef strdup
184#   define strdup _strdup
185#  endif
186#  undef popen
187#  define popen _popen
188#  undef pclose
189#  define pclose _pclose
190# endif
191#else
192 /* Make sure isatty() has a prototype. */
193 extern int isatty(int);
194
195# if !defined(__RTP__) && !defined(_WRS_KERNEL)
196  /* popen and pclose are not C89 functions and so are
197  ** sometimes omitted from the <stdio.h> header */
198   extern FILE *popen(const char*,const char*);
199   extern int pclose(FILE*);
200# else
201#  define SQLITE_OMIT_POPEN 1
202# endif
203#endif
204
205#if defined(_WIN32_WCE)
206/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
207 * thus we always assume that we have a console. That can be
208 * overridden with the -batch command line option.
209 */
210#define isatty(x) 1
211#endif
212
213/* ctype macros that work with signed characters */
214#define IsSpace(X)  isspace((unsigned char)X)
215#define IsDigit(X)  isdigit((unsigned char)X)
216#define ToLower(X)  (char)tolower((unsigned char)X)
217
218#if defined(_WIN32) || defined(WIN32)
219#if SQLITE_OS_WINRT
220#include <intrin.h>
221#endif
222#include <windows.h>
223
224/* string conversion routines only needed on Win32 */
225extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
226extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
227extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
228extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
229#endif
230
231/* On Windows, we normally run with output mode of TEXT so that \n characters
232** are automatically translated into \r\n.  However, this behavior needs
233** to be disabled in some cases (ex: when generating CSV output and when
234** rendering quoted strings that contain \n characters).  The following
235** routines take care of that.
236*/
237#if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
238static void setBinaryMode(FILE *file, int isOutput){
239  if( isOutput ) fflush(file);
240  _setmode(_fileno(file), _O_BINARY);
241}
242static void setTextMode(FILE *file, int isOutput){
243  if( isOutput ) fflush(file);
244  _setmode(_fileno(file), _O_TEXT);
245}
246#else
247# define setBinaryMode(X,Y)
248# define setTextMode(X,Y)
249#endif
250
251/* True if the timer is enabled */
252static int enableTimer = 0;
253
254/* A version of strcmp() that works with NULL values */
255static int cli_strcmp(const char *a, const char *b){
256  if( a==0 ) a = "";
257  if( b==0 ) b = "";
258  return strcmp(a,b);
259}
260static int cli_strncmp(const char *a, const char *b, size_t n){
261  if( a==0 ) a = "";
262  if( b==0 ) b = "";
263  return strncmp(a,b,n);
264}
265
266/* Return the current wall-clock time */
267static sqlite3_int64 timeOfDay(void){
268  static sqlite3_vfs *clockVfs = 0;
269  sqlite3_int64 t;
270  if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
271  if( clockVfs==0 ) return 0;  /* Never actually happens */
272  if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
273    clockVfs->xCurrentTimeInt64(clockVfs, &t);
274  }else{
275    double r;
276    clockVfs->xCurrentTime(clockVfs, &r);
277    t = (sqlite3_int64)(r*86400000.0);
278  }
279  return t;
280}
281
282#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
283#include <sys/time.h>
284#include <sys/resource.h>
285
286/* VxWorks does not support getrusage() as far as we can determine */
287#if defined(_WRS_KERNEL) || defined(__RTP__)
288struct rusage {
289  struct timeval ru_utime; /* user CPU time used */
290  struct timeval ru_stime; /* system CPU time used */
291};
292#define getrusage(A,B) memset(B,0,sizeof(*B))
293#endif
294
295/* Saved resource information for the beginning of an operation */
296static struct rusage sBegin;  /* CPU time at start */
297static sqlite3_int64 iBegin;  /* Wall-clock time at start */
298
299/*
300** Begin timing an operation
301*/
302static void beginTimer(void){
303  if( enableTimer ){
304    getrusage(RUSAGE_SELF, &sBegin);
305    iBegin = timeOfDay();
306  }
307}
308
309/* Return the difference of two time_structs in seconds */
310static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
311  return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
312         (double)(pEnd->tv_sec - pStart->tv_sec);
313}
314
315/*
316** Print the timing results.
317*/
318static void endTimer(void){
319  if( enableTimer ){
320    sqlite3_int64 iEnd = timeOfDay();
321    struct rusage sEnd;
322    getrusage(RUSAGE_SELF, &sEnd);
323    printf("Run Time: real %.3f user %f sys %f\n",
324       (iEnd - iBegin)*0.001,
325       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
326       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
327  }
328}
329
330#define BEGIN_TIMER beginTimer()
331#define END_TIMER endTimer()
332#define HAS_TIMER 1
333
334#elif (defined(_WIN32) || defined(WIN32))
335
336/* Saved resource information for the beginning of an operation */
337static HANDLE hProcess;
338static FILETIME ftKernelBegin;
339static FILETIME ftUserBegin;
340static sqlite3_int64 ftWallBegin;
341typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
342                                    LPFILETIME, LPFILETIME);
343static GETPROCTIMES getProcessTimesAddr = NULL;
344
345/*
346** Check to see if we have timer support.  Return 1 if necessary
347** support found (or found previously).
348*/
349static int hasTimer(void){
350  if( getProcessTimesAddr ){
351    return 1;
352  } else {
353#if !SQLITE_OS_WINRT
354    /* GetProcessTimes() isn't supported in WIN95 and some other Windows
355    ** versions. See if the version we are running on has it, and if it
356    ** does, save off a pointer to it and the current process handle.
357    */
358    hProcess = GetCurrentProcess();
359    if( hProcess ){
360      HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
361      if( NULL != hinstLib ){
362        getProcessTimesAddr =
363            (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
364        if( NULL != getProcessTimesAddr ){
365          return 1;
366        }
367        FreeLibrary(hinstLib);
368      }
369    }
370#endif
371  }
372  return 0;
373}
374
375/*
376** Begin timing an operation
377*/
378static void beginTimer(void){
379  if( enableTimer && getProcessTimesAddr ){
380    FILETIME ftCreation, ftExit;
381    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
382                        &ftKernelBegin,&ftUserBegin);
383    ftWallBegin = timeOfDay();
384  }
385}
386
387/* Return the difference of two FILETIME structs in seconds */
388static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
389  sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
390  sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
391  return (double) ((i64End - i64Start) / 10000000.0);
392}
393
394/*
395** Print the timing results.
396*/
397static void endTimer(void){
398  if( enableTimer && getProcessTimesAddr){
399    FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
400    sqlite3_int64 ftWallEnd = timeOfDay();
401    getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
402    printf("Run Time: real %.3f user %f sys %f\n",
403       (ftWallEnd - ftWallBegin)*0.001,
404       timeDiff(&ftUserBegin, &ftUserEnd),
405       timeDiff(&ftKernelBegin, &ftKernelEnd));
406  }
407}
408
409#define BEGIN_TIMER beginTimer()
410#define END_TIMER endTimer()
411#define HAS_TIMER hasTimer()
412
413#else
414#define BEGIN_TIMER
415#define END_TIMER
416#define HAS_TIMER 0
417#endif
418
419/*
420** Used to prevent warnings about unused parameters
421*/
422#define UNUSED_PARAMETER(x) (void)(x)
423
424/*
425** Number of elements in an array
426*/
427#define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
428
429/*
430** If the following flag is set, then command execution stops
431** at an error if we are not interactive.
432*/
433static int bail_on_error = 0;
434
435/*
436** Threat stdin as an interactive input if the following variable
437** is true.  Otherwise, assume stdin is connected to a file or pipe.
438*/
439static int stdin_is_interactive = 1;
440
441/*
442** On Windows systems we have to know if standard output is a console
443** in order to translate UTF-8 into MBCS.  The following variable is
444** true if translation is required.
445*/
446static int stdout_is_console = 1;
447
448/*
449** The following is the open SQLite database.  We make a pointer
450** to this database a static variable so that it can be accessed
451** by the SIGINT handler to interrupt database processing.
452*/
453static sqlite3 *globalDb = 0;
454
455/*
456** True if an interrupt (Control-C) has been received.
457*/
458static volatile int seenInterrupt = 0;
459
460/*
461** This is the name of our program. It is set in main(), used
462** in a number of other places, mostly for error messages.
463*/
464static char *Argv0;
465
466/*
467** Prompt strings. Initialized in main. Settable with
468**   .prompt main continue
469*/
470static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
471static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
472
473/*
474** Render output like fprintf().  Except, if the output is going to the
475** console and if this is running on a Windows machine, translate the
476** output from UTF-8 into MBCS.
477*/
478#if defined(_WIN32) || defined(WIN32)
479void utf8_printf(FILE *out, const char *zFormat, ...){
480  va_list ap;
481  va_start(ap, zFormat);
482  if( stdout_is_console && (out==stdout || out==stderr) ){
483    char *z1 = sqlite3_vmprintf(zFormat, ap);
484    char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
485    sqlite3_free(z1);
486    fputs(z2, out);
487    sqlite3_free(z2);
488  }else{
489    vfprintf(out, zFormat, ap);
490  }
491  va_end(ap);
492}
493#elif !defined(utf8_printf)
494# define utf8_printf fprintf
495#endif
496
497/*
498** Render output like fprintf().  This should not be used on anything that
499** includes string formatting (e.g. "%s").
500*/
501#if !defined(raw_printf)
502# define raw_printf fprintf
503#endif
504
505/* Indicate out-of-memory and exit. */
506static void shell_out_of_memory(void){
507  raw_printf(stderr,"Error: out of memory\n");
508  exit(1);
509}
510
511/* Check a pointer to see if it is NULL.  If it is NULL, exit with an
512** out-of-memory error.
513*/
514static void shell_check_oom(void *p){
515  if( p==0 ) shell_out_of_memory();
516}
517
518/*
519** Write I/O traces to the following stream.
520*/
521#ifdef SQLITE_ENABLE_IOTRACE
522static FILE *iotrace = 0;
523#endif
524
525/*
526** This routine works like printf in that its first argument is a
527** format string and subsequent arguments are values to be substituted
528** in place of % fields.  The result of formatting this string
529** is written to iotrace.
530*/
531#ifdef SQLITE_ENABLE_IOTRACE
532static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
533  va_list ap;
534  char *z;
535  if( iotrace==0 ) return;
536  va_start(ap, zFormat);
537  z = sqlite3_vmprintf(zFormat, ap);
538  va_end(ap);
539  utf8_printf(iotrace, "%s", z);
540  sqlite3_free(z);
541}
542#endif
543
544/*
545** Output string zUtf to stream pOut as w characters.  If w is negative,
546** then right-justify the text.  W is the width in UTF-8 characters, not
547** in bytes.  This is different from the %*.*s specification in printf
548** since with %*.*s the width is measured in bytes, not characters.
549*/
550static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
551  int i;
552  int n;
553  int aw = w<0 ? -w : w;
554  if( zUtf==0 ) zUtf = "";
555  for(i=n=0; zUtf[i]; i++){
556    if( (zUtf[i]&0xc0)!=0x80 ){
557      n++;
558      if( n==aw ){
559        do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
560        break;
561      }
562    }
563  }
564  if( n>=aw ){
565    utf8_printf(pOut, "%.*s", i, zUtf);
566  }else if( w<0 ){
567    utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
568  }else{
569    utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
570  }
571}
572
573
574/*
575** Determines if a string is a number of not.
576*/
577static int isNumber(const char *z, int *realnum){
578  if( *z=='-' || *z=='+' ) z++;
579  if( !IsDigit(*z) ){
580    return 0;
581  }
582  z++;
583  if( realnum ) *realnum = 0;
584  while( IsDigit(*z) ){ z++; }
585  if( *z=='.' ){
586    z++;
587    if( !IsDigit(*z) ) return 0;
588    while( IsDigit(*z) ){ z++; }
589    if( realnum ) *realnum = 1;
590  }
591  if( *z=='e' || *z=='E' ){
592    z++;
593    if( *z=='+' || *z=='-' ) z++;
594    if( !IsDigit(*z) ) return 0;
595    while( IsDigit(*z) ){ z++; }
596    if( realnum ) *realnum = 1;
597  }
598  return *z==0;
599}
600
601/*
602** Compute a string length that is limited to what can be stored in
603** lower 30 bits of a 32-bit signed integer.
604*/
605static int strlen30(const char *z){
606  const char *z2 = z;
607  while( *z2 ){ z2++; }
608  return 0x3fffffff & (int)(z2 - z);
609}
610
611/*
612** Return the length of a string in characters.  Multibyte UTF8 characters
613** count as a single character.
614*/
615static int strlenChar(const char *z){
616  int n = 0;
617  while( *z ){
618    if( (0xc0&*(z++))!=0x80 ) n++;
619  }
620  return n;
621}
622
623/*
624** Return open FILE * if zFile exists, can be opened for read
625** and is an ordinary file or a character stream source.
626** Otherwise return 0.
627*/
628static FILE * openChrSource(const char *zFile){
629#ifdef _WIN32
630  struct _stat x = {0};
631# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
632  /* On Windows, open first, then check the stream nature. This order
633  ** is necessary because _stat() and sibs, when checking a named pipe,
634  ** effectively break the pipe as its supplier sees it. */
635  FILE *rv = fopen(zFile, "rb");
636  if( rv==0 ) return 0;
637  if( _fstat(_fileno(rv), &x) != 0
638      || !STAT_CHR_SRC(x.st_mode)){
639    fclose(rv);
640    rv = 0;
641  }
642  return rv;
643#else
644  struct stat x = {0};
645  int rc = stat(zFile, &x);
646# define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
647  if( rc!=0 ) return 0;
648  if( STAT_CHR_SRC(x.st_mode) ){
649    return fopen(zFile, "rb");
650  }else{
651    return 0;
652  }
653#endif
654#undef STAT_CHR_SRC
655}
656
657/*
658** This routine reads a line of text from FILE in, stores
659** the text in memory obtained from malloc() and returns a pointer
660** to the text.  NULL is returned at end of file, or if malloc()
661** fails.
662**
663** If zLine is not NULL then it is a malloced buffer returned from
664** a previous call to this routine that may be reused.
665*/
666static char *local_getline(char *zLine, FILE *in){
667  int nLine = zLine==0 ? 0 : 100;
668  int n = 0;
669
670  while( 1 ){
671    if( n+100>nLine ){
672      nLine = nLine*2 + 100;
673      zLine = realloc(zLine, nLine);
674      shell_check_oom(zLine);
675    }
676    if( fgets(&zLine[n], nLine - n, in)==0 ){
677      if( n==0 ){
678        free(zLine);
679        return 0;
680      }
681      zLine[n] = 0;
682      break;
683    }
684    while( zLine[n] ) n++;
685    if( n>0 && zLine[n-1]=='\n' ){
686      n--;
687      if( n>0 && zLine[n-1]=='\r' ) n--;
688      zLine[n] = 0;
689      break;
690    }
691  }
692#if defined(_WIN32) || defined(WIN32)
693  /* For interactive input on Windows systems, translate the
694  ** multi-byte characterset characters into UTF-8. */
695  if( stdin_is_interactive && in==stdin ){
696    char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
697    if( zTrans ){
698      i64 nTrans = strlen(zTrans)+1;
699      if( nTrans>nLine ){
700        zLine = realloc(zLine, nTrans);
701        shell_check_oom(zLine);
702      }
703      memcpy(zLine, zTrans, nTrans);
704      sqlite3_free(zTrans);
705    }
706  }
707#endif /* defined(_WIN32) || defined(WIN32) */
708  return zLine;
709}
710
711/*
712** Retrieve a single line of input text.
713**
714** If in==0 then read from standard input and prompt before each line.
715** If isContinuation is true, then a continuation prompt is appropriate.
716** If isContinuation is zero, then the main prompt should be used.
717**
718** If zPrior is not NULL then it is a buffer from a prior call to this
719** routine that can be reused.
720**
721** The result is stored in space obtained from malloc() and must either
722** be freed by the caller or else passed back into this routine via the
723** zPrior argument for reuse.
724*/
725#ifndef SQLITE_SHELL_FIDDLE
726static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
727  char *zPrompt;
728  char *zResult;
729  if( in!=0 ){
730    zResult = local_getline(zPrior, in);
731  }else{
732    zPrompt = isContinuation ? continuePrompt : mainPrompt;
733#if SHELL_USE_LOCAL_GETLINE
734    printf("%s", zPrompt);
735    fflush(stdout);
736    zResult = local_getline(zPrior, stdin);
737#else
738    free(zPrior);
739    zResult = shell_readline(zPrompt);
740    if( zResult && *zResult ) shell_add_history(zResult);
741#endif
742  }
743  return zResult;
744}
745#endif /* !SQLITE_SHELL_FIDDLE */
746
747/*
748** Return the value of a hexadecimal digit.  Return -1 if the input
749** is not a hex digit.
750*/
751static int hexDigitValue(char c){
752  if( c>='0' && c<='9' ) return c - '0';
753  if( c>='a' && c<='f' ) return c - 'a' + 10;
754  if( c>='A' && c<='F' ) return c - 'A' + 10;
755  return -1;
756}
757
758/*
759** Interpret zArg as an integer value, possibly with suffixes.
760*/
761static sqlite3_int64 integerValue(const char *zArg){
762  sqlite3_int64 v = 0;
763  static const struct { char *zSuffix; int iMult; } aMult[] = {
764    { "KiB", 1024 },
765    { "MiB", 1024*1024 },
766    { "GiB", 1024*1024*1024 },
767    { "KB",  1000 },
768    { "MB",  1000000 },
769    { "GB",  1000000000 },
770    { "K",   1000 },
771    { "M",   1000000 },
772    { "G",   1000000000 },
773  };
774  int i;
775  int isNeg = 0;
776  if( zArg[0]=='-' ){
777    isNeg = 1;
778    zArg++;
779  }else if( zArg[0]=='+' ){
780    zArg++;
781  }
782  if( zArg[0]=='0' && zArg[1]=='x' ){
783    int x;
784    zArg += 2;
785    while( (x = hexDigitValue(zArg[0]))>=0 ){
786      v = (v<<4) + x;
787      zArg++;
788    }
789  }else{
790    while( IsDigit(zArg[0]) ){
791      v = v*10 + zArg[0] - '0';
792      zArg++;
793    }
794  }
795  for(i=0; i<ArraySize(aMult); i++){
796    if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
797      v *= aMult[i].iMult;
798      break;
799    }
800  }
801  return isNeg? -v : v;
802}
803
804/*
805** A variable length string to which one can append text.
806*/
807typedef struct ShellText ShellText;
808struct ShellText {
809  char *z;
810  int n;
811  int nAlloc;
812};
813
814/*
815** Initialize and destroy a ShellText object
816*/
817static void initText(ShellText *p){
818  memset(p, 0, sizeof(*p));
819}
820static void freeText(ShellText *p){
821  free(p->z);
822  initText(p);
823}
824
825/* zIn is either a pointer to a NULL-terminated string in memory obtained
826** from malloc(), or a NULL pointer. The string pointed to by zAppend is
827** added to zIn, and the result returned in memory obtained from malloc().
828** zIn, if it was not NULL, is freed.
829**
830** If the third argument, quote, is not '\0', then it is used as a
831** quote character for zAppend.
832*/
833static void appendText(ShellText *p, const char *zAppend, char quote){
834  i64 len;
835  i64 i;
836  i64 nAppend = strlen30(zAppend);
837
838  len = nAppend+p->n+1;
839  if( quote ){
840    len += 2;
841    for(i=0; i<nAppend; i++){
842      if( zAppend[i]==quote ) len++;
843    }
844  }
845
846  if( p->z==0 || p->n+len>=p->nAlloc ){
847    p->nAlloc = p->nAlloc*2 + len + 20;
848    p->z = realloc(p->z, p->nAlloc);
849    shell_check_oom(p->z);
850  }
851
852  if( quote ){
853    char *zCsr = p->z+p->n;
854    *zCsr++ = quote;
855    for(i=0; i<nAppend; i++){
856      *zCsr++ = zAppend[i];
857      if( zAppend[i]==quote ) *zCsr++ = quote;
858    }
859    *zCsr++ = quote;
860    p->n = (int)(zCsr - p->z);
861    *zCsr = '\0';
862  }else{
863    memcpy(p->z+p->n, zAppend, nAppend);
864    p->n += nAppend;
865    p->z[p->n] = '\0';
866  }
867}
868
869/*
870** Attempt to determine if identifier zName needs to be quoted, either
871** because it contains non-alphanumeric characters, or because it is an
872** SQLite keyword.  Be conservative in this estimate:  When in doubt assume
873** that quoting is required.
874**
875** Return '"' if quoting is required.  Return 0 if no quoting is required.
876*/
877static char quoteChar(const char *zName){
878  int i;
879  if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
880  for(i=0; zName[i]; i++){
881    if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
882  }
883  return sqlite3_keyword_check(zName, i) ? '"' : 0;
884}
885
886/*
887** Construct a fake object name and column list to describe the structure
888** of the view, virtual table, or table valued function zSchema.zName.
889*/
890static char *shellFakeSchema(
891  sqlite3 *db,            /* The database connection containing the vtab */
892  const char *zSchema,    /* Schema of the database holding the vtab */
893  const char *zName       /* The name of the virtual table */
894){
895  sqlite3_stmt *pStmt = 0;
896  char *zSql;
897  ShellText s;
898  char cQuote;
899  char *zDiv = "(";
900  int nRow = 0;
901
902  zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
903                         zSchema ? zSchema : "main", zName);
904  shell_check_oom(zSql);
905  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
906  sqlite3_free(zSql);
907  initText(&s);
908  if( zSchema ){
909    cQuote = quoteChar(zSchema);
910    if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
911    appendText(&s, zSchema, cQuote);
912    appendText(&s, ".", 0);
913  }
914  cQuote = quoteChar(zName);
915  appendText(&s, zName, cQuote);
916  while( sqlite3_step(pStmt)==SQLITE_ROW ){
917    const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
918    nRow++;
919    appendText(&s, zDiv, 0);
920    zDiv = ",";
921    if( zCol==0 ) zCol = "";
922    cQuote = quoteChar(zCol);
923    appendText(&s, zCol, cQuote);
924  }
925  appendText(&s, ")", 0);
926  sqlite3_finalize(pStmt);
927  if( nRow==0 ){
928    freeText(&s);
929    s.z = 0;
930  }
931  return s.z;
932}
933
934/*
935** SQL function:  shell_module_schema(X)
936**
937** Return a fake schema for the table-valued function or eponymous virtual
938** table X.
939*/
940static void shellModuleSchema(
941  sqlite3_context *pCtx,
942  int nVal,
943  sqlite3_value **apVal
944){
945  const char *zName;
946  char *zFake;
947  UNUSED_PARAMETER(nVal);
948  zName = (const char*)sqlite3_value_text(apVal[0]);
949  zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
950  if( zFake ){
951    sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
952                        -1, sqlite3_free);
953    free(zFake);
954  }
955}
956
957/*
958** SQL function:  shell_add_schema(S,X)
959**
960** Add the schema name X to the CREATE statement in S and return the result.
961** Examples:
962**
963**    CREATE TABLE t1(x)   ->   CREATE TABLE xyz.t1(x);
964**
965** Also works on
966**
967**    CREATE INDEX
968**    CREATE UNIQUE INDEX
969**    CREATE VIEW
970**    CREATE TRIGGER
971**    CREATE VIRTUAL TABLE
972**
973** This UDF is used by the .schema command to insert the schema name of
974** attached databases into the middle of the sqlite_schema.sql field.
975*/
976static void shellAddSchemaName(
977  sqlite3_context *pCtx,
978  int nVal,
979  sqlite3_value **apVal
980){
981  static const char *aPrefix[] = {
982     "TABLE",
983     "INDEX",
984     "UNIQUE INDEX",
985     "VIEW",
986     "TRIGGER",
987     "VIRTUAL TABLE"
988  };
989  int i = 0;
990  const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
991  const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
992  const char *zName = (const char*)sqlite3_value_text(apVal[2]);
993  sqlite3 *db = sqlite3_context_db_handle(pCtx);
994  UNUSED_PARAMETER(nVal);
995  if( zIn!=0 && cli_strncmp(zIn, "CREATE ", 7)==0 ){
996    for(i=0; i<ArraySize(aPrefix); i++){
997      int n = strlen30(aPrefix[i]);
998      if( cli_strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
999        char *z = 0;
1000        char *zFake = 0;
1001        if( zSchema ){
1002          char cQuote = quoteChar(zSchema);
1003          if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
1004            z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
1005          }else{
1006            z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
1007          }
1008        }
1009        if( zName
1010         && aPrefix[i][0]=='V'
1011         && (zFake = shellFakeSchema(db, zSchema, zName))!=0
1012        ){
1013          if( z==0 ){
1014            z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
1015          }else{
1016            z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
1017          }
1018          free(zFake);
1019        }
1020        if( z ){
1021          sqlite3_result_text(pCtx, z, -1, sqlite3_free);
1022          return;
1023        }
1024      }
1025    }
1026  }
1027  sqlite3_result_value(pCtx, apVal[0]);
1028}
1029
1030/*
1031** The source code for several run-time loadable extensions is inserted
1032** below by the ../tool/mkshellc.tcl script.  Before processing that included
1033** code, we need to override some macros to make the included program code
1034** work here in the middle of this regular program.
1035*/
1036#define SQLITE_EXTENSION_INIT1
1037#define SQLITE_EXTENSION_INIT2(X) (void)(X)
1038
1039#if defined(_WIN32) && defined(_MSC_VER)
1040INCLUDE test_windirent.h
1041INCLUDE test_windirent.c
1042#define dirent DIRENT
1043#endif
1044INCLUDE ../ext/misc/memtrace.c
1045INCLUDE ../ext/misc/shathree.c
1046INCLUDE ../ext/misc/uint.c
1047INCLUDE ../ext/misc/decimal.c
1048INCLUDE ../ext/misc/ieee754.c
1049INCLUDE ../ext/misc/series.c
1050INCLUDE ../ext/misc/regexp.c
1051#ifndef SQLITE_SHELL_FIDDLE
1052INCLUDE ../ext/misc/fileio.c
1053INCLUDE ../ext/misc/completion.c
1054INCLUDE ../ext/misc/appendvfs.c
1055#endif
1056#ifdef SQLITE_HAVE_ZLIB
1057INCLUDE ../ext/misc/zipfile.c
1058INCLUDE ../ext/misc/sqlar.c
1059#endif
1060INCLUDE ../ext/expert/sqlite3expert.h
1061INCLUDE ../ext/expert/sqlite3expert.c
1062
1063#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
1064#define SQLITE_SHELL_HAVE_RECOVER 1
1065#else
1066#define SQLITE_SHELL_HAVE_RECOVER 0
1067#endif
1068#if SQLITE_SHELL_HAVE_RECOVER
1069INCLUDE ../ext/recover/dbdata.c
1070INCLUDE ../ext/recover/sqlite3recover.h
1071INCLUDE ../ext/recover/sqlite3recover.c
1072#endif
1073
1074#if defined(SQLITE_ENABLE_SESSION)
1075/*
1076** State information for a single open session
1077*/
1078typedef struct OpenSession OpenSession;
1079struct OpenSession {
1080  char *zName;             /* Symbolic name for this session */
1081  int nFilter;             /* Number of xFilter rejection GLOB patterns */
1082  char **azFilter;         /* Array of xFilter rejection GLOB patterns */
1083  sqlite3_session *p;      /* The open session */
1084};
1085#endif
1086
1087typedef struct ExpertInfo ExpertInfo;
1088struct ExpertInfo {
1089  sqlite3expert *pExpert;
1090  int bVerbose;
1091};
1092
1093/* A single line in the EQP output */
1094typedef struct EQPGraphRow EQPGraphRow;
1095struct EQPGraphRow {
1096  int iEqpId;           /* ID for this row */
1097  int iParentId;        /* ID of the parent row */
1098  EQPGraphRow *pNext;   /* Next row in sequence */
1099  char zText[1];        /* Text to display for this row */
1100};
1101
1102/* All EQP output is collected into an instance of the following */
1103typedef struct EQPGraph EQPGraph;
1104struct EQPGraph {
1105  EQPGraphRow *pRow;    /* Linked list of all rows of the EQP output */
1106  EQPGraphRow *pLast;   /* Last element of the pRow list */
1107  char zPrefix[100];    /* Graph prefix */
1108};
1109
1110/* Parameters affecting columnar mode result display (defaulting together) */
1111typedef struct ColModeOpts {
1112  int iWrap;            /* In columnar modes, wrap lines reaching this limit */
1113  u8 bQuote;            /* Quote results for .mode box and table */
1114  u8 bWordWrap;         /* In columnar modes, wrap at word boundaries  */
1115} ColModeOpts;
1116#define ColModeOpts_default { 60, 0, 0 }
1117#define ColModeOpts_default_qbox { 60, 1, 0 }
1118
1119/*
1120** State information about the database connection is contained in an
1121** instance of the following structure.
1122*/
1123typedef struct ShellState ShellState;
1124struct ShellState {
1125  sqlite3 *db;           /* The database */
1126  u8 autoExplain;        /* Automatically turn on .explain mode */
1127  u8 autoEQP;            /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1128  u8 autoEQPtest;        /* autoEQP is in test mode */
1129  u8 autoEQPtrace;       /* autoEQP is in trace mode */
1130  u8 scanstatsOn;        /* True to display scan stats before each finalize */
1131  u8 openMode;           /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1132  u8 doXdgOpen;          /* Invoke start/open/xdg-open in output_reset() */
1133  u8 nEqpLevel;          /* Depth of the EQP output graph */
1134  u8 eTraceType;         /* SHELL_TRACE_* value for type of trace */
1135  u8 bSafeMode;          /* True to prohibit unsafe operations */
1136  u8 bSafeModePersist;   /* The long-term value of bSafeMode */
1137  ColModeOpts cmOpts;    /* Option values affecting columnar mode output */
1138  unsigned statsOn;      /* True to display memory stats before each finalize */
1139  unsigned mEqpLines;    /* Mask of veritical lines in the EQP output graph */
1140  int inputNesting;      /* Track nesting level of .read and other redirects */
1141  int outCount;          /* Revert to stdout when reaching zero */
1142  int cnt;               /* Number of records displayed so far */
1143  int lineno;            /* Line number of last line read from in */
1144  int openFlags;         /* Additional flags to open.  (SQLITE_OPEN_NOFOLLOW) */
1145  FILE *in;              /* Read commands from this stream */
1146  FILE *out;             /* Write results here */
1147  FILE *traceOut;        /* Output for sqlite3_trace() */
1148  int nErr;              /* Number of errors seen */
1149  int mode;              /* An output mode setting */
1150  int modePrior;         /* Saved mode */
1151  int cMode;             /* temporary output mode for the current query */
1152  int normalMode;        /* Output mode before ".explain on" */
1153  int writableSchema;    /* True if PRAGMA writable_schema=ON */
1154  int showHeader;        /* True to show column names in List or Column mode */
1155  int nCheck;            /* Number of ".check" commands run */
1156  unsigned nProgress;    /* Number of progress callbacks encountered */
1157  unsigned mxProgress;   /* Maximum progress callbacks before failing */
1158  unsigned flgProgress;  /* Flags for the progress callback */
1159  unsigned shellFlgs;    /* Various flags */
1160  unsigned priorShFlgs;  /* Saved copy of flags */
1161  sqlite3_int64 szMax;   /* --maxsize argument to .open */
1162  char *zDestTable;      /* Name of destination table when MODE_Insert */
1163  char *zTempFile;       /* Temporary file that might need deleting */
1164  char zTestcase[30];    /* Name of current test case */
1165  char colSeparator[20]; /* Column separator character for several modes */
1166  char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1167  char colSepPrior[20];  /* Saved column separator */
1168  char rowSepPrior[20];  /* Saved row separator */
1169  int *colWidth;         /* Requested width of each column in columnar modes */
1170  int *actualWidth;      /* Actual width of each column */
1171  int nWidth;            /* Number of slots in colWidth[] and actualWidth[] */
1172  char nullValue[20];    /* The text to print when a NULL comes back from
1173                         ** the database */
1174  char outfile[FILENAME_MAX]; /* Filename for *out */
1175  sqlite3_stmt *pStmt;   /* Current statement if any. */
1176  FILE *pLog;            /* Write log output here */
1177  struct AuxDb {         /* Storage space for auxiliary database connections */
1178    sqlite3 *db;               /* Connection pointer */
1179    const char *zDbFilename;   /* Filename used to open the connection */
1180    char *zFreeOnClose;        /* Free this memory allocation on close */
1181#if defined(SQLITE_ENABLE_SESSION)
1182    int nSession;              /* Number of active sessions */
1183    OpenSession aSession[4];   /* Array of sessions.  [0] is in focus. */
1184#endif
1185  } aAuxDb[5],           /* Array of all database connections */
1186    *pAuxDb;             /* Currently active database connection */
1187  int *aiIndent;         /* Array of indents used in MODE_Explain */
1188  int nIndent;           /* Size of array aiIndent[] */
1189  int iIndent;           /* Index of current op in aiIndent[] */
1190  char *zNonce;          /* Nonce for temporary safe-mode excapes */
1191  EQPGraph sGraph;       /* Information for the graphical EXPLAIN QUERY PLAN */
1192  ExpertInfo expert;     /* Valid if previous command was ".expert OPT..." */
1193#ifdef SQLITE_SHELL_FIDDLE
1194  struct {
1195    const char * zInput; /* Input string from wasm/JS proxy */
1196    const char * zPos;   /* Cursor pos into zInput */
1197    const char * zDefaultDbName; /* Default name for db file */
1198  } wasm;
1199#endif
1200};
1201
1202#ifdef SQLITE_SHELL_FIDDLE
1203static ShellState shellState;
1204#endif
1205
1206
1207/* Allowed values for ShellState.autoEQP
1208*/
1209#define AUTOEQP_off      0           /* Automatic EXPLAIN QUERY PLAN is off */
1210#define AUTOEQP_on       1           /* Automatic EQP is on */
1211#define AUTOEQP_trigger  2           /* On and also show plans for triggers */
1212#define AUTOEQP_full     3           /* Show full EXPLAIN */
1213
1214/* Allowed values for ShellState.openMode
1215*/
1216#define SHELL_OPEN_UNSPEC      0      /* No open-mode specified */
1217#define SHELL_OPEN_NORMAL      1      /* Normal database file */
1218#define SHELL_OPEN_APPENDVFS   2      /* Use appendvfs */
1219#define SHELL_OPEN_ZIPFILE     3      /* Use the zipfile virtual table */
1220#define SHELL_OPEN_READONLY    4      /* Open a normal database read-only */
1221#define SHELL_OPEN_DESERIALIZE 5      /* Open using sqlite3_deserialize() */
1222#define SHELL_OPEN_HEXDB       6      /* Use "dbtotxt" output as data source */
1223
1224/* Allowed values for ShellState.eTraceType
1225*/
1226#define SHELL_TRACE_PLAIN      0      /* Show input SQL text */
1227#define SHELL_TRACE_EXPANDED   1      /* Show expanded SQL text */
1228#define SHELL_TRACE_NORMALIZED 2      /* Show normalized SQL text */
1229
1230/* Bits in the ShellState.flgProgress variable */
1231#define SHELL_PROGRESS_QUIET 0x01  /* Omit announcing every progress callback */
1232#define SHELL_PROGRESS_RESET 0x02  /* Reset the count when the progres
1233                                   ** callback limit is reached, and for each
1234                                   ** top-level SQL statement */
1235#define SHELL_PROGRESS_ONCE  0x04  /* Cancel the --limit after firing once */
1236
1237/*
1238** These are the allowed shellFlgs values
1239*/
1240#define SHFLG_Pagecache      0x00000001 /* The --pagecache option is used */
1241#define SHFLG_Lookaside      0x00000002 /* Lookaside memory is used */
1242#define SHFLG_Backslash      0x00000004 /* The --backslash option is used */
1243#define SHFLG_PreserveRowid  0x00000008 /* .dump preserves rowid values */
1244#define SHFLG_Newlines       0x00000010 /* .dump --newline flag */
1245#define SHFLG_CountChanges   0x00000020 /* .changes setting */
1246#define SHFLG_Echo           0x00000040 /* .echo on/off, or --echo setting */
1247#define SHFLG_HeaderSet      0x00000080 /* showHeader has been specified */
1248#define SHFLG_DumpDataOnly   0x00000100 /* .dump show data only */
1249#define SHFLG_DumpNoSys      0x00000200 /* .dump omits system tables */
1250
1251/*
1252** Macros for testing and setting shellFlgs
1253*/
1254#define ShellHasFlag(P,X)    (((P)->shellFlgs & (X))!=0)
1255#define ShellSetFlag(P,X)    ((P)->shellFlgs|=(X))
1256#define ShellClearFlag(P,X)  ((P)->shellFlgs&=(~(X)))
1257
1258/*
1259** These are the allowed modes.
1260*/
1261#define MODE_Line     0  /* One column per line.  Blank line between records */
1262#define MODE_Column   1  /* One record per line in neat columns */
1263#define MODE_List     2  /* One record per line with a separator */
1264#define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
1265#define MODE_Html     4  /* Generate an XHTML table */
1266#define MODE_Insert   5  /* Generate SQL "insert" statements */
1267#define MODE_Quote    6  /* Quote values as for SQL */
1268#define MODE_Tcl      7  /* Generate ANSI-C or TCL quoted elements */
1269#define MODE_Csv      8  /* Quote strings, numbers are plain */
1270#define MODE_Explain  9  /* Like MODE_Column, but do not truncate data */
1271#define MODE_Ascii   10  /* Use ASCII unit and record separators (0x1F/0x1E) */
1272#define MODE_Pretty  11  /* Pretty-print schemas */
1273#define MODE_EQP     12  /* Converts EXPLAIN QUERY PLAN output into a graph */
1274#define MODE_Json    13  /* Output JSON */
1275#define MODE_Markdown 14 /* Markdown formatting */
1276#define MODE_Table   15  /* MySQL-style table formatting */
1277#define MODE_Box     16  /* Unicode box-drawing characters */
1278#define MODE_Count   17  /* Output only a count of the rows of output */
1279#define MODE_Off     18  /* No query output shown */
1280
1281static const char *modeDescr[] = {
1282  "line",
1283  "column",
1284  "list",
1285  "semi",
1286  "html",
1287  "insert",
1288  "quote",
1289  "tcl",
1290  "csv",
1291  "explain",
1292  "ascii",
1293  "prettyprint",
1294  "eqp",
1295  "json",
1296  "markdown",
1297  "table",
1298  "box",
1299  "count",
1300  "off"
1301};
1302
1303/*
1304** These are the column/row/line separators used by the various
1305** import/export modes.
1306*/
1307#define SEP_Column    "|"
1308#define SEP_Row       "\n"
1309#define SEP_Tab       "\t"
1310#define SEP_Space     " "
1311#define SEP_Comma     ","
1312#define SEP_CrLf      "\r\n"
1313#define SEP_Unit      "\x1F"
1314#define SEP_Record    "\x1E"
1315
1316/*
1317** Limit input nesting via .read or any other input redirect.
1318** It's not too expensive, so a generous allowance can be made.
1319*/
1320#define MAX_INPUT_NESTING 25
1321
1322/*
1323** A callback for the sqlite3_log() interface.
1324*/
1325static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1326  ShellState *p = (ShellState*)pArg;
1327  if( p->pLog==0 ) return;
1328  utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1329  fflush(p->pLog);
1330}
1331
1332/*
1333** SQL function:  shell_putsnl(X)
1334**
1335** Write the text X to the screen (or whatever output is being directed)
1336** adding a newline at the end, and then return X.
1337*/
1338static void shellPutsFunc(
1339  sqlite3_context *pCtx,
1340  int nVal,
1341  sqlite3_value **apVal
1342){
1343  ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1344  (void)nVal;
1345  utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1346  sqlite3_result_value(pCtx, apVal[0]);
1347}
1348
1349/*
1350** If in safe mode, print an error message described by the arguments
1351** and exit immediately.
1352*/
1353static void failIfSafeMode(
1354  ShellState *p,
1355  const char *zErrMsg,
1356  ...
1357){
1358  if( p->bSafeMode ){
1359    va_list ap;
1360    char *zMsg;
1361    va_start(ap, zErrMsg);
1362    zMsg = sqlite3_vmprintf(zErrMsg, ap);
1363    va_end(ap);
1364    raw_printf(stderr, "line %d: ", p->lineno);
1365    utf8_printf(stderr, "%s\n", zMsg);
1366    exit(1);
1367  }
1368}
1369
1370/*
1371** SQL function:   edit(VALUE)
1372**                 edit(VALUE,EDITOR)
1373**
1374** These steps:
1375**
1376**     (1) Write VALUE into a temporary file.
1377**     (2) Run program EDITOR on that temporary file.
1378**     (3) Read the temporary file back and return its content as the result.
1379**     (4) Delete the temporary file
1380**
1381** If the EDITOR argument is omitted, use the value in the VISUAL
1382** environment variable.  If still there is no EDITOR, through an error.
1383**
1384** Also throw an error if the EDITOR program returns a non-zero exit code.
1385*/
1386#ifndef SQLITE_NOHAVE_SYSTEM
1387static void editFunc(
1388  sqlite3_context *context,
1389  int argc,
1390  sqlite3_value **argv
1391){
1392  const char *zEditor;
1393  char *zTempFile = 0;
1394  sqlite3 *db;
1395  char *zCmd = 0;
1396  int bBin;
1397  int rc;
1398  int hasCRNL = 0;
1399  FILE *f = 0;
1400  sqlite3_int64 sz;
1401  sqlite3_int64 x;
1402  unsigned char *p = 0;
1403
1404  if( argc==2 ){
1405    zEditor = (const char*)sqlite3_value_text(argv[1]);
1406  }else{
1407    zEditor = getenv("VISUAL");
1408  }
1409  if( zEditor==0 ){
1410    sqlite3_result_error(context, "no editor for edit()", -1);
1411    return;
1412  }
1413  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1414    sqlite3_result_error(context, "NULL input to edit()", -1);
1415    return;
1416  }
1417  db = sqlite3_context_db_handle(context);
1418  zTempFile = 0;
1419  sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1420  if( zTempFile==0 ){
1421    sqlite3_uint64 r = 0;
1422    sqlite3_randomness(sizeof(r), &r);
1423    zTempFile = sqlite3_mprintf("temp%llx", r);
1424    if( zTempFile==0 ){
1425      sqlite3_result_error_nomem(context);
1426      return;
1427    }
1428  }
1429  bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1430  /* When writing the file to be edited, do \n to \r\n conversions on systems
1431  ** that want \r\n line endings */
1432  f = fopen(zTempFile, bBin ? "wb" : "w");
1433  if( f==0 ){
1434    sqlite3_result_error(context, "edit() cannot open temp file", -1);
1435    goto edit_func_end;
1436  }
1437  sz = sqlite3_value_bytes(argv[0]);
1438  if( bBin ){
1439    x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
1440  }else{
1441    const char *z = (const char*)sqlite3_value_text(argv[0]);
1442    /* Remember whether or not the value originally contained \r\n */
1443    if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
1444    x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
1445  }
1446  fclose(f);
1447  f = 0;
1448  if( x!=sz ){
1449    sqlite3_result_error(context, "edit() could not write the whole file", -1);
1450    goto edit_func_end;
1451  }
1452  zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1453  if( zCmd==0 ){
1454    sqlite3_result_error_nomem(context);
1455    goto edit_func_end;
1456  }
1457  rc = system(zCmd);
1458  sqlite3_free(zCmd);
1459  if( rc ){
1460    sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1461    goto edit_func_end;
1462  }
1463  f = fopen(zTempFile, "rb");
1464  if( f==0 ){
1465    sqlite3_result_error(context,
1466      "edit() cannot reopen temp file after edit", -1);
1467    goto edit_func_end;
1468  }
1469  fseek(f, 0, SEEK_END);
1470  sz = ftell(f);
1471  rewind(f);
1472  p = sqlite3_malloc64( sz+1 );
1473  if( p==0 ){
1474    sqlite3_result_error_nomem(context);
1475    goto edit_func_end;
1476  }
1477  x = fread(p, 1, (size_t)sz, f);
1478  fclose(f);
1479  f = 0;
1480  if( x!=sz ){
1481    sqlite3_result_error(context, "could not read back the whole file", -1);
1482    goto edit_func_end;
1483  }
1484  if( bBin ){
1485    sqlite3_result_blob64(context, p, sz, sqlite3_free);
1486  }else{
1487    sqlite3_int64 i, j;
1488    if( hasCRNL ){
1489      /* If the original contains \r\n then do no conversions back to \n */
1490    }else{
1491      /* If the file did not originally contain \r\n then convert any new
1492      ** \r\n back into \n */
1493      for(i=j=0; i<sz; i++){
1494        if( p[i]=='\r' && p[i+1]=='\n' ) i++;
1495        p[j++] = p[i];
1496      }
1497      sz = j;
1498      p[sz] = 0;
1499    }
1500    sqlite3_result_text64(context, (const char*)p, sz,
1501                          sqlite3_free, SQLITE_UTF8);
1502  }
1503  p = 0;
1504
1505edit_func_end:
1506  if( f ) fclose(f);
1507  unlink(zTempFile);
1508  sqlite3_free(zTempFile);
1509  sqlite3_free(p);
1510}
1511#endif /* SQLITE_NOHAVE_SYSTEM */
1512
1513/*
1514** Save or restore the current output mode
1515*/
1516static void outputModePush(ShellState *p){
1517  p->modePrior = p->mode;
1518  p->priorShFlgs = p->shellFlgs;
1519  memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1520  memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1521}
1522static void outputModePop(ShellState *p){
1523  p->mode = p->modePrior;
1524  p->shellFlgs = p->priorShFlgs;
1525  memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1526  memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1527}
1528
1529/*
1530** Output the given string as a hex-encoded blob (eg. X'1234' )
1531*/
1532static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1533  int i;
1534  unsigned char *aBlob = (unsigned char*)pBlob;
1535
1536  char *zStr = sqlite3_malloc(nBlob*2 + 1);
1537  shell_check_oom(zStr);
1538
1539  for(i=0; i<nBlob; i++){
1540    static const char aHex[] = {
1541        '0', '1', '2', '3', '4', '5', '6', '7',
1542        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
1543    };
1544    zStr[i*2] = aHex[ (aBlob[i] >> 4) ];
1545    zStr[i*2+1] = aHex[ (aBlob[i] & 0x0F) ];
1546  }
1547  zStr[i*2] = '\0';
1548
1549  raw_printf(out,"X'%s'", zStr);
1550  sqlite3_free(zStr);
1551}
1552
1553/*
1554** Find a string that is not found anywhere in z[].  Return a pointer
1555** to that string.
1556**
1557** Try to use zA and zB first.  If both of those are already found in z[]
1558** then make up some string and store it in the buffer zBuf.
1559*/
1560static const char *unused_string(
1561  const char *z,                    /* Result must not appear anywhere in z */
1562  const char *zA, const char *zB,   /* Try these first */
1563  char *zBuf                        /* Space to store a generated string */
1564){
1565  unsigned i = 0;
1566  if( strstr(z, zA)==0 ) return zA;
1567  if( strstr(z, zB)==0 ) return zB;
1568  do{
1569    sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1570  }while( strstr(z,zBuf)!=0 );
1571  return zBuf;
1572}
1573
1574/*
1575** Output the given string as a quoted string using SQL quoting conventions.
1576**
1577** See also: output_quoted_escaped_string()
1578*/
1579static void output_quoted_string(FILE *out, const char *z){
1580  int i;
1581  char c;
1582  setBinaryMode(out, 1);
1583  for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1584  if( c==0 ){
1585    utf8_printf(out,"'%s'",z);
1586  }else{
1587    raw_printf(out, "'");
1588    while( *z ){
1589      for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1590      if( c=='\'' ) i++;
1591      if( i ){
1592        utf8_printf(out, "%.*s", i, z);
1593        z += i;
1594      }
1595      if( c=='\'' ){
1596        raw_printf(out, "'");
1597        continue;
1598      }
1599      if( c==0 ){
1600        break;
1601      }
1602      z++;
1603    }
1604    raw_printf(out, "'");
1605  }
1606  setTextMode(out, 1);
1607}
1608
1609/*
1610** Output the given string as a quoted string using SQL quoting conventions.
1611** Additionallly , escape the "\n" and "\r" characters so that they do not
1612** get corrupted by end-of-line translation facilities in some operating
1613** systems.
1614**
1615** This is like output_quoted_string() but with the addition of the \r\n
1616** escape mechanism.
1617*/
1618static void output_quoted_escaped_string(FILE *out, const char *z){
1619  int i;
1620  char c;
1621  setBinaryMode(out, 1);
1622  for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1623  if( c==0 ){
1624    utf8_printf(out,"'%s'",z);
1625  }else{
1626    const char *zNL = 0;
1627    const char *zCR = 0;
1628    int nNL = 0;
1629    int nCR = 0;
1630    char zBuf1[20], zBuf2[20];
1631    for(i=0; z[i]; i++){
1632      if( z[i]=='\n' ) nNL++;
1633      if( z[i]=='\r' ) nCR++;
1634    }
1635    if( nNL ){
1636      raw_printf(out, "replace(");
1637      zNL = unused_string(z, "\\n", "\\012", zBuf1);
1638    }
1639    if( nCR ){
1640      raw_printf(out, "replace(");
1641      zCR = unused_string(z, "\\r", "\\015", zBuf2);
1642    }
1643    raw_printf(out, "'");
1644    while( *z ){
1645      for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1646      if( c=='\'' ) i++;
1647      if( i ){
1648        utf8_printf(out, "%.*s", i, z);
1649        z += i;
1650      }
1651      if( c=='\'' ){
1652        raw_printf(out, "'");
1653        continue;
1654      }
1655      if( c==0 ){
1656        break;
1657      }
1658      z++;
1659      if( c=='\n' ){
1660        raw_printf(out, "%s", zNL);
1661        continue;
1662      }
1663      raw_printf(out, "%s", zCR);
1664    }
1665    raw_printf(out, "'");
1666    if( nCR ){
1667      raw_printf(out, ",'%s',char(13))", zCR);
1668    }
1669    if( nNL ){
1670      raw_printf(out, ",'%s',char(10))", zNL);
1671    }
1672  }
1673  setTextMode(out, 1);
1674}
1675
1676/*
1677** Output the given string as a quoted according to C or TCL quoting rules.
1678*/
1679static void output_c_string(FILE *out, const char *z){
1680  unsigned int c;
1681  fputc('"', out);
1682  while( (c = *(z++))!=0 ){
1683    if( c=='\\' ){
1684      fputc(c, out);
1685      fputc(c, out);
1686    }else if( c=='"' ){
1687      fputc('\\', out);
1688      fputc('"', out);
1689    }else if( c=='\t' ){
1690      fputc('\\', out);
1691      fputc('t', out);
1692    }else if( c=='\n' ){
1693      fputc('\\', out);
1694      fputc('n', out);
1695    }else if( c=='\r' ){
1696      fputc('\\', out);
1697      fputc('r', out);
1698    }else if( !isprint(c&0xff) ){
1699      raw_printf(out, "\\%03o", c&0xff);
1700    }else{
1701      fputc(c, out);
1702    }
1703  }
1704  fputc('"', out);
1705}
1706
1707/*
1708** Output the given string as a quoted according to JSON quoting rules.
1709*/
1710static void output_json_string(FILE *out, const char *z, i64 n){
1711  unsigned int c;
1712  if( n<0 ) n = strlen(z);
1713  fputc('"', out);
1714  while( n-- ){
1715    c = *(z++);
1716    if( c=='\\' || c=='"' ){
1717      fputc('\\', out);
1718      fputc(c, out);
1719    }else if( c<=0x1f ){
1720      fputc('\\', out);
1721      if( c=='\b' ){
1722        fputc('b', out);
1723      }else if( c=='\f' ){
1724        fputc('f', out);
1725      }else if( c=='\n' ){
1726        fputc('n', out);
1727      }else if( c=='\r' ){
1728        fputc('r', out);
1729      }else if( c=='\t' ){
1730        fputc('t', out);
1731      }else{
1732         raw_printf(out, "u%04x",c);
1733      }
1734    }else{
1735      fputc(c, out);
1736    }
1737  }
1738  fputc('"', out);
1739}
1740
1741/*
1742** Output the given string with characters that are special to
1743** HTML escaped.
1744*/
1745static void output_html_string(FILE *out, const char *z){
1746  int i;
1747  if( z==0 ) z = "";
1748  while( *z ){
1749    for(i=0;   z[i]
1750            && z[i]!='<'
1751            && z[i]!='&'
1752            && z[i]!='>'
1753            && z[i]!='\"'
1754            && z[i]!='\'';
1755        i++){}
1756    if( i>0 ){
1757      utf8_printf(out,"%.*s",i,z);
1758    }
1759    if( z[i]=='<' ){
1760      raw_printf(out,"&lt;");
1761    }else if( z[i]=='&' ){
1762      raw_printf(out,"&amp;");
1763    }else if( z[i]=='>' ){
1764      raw_printf(out,"&gt;");
1765    }else if( z[i]=='\"' ){
1766      raw_printf(out,"&quot;");
1767    }else if( z[i]=='\'' ){
1768      raw_printf(out,"&#39;");
1769    }else{
1770      break;
1771    }
1772    z += i + 1;
1773  }
1774}
1775
1776/*
1777** If a field contains any character identified by a 1 in the following
1778** array, then the string must be quoted for CSV.
1779*/
1780static const char needCsvQuote[] = {
1781  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1782  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1783  1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
1784  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1785  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1786  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1787  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
1788  0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
1789  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1790  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1791  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1792  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1793  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1794  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1795  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1796  1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
1797};
1798
1799/*
1800** Output a single term of CSV.  Actually, p->colSeparator is used for
1801** the separator, which may or may not be a comma.  p->nullValue is
1802** the null value.  Strings are quoted if necessary.  The separator
1803** is only issued if bSep is true.
1804*/
1805static void output_csv(ShellState *p, const char *z, int bSep){
1806  FILE *out = p->out;
1807  if( z==0 ){
1808    utf8_printf(out,"%s",p->nullValue);
1809  }else{
1810    unsigned i;
1811    for(i=0; z[i]; i++){
1812      if( needCsvQuote[((unsigned char*)z)[i]] ){
1813        i = 0;
1814        break;
1815      }
1816    }
1817    if( i==0 || strstr(z, p->colSeparator)!=0 ){
1818      char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1819      shell_check_oom(zQuoted);
1820      utf8_printf(out, "%s", zQuoted);
1821      sqlite3_free(zQuoted);
1822    }else{
1823      utf8_printf(out, "%s", z);
1824    }
1825  }
1826  if( bSep ){
1827    utf8_printf(p->out, "%s", p->colSeparator);
1828  }
1829}
1830
1831/*
1832** This routine runs when the user presses Ctrl-C
1833*/
1834static void interrupt_handler(int NotUsed){
1835  UNUSED_PARAMETER(NotUsed);
1836  seenInterrupt++;
1837  if( seenInterrupt>2 ) exit(1);
1838  if( globalDb ) sqlite3_interrupt(globalDb);
1839}
1840
1841#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1842/*
1843** This routine runs for console events (e.g. Ctrl-C) on Win32
1844*/
1845static BOOL WINAPI ConsoleCtrlHandler(
1846  DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1847){
1848  if( dwCtrlType==CTRL_C_EVENT ){
1849    interrupt_handler(0);
1850    return TRUE;
1851  }
1852  return FALSE;
1853}
1854#endif
1855
1856#ifndef SQLITE_OMIT_AUTHORIZATION
1857/*
1858** This authorizer runs in safe mode.
1859*/
1860static int safeModeAuth(
1861  void *pClientData,
1862  int op,
1863  const char *zA1,
1864  const char *zA2,
1865  const char *zA3,
1866  const char *zA4
1867){
1868  ShellState *p = (ShellState*)pClientData;
1869  static const char *azProhibitedFunctions[] = {
1870    "edit",
1871    "fts3_tokenizer",
1872    "load_extension",
1873    "readfile",
1874    "writefile",
1875    "zipfile",
1876    "zipfile_cds",
1877  };
1878  UNUSED_PARAMETER(zA2);
1879  UNUSED_PARAMETER(zA3);
1880  UNUSED_PARAMETER(zA4);
1881  switch( op ){
1882    case SQLITE_ATTACH: {
1883#ifndef SQLITE_SHELL_FIDDLE
1884      /* In WASM builds the filesystem is a virtual sandbox, so
1885      ** there's no harm in using ATTACH. */
1886      failIfSafeMode(p, "cannot run ATTACH in safe mode");
1887#endif
1888      break;
1889    }
1890    case SQLITE_FUNCTION: {
1891      int i;
1892      for(i=0; i<ArraySize(azProhibitedFunctions); i++){
1893        if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
1894          failIfSafeMode(p, "cannot use the %s() function in safe mode",
1895                         azProhibitedFunctions[i]);
1896        }
1897      }
1898      break;
1899    }
1900  }
1901  return SQLITE_OK;
1902}
1903
1904/*
1905** When the ".auth ON" is set, the following authorizer callback is
1906** invoked.  It always returns SQLITE_OK.
1907*/
1908static int shellAuth(
1909  void *pClientData,
1910  int op,
1911  const char *zA1,
1912  const char *zA2,
1913  const char *zA3,
1914  const char *zA4
1915){
1916  ShellState *p = (ShellState*)pClientData;
1917  static const char *azAction[] = { 0,
1918     "CREATE_INDEX",         "CREATE_TABLE",         "CREATE_TEMP_INDEX",
1919     "CREATE_TEMP_TABLE",    "CREATE_TEMP_TRIGGER",  "CREATE_TEMP_VIEW",
1920     "CREATE_TRIGGER",       "CREATE_VIEW",          "DELETE",
1921     "DROP_INDEX",           "DROP_TABLE",           "DROP_TEMP_INDEX",
1922     "DROP_TEMP_TABLE",      "DROP_TEMP_TRIGGER",    "DROP_TEMP_VIEW",
1923     "DROP_TRIGGER",         "DROP_VIEW",            "INSERT",
1924     "PRAGMA",               "READ",                 "SELECT",
1925     "TRANSACTION",          "UPDATE",               "ATTACH",
1926     "DETACH",               "ALTER_TABLE",          "REINDEX",
1927     "ANALYZE",              "CREATE_VTABLE",        "DROP_VTABLE",
1928     "FUNCTION",             "SAVEPOINT",            "RECURSIVE"
1929  };
1930  int i;
1931  const char *az[4];
1932  az[0] = zA1;
1933  az[1] = zA2;
1934  az[2] = zA3;
1935  az[3] = zA4;
1936  utf8_printf(p->out, "authorizer: %s", azAction[op]);
1937  for(i=0; i<4; i++){
1938    raw_printf(p->out, " ");
1939    if( az[i] ){
1940      output_c_string(p->out, az[i]);
1941    }else{
1942      raw_printf(p->out, "NULL");
1943    }
1944  }
1945  raw_printf(p->out, "\n");
1946  if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
1947  return SQLITE_OK;
1948}
1949#endif
1950
1951/*
1952** Print a schema statement.  Part of MODE_Semi and MODE_Pretty output.
1953**
1954** This routine converts some CREATE TABLE statements for shadow tables
1955** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1956**
1957** If the schema statement in z[] contains a start-of-comment and if
1958** sqlite3_complete() returns false, try to terminate the comment before
1959** printing the result.  https://sqlite.org/forum/forumpost/d7be961c5c
1960*/
1961static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1962  char *zToFree = 0;
1963  if( z==0 ) return;
1964  if( zTail==0 ) return;
1965  if( zTail[0]==';' && (strstr(z, "/*")!=0 || strstr(z,"--")!=0) ){
1966    const char *zOrig = z;
1967    static const char *azTerm[] = { "", "*/", "\n" };
1968    int i;
1969    for(i=0; i<ArraySize(azTerm); i++){
1970      char *zNew = sqlite3_mprintf("%s%s;", zOrig, azTerm[i]);
1971      if( sqlite3_complete(zNew) ){
1972        size_t n = strlen(zNew);
1973        zNew[n-1] = 0;
1974        zToFree = zNew;
1975        z = zNew;
1976        break;
1977      }
1978      sqlite3_free(zNew);
1979    }
1980  }
1981  if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1982    utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1983  }else{
1984    utf8_printf(out, "%s%s", z, zTail);
1985  }
1986  sqlite3_free(zToFree);
1987}
1988static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1989  char c = z[n];
1990  z[n] = 0;
1991  printSchemaLine(out, z, zTail);
1992  z[n] = c;
1993}
1994
1995/*
1996** Return true if string z[] has nothing but whitespace and comments to the
1997** end of the first line.
1998*/
1999static int wsToEol(const char *z){
2000  int i;
2001  for(i=0; z[i]; i++){
2002    if( z[i]=='\n' ) return 1;
2003    if( IsSpace(z[i]) ) continue;
2004    if( z[i]=='-' && z[i+1]=='-' ) return 1;
2005    return 0;
2006  }
2007  return 1;
2008}
2009
2010/*
2011** Add a new entry to the EXPLAIN QUERY PLAN data
2012*/
2013static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
2014  EQPGraphRow *pNew;
2015  i64 nText;
2016  if( zText==0 ) return;
2017  nText = strlen(zText);
2018  if( p->autoEQPtest ){
2019    utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
2020  }
2021  pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
2022  shell_check_oom(pNew);
2023  pNew->iEqpId = iEqpId;
2024  pNew->iParentId = p2;
2025  memcpy(pNew->zText, zText, nText+1);
2026  pNew->pNext = 0;
2027  if( p->sGraph.pLast ){
2028    p->sGraph.pLast->pNext = pNew;
2029  }else{
2030    p->sGraph.pRow = pNew;
2031  }
2032  p->sGraph.pLast = pNew;
2033}
2034
2035/*
2036** Free and reset the EXPLAIN QUERY PLAN data that has been collected
2037** in p->sGraph.
2038*/
2039static void eqp_reset(ShellState *p){
2040  EQPGraphRow *pRow, *pNext;
2041  for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
2042    pNext = pRow->pNext;
2043    sqlite3_free(pRow);
2044  }
2045  memset(&p->sGraph, 0, sizeof(p->sGraph));
2046}
2047
2048/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
2049** pOld, or return the first such line if pOld is NULL
2050*/
2051static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
2052  EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
2053  while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
2054  return pRow;
2055}
2056
2057/* Render a single level of the graph that has iEqpId as its parent.  Called
2058** recursively to render sublevels.
2059*/
2060static void eqp_render_level(ShellState *p, int iEqpId){
2061  EQPGraphRow *pRow, *pNext;
2062  i64 n = strlen(p->sGraph.zPrefix);
2063  char *z;
2064  for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
2065    pNext = eqp_next_row(p, iEqpId, pRow);
2066    z = pRow->zText;
2067    utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
2068                pNext ? "|--" : "`--", z);
2069    if( n<(i64)sizeof(p->sGraph.zPrefix)-7 ){
2070      memcpy(&p->sGraph.zPrefix[n], pNext ? "|  " : "   ", 4);
2071      eqp_render_level(p, pRow->iEqpId);
2072      p->sGraph.zPrefix[n] = 0;
2073    }
2074  }
2075}
2076
2077/*
2078** Display and reset the EXPLAIN QUERY PLAN data
2079*/
2080static void eqp_render(ShellState *p){
2081  EQPGraphRow *pRow = p->sGraph.pRow;
2082  if( pRow ){
2083    if( pRow->zText[0]=='-' ){
2084      if( pRow->pNext==0 ){
2085        eqp_reset(p);
2086        return;
2087      }
2088      utf8_printf(p->out, "%s\n", pRow->zText+3);
2089      p->sGraph.pRow = pRow->pNext;
2090      sqlite3_free(pRow);
2091    }else{
2092      utf8_printf(p->out, "QUERY PLAN\n");
2093    }
2094    p->sGraph.zPrefix[0] = 0;
2095    eqp_render_level(p, 0);
2096    eqp_reset(p);
2097  }
2098}
2099
2100#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
2101/*
2102** Progress handler callback.
2103*/
2104static int progress_handler(void *pClientData) {
2105  ShellState *p = (ShellState*)pClientData;
2106  p->nProgress++;
2107  if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
2108    raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
2109    if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
2110    if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
2111    return 1;
2112  }
2113  if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
2114    raw_printf(p->out, "Progress %u\n", p->nProgress);
2115  }
2116  return 0;
2117}
2118#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
2119
2120/*
2121** Print N dashes
2122*/
2123static void print_dashes(FILE *out, int N){
2124  const char zDash[] = "--------------------------------------------------";
2125  const int nDash = sizeof(zDash) - 1;
2126  while( N>nDash ){
2127    fputs(zDash, out);
2128    N -= nDash;
2129  }
2130  raw_printf(out, "%.*s", N, zDash);
2131}
2132
2133/*
2134** Print a markdown or table-style row separator using ascii-art
2135*/
2136static void print_row_separator(
2137  ShellState *p,
2138  int nArg,
2139  const char *zSep
2140){
2141  int i;
2142  if( nArg>0 ){
2143    fputs(zSep, p->out);
2144    print_dashes(p->out, p->actualWidth[0]+2);
2145    for(i=1; i<nArg; i++){
2146      fputs(zSep, p->out);
2147      print_dashes(p->out, p->actualWidth[i]+2);
2148    }
2149    fputs(zSep, p->out);
2150  }
2151  fputs("\n", p->out);
2152}
2153
2154/*
2155** This is the callback routine that the shell
2156** invokes for each row of a query result.
2157*/
2158static int shell_callback(
2159  void *pArg,
2160  int nArg,        /* Number of result columns */
2161  char **azArg,    /* Text of each result column */
2162  char **azCol,    /* Column names */
2163  int *aiType      /* Column types.  Might be NULL */
2164){
2165  int i;
2166  ShellState *p = (ShellState*)pArg;
2167
2168  if( azArg==0 ) return 0;
2169  switch( p->cMode ){
2170    case MODE_Count:
2171    case MODE_Off: {
2172      break;
2173    }
2174    case MODE_Line: {
2175      int w = 5;
2176      if( azArg==0 ) break;
2177      for(i=0; i<nArg; i++){
2178        int len = strlen30(azCol[i] ? azCol[i] : "");
2179        if( len>w ) w = len;
2180      }
2181      if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2182      for(i=0; i<nArg; i++){
2183        utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2184                azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2185      }
2186      break;
2187    }
2188    case MODE_Explain: {
2189      static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
2190      if( nArg>ArraySize(aExplainWidth) ){
2191        nArg = ArraySize(aExplainWidth);
2192      }
2193      if( p->cnt++==0 ){
2194        for(i=0; i<nArg; i++){
2195          int w = aExplainWidth[i];
2196          utf8_width_print(p->out, w, azCol[i]);
2197          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2198        }
2199        for(i=0; i<nArg; i++){
2200          int w = aExplainWidth[i];
2201          print_dashes(p->out, w);
2202          fputs(i==nArg-1 ? "\n" : "  ", p->out);
2203        }
2204      }
2205      if( azArg==0 ) break;
2206      for(i=0; i<nArg; i++){
2207        int w = aExplainWidth[i];
2208        if( i==nArg-1 ) w = 0;
2209        if( azArg[i] && strlenChar(azArg[i])>w ){
2210          w = strlenChar(azArg[i]);
2211        }
2212        if( i==1 && p->aiIndent && p->pStmt ){
2213          if( p->iIndent<p->nIndent ){
2214            utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2215          }
2216          p->iIndent++;
2217        }
2218        utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2219        fputs(i==nArg-1 ? "\n" : "  ", p->out);
2220      }
2221      break;
2222    }
2223    case MODE_Semi: {   /* .schema and .fullschema output */
2224      printSchemaLine(p->out, azArg[0], ";\n");
2225      break;
2226    }
2227    case MODE_Pretty: {  /* .schema and .fullschema with --indent */
2228      char *z;
2229      int j;
2230      int nParen = 0;
2231      char cEnd = 0;
2232      char c;
2233      int nLine = 0;
2234      assert( nArg==1 );
2235      if( azArg[0]==0 ) break;
2236      if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2237       || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2238      ){
2239        utf8_printf(p->out, "%s;\n", azArg[0]);
2240        break;
2241      }
2242      z = sqlite3_mprintf("%s", azArg[0]);
2243      shell_check_oom(z);
2244      j = 0;
2245      for(i=0; IsSpace(z[i]); i++){}
2246      for(; (c = z[i])!=0; i++){
2247        if( IsSpace(c) ){
2248          if( z[j-1]=='\r' ) z[j-1] = '\n';
2249          if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2250        }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2251          j--;
2252        }
2253        z[j++] = c;
2254      }
2255      while( j>0 && IsSpace(z[j-1]) ){ j--; }
2256      z[j] = 0;
2257      if( strlen30(z)>=79 ){
2258        for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
2259          if( c==cEnd ){
2260            cEnd = 0;
2261          }else if( c=='"' || c=='\'' || c=='`' ){
2262            cEnd = c;
2263          }else if( c=='[' ){
2264            cEnd = ']';
2265          }else if( c=='-' && z[i+1]=='-' ){
2266            cEnd = '\n';
2267          }else if( c=='(' ){
2268            nParen++;
2269          }else if( c==')' ){
2270            nParen--;
2271            if( nLine>0 && nParen==0 && j>0 ){
2272              printSchemaLineN(p->out, z, j, "\n");
2273              j = 0;
2274            }
2275          }
2276          z[j++] = c;
2277          if( nParen==1 && cEnd==0
2278           && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
2279          ){
2280            if( c=='\n' ) j--;
2281            printSchemaLineN(p->out, z, j, "\n  ");
2282            j = 0;
2283            nLine++;
2284            while( IsSpace(z[i+1]) ){ i++; }
2285          }
2286        }
2287        z[j] = 0;
2288      }
2289      printSchemaLine(p->out, z, ";\n");
2290      sqlite3_free(z);
2291      break;
2292    }
2293    case MODE_List: {
2294      if( p->cnt++==0 && p->showHeader ){
2295        for(i=0; i<nArg; i++){
2296          utf8_printf(p->out,"%s%s",azCol[i],
2297                  i==nArg-1 ? p->rowSeparator : p->colSeparator);
2298        }
2299      }
2300      if( azArg==0 ) break;
2301      for(i=0; i<nArg; i++){
2302        char *z = azArg[i];
2303        if( z==0 ) z = p->nullValue;
2304        utf8_printf(p->out, "%s", z);
2305        if( i<nArg-1 ){
2306          utf8_printf(p->out, "%s", p->colSeparator);
2307        }else{
2308          utf8_printf(p->out, "%s", p->rowSeparator);
2309        }
2310      }
2311      break;
2312    }
2313    case MODE_Html: {
2314      if( p->cnt++==0 && p->showHeader ){
2315        raw_printf(p->out,"<TR>");
2316        for(i=0; i<nArg; i++){
2317          raw_printf(p->out,"<TH>");
2318          output_html_string(p->out, azCol[i]);
2319          raw_printf(p->out,"</TH>\n");
2320        }
2321        raw_printf(p->out,"</TR>\n");
2322      }
2323      if( azArg==0 ) break;
2324      raw_printf(p->out,"<TR>");
2325      for(i=0; i<nArg; i++){
2326        raw_printf(p->out,"<TD>");
2327        output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2328        raw_printf(p->out,"</TD>\n");
2329      }
2330      raw_printf(p->out,"</TR>\n");
2331      break;
2332    }
2333    case MODE_Tcl: {
2334      if( p->cnt++==0 && p->showHeader ){
2335        for(i=0; i<nArg; i++){
2336          output_c_string(p->out,azCol[i] ? azCol[i] : "");
2337          if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2338        }
2339        utf8_printf(p->out, "%s", p->rowSeparator);
2340      }
2341      if( azArg==0 ) break;
2342      for(i=0; i<nArg; i++){
2343        output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2344        if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2345      }
2346      utf8_printf(p->out, "%s", p->rowSeparator);
2347      break;
2348    }
2349    case MODE_Csv: {
2350      setBinaryMode(p->out, 1);
2351      if( p->cnt++==0 && p->showHeader ){
2352        for(i=0; i<nArg; i++){
2353          output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2354        }
2355        utf8_printf(p->out, "%s", p->rowSeparator);
2356      }
2357      if( nArg>0 ){
2358        for(i=0; i<nArg; i++){
2359          output_csv(p, azArg[i], i<nArg-1);
2360        }
2361        utf8_printf(p->out, "%s", p->rowSeparator);
2362      }
2363      setTextMode(p->out, 1);
2364      break;
2365    }
2366    case MODE_Insert: {
2367      if( azArg==0 ) break;
2368      utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2369      if( p->showHeader ){
2370        raw_printf(p->out,"(");
2371        for(i=0; i<nArg; i++){
2372          if( i>0 ) raw_printf(p->out, ",");
2373          if( quoteChar(azCol[i]) ){
2374            char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2375            shell_check_oom(z);
2376            utf8_printf(p->out, "%s", z);
2377            sqlite3_free(z);
2378          }else{
2379            raw_printf(p->out, "%s", azCol[i]);
2380          }
2381        }
2382        raw_printf(p->out,")");
2383      }
2384      p->cnt++;
2385      for(i=0; i<nArg; i++){
2386        raw_printf(p->out, i>0 ? "," : " VALUES(");
2387        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2388          utf8_printf(p->out,"NULL");
2389        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2390          if( ShellHasFlag(p, SHFLG_Newlines) ){
2391            output_quoted_string(p->out, azArg[i]);
2392          }else{
2393            output_quoted_escaped_string(p->out, azArg[i]);
2394          }
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_uint64 ur;
2401          memcpy(&ur,&r,sizeof(r));
2402          if( ur==0x7ff0000000000000LL ){
2403            raw_printf(p->out, "1e999");
2404          }else if( ur==0xfff0000000000000LL ){
2405            raw_printf(p->out, "-1e999");
2406          }else{
2407            sqlite3_int64 ir = (sqlite3_int64)r;
2408            if( r==(double)ir ){
2409              sqlite3_snprintf(50,z,"%lld.0", ir);
2410            }else{
2411              sqlite3_snprintf(50,z,"%!.20g", r);
2412            }
2413            raw_printf(p->out, "%s", z);
2414          }
2415        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2416          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2417          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2418          output_hex_blob(p->out, pBlob, nBlob);
2419        }else if( isNumber(azArg[i], 0) ){
2420          utf8_printf(p->out,"%s", azArg[i]);
2421        }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2422          output_quoted_string(p->out, azArg[i]);
2423        }else{
2424          output_quoted_escaped_string(p->out, azArg[i]);
2425        }
2426      }
2427      raw_printf(p->out,");\n");
2428      break;
2429    }
2430    case MODE_Json: {
2431      if( azArg==0 ) break;
2432      if( p->cnt==0 ){
2433        fputs("[{", p->out);
2434      }else{
2435        fputs(",\n{", p->out);
2436      }
2437      p->cnt++;
2438      for(i=0; i<nArg; i++){
2439        output_json_string(p->out, azCol[i], -1);
2440        putc(':', p->out);
2441        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2442          fputs("null",p->out);
2443        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2444          char z[50];
2445          double r = sqlite3_column_double(p->pStmt, i);
2446          sqlite3_uint64 ur;
2447          memcpy(&ur,&r,sizeof(r));
2448          if( ur==0x7ff0000000000000LL ){
2449            raw_printf(p->out, "1e999");
2450          }else if( ur==0xfff0000000000000LL ){
2451            raw_printf(p->out, "-1e999");
2452          }else{
2453            sqlite3_snprintf(50,z,"%!.20g", r);
2454            raw_printf(p->out, "%s", z);
2455          }
2456        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2457          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2458          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2459          output_json_string(p->out, pBlob, nBlob);
2460        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2461          output_json_string(p->out, azArg[i], -1);
2462        }else{
2463          utf8_printf(p->out,"%s", azArg[i]);
2464        }
2465        if( i<nArg-1 ){
2466          putc(',', p->out);
2467        }
2468      }
2469      putc('}', p->out);
2470      break;
2471    }
2472    case MODE_Quote: {
2473      if( azArg==0 ) break;
2474      if( p->cnt==0 && p->showHeader ){
2475        for(i=0; i<nArg; i++){
2476          if( i>0 ) fputs(p->colSeparator, p->out);
2477          output_quoted_string(p->out, azCol[i]);
2478        }
2479        fputs(p->rowSeparator, p->out);
2480      }
2481      p->cnt++;
2482      for(i=0; i<nArg; i++){
2483        if( i>0 ) fputs(p->colSeparator, p->out);
2484        if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2485          utf8_printf(p->out,"NULL");
2486        }else if( aiType && aiType[i]==SQLITE_TEXT ){
2487          output_quoted_string(p->out, azArg[i]);
2488        }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2489          utf8_printf(p->out,"%s", azArg[i]);
2490        }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2491          char z[50];
2492          double r = sqlite3_column_double(p->pStmt, i);
2493          sqlite3_snprintf(50,z,"%!.20g", r);
2494          raw_printf(p->out, "%s", z);
2495        }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2496          const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2497          int nBlob = sqlite3_column_bytes(p->pStmt, i);
2498          output_hex_blob(p->out, pBlob, nBlob);
2499        }else if( isNumber(azArg[i], 0) ){
2500          utf8_printf(p->out,"%s", azArg[i]);
2501        }else{
2502          output_quoted_string(p->out, azArg[i]);
2503        }
2504      }
2505      fputs(p->rowSeparator, p->out);
2506      break;
2507    }
2508    case MODE_Ascii: {
2509      if( p->cnt++==0 && p->showHeader ){
2510        for(i=0; i<nArg; i++){
2511          if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2512          utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2513        }
2514        utf8_printf(p->out, "%s", p->rowSeparator);
2515      }
2516      if( azArg==0 ) break;
2517      for(i=0; i<nArg; i++){
2518        if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2519        utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2520      }
2521      utf8_printf(p->out, "%s", p->rowSeparator);
2522      break;
2523    }
2524    case MODE_EQP: {
2525      eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2526      break;
2527    }
2528  }
2529  return 0;
2530}
2531
2532/*
2533** This is the callback routine that the SQLite library
2534** invokes for each row of a query result.
2535*/
2536static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2537  /* since we don't have type info, call the shell_callback with a NULL value */
2538  return shell_callback(pArg, nArg, azArg, azCol, NULL);
2539}
2540
2541/*
2542** This is the callback routine from sqlite3_exec() that appends all
2543** output onto the end of a ShellText object.
2544*/
2545static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2546  ShellText *p = (ShellText*)pArg;
2547  int i;
2548  UNUSED_PARAMETER(az);
2549  if( azArg==0 ) return 0;
2550  if( p->n ) appendText(p, "|", 0);
2551  for(i=0; i<nArg; i++){
2552    if( i ) appendText(p, ",", 0);
2553    if( azArg[i] ) appendText(p, azArg[i], 0);
2554  }
2555  return 0;
2556}
2557
2558/*
2559** Generate an appropriate SELFTEST table in the main database.
2560*/
2561static void createSelftestTable(ShellState *p){
2562  char *zErrMsg = 0;
2563  sqlite3_exec(p->db,
2564    "SAVEPOINT selftest_init;\n"
2565    "CREATE TABLE IF NOT EXISTS selftest(\n"
2566    "  tno INTEGER PRIMARY KEY,\n"   /* Test number */
2567    "  op TEXT,\n"                   /* Operator:  memo run */
2568    "  cmd TEXT,\n"                  /* Command text */
2569    "  ans TEXT\n"                   /* Desired answer */
2570    ");"
2571    "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2572    "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2573    "  VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2574    "         'memo','Tests generated by --init');\n"
2575    "INSERT INTO [_shell$self]\n"
2576    "  SELECT 'run',\n"
2577    "    'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2578                                 "FROM sqlite_schema ORDER BY 2'',224))',\n"
2579    "    hex(sha3_query('SELECT type,name,tbl_name,sql "
2580                          "FROM sqlite_schema ORDER BY 2',224));\n"
2581    "INSERT INTO [_shell$self]\n"
2582    "  SELECT 'run',"
2583    "    'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2584    "        printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2585    "    hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2586    "  FROM (\n"
2587    "    SELECT name FROM sqlite_schema\n"
2588    "     WHERE type='table'\n"
2589    "       AND name<>'selftest'\n"
2590    "       AND coalesce(rootpage,0)>0\n"
2591    "  )\n"
2592    " ORDER BY name;\n"
2593    "INSERT INTO [_shell$self]\n"
2594    "  VALUES('run','PRAGMA integrity_check','ok');\n"
2595    "INSERT INTO selftest(tno,op,cmd,ans)"
2596    "  SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2597    "DROP TABLE [_shell$self];"
2598    ,0,0,&zErrMsg);
2599  if( zErrMsg ){
2600    utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2601    sqlite3_free(zErrMsg);
2602  }
2603  sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2604}
2605
2606
2607/*
2608** Set the destination table field of the ShellState structure to
2609** the name of the table given.  Escape any quote characters in the
2610** table name.
2611*/
2612static void set_table_name(ShellState *p, const char *zName){
2613  int i, n;
2614  char cQuote;
2615  char *z;
2616
2617  if( p->zDestTable ){
2618    free(p->zDestTable);
2619    p->zDestTable = 0;
2620  }
2621  if( zName==0 ) return;
2622  cQuote = quoteChar(zName);
2623  n = strlen30(zName);
2624  if( cQuote ) n += n+2;
2625  z = p->zDestTable = malloc( n+1 );
2626  shell_check_oom(z);
2627  n = 0;
2628  if( cQuote ) z[n++] = cQuote;
2629  for(i=0; zName[i]; i++){
2630    z[n++] = zName[i];
2631    if( zName[i]==cQuote ) z[n++] = cQuote;
2632  }
2633  if( cQuote ) z[n++] = cQuote;
2634  z[n] = 0;
2635}
2636
2637/*
2638** Maybe construct two lines of text that point out the position of a
2639** syntax error.  Return a pointer to the text, in memory obtained from
2640** sqlite3_malloc().  Or, if the most recent error does not involve a
2641** specific token that we can point to, return an empty string.
2642**
2643** In all cases, the memory returned is obtained from sqlite3_malloc64()
2644** and should be released by the caller invoking sqlite3_free().
2645*/
2646static char *shell_error_context(const char *zSql, sqlite3 *db){
2647  int iOffset;
2648  size_t len;
2649  char *zCode;
2650  char *zMsg;
2651  int i;
2652  if( db==0
2653   || zSql==0
2654   || (iOffset = sqlite3_error_offset(db))<0
2655  ){
2656    return sqlite3_mprintf("");
2657  }
2658  while( iOffset>50 ){
2659    iOffset--;
2660    zSql++;
2661    while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
2662  }
2663  len = strlen(zSql);
2664  if( len>78 ){
2665    len = 78;
2666    while( (zSql[len]&0xc0)==0x80 ) len--;
2667  }
2668  zCode = sqlite3_mprintf("%.*s", len, zSql);
2669  shell_check_oom(zCode);
2670  for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
2671  if( iOffset<25 ){
2672    zMsg = sqlite3_mprintf("\n  %z\n  %*s^--- error here", zCode, iOffset, "");
2673  }else{
2674    zMsg = sqlite3_mprintf("\n  %z\n  %*serror here ---^", zCode, iOffset-14, "");
2675  }
2676  return zMsg;
2677}
2678
2679
2680/*
2681** Execute a query statement that will generate SQL output.  Print
2682** the result columns, comma-separated, on a line and then add a
2683** semicolon terminator to the end of that line.
2684**
2685** If the number of columns is 1 and that column contains text "--"
2686** then write the semicolon on a separate line.  That way, if a
2687** "--" comment occurs at the end of the statement, the comment
2688** won't consume the semicolon terminator.
2689*/
2690static int run_table_dump_query(
2691  ShellState *p,           /* Query context */
2692  const char *zSelect      /* SELECT statement to extract content */
2693){
2694  sqlite3_stmt *pSelect;
2695  int rc;
2696  int nResult;
2697  int i;
2698  const char *z;
2699  rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2700  if( rc!=SQLITE_OK || !pSelect ){
2701    char *zContext = shell_error_context(zSelect, p->db);
2702    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
2703                sqlite3_errmsg(p->db), zContext);
2704    sqlite3_free(zContext);
2705    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2706    return rc;
2707  }
2708  rc = sqlite3_step(pSelect);
2709  nResult = sqlite3_column_count(pSelect);
2710  while( rc==SQLITE_ROW ){
2711    z = (const char*)sqlite3_column_text(pSelect, 0);
2712    utf8_printf(p->out, "%s", z);
2713    for(i=1; i<nResult; i++){
2714      utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2715    }
2716    if( z==0 ) z = "";
2717    while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2718    if( z[0] ){
2719      raw_printf(p->out, "\n;\n");
2720    }else{
2721      raw_printf(p->out, ";\n");
2722    }
2723    rc = sqlite3_step(pSelect);
2724  }
2725  rc = sqlite3_finalize(pSelect);
2726  if( rc!=SQLITE_OK ){
2727    utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2728                sqlite3_errmsg(p->db));
2729    if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2730  }
2731  return rc;
2732}
2733
2734/*
2735** Allocate space and save off string indicating current error.
2736*/
2737static char *save_err_msg(
2738  sqlite3 *db,           /* Database to query */
2739  const char *zPhase,    /* When the error occcurs */
2740  int rc,                /* Error code returned from API */
2741  const char *zSql       /* SQL string, or NULL */
2742){
2743  char *zErr;
2744  char *zContext;
2745  sqlite3_str *pStr = sqlite3_str_new(0);
2746  sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
2747  if( rc>1 ){
2748    sqlite3_str_appendf(pStr, " (%d)", rc);
2749  }
2750  zContext = shell_error_context(zSql, db);
2751  if( zContext ){
2752    sqlite3_str_appendall(pStr, zContext);
2753    sqlite3_free(zContext);
2754  }
2755  zErr = sqlite3_str_finish(pStr);
2756  shell_check_oom(zErr);
2757  return zErr;
2758}
2759
2760#ifdef __linux__
2761/*
2762** Attempt to display I/O stats on Linux using /proc/PID/io
2763*/
2764static void displayLinuxIoStats(FILE *out){
2765  FILE *in;
2766  char z[200];
2767  sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2768  in = fopen(z, "rb");
2769  if( in==0 ) return;
2770  while( fgets(z, sizeof(z), in)!=0 ){
2771    static const struct {
2772      const char *zPattern;
2773      const char *zDesc;
2774    } aTrans[] = {
2775      { "rchar: ",                  "Bytes received by read():" },
2776      { "wchar: ",                  "Bytes sent to write():"    },
2777      { "syscr: ",                  "Read() system calls:"      },
2778      { "syscw: ",                  "Write() system calls:"     },
2779      { "read_bytes: ",             "Bytes read from storage:"  },
2780      { "write_bytes: ",            "Bytes written to storage:" },
2781      { "cancelled_write_bytes: ",  "Cancelled write bytes:"    },
2782    };
2783    int i;
2784    for(i=0; i<ArraySize(aTrans); i++){
2785      int n = strlen30(aTrans[i].zPattern);
2786      if( cli_strncmp(aTrans[i].zPattern, z, n)==0 ){
2787        utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2788        break;
2789      }
2790    }
2791  }
2792  fclose(in);
2793}
2794#endif
2795
2796/*
2797** Display a single line of status using 64-bit values.
2798*/
2799static void displayStatLine(
2800  ShellState *p,            /* The shell context */
2801  char *zLabel,             /* Label for this one line */
2802  char *zFormat,            /* Format for the result */
2803  int iStatusCtrl,          /* Which status to display */
2804  int bReset                /* True to reset the stats */
2805){
2806  sqlite3_int64 iCur = -1;
2807  sqlite3_int64 iHiwtr = -1;
2808  int i, nPercent;
2809  char zLine[200];
2810  sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2811  for(i=0, nPercent=0; zFormat[i]; i++){
2812    if( zFormat[i]=='%' ) nPercent++;
2813  }
2814  if( nPercent>1 ){
2815    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2816  }else{
2817    sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2818  }
2819  raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2820}
2821
2822/*
2823** Display memory stats.
2824*/
2825static int display_stats(
2826  sqlite3 *db,                /* Database to query */
2827  ShellState *pArg,           /* Pointer to ShellState */
2828  int bReset                  /* True to reset the stats */
2829){
2830  int iCur;
2831  int iHiwtr;
2832  FILE *out;
2833  if( pArg==0 || pArg->out==0 ) return 0;
2834  out = pArg->out;
2835
2836  if( pArg->pStmt && pArg->statsOn==2 ){
2837    int nCol, i, x;
2838    sqlite3_stmt *pStmt = pArg->pStmt;
2839    char z[100];
2840    nCol = sqlite3_column_count(pStmt);
2841    raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2842    for(i=0; i<nCol; i++){
2843      sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2844      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2845#ifndef SQLITE_OMIT_DECLTYPE
2846      sqlite3_snprintf(30, z+x, "declared type:");
2847      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2848#endif
2849#ifdef SQLITE_ENABLE_COLUMN_METADATA
2850      sqlite3_snprintf(30, z+x, "database name:");
2851      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2852      sqlite3_snprintf(30, z+x, "table name:");
2853      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2854      sqlite3_snprintf(30, z+x, "origin name:");
2855      utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2856#endif
2857    }
2858  }
2859
2860  if( pArg->statsOn==3 ){
2861    if( pArg->pStmt ){
2862      iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2863      raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2864    }
2865    return 0;
2866  }
2867
2868  displayStatLine(pArg, "Memory Used:",
2869     "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2870  displayStatLine(pArg, "Number of Outstanding Allocations:",
2871     "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2872  if( pArg->shellFlgs & SHFLG_Pagecache ){
2873    displayStatLine(pArg, "Number of Pcache Pages Used:",
2874       "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2875  }
2876  displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2877     "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2878  displayStatLine(pArg, "Largest Allocation:",
2879     "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2880  displayStatLine(pArg, "Largest Pcache Allocation:",
2881     "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2882#ifdef YYTRACKMAXSTACKDEPTH
2883  displayStatLine(pArg, "Deepest Parser Stack:",
2884     "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2885#endif
2886
2887  if( db ){
2888    if( pArg->shellFlgs & SHFLG_Lookaside ){
2889      iHiwtr = iCur = -1;
2890      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2891                        &iCur, &iHiwtr, bReset);
2892      raw_printf(pArg->out,
2893              "Lookaside Slots Used:                %d (max %d)\n",
2894              iCur, iHiwtr);
2895      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2896                        &iCur, &iHiwtr, bReset);
2897      raw_printf(pArg->out, "Successful lookaside attempts:       %d\n",
2898              iHiwtr);
2899      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2900                        &iCur, &iHiwtr, bReset);
2901      raw_printf(pArg->out, "Lookaside failures due to size:      %d\n",
2902              iHiwtr);
2903      sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2904                        &iCur, &iHiwtr, bReset);
2905      raw_printf(pArg->out, "Lookaside failures due to OOM:       %d\n",
2906              iHiwtr);
2907    }
2908    iHiwtr = iCur = -1;
2909    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2910    raw_printf(pArg->out, "Pager Heap Usage:                    %d bytes\n",
2911            iCur);
2912    iHiwtr = iCur = -1;
2913    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2914    raw_printf(pArg->out, "Page cache hits:                     %d\n", iCur);
2915    iHiwtr = iCur = -1;
2916    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2917    raw_printf(pArg->out, "Page cache misses:                   %d\n", iCur);
2918    iHiwtr = iCur = -1;
2919    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2920    raw_printf(pArg->out, "Page cache writes:                   %d\n", iCur);
2921    iHiwtr = iCur = -1;
2922    sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2923    raw_printf(pArg->out, "Page cache spills:                   %d\n", iCur);
2924    iHiwtr = iCur = -1;
2925    sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2926    raw_printf(pArg->out, "Schema Heap Usage:                   %d bytes\n",
2927            iCur);
2928    iHiwtr = iCur = -1;
2929    sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2930    raw_printf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",
2931            iCur);
2932  }
2933
2934  if( pArg->pStmt ){
2935    int iHit, iMiss;
2936    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2937                               bReset);
2938    raw_printf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
2939    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2940    raw_printf(pArg->out, "Sort Operations:                     %d\n", iCur);
2941    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2942    raw_printf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
2943    iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2944    iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2945    if( iHit || iMiss ){
2946      raw_printf(pArg->out, "Bloom filter bypass taken:           %d/%d\n",
2947            iHit, iHit+iMiss);
2948    }
2949    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2950    raw_printf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
2951    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2952    raw_printf(pArg->out, "Reprepare operations:                %d\n", iCur);
2953    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2954    raw_printf(pArg->out, "Number of times run:                 %d\n", iCur);
2955    iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2956    raw_printf(pArg->out, "Memory used by prepared stmt:        %d\n", iCur);
2957  }
2958
2959#ifdef __linux__
2960  displayLinuxIoStats(pArg->out);
2961#endif
2962
2963  /* Do not remove this machine readable comment: extra-stats-output-here */
2964
2965  return 0;
2966}
2967
2968/*
2969** Display scan stats.
2970*/
2971static void display_scanstats(
2972  sqlite3 *db,                    /* Database to query */
2973  ShellState *pArg                /* Pointer to ShellState */
2974){
2975#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2976  UNUSED_PARAMETER(db);
2977  UNUSED_PARAMETER(pArg);
2978#else
2979  int i, k, n, mx;
2980  raw_printf(pArg->out, "-------- scanstats --------\n");
2981  mx = 0;
2982  for(k=0; k<=mx; k++){
2983    double rEstLoop = 1.0;
2984    for(i=n=0; 1; i++){
2985      sqlite3_stmt *p = pArg->pStmt;
2986      sqlite3_int64 nLoop, nVisit;
2987      double rEst;
2988      int iSid;
2989      const char *zExplain;
2990      if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2991        break;
2992      }
2993      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2994      if( iSid>mx ) mx = iSid;
2995      if( iSid!=k ) continue;
2996      if( n==0 ){
2997        rEstLoop = (double)nLoop;
2998        if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2999      }
3000      n++;
3001      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
3002      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
3003      sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
3004      utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
3005      rEstLoop *= rEst;
3006      raw_printf(pArg->out,
3007          "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
3008          nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
3009      );
3010    }
3011  }
3012  raw_printf(pArg->out, "---------------------------\n");
3013#endif
3014}
3015
3016/*
3017** Parameter azArray points to a zero-terminated array of strings. zStr
3018** points to a single nul-terminated string. Return non-zero if zStr
3019** is equal, according to strcmp(), to any of the strings in the array.
3020** Otherwise, return zero.
3021*/
3022static int str_in_array(const char *zStr, const char **azArray){
3023  int i;
3024  for(i=0; azArray[i]; i++){
3025    if( 0==cli_strcmp(zStr, azArray[i]) ) return 1;
3026  }
3027  return 0;
3028}
3029
3030/*
3031** If compiled statement pSql appears to be an EXPLAIN statement, allocate
3032** and populate the ShellState.aiIndent[] array with the number of
3033** spaces each opcode should be indented before it is output.
3034**
3035** The indenting rules are:
3036**
3037**     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
3038**       all opcodes that occur between the p2 jump destination and the opcode
3039**       itself by 2 spaces.
3040**
3041**     * Do the previous for "Return" instructions for when P2 is positive.
3042**       See tag-20220407a in wherecode.c and vdbe.c.
3043**
3044**     * For each "Goto", if the jump destination is earlier in the program
3045**       and ends on one of:
3046**          Yield  SeekGt  SeekLt  RowSetRead  Rewind
3047**       or if the P1 parameter is one instead of zero,
3048**       then indent all opcodes between the earlier instruction
3049**       and "Goto" by 2 spaces.
3050*/
3051static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
3052  const char *zSql;               /* The text of the SQL statement */
3053  const char *z;                  /* Used to check if this is an EXPLAIN */
3054  int *abYield = 0;               /* True if op is an OP_Yield */
3055  int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
3056  int iOp;                        /* Index of operation in p->aiIndent[] */
3057
3058  const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
3059                           "Return", 0 };
3060  const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
3061                            "Rewind", 0 };
3062  const char *azGoto[] = { "Goto", 0 };
3063
3064  /* Try to figure out if this is really an EXPLAIN statement. If this
3065  ** cannot be verified, return early.  */
3066  if( sqlite3_column_count(pSql)!=8 ){
3067    p->cMode = p->mode;
3068    return;
3069  }
3070  zSql = sqlite3_sql(pSql);
3071  if( zSql==0 ) return;
3072  for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
3073  if( sqlite3_strnicmp(z, "explain", 7) ){
3074    p->cMode = p->mode;
3075    return;
3076  }
3077
3078  for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
3079    int i;
3080    int iAddr = sqlite3_column_int(pSql, 0);
3081    const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
3082
3083    /* Set p2 to the P2 field of the current opcode. Then, assuming that
3084    ** p2 is an instruction address, set variable p2op to the index of that
3085    ** instruction in the aiIndent[] array. p2 and p2op may be different if
3086    ** the current instruction is part of a sub-program generated by an
3087    ** SQL trigger or foreign key.  */
3088    int p2 = sqlite3_column_int(pSql, 3);
3089    int p2op = (p2 + (iOp-iAddr));
3090
3091    /* Grow the p->aiIndent array as required */
3092    if( iOp>=nAlloc ){
3093      if( iOp==0 ){
3094        /* Do further verfication that this is explain output.  Abort if
3095        ** it is not */
3096        static const char *explainCols[] = {
3097           "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3098        int jj;
3099        for(jj=0; jj<ArraySize(explainCols); jj++){
3100          if( cli_strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3101            p->cMode = p->mode;
3102            sqlite3_reset(pSql);
3103            return;
3104          }
3105        }
3106      }
3107      nAlloc += 100;
3108      p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3109      shell_check_oom(p->aiIndent);
3110      abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
3111      shell_check_oom(abYield);
3112    }
3113    abYield[iOp] = str_in_array(zOp, azYield);
3114    p->aiIndent[iOp] = 0;
3115    p->nIndent = iOp+1;
3116
3117    if( str_in_array(zOp, azNext) && p2op>0 ){
3118      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3119    }
3120    if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3121     && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3122    ){
3123      for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3124    }
3125  }
3126
3127  p->iIndent = 0;
3128  sqlite3_free(abYield);
3129  sqlite3_reset(pSql);
3130}
3131
3132/*
3133** Free the array allocated by explain_data_prepare().
3134*/
3135static void explain_data_delete(ShellState *p){
3136  sqlite3_free(p->aiIndent);
3137  p->aiIndent = 0;
3138  p->nIndent = 0;
3139  p->iIndent = 0;
3140}
3141
3142/*
3143** Disable and restore .wheretrace and .treetrace/.selecttrace settings.
3144*/
3145static unsigned int savedSelectTrace;
3146static unsigned int savedWhereTrace;
3147static void disable_debug_trace_modes(void){
3148  unsigned int zero = 0;
3149  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
3150  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
3151  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
3152  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
3153}
3154static void restore_debug_trace_modes(void){
3155  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
3156  sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
3157}
3158
3159/* Create the TEMP table used to store parameter bindings */
3160static void bind_table_init(ShellState *p){
3161  int wrSchema = 0;
3162  int defensiveMode = 0;
3163  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
3164  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
3165  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
3166  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
3167  sqlite3_exec(p->db,
3168    "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
3169    "  key TEXT PRIMARY KEY,\n"
3170    "  value\n"
3171    ") WITHOUT ROWID;",
3172    0, 0, 0);
3173  sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3174  sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3175}
3176
3177/*
3178** Bind parameters on a prepared statement.
3179**
3180** Parameter bindings are taken from a TEMP table of the form:
3181**
3182**    CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3183**    WITHOUT ROWID;
3184**
3185** No bindings occur if this table does not exist.  The name of the table
3186** begins with "sqlite_" so that it will not collide with ordinary application
3187** tables.  The table must be in the TEMP schema.
3188*/
3189static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3190  int nVar;
3191  int i;
3192  int rc;
3193  sqlite3_stmt *pQ = 0;
3194
3195  nVar = sqlite3_bind_parameter_count(pStmt);
3196  if( nVar==0 ) return;  /* Nothing to do */
3197  if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3198                                    "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3199    return; /* Parameter table does not exist */
3200  }
3201  rc = sqlite3_prepare_v2(pArg->db,
3202          "SELECT value FROM temp.sqlite_parameters"
3203          " WHERE key=?1", -1, &pQ, 0);
3204  if( rc || pQ==0 ) return;
3205  for(i=1; i<=nVar; i++){
3206    char zNum[30];
3207    const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3208    if( zVar==0 ){
3209      sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3210      zVar = zNum;
3211    }
3212    sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3213    if( sqlite3_step(pQ)==SQLITE_ROW ){
3214      sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3215    }else{
3216      sqlite3_bind_null(pStmt, i);
3217    }
3218    sqlite3_reset(pQ);
3219  }
3220  sqlite3_finalize(pQ);
3221}
3222
3223/*
3224** UTF8 box-drawing characters.  Imagine box lines like this:
3225**
3226**           1
3227**           |
3228**       4 --+-- 2
3229**           |
3230**           3
3231**
3232** Each box characters has between 2 and 4 of the lines leading from
3233** the center.  The characters are here identified by the numbers of
3234** their corresponding lines.
3235*/
3236#define BOX_24   "\342\224\200"  /* U+2500 --- */
3237#define BOX_13   "\342\224\202"  /* U+2502  |  */
3238#define BOX_23   "\342\224\214"  /* U+250c  ,- */
3239#define BOX_34   "\342\224\220"  /* U+2510 -,  */
3240#define BOX_12   "\342\224\224"  /* U+2514  '- */
3241#define BOX_14   "\342\224\230"  /* U+2518 -'  */
3242#define BOX_123  "\342\224\234"  /* U+251c  |- */
3243#define BOX_134  "\342\224\244"  /* U+2524 -|  */
3244#define BOX_234  "\342\224\254"  /* U+252c -,- */
3245#define BOX_124  "\342\224\264"  /* U+2534 -'- */
3246#define BOX_1234 "\342\224\274"  /* U+253c -|- */
3247
3248/* Draw horizontal line N characters long using unicode box
3249** characters
3250*/
3251static void print_box_line(FILE *out, int N){
3252  const char zDash[] =
3253      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3254      BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3255  const int nDash = sizeof(zDash) - 1;
3256  N *= 3;
3257  while( N>nDash ){
3258    utf8_printf(out, zDash);
3259    N -= nDash;
3260  }
3261  utf8_printf(out, "%.*s", N, zDash);
3262}
3263
3264/*
3265** Draw a horizontal separator for a MODE_Box table.
3266*/
3267static void print_box_row_separator(
3268  ShellState *p,
3269  int nArg,
3270  const char *zSep1,
3271  const char *zSep2,
3272  const char *zSep3
3273){
3274  int i;
3275  if( nArg>0 ){
3276    utf8_printf(p->out, "%s", zSep1);
3277    print_box_line(p->out, p->actualWidth[0]+2);
3278    for(i=1; i<nArg; i++){
3279      utf8_printf(p->out, "%s", zSep2);
3280      print_box_line(p->out, p->actualWidth[i]+2);
3281    }
3282    utf8_printf(p->out, "%s", zSep3);
3283  }
3284  fputs("\n", p->out);
3285}
3286
3287/*
3288** z[] is a line of text that is to be displayed the .mode box or table or
3289** similar tabular formats.  z[] might contain control characters such
3290** as \n, \t, \f, or \r.
3291**
3292** Compute characters to display on the first line of z[].  Stop at the
3293** first \r, \n, or \f.  Expand \t into spaces.  Return a copy (obtained
3294** from malloc()) of that first line, which caller should free sometime.
3295** Write anything to display on the next line into *pzTail.  If this is
3296** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
3297*/
3298static char *translateForDisplayAndDup(
3299  const unsigned char *z,            /* Input text to be transformed */
3300  const unsigned char **pzTail,      /* OUT: Tail of the input for next line */
3301  int mxWidth,                       /* Max width.  0 means no limit */
3302  u8 bWordWrap                       /* If true, avoid breaking mid-word */
3303){
3304  int i;                 /* Input bytes consumed */
3305  int j;                 /* Output bytes generated */
3306  int k;                 /* Input bytes to be displayed */
3307  int n;                 /* Output column number */
3308  unsigned char *zOut;   /* Output text */
3309
3310  if( z==0 ){
3311    *pzTail = 0;
3312    return 0;
3313  }
3314  if( mxWidth<0 ) mxWidth = -mxWidth;
3315  if( mxWidth==0 ) mxWidth = 1000000;
3316  i = j = n = 0;
3317  while( n<mxWidth ){
3318    if( z[i]>=' ' ){
3319      n++;
3320      do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
3321      continue;
3322    }
3323    if( z[i]=='\t' ){
3324      do{
3325        n++;
3326        j++;
3327      }while( (n&7)!=0 && n<mxWidth );
3328      i++;
3329      continue;
3330    }
3331    break;
3332  }
3333  if( n>=mxWidth && bWordWrap  ){
3334    /* Perhaps try to back up to a better place to break the line */
3335    for(k=i; k>i/2; k--){
3336      if( isspace(z[k-1]) ) break;
3337    }
3338    if( k<=i/2 ){
3339      for(k=i; k>i/2; k--){
3340        if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
3341      }
3342    }
3343    if( k<=i/2 ){
3344      k = i;
3345    }else{
3346      i = k;
3347      while( z[i]==' ' ) i++;
3348    }
3349  }else{
3350    k = i;
3351  }
3352  if( n>=mxWidth && z[i]>=' ' ){
3353   *pzTail = &z[i];
3354  }else if( z[i]=='\r' && z[i+1]=='\n' ){
3355    *pzTail = z[i+2] ? &z[i+2] : 0;
3356  }else if( z[i]==0 || z[i+1]==0 ){
3357    *pzTail = 0;
3358  }else{
3359    *pzTail = &z[i+1];
3360  }
3361  zOut = malloc( j+1 );
3362  shell_check_oom(zOut);
3363  i = j = n = 0;
3364  while( i<k ){
3365    if( z[i]>=' ' ){
3366      n++;
3367      do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
3368      continue;
3369    }
3370    if( z[i]=='\t' ){
3371      do{
3372        n++;
3373        zOut[j++] = ' ';
3374      }while( (n&7)!=0 && n<mxWidth );
3375      i++;
3376      continue;
3377    }
3378    break;
3379  }
3380  zOut[j] = 0;
3381  return (char*)zOut;
3382}
3383
3384/* Extract the value of the i-th current column for pStmt as an SQL literal
3385** value.  Memory is obtained from sqlite3_malloc64() and must be freed by
3386** the caller.
3387*/
3388static char *quoted_column(sqlite3_stmt *pStmt, int i){
3389  switch( sqlite3_column_type(pStmt, i) ){
3390    case SQLITE_NULL: {
3391      return sqlite3_mprintf("NULL");
3392    }
3393    case SQLITE_INTEGER:
3394    case SQLITE_FLOAT: {
3395      return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
3396    }
3397    case SQLITE_TEXT: {
3398      return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
3399    }
3400    case SQLITE_BLOB: {
3401      int j;
3402      sqlite3_str *pStr = sqlite3_str_new(0);
3403      const unsigned char *a = sqlite3_column_blob(pStmt,i);
3404      int n = sqlite3_column_bytes(pStmt,i);
3405      sqlite3_str_append(pStr, "x'", 2);
3406      for(j=0; j<n; j++){
3407        sqlite3_str_appendf(pStr, "%02x", a[j]);
3408      }
3409      sqlite3_str_append(pStr, "'", 1);
3410      return sqlite3_str_finish(pStr);
3411    }
3412  }
3413  return 0; /* Not reached */
3414}
3415
3416/*
3417** Run a prepared statement and output the result in one of the
3418** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3419** or MODE_Box.
3420**
3421** This is different from ordinary exec_prepared_stmt() in that
3422** it has to run the entire query and gather the results into memory
3423** first, in order to determine column widths, before providing
3424** any output.
3425*/
3426static void exec_prepared_stmt_columnar(
3427  ShellState *p,                        /* Pointer to ShellState */
3428  sqlite3_stmt *pStmt                   /* Statment to run */
3429){
3430  sqlite3_int64 nRow = 0;
3431  int nColumn = 0;
3432  char **azData = 0;
3433  sqlite3_int64 nAlloc = 0;
3434  char *abRowDiv = 0;
3435  const unsigned char *uz;
3436  const char *z;
3437  char **azQuoted = 0;
3438  int rc;
3439  sqlite3_int64 i, nData;
3440  int j, nTotal, w, n;
3441  const char *colSep = 0;
3442  const char *rowSep = 0;
3443  const unsigned char **azNextLine = 0;
3444  int bNextLine = 0;
3445  int bMultiLineRowExists = 0;
3446  int bw = p->cmOpts.bWordWrap;
3447  const char *zEmpty = "";
3448  const char *zShowNull = p->nullValue;
3449
3450  rc = sqlite3_step(pStmt);
3451  if( rc!=SQLITE_ROW ) return;
3452  nColumn = sqlite3_column_count(pStmt);
3453  nAlloc = nColumn*4;
3454  if( nAlloc<=0 ) nAlloc = 1;
3455  azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3456  shell_check_oom(azData);
3457  azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
3458  shell_check_oom((void*)azNextLine);
3459  memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
3460  if( p->cmOpts.bQuote ){
3461    azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
3462    shell_check_oom(azQuoted);
3463    memset(azQuoted, 0, nColumn*sizeof(char*) );
3464  }
3465  abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
3466  shell_check_oom(abRowDiv);
3467  if( nColumn>p->nWidth ){
3468    p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3469    shell_check_oom(p->colWidth);
3470    for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3471    p->nWidth = nColumn;
3472    p->actualWidth = &p->colWidth[nColumn];
3473  }
3474  memset(p->actualWidth, 0, nColumn*sizeof(int));
3475  for(i=0; i<nColumn; i++){
3476    w = p->colWidth[i];
3477    if( w<0 ) w = -w;
3478    p->actualWidth[i] = w;
3479  }
3480  for(i=0; i<nColumn; i++){
3481    const unsigned char *zNotUsed;
3482    int wx = p->colWidth[i];
3483    if( wx==0 ){
3484      wx = p->cmOpts.iWrap;
3485    }
3486    if( wx<0 ) wx = -wx;
3487    uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
3488    azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
3489  }
3490  do{
3491    int useNextLine = bNextLine;
3492    bNextLine = 0;
3493    if( (nRow+2)*nColumn >= nAlloc ){
3494      nAlloc *= 2;
3495      azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3496      shell_check_oom(azData);
3497      abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
3498      shell_check_oom(abRowDiv);
3499    }
3500    abRowDiv[nRow] = 1;
3501    nRow++;
3502    for(i=0; i<nColumn; i++){
3503      int wx = p->colWidth[i];
3504      if( wx==0 ){
3505        wx = p->cmOpts.iWrap;
3506      }
3507      if( wx<0 ) wx = -wx;
3508      if( useNextLine ){
3509        uz = azNextLine[i];
3510        if( uz==0 ) uz = (u8*)zEmpty;
3511      }else if( p->cmOpts.bQuote ){
3512        sqlite3_free(azQuoted[i]);
3513        azQuoted[i] = quoted_column(pStmt,i);
3514        uz = (const unsigned char*)azQuoted[i];
3515      }else{
3516        uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
3517        if( uz==0 ) uz = (u8*)zShowNull;
3518      }
3519      azData[nRow*nColumn + i]
3520        = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
3521      if( azNextLine[i] ){
3522        bNextLine = 1;
3523        abRowDiv[nRow-1] = 0;
3524        bMultiLineRowExists = 1;
3525      }
3526    }
3527  }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
3528  nTotal = nColumn*(nRow+1);
3529  for(i=0; i<nTotal; i++){
3530    z = azData[i];
3531    if( z==0 ) z = (char*)zEmpty;
3532    n = strlenChar(z);
3533    j = i%nColumn;
3534    if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3535  }
3536  if( seenInterrupt ) goto columnar_end;
3537  if( nColumn==0 ) goto columnar_end;
3538  switch( p->cMode ){
3539    case MODE_Column: {
3540      colSep = "  ";
3541      rowSep = "\n";
3542      if( p->showHeader ){
3543        for(i=0; i<nColumn; i++){
3544          w = p->actualWidth[i];
3545          if( p->colWidth[i]<0 ) w = -w;
3546          utf8_width_print(p->out, w, azData[i]);
3547          fputs(i==nColumn-1?"\n":"  ", p->out);
3548        }
3549        for(i=0; i<nColumn; i++){
3550          print_dashes(p->out, p->actualWidth[i]);
3551          fputs(i==nColumn-1?"\n":"  ", p->out);
3552        }
3553      }
3554      break;
3555    }
3556    case MODE_Table: {
3557      colSep = " | ";
3558      rowSep = " |\n";
3559      print_row_separator(p, nColumn, "+");
3560      fputs("| ", p->out);
3561      for(i=0; i<nColumn; i++){
3562        w = p->actualWidth[i];
3563        n = strlenChar(azData[i]);
3564        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3565        fputs(i==nColumn-1?" |\n":" | ", p->out);
3566      }
3567      print_row_separator(p, nColumn, "+");
3568      break;
3569    }
3570    case MODE_Markdown: {
3571      colSep = " | ";
3572      rowSep = " |\n";
3573      fputs("| ", p->out);
3574      for(i=0; i<nColumn; i++){
3575        w = p->actualWidth[i];
3576        n = strlenChar(azData[i]);
3577        utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3578        fputs(i==nColumn-1?" |\n":" | ", p->out);
3579      }
3580      print_row_separator(p, nColumn, "|");
3581      break;
3582    }
3583    case MODE_Box: {
3584      colSep = " " BOX_13 " ";
3585      rowSep = " " BOX_13 "\n";
3586      print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3587      utf8_printf(p->out, BOX_13 " ");
3588      for(i=0; i<nColumn; i++){
3589        w = p->actualWidth[i];
3590        n = strlenChar(azData[i]);
3591        utf8_printf(p->out, "%*s%s%*s%s",
3592            (w-n)/2, "", azData[i], (w-n+1)/2, "",
3593            i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3594      }
3595      print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3596      break;
3597    }
3598  }
3599  for(i=nColumn, j=0; i<nTotal; i++, j++){
3600    if( j==0 && p->cMode!=MODE_Column ){
3601      utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3602    }
3603    z = azData[i];
3604    if( z==0 ) z = p->nullValue;
3605    w = p->actualWidth[j];
3606    if( p->colWidth[j]<0 ) w = -w;
3607    utf8_width_print(p->out, w, z);
3608    if( j==nColumn-1 ){
3609      utf8_printf(p->out, "%s", rowSep);
3610      if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
3611        if( p->cMode==MODE_Table ){
3612          print_row_separator(p, nColumn, "+");
3613        }else if( p->cMode==MODE_Box ){
3614          print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3615        }else if( p->cMode==MODE_Column ){
3616          raw_printf(p->out, "\n");
3617        }
3618      }
3619      j = -1;
3620      if( seenInterrupt ) goto columnar_end;
3621    }else{
3622      utf8_printf(p->out, "%s", colSep);
3623    }
3624  }
3625  if( p->cMode==MODE_Table ){
3626    print_row_separator(p, nColumn, "+");
3627  }else if( p->cMode==MODE_Box ){
3628    print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3629  }
3630columnar_end:
3631  if( seenInterrupt ){
3632    utf8_printf(p->out, "Interrupt\n");
3633  }
3634  nData = (nRow+1)*nColumn;
3635  for(i=0; i<nData; i++){
3636    z = azData[i];
3637    if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
3638  }
3639  sqlite3_free(azData);
3640  sqlite3_free((void*)azNextLine);
3641  sqlite3_free(abRowDiv);
3642  if( azQuoted ){
3643    for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
3644    sqlite3_free(azQuoted);
3645  }
3646}
3647
3648/*
3649** Run a prepared statement
3650*/
3651static void exec_prepared_stmt(
3652  ShellState *pArg,                                /* Pointer to ShellState */
3653  sqlite3_stmt *pStmt                              /* Statment to run */
3654){
3655  int rc;
3656  sqlite3_uint64 nRow = 0;
3657
3658  if( pArg->cMode==MODE_Column
3659   || pArg->cMode==MODE_Table
3660   || pArg->cMode==MODE_Box
3661   || pArg->cMode==MODE_Markdown
3662  ){
3663    exec_prepared_stmt_columnar(pArg, pStmt);
3664    return;
3665  }
3666
3667  /* perform the first step.  this will tell us if we
3668  ** have a result set or not and how wide it is.
3669  */
3670  rc = sqlite3_step(pStmt);
3671  /* if we have a result set... */
3672  if( SQLITE_ROW == rc ){
3673    /* allocate space for col name ptr, value ptr, and type */
3674    int nCol = sqlite3_column_count(pStmt);
3675    void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3676    if( !pData ){
3677      shell_out_of_memory();
3678    }else{
3679      char **azCols = (char **)pData;      /* Names of result columns */
3680      char **azVals = &azCols[nCol];       /* Results */
3681      int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3682      int i, x;
3683      assert(sizeof(int) <= sizeof(char *));
3684      /* save off ptrs to column names */
3685      for(i=0; i<nCol; i++){
3686        azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3687      }
3688      do{
3689        nRow++;
3690        /* extract the data and data types */
3691        for(i=0; i<nCol; i++){
3692          aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3693          if( x==SQLITE_BLOB
3694           && pArg
3695           && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
3696          ){
3697            azVals[i] = "";
3698          }else{
3699            azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3700          }
3701          if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3702            rc = SQLITE_NOMEM;
3703            break; /* from for */
3704          }
3705        } /* end for */
3706
3707        /* if data and types extracted successfully... */
3708        if( SQLITE_ROW == rc ){
3709          /* call the supplied callback with the result row data */
3710          if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3711            rc = SQLITE_ABORT;
3712          }else{
3713            rc = sqlite3_step(pStmt);
3714          }
3715        }
3716      } while( SQLITE_ROW == rc );
3717      sqlite3_free(pData);
3718      if( pArg->cMode==MODE_Json ){
3719        fputs("]\n", pArg->out);
3720      }else if( pArg->cMode==MODE_Count ){
3721        char zBuf[200];
3722        sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
3723                         nRow, nRow!=1 ? "s" : "");
3724        printf("%s", zBuf);
3725      }
3726    }
3727  }
3728}
3729
3730#ifndef SQLITE_OMIT_VIRTUALTABLE
3731/*
3732** This function is called to process SQL if the previous shell command
3733** was ".expert". It passes the SQL in the second argument directly to
3734** the sqlite3expert object.
3735**
3736** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3737** code. In this case, (*pzErr) may be set to point to a buffer containing
3738** an English language error message. It is the responsibility of the
3739** caller to eventually free this buffer using sqlite3_free().
3740*/
3741static int expertHandleSQL(
3742  ShellState *pState,
3743  const char *zSql,
3744  char **pzErr
3745){
3746  assert( pState->expert.pExpert );
3747  assert( pzErr==0 || *pzErr==0 );
3748  return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3749}
3750
3751/*
3752** This function is called either to silently clean up the object
3753** created by the ".expert" command (if bCancel==1), or to generate a
3754** report from it and then clean it up (if bCancel==0).
3755**
3756** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3757** code. In this case, (*pzErr) may be set to point to a buffer containing
3758** an English language error message. It is the responsibility of the
3759** caller to eventually free this buffer using sqlite3_free().
3760*/
3761static int expertFinish(
3762  ShellState *pState,
3763  int bCancel,
3764  char **pzErr
3765){
3766  int rc = SQLITE_OK;
3767  sqlite3expert *p = pState->expert.pExpert;
3768  assert( p );
3769  assert( bCancel || pzErr==0 || *pzErr==0 );
3770  if( bCancel==0 ){
3771    FILE *out = pState->out;
3772    int bVerbose = pState->expert.bVerbose;
3773
3774    rc = sqlite3_expert_analyze(p, pzErr);
3775    if( rc==SQLITE_OK ){
3776      int nQuery = sqlite3_expert_count(p);
3777      int i;
3778
3779      if( bVerbose ){
3780        const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3781        raw_printf(out, "-- Candidates -----------------------------\n");
3782        raw_printf(out, "%s\n", zCand);
3783      }
3784      for(i=0; i<nQuery; i++){
3785        const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3786        const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3787        const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3788        if( zIdx==0 ) zIdx = "(no new indexes)\n";
3789        if( bVerbose ){
3790          raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3791          raw_printf(out, "%s\n\n", zSql);
3792        }
3793        raw_printf(out, "%s\n", zIdx);
3794        raw_printf(out, "%s\n", zEQP);
3795      }
3796    }
3797  }
3798  sqlite3_expert_destroy(p);
3799  pState->expert.pExpert = 0;
3800  return rc;
3801}
3802
3803/*
3804** Implementation of ".expert" dot command.
3805*/
3806static int expertDotCommand(
3807  ShellState *pState,             /* Current shell tool state */
3808  char **azArg,                   /* Array of arguments passed to dot command */
3809  int nArg                        /* Number of entries in azArg[] */
3810){
3811  int rc = SQLITE_OK;
3812  char *zErr = 0;
3813  int i;
3814  int iSample = 0;
3815
3816  assert( pState->expert.pExpert==0 );
3817  memset(&pState->expert, 0, sizeof(ExpertInfo));
3818
3819  for(i=1; rc==SQLITE_OK && i<nArg; i++){
3820    char *z = azArg[i];
3821    int n;
3822    if( z[0]=='-' && z[1]=='-' ) z++;
3823    n = strlen30(z);
3824    if( n>=2 && 0==cli_strncmp(z, "-verbose", n) ){
3825      pState->expert.bVerbose = 1;
3826    }
3827    else if( n>=2 && 0==cli_strncmp(z, "-sample", n) ){
3828      if( i==(nArg-1) ){
3829        raw_printf(stderr, "option requires an argument: %s\n", z);
3830        rc = SQLITE_ERROR;
3831      }else{
3832        iSample = (int)integerValue(azArg[++i]);
3833        if( iSample<0 || iSample>100 ){
3834          raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3835          rc = SQLITE_ERROR;
3836        }
3837      }
3838    }
3839    else{
3840      raw_printf(stderr, "unknown option: %s\n", z);
3841      rc = SQLITE_ERROR;
3842    }
3843  }
3844
3845  if( rc==SQLITE_OK ){
3846    pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3847    if( pState->expert.pExpert==0 ){
3848      raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3849      rc = SQLITE_ERROR;
3850    }else{
3851      sqlite3_expert_config(
3852          pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3853      );
3854    }
3855  }
3856  sqlite3_free(zErr);
3857
3858  return rc;
3859}
3860#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3861
3862/*
3863** Execute a statement or set of statements.  Print
3864** any result rows/columns depending on the current mode
3865** set via the supplied callback.
3866**
3867** This is very similar to SQLite's built-in sqlite3_exec()
3868** function except it takes a slightly different callback
3869** and callback data argument.
3870*/
3871static int shell_exec(
3872  ShellState *pArg,                         /* Pointer to ShellState */
3873  const char *zSql,                         /* SQL to be evaluated */
3874  char **pzErrMsg                           /* Error msg written here */
3875){
3876  sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
3877  int rc = SQLITE_OK;             /* Return Code */
3878  int rc2;
3879  const char *zLeftover;          /* Tail of unprocessed SQL */
3880  sqlite3 *db = pArg->db;
3881
3882  if( pzErrMsg ){
3883    *pzErrMsg = NULL;
3884  }
3885
3886#ifndef SQLITE_OMIT_VIRTUALTABLE
3887  if( pArg->expert.pExpert ){
3888    rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3889    return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3890  }
3891#endif
3892
3893  while( zSql[0] && (SQLITE_OK == rc) ){
3894    static const char *zStmtSql;
3895    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3896    if( SQLITE_OK != rc ){
3897      if( pzErrMsg ){
3898        *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
3899      }
3900    }else{
3901      if( !pStmt ){
3902        /* this happens for a comment or white-space */
3903        zSql = zLeftover;
3904        while( IsSpace(zSql[0]) ) zSql++;
3905        continue;
3906      }
3907      zStmtSql = sqlite3_sql(pStmt);
3908      if( zStmtSql==0 ) zStmtSql = "";
3909      while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3910
3911      /* save off the prepared statment handle and reset row count */
3912      if( pArg ){
3913        pArg->pStmt = pStmt;
3914        pArg->cnt = 0;
3915      }
3916
3917      /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3918      if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3919        sqlite3_stmt *pExplain;
3920        char *zEQP;
3921        int triggerEQP = 0;
3922        disable_debug_trace_modes();
3923        sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3924        if( pArg->autoEQP>=AUTOEQP_trigger ){
3925          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3926        }
3927        zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3928        shell_check_oom(zEQP);
3929        rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3930        if( rc==SQLITE_OK ){
3931          while( sqlite3_step(pExplain)==SQLITE_ROW ){
3932            const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3933            int iEqpId = sqlite3_column_int(pExplain, 0);
3934            int iParentId = sqlite3_column_int(pExplain, 1);
3935            if( zEQPLine==0 ) zEQPLine = "";
3936            if( zEQPLine[0]=='-' ) eqp_render(pArg);
3937            eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3938          }
3939          eqp_render(pArg);
3940        }
3941        sqlite3_finalize(pExplain);
3942        sqlite3_free(zEQP);
3943        if( pArg->autoEQP>=AUTOEQP_full ){
3944          /* Also do an EXPLAIN for ".eqp full" mode */
3945          zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3946          shell_check_oom(zEQP);
3947          rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3948          if( rc==SQLITE_OK ){
3949            pArg->cMode = MODE_Explain;
3950            explain_data_prepare(pArg, pExplain);
3951            exec_prepared_stmt(pArg, pExplain);
3952            explain_data_delete(pArg);
3953          }
3954          sqlite3_finalize(pExplain);
3955          sqlite3_free(zEQP);
3956        }
3957        if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3958          sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3959          /* Reprepare pStmt before reactiving trace modes */
3960          sqlite3_finalize(pStmt);
3961          sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3962          if( pArg ) pArg->pStmt = pStmt;
3963        }
3964        restore_debug_trace_modes();
3965      }
3966
3967      if( pArg ){
3968        pArg->cMode = pArg->mode;
3969        if( pArg->autoExplain ){
3970          if( sqlite3_stmt_isexplain(pStmt)==1 ){
3971            pArg->cMode = MODE_Explain;
3972          }
3973          if( sqlite3_stmt_isexplain(pStmt)==2 ){
3974            pArg->cMode = MODE_EQP;
3975          }
3976        }
3977
3978        /* If the shell is currently in ".explain" mode, gather the extra
3979        ** data required to add indents to the output.*/
3980        if( pArg->cMode==MODE_Explain ){
3981          explain_data_prepare(pArg, pStmt);
3982        }
3983      }
3984
3985      bind_prepared_stmt(pArg, pStmt);
3986      exec_prepared_stmt(pArg, pStmt);
3987      explain_data_delete(pArg);
3988      eqp_render(pArg);
3989
3990      /* print usage stats if stats on */
3991      if( pArg && pArg->statsOn ){
3992        display_stats(db, pArg, 0);
3993      }
3994
3995      /* print loop-counters if required */
3996      if( pArg && pArg->scanstatsOn ){
3997        display_scanstats(db, pArg);
3998      }
3999
4000      /* Finalize the statement just executed. If this fails, save a
4001      ** copy of the error message. Otherwise, set zSql to point to the
4002      ** next statement to execute. */
4003      rc2 = sqlite3_finalize(pStmt);
4004      if( rc!=SQLITE_NOMEM ) rc = rc2;
4005      if( rc==SQLITE_OK ){
4006        zSql = zLeftover;
4007        while( IsSpace(zSql[0]) ) zSql++;
4008      }else if( pzErrMsg ){
4009        *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
4010      }
4011
4012      /* clear saved stmt handle */
4013      if( pArg ){
4014        pArg->pStmt = NULL;
4015      }
4016    }
4017  } /* end while */
4018
4019  return rc;
4020}
4021
4022/*
4023** Release memory previously allocated by tableColumnList().
4024*/
4025static void freeColumnList(char **azCol){
4026  int i;
4027  for(i=1; azCol[i]; i++){
4028    sqlite3_free(azCol[i]);
4029  }
4030  /* azCol[0] is a static string */
4031  sqlite3_free(azCol);
4032}
4033
4034/*
4035** Return a list of pointers to strings which are the names of all
4036** columns in table zTab.   The memory to hold the names is dynamically
4037** allocated and must be released by the caller using a subsequent call
4038** to freeColumnList().
4039**
4040** The azCol[0] entry is usually NULL.  However, if zTab contains a rowid
4041** value that needs to be preserved, then azCol[0] is filled in with the
4042** name of the rowid column.
4043**
4044** The first regular column in the table is azCol[1].  The list is terminated
4045** by an entry with azCol[i]==0.
4046*/
4047static char **tableColumnList(ShellState *p, const char *zTab){
4048  char **azCol = 0;
4049  sqlite3_stmt *pStmt;
4050  char *zSql;
4051  int nCol = 0;
4052  int nAlloc = 0;
4053  int nPK = 0;       /* Number of PRIMARY KEY columns seen */
4054  int isIPK = 0;     /* True if one PRIMARY KEY column of type INTEGER */
4055  int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
4056  int rc;
4057
4058  zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
4059  shell_check_oom(zSql);
4060  rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4061  sqlite3_free(zSql);
4062  if( rc ) return 0;
4063  while( sqlite3_step(pStmt)==SQLITE_ROW ){
4064    if( nCol>=nAlloc-2 ){
4065      nAlloc = nAlloc*2 + nCol + 10;
4066      azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
4067      shell_check_oom(azCol);
4068    }
4069    azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
4070    shell_check_oom(azCol[nCol]);
4071    if( sqlite3_column_int(pStmt, 5) ){
4072      nPK++;
4073      if( nPK==1
4074       && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
4075                          "INTEGER")==0
4076      ){
4077        isIPK = 1;
4078      }else{
4079        isIPK = 0;
4080      }
4081    }
4082  }
4083  sqlite3_finalize(pStmt);
4084  if( azCol==0 ) return 0;
4085  azCol[0] = 0;
4086  azCol[nCol+1] = 0;
4087
4088  /* The decision of whether or not a rowid really needs to be preserved
4089  ** is tricky.  We never need to preserve a rowid for a WITHOUT ROWID table
4090  ** or a table with an INTEGER PRIMARY KEY.  We are unable to preserve
4091  ** rowids on tables where the rowid is inaccessible because there are other
4092  ** columns in the table named "rowid", "_rowid_", and "oid".
4093  */
4094  if( preserveRowid && isIPK ){
4095    /* If a single PRIMARY KEY column with type INTEGER was seen, then it
4096    ** might be an alise for the ROWID.  But it might also be a WITHOUT ROWID
4097    ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
4098    ** ROWID aliases.  To distinguish these cases, check to see if
4099    ** there is a "pk" entry in "PRAGMA index_list".  There will be
4100    ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
4101    */
4102    zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
4103                           " WHERE origin='pk'", zTab);
4104    shell_check_oom(zSql);
4105    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4106    sqlite3_free(zSql);
4107    if( rc ){
4108      freeColumnList(azCol);
4109      return 0;
4110    }
4111    rc = sqlite3_step(pStmt);
4112    sqlite3_finalize(pStmt);
4113    preserveRowid = rc==SQLITE_ROW;
4114  }
4115  if( preserveRowid ){
4116    /* Only preserve the rowid if we can find a name to use for the
4117    ** rowid */
4118    static char *azRowid[] = { "rowid", "_rowid_", "oid" };
4119    int i, j;
4120    for(j=0; j<3; j++){
4121      for(i=1; i<=nCol; i++){
4122        if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
4123      }
4124      if( i>nCol ){
4125        /* At this point, we know that azRowid[j] is not the name of any
4126        ** ordinary column in the table.  Verify that azRowid[j] is a valid
4127        ** name for the rowid before adding it to azCol[0].  WITHOUT ROWID
4128        ** tables will fail this last check */
4129        rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
4130        if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
4131        break;
4132      }
4133    }
4134  }
4135  return azCol;
4136}
4137
4138/*
4139** Toggle the reverse_unordered_selects setting.
4140*/
4141static void toggleSelectOrder(sqlite3 *db){
4142  sqlite3_stmt *pStmt = 0;
4143  int iSetting = 0;
4144  char zStmt[100];
4145  sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
4146  if( sqlite3_step(pStmt)==SQLITE_ROW ){
4147    iSetting = sqlite3_column_int(pStmt, 0);
4148  }
4149  sqlite3_finalize(pStmt);
4150  sqlite3_snprintf(sizeof(zStmt), zStmt,
4151       "PRAGMA reverse_unordered_selects(%d)", !iSetting);
4152  sqlite3_exec(db, zStmt, 0, 0, 0);
4153}
4154
4155/*
4156** This is a different callback routine used for dumping the database.
4157** Each row received by this callback consists of a table name,
4158** the table type ("index" or "table") and SQL to create the table.
4159** This routine should print text sufficient to recreate the table.
4160*/
4161static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
4162  int rc;
4163  const char *zTable;
4164  const char *zType;
4165  const char *zSql;
4166  ShellState *p = (ShellState *)pArg;
4167  int dataOnly;
4168  int noSys;
4169
4170  UNUSED_PARAMETER(azNotUsed);
4171  if( nArg!=3 || azArg==0 ) return 0;
4172  zTable = azArg[0];
4173  zType = azArg[1];
4174  zSql = azArg[2];
4175  if( zTable==0 ) return 0;
4176  if( zType==0 ) return 0;
4177  dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
4178  noSys    = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
4179
4180  if( cli_strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
4181    if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
4182  }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
4183    if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
4184  }else if( cli_strncmp(zTable, "sqlite_", 7)==0 ){
4185    return 0;
4186  }else if( dataOnly ){
4187    /* no-op */
4188  }else if( cli_strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
4189    char *zIns;
4190    if( !p->writableSchema ){
4191      raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
4192      p->writableSchema = 1;
4193    }
4194    zIns = sqlite3_mprintf(
4195       "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
4196       "VALUES('table','%q','%q',0,'%q');",
4197       zTable, zTable, zSql);
4198    shell_check_oom(zIns);
4199    utf8_printf(p->out, "%s\n", zIns);
4200    sqlite3_free(zIns);
4201    return 0;
4202  }else{
4203    printSchemaLine(p->out, zSql, ";\n");
4204  }
4205
4206  if( cli_strcmp(zType, "table")==0 ){
4207    ShellText sSelect;
4208    ShellText sTable;
4209    char **azCol;
4210    int i;
4211    char *savedDestTable;
4212    int savedMode;
4213
4214    azCol = tableColumnList(p, zTable);
4215    if( azCol==0 ){
4216      p->nErr++;
4217      return 0;
4218    }
4219
4220    /* Always quote the table name, even if it appears to be pure ascii,
4221    ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
4222    initText(&sTable);
4223    appendText(&sTable, zTable, quoteChar(zTable));
4224    /* If preserving the rowid, add a column list after the table name.
4225    ** In other words:  "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
4226    ** instead of the usual "INSERT INTO tab VALUES(...)".
4227    */
4228    if( azCol[0] ){
4229      appendText(&sTable, "(", 0);
4230      appendText(&sTable, azCol[0], 0);
4231      for(i=1; azCol[i]; i++){
4232        appendText(&sTable, ",", 0);
4233        appendText(&sTable, azCol[i], quoteChar(azCol[i]));
4234      }
4235      appendText(&sTable, ")", 0);
4236    }
4237
4238    /* Build an appropriate SELECT statement */
4239    initText(&sSelect);
4240    appendText(&sSelect, "SELECT ", 0);
4241    if( azCol[0] ){
4242      appendText(&sSelect, azCol[0], 0);
4243      appendText(&sSelect, ",", 0);
4244    }
4245    for(i=1; azCol[i]; i++){
4246      appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
4247      if( azCol[i+1] ){
4248        appendText(&sSelect, ",", 0);
4249      }
4250    }
4251    freeColumnList(azCol);
4252    appendText(&sSelect, " FROM ", 0);
4253    appendText(&sSelect, zTable, quoteChar(zTable));
4254
4255    savedDestTable = p->zDestTable;
4256    savedMode = p->mode;
4257    p->zDestTable = sTable.z;
4258    p->mode = p->cMode = MODE_Insert;
4259    rc = shell_exec(p, sSelect.z, 0);
4260    if( (rc&0xff)==SQLITE_CORRUPT ){
4261      raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4262      toggleSelectOrder(p->db);
4263      shell_exec(p, sSelect.z, 0);
4264      toggleSelectOrder(p->db);
4265    }
4266    p->zDestTable = savedDestTable;
4267    p->mode = savedMode;
4268    freeText(&sTable);
4269    freeText(&sSelect);
4270    if( rc ) p->nErr++;
4271  }
4272  return 0;
4273}
4274
4275/*
4276** Run zQuery.  Use dump_callback() as the callback routine so that
4277** the contents of the query are output as SQL statements.
4278**
4279** If we get a SQLITE_CORRUPT error, rerun the query after appending
4280** "ORDER BY rowid DESC" to the end.
4281*/
4282static int run_schema_dump_query(
4283  ShellState *p,
4284  const char *zQuery
4285){
4286  int rc;
4287  char *zErr = 0;
4288  rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
4289  if( rc==SQLITE_CORRUPT ){
4290    char *zQ2;
4291    int len = strlen30(zQuery);
4292    raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4293    if( zErr ){
4294      utf8_printf(p->out, "/****** %s ******/\n", zErr);
4295      sqlite3_free(zErr);
4296      zErr = 0;
4297    }
4298    zQ2 = malloc( len+100 );
4299    if( zQ2==0 ) return rc;
4300    sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
4301    rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4302    if( rc ){
4303      utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
4304    }else{
4305      rc = SQLITE_CORRUPT;
4306    }
4307    sqlite3_free(zErr);
4308    free(zQ2);
4309  }
4310  return rc;
4311}
4312
4313/*
4314** Text of help messages.
4315**
4316** The help text for each individual command begins with a line that starts
4317** with ".".  Subsequent lines are supplemental information.
4318**
4319** There must be two or more spaces between the end of the command and the
4320** start of the description of what that command does.
4321*/
4322static const char *(azHelp[]) = {
4323#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) \
4324  && !defined(SQLITE_SHELL_FIDDLE)
4325  ".archive ...             Manage SQL archives",
4326  "   Each command must have exactly one of the following options:",
4327  "     -c, --create               Create a new archive",
4328  "     -u, --update               Add or update files with changed mtime",
4329  "     -i, --insert               Like -u but always add even if unchanged",
4330  "     -r, --remove               Remove files from archive",
4331  "     -t, --list                 List contents of archive",
4332  "     -x, --extract              Extract files from archive",
4333  "   Optional arguments:",
4334  "     -v, --verbose              Print each filename as it is processed",
4335  "     -f FILE, --file FILE       Use archive FILE (default is current db)",
4336  "     -a FILE, --append FILE     Open FILE using the apndvfs VFS",
4337  "     -C DIR, --directory DIR    Read/extract files from directory DIR",
4338  "     -g, --glob                 Use glob matching for names in archive",
4339  "     -n, --dryrun               Show the SQL that would have occurred",
4340  "   Examples:",
4341  "     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar",
4342  "     .ar -tf ARCHIVE          # List members of ARCHIVE",
4343  "     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE",
4344  "   See also:",
4345  "      http://sqlite.org/cli.html#sqlite_archive_support",
4346#endif
4347#ifndef SQLITE_OMIT_AUTHORIZATION
4348  ".auth ON|OFF             Show authorizer callbacks",
4349#endif
4350#ifndef SQLITE_SHELL_FIDDLE
4351  ".backup ?DB? FILE        Backup DB (default \"main\") to FILE",
4352  "   Options:",
4353  "       --append            Use the appendvfs",
4354  "       --async             Write to FILE without journal and fsync()",
4355#endif
4356  ".bail on|off             Stop after hitting an error.  Default OFF",
4357  ".binary on|off           Turn binary output on or off.  Default OFF",
4358#ifndef SQLITE_SHELL_FIDDLE
4359  ".cd DIRECTORY            Change the working directory to DIRECTORY",
4360#endif
4361  ".changes on|off          Show number of rows changed by SQL",
4362#ifndef SQLITE_SHELL_FIDDLE
4363  ".check GLOB              Fail if output since .testcase does not match",
4364  ".clone NEWDB             Clone data into NEWDB from the existing database",
4365#endif
4366  ".connection [close] [#]  Open or close an auxiliary database connection",
4367  ".databases               List names and files of attached databases",
4368  ".dbconfig ?op? ?val?     List or change sqlite3_db_config() options",
4369#if SQLITE_SHELL_HAVE_RECOVER
4370  ".dbinfo ?DB?             Show status information about the database",
4371#endif
4372  ".dump ?OBJECTS?          Render database content as SQL",
4373  "   Options:",
4374  "     --data-only            Output only INSERT statements",
4375  "     --newlines             Allow unescaped newline characters in output",
4376  "     --nosys                Omit system tables (ex: \"sqlite_stat1\")",
4377  "     --preserve-rowids      Include ROWID values in the output",
4378  "   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
4379  "   Additional LIKE patterns can be given in subsequent arguments",
4380  ".echo on|off             Turn command echo on or off",
4381  ".eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN",
4382  "   Other Modes:",
4383#ifdef SQLITE_DEBUG
4384  "      test                  Show raw EXPLAIN QUERY PLAN output",
4385  "      trace                 Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4386#endif
4387  "      trigger               Like \"full\" but also show trigger bytecode",
4388#ifndef SQLITE_SHELL_FIDDLE
4389  ".excel                   Display the output of next command in spreadsheet",
4390  "   --bom                   Put a UTF8 byte-order mark on intermediate file",
4391#endif
4392#ifndef SQLITE_SHELL_FIDDLE
4393  ".exit ?CODE?             Exit this program with return-code CODE",
4394#endif
4395  ".expert                  EXPERIMENTAL. Suggest indexes for queries",
4396  ".explain ?on|off|auto?   Change the EXPLAIN formatting mode.  Default: auto",
4397  ".filectrl CMD ...        Run various sqlite3_file_control() operations",
4398  "   --schema SCHEMA         Use SCHEMA instead of \"main\"",
4399  "   --help                  Show CMD details",
4400  ".fullschema ?--indent?   Show schema and the content of sqlite_stat tables",
4401  ".headers on|off          Turn display of headers on or off",
4402  ".help ?-all? ?PATTERN?   Show help text for PATTERN",
4403#ifndef SQLITE_SHELL_FIDDLE
4404  ".import FILE TABLE       Import data from FILE into TABLE",
4405  "   Options:",
4406  "     --ascii               Use \\037 and \\036 as column and row separators",
4407  "     --csv                 Use , and \\n as column and row separators",
4408  "     --skip N              Skip the first N rows of input",
4409  "     --schema S            Target table to be S.TABLE",
4410  "     -v                    \"Verbose\" - increase auxiliary output",
4411  "   Notes:",
4412  "     *  If TABLE does not exist, it is created.  The first row of input",
4413  "        determines the column names.",
4414  "     *  If neither --csv or --ascii are used, the input mode is derived",
4415  "        from the \".mode\" output mode",
4416  "     *  If FILE begins with \"|\" then it is a command that generates the",
4417  "        input text.",
4418#endif
4419#ifndef SQLITE_OMIT_TEST_CONTROL
4420  ".imposter INDEX TABLE    Create imposter table TABLE on index INDEX",
4421#endif
4422  ".indexes ?TABLE?         Show names of indexes",
4423  "                           If TABLE is specified, only show indexes for",
4424  "                           tables matching TABLE using the LIKE operator.",
4425#ifdef SQLITE_ENABLE_IOTRACE
4426  ".iotrace FILE            Enable I/O diagnostic logging to FILE",
4427#endif
4428  ".limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT",
4429  ".lint OPTIONS            Report potential schema issues.",
4430  "     Options:",
4431  "        fkey-indexes     Find missing foreign key indexes",
4432#if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
4433  ".load FILE ?ENTRY?       Load an extension library",
4434#endif
4435#ifndef SQLITE_SHELL_FIDDLE
4436  ".log FILE|off            Turn logging on or off.  FILE can be stderr/stdout",
4437#endif
4438  ".mode MODE ?OPTIONS?     Set output mode",
4439  "   MODE is one of:",
4440  "     ascii       Columns/rows delimited by 0x1F and 0x1E",
4441  "     box         Tables using unicode box-drawing characters",
4442  "     csv         Comma-separated values",
4443  "     column      Output in columns.  (See .width)",
4444  "     html        HTML <table> code",
4445  "     insert      SQL insert statements for TABLE",
4446  "     json        Results in a JSON array",
4447  "     line        One value per line",
4448  "     list        Values delimited by \"|\"",
4449  "     markdown    Markdown table format",
4450  "     qbox        Shorthand for \"box --wrap 60 --quote\"",
4451  "     quote       Escape answers as for SQL",
4452  "     table       ASCII-art table",
4453  "     tabs        Tab-separated values",
4454  "     tcl         TCL list elements",
4455  "   OPTIONS: (for columnar modes or insert mode):",
4456  "     --wrap N       Wrap output lines to no longer than N characters",
4457  "     --wordwrap B   Wrap or not at word boundaries per B (on/off)",
4458  "     --ww           Shorthand for \"--wordwrap 1\"",
4459  "     --quote        Quote output text as SQL literals",
4460  "     --noquote      Do not quote output text",
4461  "     TABLE          The name of SQL table used for \"insert\" mode",
4462#ifndef SQLITE_SHELL_FIDDLE
4463  ".nonce STRING            Suspend safe mode for one command if nonce matches",
4464#endif
4465  ".nullvalue STRING        Use STRING in place of NULL values",
4466#ifndef SQLITE_SHELL_FIDDLE
4467  ".once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE",
4468  "     If FILE begins with '|' then open as a pipe",
4469  "       --bom  Put a UTF8 byte-order mark at the beginning",
4470  "       -e     Send output to the system text editor",
4471  "       -x     Send output as CSV to a spreadsheet (same as \".excel\")",
4472  /* Note that .open is (partially) available in WASM builds but is
4473  ** currently only intended to be used by the fiddle tool, not
4474  ** end users, so is "undocumented." */
4475  ".open ?OPTIONS? ?FILE?   Close existing database and reopen FILE",
4476  "     Options:",
4477  "        --append        Use appendvfs to append database to the end of FILE",
4478#endif
4479#ifndef SQLITE_OMIT_DESERIALIZE
4480  "        --deserialize   Load into memory using sqlite3_deserialize()",
4481  "        --hexdb         Load the output of \"dbtotxt\" as an in-memory db",
4482  "        --maxsize N     Maximum size for --hexdb or --deserialized database",
4483#endif
4484  "        --new           Initialize FILE to an empty database",
4485  "        --nofollow      Do not follow symbolic links",
4486  "        --readonly      Open FILE readonly",
4487  "        --zip           FILE is a ZIP archive",
4488#ifndef SQLITE_SHELL_FIDDLE
4489  ".output ?FILE?           Send output to FILE or stdout if FILE is omitted",
4490  "   If FILE begins with '|' then open it as a pipe.",
4491  "   Options:",
4492  "     --bom                 Prefix output with a UTF8 byte-order mark",
4493  "     -e                    Send output to the system text editor",
4494  "     -x                    Send output as CSV to a spreadsheet",
4495#endif
4496  ".parameter CMD ...       Manage SQL parameter bindings",
4497  "   clear                   Erase all bindings",
4498  "   init                    Initialize the TEMP table that holds bindings",
4499  "   list                    List the current parameter bindings",
4500  "   set PARAMETER VALUE     Given SQL parameter PARAMETER a value of VALUE",
4501  "                           PARAMETER should start with one of: $ : @ ?",
4502  "   unset PARAMETER         Remove PARAMETER from the binding table",
4503  ".print STRING...         Print literal STRING",
4504#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4505  ".progress N              Invoke progress handler after every N opcodes",
4506  "   --limit N                 Interrupt after N progress callbacks",
4507  "   --once                    Do no more than one progress interrupt",
4508  "   --quiet|-q                No output except at interrupts",
4509  "   --reset                   Reset the count for each input and interrupt",
4510#endif
4511  ".prompt MAIN CONTINUE    Replace the standard prompts",
4512#ifndef SQLITE_SHELL_FIDDLE
4513  ".quit                    Exit this program",
4514  ".read FILE               Read input from FILE or command output",
4515  "    If FILE begins with \"|\", it is a command that generates the input.",
4516#endif
4517#if SQLITE_SHELL_HAVE_RECOVER
4518  ".recover                 Recover as much data as possible from corrupt db.",
4519  "   --ignore-freelist        Ignore pages that appear to be on db freelist",
4520  "   --lost-and-found TABLE   Alternative name for the lost-and-found table",
4521  "   --no-rowids              Do not attempt to recover rowid values",
4522  "                            that are not also INTEGER PRIMARY KEYs",
4523#endif
4524#ifndef SQLITE_SHELL_FIDDLE
4525  ".restore ?DB? FILE       Restore content of DB (default \"main\") from FILE",
4526  ".save ?OPTIONS? FILE     Write database to FILE (an alias for .backup ...)",
4527#endif
4528  ".scanstats on|off        Turn sqlite3_stmt_scanstatus() metrics on or off",
4529  ".schema ?PATTERN?        Show the CREATE statements matching PATTERN",
4530  "   Options:",
4531  "      --indent             Try to pretty-print the schema",
4532  "      --nosys              Omit objects whose names start with \"sqlite_\"",
4533  ".selftest ?OPTIONS?      Run tests defined in the SELFTEST table",
4534  "    Options:",
4535  "       --init               Create a new SELFTEST table",
4536  "       -v                   Verbose output",
4537  ".separator COL ?ROW?     Change the column and row separators",
4538#if defined(SQLITE_ENABLE_SESSION)
4539  ".session ?NAME? CMD ...  Create or control sessions",
4540  "   Subcommands:",
4541  "     attach TABLE             Attach TABLE",
4542  "     changeset FILE           Write a changeset into FILE",
4543  "     close                    Close one session",
4544  "     enable ?BOOLEAN?         Set or query the enable bit",
4545  "     filter GLOB...           Reject tables matching GLOBs",
4546  "     indirect ?BOOLEAN?       Mark or query the indirect status",
4547  "     isempty                  Query whether the session is empty",
4548  "     list                     List currently open session names",
4549  "     open DB NAME             Open a new session on DB",
4550  "     patchset FILE            Write a patchset into FILE",
4551  "   If ?NAME? is omitted, the first defined session is used.",
4552#endif
4553  ".sha3sum ...             Compute a SHA3 hash of database content",
4554  "    Options:",
4555  "      --schema              Also hash the sqlite_schema table",
4556  "      --sha3-224            Use the sha3-224 algorithm",
4557  "      --sha3-256            Use the sha3-256 algorithm (default)",
4558  "      --sha3-384            Use the sha3-384 algorithm",
4559  "      --sha3-512            Use the sha3-512 algorithm",
4560  "    Any other argument is a LIKE pattern for tables to hash",
4561#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
4562  ".shell CMD ARGS...       Run CMD ARGS... in a system shell",
4563#endif
4564  ".show                    Show the current values for various settings",
4565  ".stats ?ARG?             Show stats or turn stats on or off",
4566  "   off                      Turn off automatic stat display",
4567  "   on                       Turn on automatic stat display",
4568  "   stmt                     Show statement stats",
4569  "   vmstep                   Show the virtual machine step count only",
4570#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
4571  ".system CMD ARGS...      Run CMD ARGS... in a system shell",
4572#endif
4573  ".tables ?TABLE?          List names of tables matching LIKE pattern TABLE",
4574#ifndef SQLITE_SHELL_FIDDLE
4575  ".testcase NAME           Begin redirecting output to 'testcase-out.txt'",
4576#endif
4577  ".testctrl CMD ...        Run various sqlite3_test_control() operations",
4578  "                           Run \".testctrl\" with no arguments for details",
4579  ".timeout MS              Try opening locked tables for MS milliseconds",
4580  ".timer on|off            Turn SQL timer on or off",
4581#ifndef SQLITE_OMIT_TRACE
4582  ".trace ?OPTIONS?         Output each SQL statement as it is run",
4583  "    FILE                    Send output to FILE",
4584  "    stdout                  Send output to stdout",
4585  "    stderr                  Send output to stderr",
4586  "    off                     Disable tracing",
4587  "    --expanded              Expand query parameters",
4588#ifdef SQLITE_ENABLE_NORMALIZE
4589  "    --normalized            Normal the SQL statements",
4590#endif
4591  "    --plain                 Show SQL as it is input",
4592  "    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)",
4593  "    --profile               Profile statements (SQLITE_TRACE_PROFILE)",
4594  "    --row                   Trace each row (SQLITE_TRACE_ROW)",
4595  "    --close                 Trace connection close (SQLITE_TRACE_CLOSE)",
4596#endif /* SQLITE_OMIT_TRACE */
4597#ifdef SQLITE_DEBUG
4598  ".unmodule NAME ...       Unregister virtual table modules",
4599  "    --allexcept             Unregister everything except those named",
4600#endif
4601  ".vfsinfo ?AUX?           Information about the top-level VFS",
4602  ".vfslist                 List all available VFSes",
4603  ".vfsname ?AUX?           Print the name of the VFS stack",
4604  ".width NUM1 NUM2 ...     Set minimum column widths for columnar output",
4605  "     Negative values right-justify",
4606};
4607
4608/*
4609** Output help text.
4610**
4611** zPattern describes the set of commands for which help text is provided.
4612** If zPattern is NULL, then show all commands, but only give a one-line
4613** description of each.
4614**
4615** Return the number of matches.
4616*/
4617static int showHelp(FILE *out, const char *zPattern){
4618  int i = 0;
4619  int j = 0;
4620  int n = 0;
4621  char *zPat;
4622  if( zPattern==0
4623   || zPattern[0]=='0'
4624   || cli_strcmp(zPattern,"-a")==0
4625   || cli_strcmp(zPattern,"-all")==0
4626   || cli_strcmp(zPattern,"--all")==0
4627  ){
4628    /* Show all commands, but only one line per command */
4629    if( zPattern==0 ) zPattern = "";
4630    for(i=0; i<ArraySize(azHelp); i++){
4631      if( azHelp[i][0]=='.' || zPattern[0] ){
4632        utf8_printf(out, "%s\n", azHelp[i]);
4633        n++;
4634      }
4635    }
4636  }else{
4637    /* Look for commands that for which zPattern is an exact prefix */
4638    zPat = sqlite3_mprintf(".%s*", zPattern);
4639    shell_check_oom(zPat);
4640    for(i=0; i<ArraySize(azHelp); i++){
4641      if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4642        utf8_printf(out, "%s\n", azHelp[i]);
4643        j = i+1;
4644        n++;
4645      }
4646    }
4647    sqlite3_free(zPat);
4648    if( n ){
4649      if( n==1 ){
4650        /* when zPattern is a prefix of exactly one command, then include the
4651        ** details of that command, which should begin at offset j */
4652        while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4653          utf8_printf(out, "%s\n", azHelp[j]);
4654          j++;
4655        }
4656      }
4657      return n;
4658    }
4659    /* Look for commands that contain zPattern anywhere.  Show the complete
4660    ** text of all commands that match. */
4661    zPat = sqlite3_mprintf("%%%s%%", zPattern);
4662    shell_check_oom(zPat);
4663    for(i=0; i<ArraySize(azHelp); i++){
4664      if( azHelp[i][0]=='.' ) j = i;
4665      if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4666        utf8_printf(out, "%s\n", azHelp[j]);
4667        while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4668          j++;
4669          utf8_printf(out, "%s\n", azHelp[j]);
4670        }
4671        i = j;
4672        n++;
4673      }
4674    }
4675    sqlite3_free(zPat);
4676  }
4677  return n;
4678}
4679
4680/* Forward reference */
4681static int process_input(ShellState *p);
4682
4683/*
4684** Read the content of file zName into memory obtained from sqlite3_malloc64()
4685** and return a pointer to the buffer. The caller is responsible for freeing
4686** the memory.
4687**
4688** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4689** read.
4690**
4691** For convenience, a nul-terminator byte is always appended to the data read
4692** from the file before the buffer is returned. This byte is not included in
4693** the final value of (*pnByte), if applicable.
4694**
4695** NULL is returned if any error is encountered. The final value of *pnByte
4696** is undefined in this case.
4697*/
4698static char *readFile(const char *zName, int *pnByte){
4699  FILE *in = fopen(zName, "rb");
4700  long nIn;
4701  size_t nRead;
4702  char *pBuf;
4703  if( in==0 ) return 0;
4704  fseek(in, 0, SEEK_END);
4705  nIn = ftell(in);
4706  rewind(in);
4707  pBuf = sqlite3_malloc64( nIn+1 );
4708  if( pBuf==0 ){ fclose(in); return 0; }
4709  nRead = fread(pBuf, nIn, 1, in);
4710  fclose(in);
4711  if( nRead!=1 ){
4712    sqlite3_free(pBuf);
4713    return 0;
4714  }
4715  pBuf[nIn] = 0;
4716  if( pnByte ) *pnByte = nIn;
4717  return pBuf;
4718}
4719
4720#if defined(SQLITE_ENABLE_SESSION)
4721/*
4722** Close a single OpenSession object and release all of its associated
4723** resources.
4724*/
4725static void session_close(OpenSession *pSession){
4726  int i;
4727  sqlite3session_delete(pSession->p);
4728  sqlite3_free(pSession->zName);
4729  for(i=0; i<pSession->nFilter; i++){
4730    sqlite3_free(pSession->azFilter[i]);
4731  }
4732  sqlite3_free(pSession->azFilter);
4733  memset(pSession, 0, sizeof(OpenSession));
4734}
4735#endif
4736
4737/*
4738** Close all OpenSession objects and release all associated resources.
4739*/
4740#if defined(SQLITE_ENABLE_SESSION)
4741static void session_close_all(ShellState *p, int i){
4742  int j;
4743  struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4744  for(j=0; j<pAuxDb->nSession; j++){
4745    session_close(&pAuxDb->aSession[j]);
4746  }
4747  pAuxDb->nSession = 0;
4748}
4749#else
4750# define session_close_all(X,Y)
4751#endif
4752
4753/*
4754** Implementation of the xFilter function for an open session.  Omit
4755** any tables named by ".session filter" but let all other table through.
4756*/
4757#if defined(SQLITE_ENABLE_SESSION)
4758static int session_filter(void *pCtx, const char *zTab){
4759  OpenSession *pSession = (OpenSession*)pCtx;
4760  int i;
4761  for(i=0; i<pSession->nFilter; i++){
4762    if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4763  }
4764  return 1;
4765}
4766#endif
4767
4768/*
4769** Try to deduce the type of file for zName based on its content.  Return
4770** one of the SHELL_OPEN_* constants.
4771**
4772** If the file does not exist or is empty but its name looks like a ZIP
4773** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4774** Otherwise, assume an ordinary database regardless of the filename if
4775** the type cannot be determined from content.
4776*/
4777int deduceDatabaseType(const char *zName, int dfltZip){
4778  FILE *f = fopen(zName, "rb");
4779  size_t n;
4780  int rc = SHELL_OPEN_UNSPEC;
4781  char zBuf[100];
4782  if( f==0 ){
4783    if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4784       return SHELL_OPEN_ZIPFILE;
4785    }else{
4786       return SHELL_OPEN_NORMAL;
4787    }
4788  }
4789  n = fread(zBuf, 16, 1, f);
4790  if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4791    fclose(f);
4792    return SHELL_OPEN_NORMAL;
4793  }
4794  fseek(f, -25, SEEK_END);
4795  n = fread(zBuf, 25, 1, f);
4796  if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4797    rc = SHELL_OPEN_APPENDVFS;
4798  }else{
4799    fseek(f, -22, SEEK_END);
4800    n = fread(zBuf, 22, 1, f);
4801    if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4802       && zBuf[3]==0x06 ){
4803      rc = SHELL_OPEN_ZIPFILE;
4804    }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4805      rc = SHELL_OPEN_ZIPFILE;
4806    }
4807  }
4808  fclose(f);
4809  return rc;
4810}
4811
4812#ifndef SQLITE_OMIT_DESERIALIZE
4813/*
4814** Reconstruct an in-memory database using the output from the "dbtotxt"
4815** program.  Read content from the file in p->aAuxDb[].zDbFilename.
4816** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4817*/
4818static unsigned char *readHexDb(ShellState *p, int *pnData){
4819  unsigned char *a = 0;
4820  int nLine;
4821  int n = 0;
4822  int pgsz = 0;
4823  int iOffset = 0;
4824  int j, k;
4825  int rc;
4826  FILE *in;
4827  const char *zDbFilename = p->pAuxDb->zDbFilename;
4828  unsigned int x[16];
4829  char zLine[1000];
4830  if( zDbFilename ){
4831    in = fopen(zDbFilename, "r");
4832    if( in==0 ){
4833      utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4834      return 0;
4835    }
4836    nLine = 0;
4837  }else{
4838    in = p->in;
4839    nLine = p->lineno;
4840    if( in==0 ) in = stdin;
4841  }
4842  *pnData = 0;
4843  nLine++;
4844  if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4845  rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4846  if( rc!=2 ) goto readHexDb_error;
4847  if( n<0 ) goto readHexDb_error;
4848  if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4849  n = (n+pgsz-1)&~(pgsz-1);  /* Round n up to the next multiple of pgsz */
4850  a = sqlite3_malloc( n ? n : 1 );
4851  shell_check_oom(a);
4852  memset(a, 0, n);
4853  if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4854    utf8_printf(stderr, "invalid pagesize\n");
4855    goto readHexDb_error;
4856  }
4857  for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4858    rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4859    if( rc==2 ){
4860      iOffset = k;
4861      continue;
4862    }
4863    if( cli_strncmp(zLine, "| end ", 6)==0 ){
4864      break;
4865    }
4866    rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4867                &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4868                &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4869    if( rc==17 ){
4870      k = iOffset+j;
4871      if( k+16<=n && k>=0 ){
4872        int ii;
4873        for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4874      }
4875    }
4876  }
4877  *pnData = n;
4878  if( in!=p->in ){
4879    fclose(in);
4880  }else{
4881    p->lineno = nLine;
4882  }
4883  return a;
4884
4885readHexDb_error:
4886  if( in!=p->in ){
4887    fclose(in);
4888  }else{
4889    while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4890      nLine++;
4891      if(cli_strncmp(zLine, "| end ", 6)==0 ) break;
4892    }
4893    p->lineno = nLine;
4894  }
4895  sqlite3_free(a);
4896  utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4897  return 0;
4898}
4899#endif /* SQLITE_OMIT_DESERIALIZE */
4900
4901/*
4902** Scalar function "shell_int32". The first argument to this function
4903** must be a blob. The second a non-negative integer. This function
4904** reads and returns a 32-bit big-endian integer from byte
4905** offset (4*<arg2>) of the blob.
4906*/
4907static void shellInt32(
4908  sqlite3_context *context,
4909  int argc,
4910  sqlite3_value **argv
4911){
4912  const unsigned char *pBlob;
4913  int nBlob;
4914  int iInt;
4915
4916  UNUSED_PARAMETER(argc);
4917  nBlob = sqlite3_value_bytes(argv[0]);
4918  pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4919  iInt = sqlite3_value_int(argv[1]);
4920
4921  if( iInt>=0 && (iInt+1)*4<=nBlob ){
4922    const unsigned char *a = &pBlob[iInt*4];
4923    sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4924                       + ((sqlite3_int64)a[1]<<16)
4925                       + ((sqlite3_int64)a[2]<< 8)
4926                       + ((sqlite3_int64)a[3]<< 0);
4927    sqlite3_result_int64(context, iVal);
4928  }
4929}
4930
4931/*
4932** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4933** using "..." with internal double-quote characters doubled.
4934*/
4935static void shellIdQuote(
4936  sqlite3_context *context,
4937  int argc,
4938  sqlite3_value **argv
4939){
4940  const char *zName = (const char*)sqlite3_value_text(argv[0]);
4941  UNUSED_PARAMETER(argc);
4942  if( zName ){
4943    char *z = sqlite3_mprintf("\"%w\"", zName);
4944    sqlite3_result_text(context, z, -1, sqlite3_free);
4945  }
4946}
4947
4948/*
4949** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4950*/
4951static void shellUSleepFunc(
4952  sqlite3_context *context,
4953  int argcUnused,
4954  sqlite3_value **argv
4955){
4956  int sleep = sqlite3_value_int(argv[0]);
4957  (void)argcUnused;
4958  sqlite3_sleep(sleep/1000);
4959  sqlite3_result_int(context, sleep);
4960}
4961
4962/*
4963** Scalar function "shell_escape_crnl" used by the .recover command.
4964** The argument passed to this function is the output of built-in
4965** function quote(). If the first character of the input is "'",
4966** indicating that the value passed to quote() was a text value,
4967** then this function searches the input for "\n" and "\r" characters
4968** and adds a wrapper similar to the following:
4969**
4970**   replace(replace(<input>, '\n', char(10), '\r', char(13));
4971**
4972** Or, if the first character of the input is not "'", then a copy
4973** of the input is returned.
4974*/
4975static void shellEscapeCrnl(
4976  sqlite3_context *context,
4977  int argc,
4978  sqlite3_value **argv
4979){
4980  const char *zText = (const char*)sqlite3_value_text(argv[0]);
4981  UNUSED_PARAMETER(argc);
4982  if( zText && zText[0]=='\'' ){
4983    i64 nText = sqlite3_value_bytes(argv[0]);
4984    i64 i;
4985    char zBuf1[20];
4986    char zBuf2[20];
4987    const char *zNL = 0;
4988    const char *zCR = 0;
4989    i64 nCR = 0;
4990    i64 nNL = 0;
4991
4992    for(i=0; zText[i]; i++){
4993      if( zNL==0 && zText[i]=='\n' ){
4994        zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4995        nNL = strlen(zNL);
4996      }
4997      if( zCR==0 && zText[i]=='\r' ){
4998        zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4999        nCR = strlen(zCR);
5000      }
5001    }
5002
5003    if( zNL || zCR ){
5004      i64 iOut = 0;
5005      i64 nMax = (nNL > nCR) ? nNL : nCR;
5006      i64 nAlloc = nMax * nText + (nMax+64)*2;
5007      char *zOut = (char*)sqlite3_malloc64(nAlloc);
5008      if( zOut==0 ){
5009        sqlite3_result_error_nomem(context);
5010        return;
5011      }
5012
5013      if( zNL && zCR ){
5014        memcpy(&zOut[iOut], "replace(replace(", 16);
5015        iOut += 16;
5016      }else{
5017        memcpy(&zOut[iOut], "replace(", 8);
5018        iOut += 8;
5019      }
5020      for(i=0; zText[i]; i++){
5021        if( zText[i]=='\n' ){
5022          memcpy(&zOut[iOut], zNL, nNL);
5023          iOut += nNL;
5024        }else if( zText[i]=='\r' ){
5025          memcpy(&zOut[iOut], zCR, nCR);
5026          iOut += nCR;
5027        }else{
5028          zOut[iOut] = zText[i];
5029          iOut++;
5030        }
5031      }
5032
5033      if( zNL ){
5034        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
5035        memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
5036        memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
5037      }
5038      if( zCR ){
5039        memcpy(&zOut[iOut], ",'", 2); iOut += 2;
5040        memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
5041        memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
5042      }
5043
5044      sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
5045      sqlite3_free(zOut);
5046      return;
5047    }
5048  }
5049
5050  sqlite3_result_value(context, argv[0]);
5051}
5052
5053/* Flags for open_db().
5054**
5055** The default behavior of open_db() is to exit(1) if the database fails to
5056** open.  The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
5057** but still returns without calling exit.
5058**
5059** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
5060** ZIP archive if the file does not exist or is empty and its name matches
5061** the *.zip pattern.
5062*/
5063#define OPEN_DB_KEEPALIVE   0x001   /* Return after error if true */
5064#define OPEN_DB_ZIPFILE     0x002   /* Open as ZIP if name matches *.zip */
5065
5066/*
5067** Make sure the database is open.  If it is not, then open it.  If
5068** the database fails to open, print an error message and exit.
5069*/
5070static void open_db(ShellState *p, int openFlags){
5071  if( p->db==0 ){
5072    const char *zDbFilename = p->pAuxDb->zDbFilename;
5073    if( p->openMode==SHELL_OPEN_UNSPEC ){
5074      if( zDbFilename==0 || zDbFilename[0]==0 ){
5075        p->openMode = SHELL_OPEN_NORMAL;
5076      }else{
5077        p->openMode = (u8)deduceDatabaseType(zDbFilename,
5078                             (openFlags & OPEN_DB_ZIPFILE)!=0);
5079      }
5080    }
5081    switch( p->openMode ){
5082      case SHELL_OPEN_APPENDVFS: {
5083        sqlite3_open_v2(zDbFilename, &p->db,
5084           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
5085        break;
5086      }
5087      case SHELL_OPEN_HEXDB:
5088      case SHELL_OPEN_DESERIALIZE: {
5089        sqlite3_open(0, &p->db);
5090        break;
5091      }
5092      case SHELL_OPEN_ZIPFILE: {
5093        sqlite3_open(":memory:", &p->db);
5094        break;
5095      }
5096      case SHELL_OPEN_READONLY: {
5097        sqlite3_open_v2(zDbFilename, &p->db,
5098            SQLITE_OPEN_READONLY|p->openFlags, 0);
5099        break;
5100      }
5101      case SHELL_OPEN_UNSPEC:
5102      case SHELL_OPEN_NORMAL: {
5103        sqlite3_open_v2(zDbFilename, &p->db,
5104           SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
5105        break;
5106      }
5107    }
5108    globalDb = p->db;
5109    if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
5110      utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
5111          zDbFilename, sqlite3_errmsg(p->db));
5112      if( openFlags & OPEN_DB_KEEPALIVE ){
5113        sqlite3_open(":memory:", &p->db);
5114        return;
5115      }
5116      exit(1);
5117    }
5118#ifndef SQLITE_OMIT_LOAD_EXTENSION
5119    sqlite3_enable_load_extension(p->db, 1);
5120#endif
5121    sqlite3_shathree_init(p->db, 0, 0);
5122    sqlite3_uint_init(p->db, 0, 0);
5123    sqlite3_decimal_init(p->db, 0, 0);
5124    sqlite3_regexp_init(p->db, 0, 0);
5125    sqlite3_ieee_init(p->db, 0, 0);
5126    sqlite3_series_init(p->db, 0, 0);
5127#ifndef SQLITE_SHELL_FIDDLE
5128    sqlite3_fileio_init(p->db, 0, 0);
5129    sqlite3_completion_init(p->db, 0, 0);
5130#endif
5131#if SQLITE_SHELL_HAVE_RECOVER
5132    sqlite3_dbdata_init(p->db, 0, 0);
5133#endif
5134#ifdef SQLITE_HAVE_ZLIB
5135    if( !p->bSafeModePersist ){
5136      sqlite3_zipfile_init(p->db, 0, 0);
5137      sqlite3_sqlar_init(p->db, 0, 0);
5138    }
5139#endif
5140    sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
5141                            shellAddSchemaName, 0, 0);
5142    sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
5143                            shellModuleSchema, 0, 0);
5144    sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
5145                            shellPutsFunc, 0, 0);
5146    sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
5147                            shellEscapeCrnl, 0, 0);
5148    sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
5149                            shellInt32, 0, 0);
5150    sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
5151                            shellIdQuote, 0, 0);
5152    sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
5153                            shellUSleepFunc, 0, 0);
5154#ifndef SQLITE_NOHAVE_SYSTEM
5155    sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
5156                            editFunc, 0, 0);
5157    sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
5158                            editFunc, 0, 0);
5159#endif
5160    if( p->openMode==SHELL_OPEN_ZIPFILE ){
5161      char *zSql = sqlite3_mprintf(
5162         "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
5163      shell_check_oom(zSql);
5164      sqlite3_exec(p->db, zSql, 0, 0, 0);
5165      sqlite3_free(zSql);
5166    }
5167#ifndef SQLITE_OMIT_DESERIALIZE
5168    else
5169    if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
5170      int rc;
5171      int nData = 0;
5172      unsigned char *aData;
5173      if( p->openMode==SHELL_OPEN_DESERIALIZE ){
5174        aData = (unsigned char*)readFile(zDbFilename, &nData);
5175      }else{
5176        aData = readHexDb(p, &nData);
5177        if( aData==0 ){
5178          return;
5179        }
5180      }
5181      rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
5182                   SQLITE_DESERIALIZE_RESIZEABLE |
5183                   SQLITE_DESERIALIZE_FREEONCLOSE);
5184      if( rc ){
5185        utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
5186      }
5187      if( p->szMax>0 ){
5188        sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
5189      }
5190    }
5191#endif
5192  }
5193  if( p->bSafeModePersist && p->db!=0 ){
5194    sqlite3_set_authorizer(p->db, safeModeAuth, p);
5195  }
5196}
5197
5198/*
5199** Attempt to close the databaes connection.  Report errors.
5200*/
5201void close_db(sqlite3 *db){
5202  int rc = sqlite3_close(db);
5203  if( rc ){
5204    utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
5205        rc, sqlite3_errmsg(db));
5206  }
5207}
5208
5209#if HAVE_READLINE || HAVE_EDITLINE
5210/*
5211** Readline completion callbacks
5212*/
5213static char *readline_completion_generator(const char *text, int state){
5214  static sqlite3_stmt *pStmt = 0;
5215  char *zRet;
5216  if( state==0 ){
5217    char *zSql;
5218    sqlite3_finalize(pStmt);
5219    zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5220                           "  FROM completion(%Q) ORDER BY 1", text);
5221    shell_check_oom(zSql);
5222    sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5223    sqlite3_free(zSql);
5224  }
5225  if( sqlite3_step(pStmt)==SQLITE_ROW ){
5226    const char *z = (const char*)sqlite3_column_text(pStmt,0);
5227    zRet = z ? strdup(z) : 0;
5228  }else{
5229    sqlite3_finalize(pStmt);
5230    pStmt = 0;
5231    zRet = 0;
5232  }
5233  return zRet;
5234}
5235static char **readline_completion(const char *zText, int iStart, int iEnd){
5236  rl_attempted_completion_over = 1;
5237  return rl_completion_matches(zText, readline_completion_generator);
5238}
5239
5240#elif HAVE_LINENOISE
5241/*
5242** Linenoise completion callback
5243*/
5244static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
5245  i64 nLine = strlen(zLine);
5246  i64 i, iStart;
5247  sqlite3_stmt *pStmt = 0;
5248  char *zSql;
5249  char zBuf[1000];
5250
5251  if( nLine>sizeof(zBuf)-30 ) return;
5252  if( zLine[0]=='.' || zLine[0]=='#') return;
5253  for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
5254  if( i==nLine-1 ) return;
5255  iStart = i+1;
5256  memcpy(zBuf, zLine, iStart);
5257  zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5258                         "  FROM completion(%Q,%Q) ORDER BY 1",
5259                         &zLine[iStart], zLine);
5260  shell_check_oom(zSql);
5261  sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5262  sqlite3_free(zSql);
5263  sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
5264  while( sqlite3_step(pStmt)==SQLITE_ROW ){
5265    const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
5266    int nCompletion = sqlite3_column_bytes(pStmt, 0);
5267    if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
5268      memcpy(zBuf+iStart, zCompletion, nCompletion+1);
5269      linenoiseAddCompletion(lc, zBuf);
5270    }
5271  }
5272  sqlite3_finalize(pStmt);
5273}
5274#endif
5275
5276/*
5277** Do C-language style dequoting.
5278**
5279**    \a    -> alarm
5280**    \b    -> backspace
5281**    \t    -> tab
5282**    \n    -> newline
5283**    \v    -> vertical tab
5284**    \f    -> form feed
5285**    \r    -> carriage return
5286**    \s    -> space
5287**    \"    -> "
5288**    \'    -> '
5289**    \\    -> backslash
5290**    \NNN  -> ascii character NNN in octal
5291*/
5292static void resolve_backslashes(char *z){
5293  int i, j;
5294  char c;
5295  while( *z && *z!='\\' ) z++;
5296  for(i=j=0; (c = z[i])!=0; i++, j++){
5297    if( c=='\\' && z[i+1]!=0 ){
5298      c = z[++i];
5299      if( c=='a' ){
5300        c = '\a';
5301      }else if( c=='b' ){
5302        c = '\b';
5303      }else if( c=='t' ){
5304        c = '\t';
5305      }else if( c=='n' ){
5306        c = '\n';
5307      }else if( c=='v' ){
5308        c = '\v';
5309      }else if( c=='f' ){
5310        c = '\f';
5311      }else if( c=='r' ){
5312        c = '\r';
5313      }else if( c=='"' ){
5314        c = '"';
5315      }else if( c=='\'' ){
5316        c = '\'';
5317      }else if( c=='\\' ){
5318        c = '\\';
5319      }else if( c>='0' && c<='7' ){
5320        c -= '0';
5321        if( z[i+1]>='0' && z[i+1]<='7' ){
5322          i++;
5323          c = (c<<3) + z[i] - '0';
5324          if( z[i+1]>='0' && z[i+1]<='7' ){
5325            i++;
5326            c = (c<<3) + z[i] - '0';
5327          }
5328        }
5329      }
5330    }
5331    z[j] = c;
5332  }
5333  if( j<i ) z[j] = 0;
5334}
5335
5336/*
5337** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
5338** for TRUE and FALSE.  Return the integer value if appropriate.
5339*/
5340static int booleanValue(const char *zArg){
5341  int i;
5342  if( zArg[0]=='0' && zArg[1]=='x' ){
5343    for(i=2; hexDigitValue(zArg[i])>=0; i++){}
5344  }else{
5345    for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
5346  }
5347  if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
5348  if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
5349    return 1;
5350  }
5351  if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
5352    return 0;
5353  }
5354  utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
5355          zArg);
5356  return 0;
5357}
5358
5359/*
5360** Set or clear a shell flag according to a boolean value.
5361*/
5362static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
5363  if( booleanValue(zArg) ){
5364    ShellSetFlag(p, mFlag);
5365  }else{
5366    ShellClearFlag(p, mFlag);
5367  }
5368}
5369
5370/*
5371** Close an output file, assuming it is not stderr or stdout
5372*/
5373static void output_file_close(FILE *f){
5374  if( f && f!=stdout && f!=stderr ) fclose(f);
5375}
5376
5377/*
5378** Try to open an output file.   The names "stdout" and "stderr" are
5379** recognized and do the right thing.  NULL is returned if the output
5380** filename is "off".
5381*/
5382static FILE *output_file_open(const char *zFile, int bTextMode){
5383  FILE *f;
5384  if( cli_strcmp(zFile,"stdout")==0 ){
5385    f = stdout;
5386  }else if( cli_strcmp(zFile, "stderr")==0 ){
5387    f = stderr;
5388  }else if( cli_strcmp(zFile, "off")==0 ){
5389    f = 0;
5390  }else{
5391    f = fopen(zFile, bTextMode ? "w" : "wb");
5392    if( f==0 ){
5393      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5394    }
5395  }
5396  return f;
5397}
5398
5399#ifndef SQLITE_OMIT_TRACE
5400/*
5401** A routine for handling output from sqlite3_trace().
5402*/
5403static int sql_trace_callback(
5404  unsigned mType,         /* The trace type */
5405  void *pArg,             /* The ShellState pointer */
5406  void *pP,               /* Usually a pointer to sqlite_stmt */
5407  void *pX                /* Auxiliary output */
5408){
5409  ShellState *p = (ShellState*)pArg;
5410  sqlite3_stmt *pStmt;
5411  const char *zSql;
5412  i64 nSql;
5413  if( p->traceOut==0 ) return 0;
5414  if( mType==SQLITE_TRACE_CLOSE ){
5415    utf8_printf(p->traceOut, "-- closing database connection\n");
5416    return 0;
5417  }
5418  if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5419    zSql = (const char*)pX;
5420  }else{
5421    pStmt = (sqlite3_stmt*)pP;
5422    switch( p->eTraceType ){
5423      case SHELL_TRACE_EXPANDED: {
5424        zSql = sqlite3_expanded_sql(pStmt);
5425        break;
5426      }
5427#ifdef SQLITE_ENABLE_NORMALIZE
5428      case SHELL_TRACE_NORMALIZED: {
5429        zSql = sqlite3_normalized_sql(pStmt);
5430        break;
5431      }
5432#endif
5433      default: {
5434        zSql = sqlite3_sql(pStmt);
5435        break;
5436      }
5437    }
5438  }
5439  if( zSql==0 ) return 0;
5440  nSql = strlen(zSql);
5441  if( nSql>1000000000 ) nSql = 1000000000;
5442  while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5443  switch( mType ){
5444    case SQLITE_TRACE_ROW:
5445    case SQLITE_TRACE_STMT: {
5446      utf8_printf(p->traceOut, "%.*s;\n", (int)nSql, zSql);
5447      break;
5448    }
5449    case SQLITE_TRACE_PROFILE: {
5450      sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5451      utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", (int)nSql, zSql, nNanosec);
5452      break;
5453    }
5454  }
5455  return 0;
5456}
5457#endif
5458
5459/*
5460** A no-op routine that runs with the ".breakpoint" doc-command.  This is
5461** a useful spot to set a debugger breakpoint.
5462*/
5463static void test_breakpoint(void){
5464  static int nCall = 0;
5465  nCall++;
5466}
5467
5468/*
5469** An object used to read a CSV and other files for import.
5470*/
5471typedef struct ImportCtx ImportCtx;
5472struct ImportCtx {
5473  const char *zFile;  /* Name of the input file */
5474  FILE *in;           /* Read the CSV text from this input stream */
5475  int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close in */
5476  char *z;            /* Accumulated text for a field */
5477  int n;              /* Number of bytes in z */
5478  int nAlloc;         /* Space allocated for z[] */
5479  int nLine;          /* Current line number */
5480  int nRow;           /* Number of rows imported */
5481  int nErr;           /* Number of errors encountered */
5482  int bNotFirst;      /* True if one or more bytes already read */
5483  int cTerm;          /* Character that terminated the most recent field */
5484  int cColSep;        /* The column separator character.  (Usually ",") */
5485  int cRowSep;        /* The row separator character.  (Usually "\n") */
5486};
5487
5488/* Clean up resourced used by an ImportCtx */
5489static void import_cleanup(ImportCtx *p){
5490  if( p->in!=0 && p->xCloser!=0 ){
5491    p->xCloser(p->in);
5492    p->in = 0;
5493  }
5494  sqlite3_free(p->z);
5495  p->z = 0;
5496}
5497
5498/* Append a single byte to z[] */
5499static void import_append_char(ImportCtx *p, int c){
5500  if( p->n+1>=p->nAlloc ){
5501    p->nAlloc += p->nAlloc + 100;
5502    p->z = sqlite3_realloc64(p->z, p->nAlloc);
5503    shell_check_oom(p->z);
5504  }
5505  p->z[p->n++] = (char)c;
5506}
5507
5508/* Read a single field of CSV text.  Compatible with rfc4180 and extended
5509** with the option of having a separator other than ",".
5510**
5511**   +  Input comes from p->in.
5512**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5513**      from sqlite3_malloc64().
5514**   +  Use p->cSep as the column separator.  The default is ",".
5515**   +  Use p->rSep as the row separator.  The default is "\n".
5516**   +  Keep track of the line number in p->nLine.
5517**   +  Store the character that terminates the field in p->cTerm.  Store
5518**      EOF on end-of-file.
5519**   +  Report syntax errors on stderr
5520*/
5521static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5522  int c;
5523  int cSep = p->cColSep;
5524  int rSep = p->cRowSep;
5525  p->n = 0;
5526  c = fgetc(p->in);
5527  if( c==EOF || seenInterrupt ){
5528    p->cTerm = EOF;
5529    return 0;
5530  }
5531  if( c=='"' ){
5532    int pc, ppc;
5533    int startLine = p->nLine;
5534    int cQuote = c;
5535    pc = ppc = 0;
5536    while( 1 ){
5537      c = fgetc(p->in);
5538      if( c==rSep ) p->nLine++;
5539      if( c==cQuote ){
5540        if( pc==cQuote ){
5541          pc = 0;
5542          continue;
5543        }
5544      }
5545      if( (c==cSep && pc==cQuote)
5546       || (c==rSep && pc==cQuote)
5547       || (c==rSep && pc=='\r' && ppc==cQuote)
5548       || (c==EOF && pc==cQuote)
5549      ){
5550        do{ p->n--; }while( p->z[p->n]!=cQuote );
5551        p->cTerm = c;
5552        break;
5553      }
5554      if( pc==cQuote && c!='\r' ){
5555        utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5556                p->zFile, p->nLine, cQuote);
5557      }
5558      if( c==EOF ){
5559        utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5560                p->zFile, startLine, cQuote);
5561        p->cTerm = c;
5562        break;
5563      }
5564      import_append_char(p, c);
5565      ppc = pc;
5566      pc = c;
5567    }
5568  }else{
5569    /* If this is the first field being parsed and it begins with the
5570    ** UTF-8 BOM  (0xEF BB BF) then skip the BOM */
5571    if( (c&0xff)==0xef && p->bNotFirst==0 ){
5572      import_append_char(p, c);
5573      c = fgetc(p->in);
5574      if( (c&0xff)==0xbb ){
5575        import_append_char(p, c);
5576        c = fgetc(p->in);
5577        if( (c&0xff)==0xbf ){
5578          p->bNotFirst = 1;
5579          p->n = 0;
5580          return csv_read_one_field(p);
5581        }
5582      }
5583    }
5584    while( c!=EOF && c!=cSep && c!=rSep ){
5585      import_append_char(p, c);
5586      c = fgetc(p->in);
5587    }
5588    if( c==rSep ){
5589      p->nLine++;
5590      if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5591    }
5592    p->cTerm = c;
5593  }
5594  if( p->z ) p->z[p->n] = 0;
5595  p->bNotFirst = 1;
5596  return p->z;
5597}
5598
5599/* Read a single field of ASCII delimited text.
5600**
5601**   +  Input comes from p->in.
5602**   +  Store results in p->z of length p->n.  Space to hold p->z comes
5603**      from sqlite3_malloc64().
5604**   +  Use p->cSep as the column separator.  The default is "\x1F".
5605**   +  Use p->rSep as the row separator.  The default is "\x1E".
5606**   +  Keep track of the row number in p->nLine.
5607**   +  Store the character that terminates the field in p->cTerm.  Store
5608**      EOF on end-of-file.
5609**   +  Report syntax errors on stderr
5610*/
5611static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5612  int c;
5613  int cSep = p->cColSep;
5614  int rSep = p->cRowSep;
5615  p->n = 0;
5616  c = fgetc(p->in);
5617  if( c==EOF || seenInterrupt ){
5618    p->cTerm = EOF;
5619    return 0;
5620  }
5621  while( c!=EOF && c!=cSep && c!=rSep ){
5622    import_append_char(p, c);
5623    c = fgetc(p->in);
5624  }
5625  if( c==rSep ){
5626    p->nLine++;
5627  }
5628  p->cTerm = c;
5629  if( p->z ) p->z[p->n] = 0;
5630  return p->z;
5631}
5632
5633/*
5634** Try to transfer data for table zTable.  If an error is seen while
5635** moving forward, try to go backwards.  The backwards movement won't
5636** work for WITHOUT ROWID tables.
5637*/
5638static void tryToCloneData(
5639  ShellState *p,
5640  sqlite3 *newDb,
5641  const char *zTable
5642){
5643  sqlite3_stmt *pQuery = 0;
5644  sqlite3_stmt *pInsert = 0;
5645  char *zQuery = 0;
5646  char *zInsert = 0;
5647  int rc;
5648  int i, j, n;
5649  int nTable = strlen30(zTable);
5650  int k = 0;
5651  int cnt = 0;
5652  const int spinRate = 10000;
5653
5654  zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5655  shell_check_oom(zQuery);
5656  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5657  if( rc ){
5658    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5659            sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5660            zQuery);
5661    goto end_data_xfer;
5662  }
5663  n = sqlite3_column_count(pQuery);
5664  zInsert = sqlite3_malloc64(200 + nTable + n*3);
5665  shell_check_oom(zInsert);
5666  sqlite3_snprintf(200+nTable,zInsert,
5667                   "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5668  i = strlen30(zInsert);
5669  for(j=1; j<n; j++){
5670    memcpy(zInsert+i, ",?", 2);
5671    i += 2;
5672  }
5673  memcpy(zInsert+i, ");", 3);
5674  rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5675  if( rc ){
5676    utf8_printf(stderr, "Error %d: %s on [%s]\n",
5677            sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5678            zQuery);
5679    goto end_data_xfer;
5680  }
5681  for(k=0; k<2; k++){
5682    while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5683      for(i=0; i<n; i++){
5684        switch( sqlite3_column_type(pQuery, i) ){
5685          case SQLITE_NULL: {
5686            sqlite3_bind_null(pInsert, i+1);
5687            break;
5688          }
5689          case SQLITE_INTEGER: {
5690            sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5691            break;
5692          }
5693          case SQLITE_FLOAT: {
5694            sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5695            break;
5696          }
5697          case SQLITE_TEXT: {
5698            sqlite3_bind_text(pInsert, i+1,
5699                             (const char*)sqlite3_column_text(pQuery,i),
5700                             -1, SQLITE_STATIC);
5701            break;
5702          }
5703          case SQLITE_BLOB: {
5704            sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5705                                            sqlite3_column_bytes(pQuery,i),
5706                                            SQLITE_STATIC);
5707            break;
5708          }
5709        }
5710      } /* End for */
5711      rc = sqlite3_step(pInsert);
5712      if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5713        utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5714                        sqlite3_errmsg(newDb));
5715      }
5716      sqlite3_reset(pInsert);
5717      cnt++;
5718      if( (cnt%spinRate)==0 ){
5719        printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5720        fflush(stdout);
5721      }
5722    } /* End while */
5723    if( rc==SQLITE_DONE ) break;
5724    sqlite3_finalize(pQuery);
5725    sqlite3_free(zQuery);
5726    zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5727                             zTable);
5728    shell_check_oom(zQuery);
5729    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5730    if( rc ){
5731      utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5732      break;
5733    }
5734  } /* End for(k=0...) */
5735
5736end_data_xfer:
5737  sqlite3_finalize(pQuery);
5738  sqlite3_finalize(pInsert);
5739  sqlite3_free(zQuery);
5740  sqlite3_free(zInsert);
5741}
5742
5743
5744/*
5745** Try to transfer all rows of the schema that match zWhere.  For
5746** each row, invoke xForEach() on the object defined by that row.
5747** If an error is encountered while moving forward through the
5748** sqlite_schema table, try again moving backwards.
5749*/
5750static void tryToCloneSchema(
5751  ShellState *p,
5752  sqlite3 *newDb,
5753  const char *zWhere,
5754  void (*xForEach)(ShellState*,sqlite3*,const char*)
5755){
5756  sqlite3_stmt *pQuery = 0;
5757  char *zQuery = 0;
5758  int rc;
5759  const unsigned char *zName;
5760  const unsigned char *zSql;
5761  char *zErrMsg = 0;
5762
5763  zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5764                           " WHERE %s", zWhere);
5765  shell_check_oom(zQuery);
5766  rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5767  if( rc ){
5768    utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5769                    sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5770                    zQuery);
5771    goto end_schema_xfer;
5772  }
5773  while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5774    zName = sqlite3_column_text(pQuery, 0);
5775    zSql = sqlite3_column_text(pQuery, 1);
5776    if( zName==0 || zSql==0 ) continue;
5777    printf("%s... ", zName); fflush(stdout);
5778    sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5779    if( zErrMsg ){
5780      utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5781      sqlite3_free(zErrMsg);
5782      zErrMsg = 0;
5783    }
5784    if( xForEach ){
5785      xForEach(p, newDb, (const char*)zName);
5786    }
5787    printf("done\n");
5788  }
5789  if( rc!=SQLITE_DONE ){
5790    sqlite3_finalize(pQuery);
5791    sqlite3_free(zQuery);
5792    zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5793                             " WHERE %s ORDER BY rowid DESC", zWhere);
5794    shell_check_oom(zQuery);
5795    rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5796    if( rc ){
5797      utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5798                      sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5799                      zQuery);
5800      goto end_schema_xfer;
5801    }
5802    while( sqlite3_step(pQuery)==SQLITE_ROW ){
5803      zName = sqlite3_column_text(pQuery, 0);
5804      zSql = sqlite3_column_text(pQuery, 1);
5805      if( zName==0 || zSql==0 ) continue;
5806      printf("%s... ", zName); fflush(stdout);
5807      sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5808      if( zErrMsg ){
5809        utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5810        sqlite3_free(zErrMsg);
5811        zErrMsg = 0;
5812      }
5813      if( xForEach ){
5814        xForEach(p, newDb, (const char*)zName);
5815      }
5816      printf("done\n");
5817    }
5818  }
5819end_schema_xfer:
5820  sqlite3_finalize(pQuery);
5821  sqlite3_free(zQuery);
5822}
5823
5824/*
5825** Open a new database file named "zNewDb".  Try to recover as much information
5826** as possible out of the main database (which might be corrupt) and write it
5827** into zNewDb.
5828*/
5829static void tryToClone(ShellState *p, const char *zNewDb){
5830  int rc;
5831  sqlite3 *newDb = 0;
5832  if( access(zNewDb,0)==0 ){
5833    utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5834    return;
5835  }
5836  rc = sqlite3_open(zNewDb, &newDb);
5837  if( rc ){
5838    utf8_printf(stderr, "Cannot create output database: %s\n",
5839            sqlite3_errmsg(newDb));
5840  }else{
5841    sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5842    sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5843    tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5844    tryToCloneSchema(p, newDb, "type!='table'", 0);
5845    sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5846    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5847  }
5848  close_db(newDb);
5849}
5850
5851/*
5852** Change the output file back to stdout.
5853**
5854** If the p->doXdgOpen flag is set, that means the output was being
5855** redirected to a temporary file named by p->zTempFile.  In that case,
5856** launch start/open/xdg-open on that temporary file.
5857*/
5858static void output_reset(ShellState *p){
5859  if( p->outfile[0]=='|' ){
5860#ifndef SQLITE_OMIT_POPEN
5861    pclose(p->out);
5862#endif
5863  }else{
5864    output_file_close(p->out);
5865#ifndef SQLITE_NOHAVE_SYSTEM
5866    if( p->doXdgOpen ){
5867      const char *zXdgOpenCmd =
5868#if defined(_WIN32)
5869      "start";
5870#elif defined(__APPLE__)
5871      "open";
5872#else
5873      "xdg-open";
5874#endif
5875      char *zCmd;
5876      zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5877      if( system(zCmd) ){
5878        utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5879      }else{
5880        /* Give the start/open/xdg-open command some time to get
5881        ** going before we continue, and potential delete the
5882        ** p->zTempFile data file out from under it */
5883        sqlite3_sleep(2000);
5884      }
5885      sqlite3_free(zCmd);
5886      outputModePop(p);
5887      p->doXdgOpen = 0;
5888    }
5889#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5890  }
5891  p->outfile[0] = 0;
5892  p->out = stdout;
5893}
5894
5895/*
5896** Run an SQL command and return the single integer result.
5897*/
5898static int db_int(sqlite3 *db, const char *zSql){
5899  sqlite3_stmt *pStmt;
5900  int res = 0;
5901  sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
5902  if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5903    res = sqlite3_column_int(pStmt,0);
5904  }
5905  sqlite3_finalize(pStmt);
5906  return res;
5907}
5908
5909#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
5910/*
5911** Convert a 2-byte or 4-byte big-endian integer into a native integer
5912*/
5913static unsigned int get2byteInt(unsigned char *a){
5914  return (a[0]<<8) + a[1];
5915}
5916static unsigned int get4byteInt(unsigned char *a){
5917  return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5918}
5919
5920/*
5921** Implementation of the ".dbinfo" command.
5922**
5923** Return 1 on error, 2 to exit, and 0 otherwise.
5924*/
5925static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5926  static const struct { const char *zName; int ofst; } aField[] = {
5927     { "file change counter:",  24  },
5928     { "database page count:",  28  },
5929     { "freelist page count:",  36  },
5930     { "schema cookie:",        40  },
5931     { "schema format:",        44  },
5932     { "default cache size:",   48  },
5933     { "autovacuum top root:",  52  },
5934     { "incremental vacuum:",   64  },
5935     { "text encoding:",        56  },
5936     { "user version:",         60  },
5937     { "application id:",       68  },
5938     { "software version:",     96  },
5939  };
5940  static const struct { const char *zName; const char *zSql; } aQuery[] = {
5941     { "number of tables:",
5942       "SELECT count(*) FROM %s WHERE type='table'" },
5943     { "number of indexes:",
5944       "SELECT count(*) FROM %s WHERE type='index'" },
5945     { "number of triggers:",
5946       "SELECT count(*) FROM %s WHERE type='trigger'" },
5947     { "number of views:",
5948       "SELECT count(*) FROM %s WHERE type='view'" },
5949     { "schema size:",
5950       "SELECT total(length(sql)) FROM %s" },
5951  };
5952  int i, rc;
5953  unsigned iDataVersion;
5954  char *zSchemaTab;
5955  char *zDb = nArg>=2 ? azArg[1] : "main";
5956  sqlite3_stmt *pStmt = 0;
5957  unsigned char aHdr[100];
5958  open_db(p, 0);
5959  if( p->db==0 ) return 1;
5960  rc = sqlite3_prepare_v2(p->db,
5961             "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5962             -1, &pStmt, 0);
5963  if( rc ){
5964    utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5965    sqlite3_finalize(pStmt);
5966    return 1;
5967  }
5968  sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5969  if( sqlite3_step(pStmt)==SQLITE_ROW
5970   && sqlite3_column_bytes(pStmt,0)>100
5971  ){
5972    memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5973    sqlite3_finalize(pStmt);
5974  }else{
5975    raw_printf(stderr, "unable to read database header\n");
5976    sqlite3_finalize(pStmt);
5977    return 1;
5978  }
5979  i = get2byteInt(aHdr+16);
5980  if( i==1 ) i = 65536;
5981  utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5982  utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5983  utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5984  utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5985  for(i=0; i<ArraySize(aField); i++){
5986    int ofst = aField[i].ofst;
5987    unsigned int val = get4byteInt(aHdr + ofst);
5988    utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5989    switch( ofst ){
5990      case 56: {
5991        if( val==1 ) raw_printf(p->out, " (utf8)");
5992        if( val==2 ) raw_printf(p->out, " (utf16le)");
5993        if( val==3 ) raw_printf(p->out, " (utf16be)");
5994      }
5995    }
5996    raw_printf(p->out, "\n");
5997  }
5998  if( zDb==0 ){
5999    zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
6000  }else if( cli_strcmp(zDb,"temp")==0 ){
6001    zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
6002  }else{
6003    zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
6004  }
6005  for(i=0; i<ArraySize(aQuery); i++){
6006    char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
6007    int val = db_int(p->db, zSql);
6008    sqlite3_free(zSql);
6009    utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
6010  }
6011  sqlite3_free(zSchemaTab);
6012  sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
6013  utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
6014  return 0;
6015}
6016#endif /* SQLITE_SHELL_HAVE_RECOVER */
6017
6018/*
6019** Print the current sqlite3_errmsg() value to stderr and return 1.
6020*/
6021static int shellDatabaseError(sqlite3 *db){
6022  const char *zErr = sqlite3_errmsg(db);
6023  utf8_printf(stderr, "Error: %s\n", zErr);
6024  return 1;
6025}
6026
6027/*
6028** Compare the pattern in zGlob[] against the text in z[].  Return TRUE
6029** if they match and FALSE (0) if they do not match.
6030**
6031** Globbing rules:
6032**
6033**      '*'       Matches any sequence of zero or more characters.
6034**
6035**      '?'       Matches exactly one character.
6036**
6037**     [...]      Matches one character from the enclosed list of
6038**                characters.
6039**
6040**     [^...]     Matches one character not in the enclosed list.
6041**
6042**      '#'       Matches any sequence of one or more digits with an
6043**                optional + or - sign in front
6044**
6045**      ' '       Any span of whitespace matches any other span of
6046**                whitespace.
6047**
6048** Extra whitespace at the end of z[] is ignored.
6049*/
6050static int testcase_glob(const char *zGlob, const char *z){
6051  int c, c2;
6052  int invert;
6053  int seen;
6054
6055  while( (c = (*(zGlob++)))!=0 ){
6056    if( IsSpace(c) ){
6057      if( !IsSpace(*z) ) return 0;
6058      while( IsSpace(*zGlob) ) zGlob++;
6059      while( IsSpace(*z) ) z++;
6060    }else if( c=='*' ){
6061      while( (c=(*(zGlob++))) == '*' || c=='?' ){
6062        if( c=='?' && (*(z++))==0 ) return 0;
6063      }
6064      if( c==0 ){
6065        return 1;
6066      }else if( c=='[' ){
6067        while( *z && testcase_glob(zGlob-1,z)==0 ){
6068          z++;
6069        }
6070        return (*z)!=0;
6071      }
6072      while( (c2 = (*(z++)))!=0 ){
6073        while( c2!=c ){
6074          c2 = *(z++);
6075          if( c2==0 ) return 0;
6076        }
6077        if( testcase_glob(zGlob,z) ) return 1;
6078      }
6079      return 0;
6080    }else if( c=='?' ){
6081      if( (*(z++))==0 ) return 0;
6082    }else if( c=='[' ){
6083      int prior_c = 0;
6084      seen = 0;
6085      invert = 0;
6086      c = *(z++);
6087      if( c==0 ) return 0;
6088      c2 = *(zGlob++);
6089      if( c2=='^' ){
6090        invert = 1;
6091        c2 = *(zGlob++);
6092      }
6093      if( c2==']' ){
6094        if( c==']' ) seen = 1;
6095        c2 = *(zGlob++);
6096      }
6097      while( c2 && c2!=']' ){
6098        if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
6099          c2 = *(zGlob++);
6100          if( c>=prior_c && c<=c2 ) seen = 1;
6101          prior_c = 0;
6102        }else{
6103          if( c==c2 ){
6104            seen = 1;
6105          }
6106          prior_c = c2;
6107        }
6108        c2 = *(zGlob++);
6109      }
6110      if( c2==0 || (seen ^ invert)==0 ) return 0;
6111    }else if( c=='#' ){
6112      if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
6113      if( !IsDigit(z[0]) ) return 0;
6114      z++;
6115      while( IsDigit(z[0]) ){ z++; }
6116    }else{
6117      if( c!=(*(z++)) ) return 0;
6118    }
6119  }
6120  while( IsSpace(*z) ){ z++; }
6121  return *z==0;
6122}
6123
6124
6125/*
6126** Compare the string as a command-line option with either one or two
6127** initial "-" characters.
6128*/
6129static int optionMatch(const char *zStr, const char *zOpt){
6130  if( zStr[0]!='-' ) return 0;
6131  zStr++;
6132  if( zStr[0]=='-' ) zStr++;
6133  return cli_strcmp(zStr, zOpt)==0;
6134}
6135
6136/*
6137** Delete a file.
6138*/
6139int shellDeleteFile(const char *zFilename){
6140  int rc;
6141#ifdef _WIN32
6142  wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
6143  rc = _wunlink(z);
6144  sqlite3_free(z);
6145#else
6146  rc = unlink(zFilename);
6147#endif
6148  return rc;
6149}
6150
6151/*
6152** Try to delete the temporary file (if there is one) and free the
6153** memory used to hold the name of the temp file.
6154*/
6155static void clearTempFile(ShellState *p){
6156  if( p->zTempFile==0 ) return;
6157  if( p->doXdgOpen ) return;
6158  if( shellDeleteFile(p->zTempFile) ) return;
6159  sqlite3_free(p->zTempFile);
6160  p->zTempFile = 0;
6161}
6162
6163/*
6164** Create a new temp file name with the given suffix.
6165*/
6166static void newTempFile(ShellState *p, const char *zSuffix){
6167  clearTempFile(p);
6168  sqlite3_free(p->zTempFile);
6169  p->zTempFile = 0;
6170  if( p->db ){
6171    sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
6172  }
6173  if( p->zTempFile==0 ){
6174    /* If p->db is an in-memory database then the TEMPFILENAME file-control
6175    ** will not work and we will need to fallback to guessing */
6176    char *zTemp;
6177    sqlite3_uint64 r;
6178    sqlite3_randomness(sizeof(r), &r);
6179    zTemp = getenv("TEMP");
6180    if( zTemp==0 ) zTemp = getenv("TMP");
6181    if( zTemp==0 ){
6182#ifdef _WIN32
6183      zTemp = "\\tmp";
6184#else
6185      zTemp = "/tmp";
6186#endif
6187    }
6188    p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
6189  }else{
6190    p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
6191  }
6192  shell_check_oom(p->zTempFile);
6193}
6194
6195
6196/*
6197** The implementation of SQL scalar function fkey_collate_clause(), used
6198** by the ".lint fkey-indexes" command. This scalar function is always
6199** called with four arguments - the parent table name, the parent column name,
6200** the child table name and the child column name.
6201**
6202**   fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
6203**
6204** If either of the named tables or columns do not exist, this function
6205** returns an empty string. An empty string is also returned if both tables
6206** and columns exist but have the same default collation sequence. Or,
6207** if both exist but the default collation sequences are different, this
6208** function returns the string " COLLATE <parent-collation>", where
6209** <parent-collation> is the default collation sequence of the parent column.
6210*/
6211static void shellFkeyCollateClause(
6212  sqlite3_context *pCtx,
6213  int nVal,
6214  sqlite3_value **apVal
6215){
6216  sqlite3 *db = sqlite3_context_db_handle(pCtx);
6217  const char *zParent;
6218  const char *zParentCol;
6219  const char *zParentSeq;
6220  const char *zChild;
6221  const char *zChildCol;
6222  const char *zChildSeq = 0;  /* Initialize to avoid false-positive warning */
6223  int rc;
6224
6225  assert( nVal==4 );
6226  zParent = (const char*)sqlite3_value_text(apVal[0]);
6227  zParentCol = (const char*)sqlite3_value_text(apVal[1]);
6228  zChild = (const char*)sqlite3_value_text(apVal[2]);
6229  zChildCol = (const char*)sqlite3_value_text(apVal[3]);
6230
6231  sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
6232  rc = sqlite3_table_column_metadata(
6233      db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
6234  );
6235  if( rc==SQLITE_OK ){
6236    rc = sqlite3_table_column_metadata(
6237        db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
6238    );
6239  }
6240
6241  if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
6242    char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
6243    sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
6244    sqlite3_free(z);
6245  }
6246}
6247
6248
6249/*
6250** The implementation of dot-command ".lint fkey-indexes".
6251*/
6252static int lintFkeyIndexes(
6253  ShellState *pState,             /* Current shell tool state */
6254  char **azArg,                   /* Array of arguments passed to dot command */
6255  int nArg                        /* Number of entries in azArg[] */
6256){
6257  sqlite3 *db = pState->db;       /* Database handle to query "main" db of */
6258  FILE *out = pState->out;        /* Stream to write non-error output to */
6259  int bVerbose = 0;               /* If -verbose is present */
6260  int bGroupByParent = 0;         /* If -groupbyparent is present */
6261  int i;                          /* To iterate through azArg[] */
6262  const char *zIndent = "";       /* How much to indent CREATE INDEX by */
6263  int rc;                         /* Return code */
6264  sqlite3_stmt *pSql = 0;         /* Compiled version of SQL statement below */
6265
6266  /*
6267  ** This SELECT statement returns one row for each foreign key constraint
6268  ** in the schema of the main database. The column values are:
6269  **
6270  ** 0. The text of an SQL statement similar to:
6271  **
6272  **      "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
6273  **
6274  **    This SELECT is similar to the one that the foreign keys implementation
6275  **    needs to run internally on child tables. If there is an index that can
6276  **    be used to optimize this query, then it can also be used by the FK
6277  **    implementation to optimize DELETE or UPDATE statements on the parent
6278  **    table.
6279  **
6280  ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
6281  **    the EXPLAIN QUERY PLAN command matches this pattern, then the schema
6282  **    contains an index that can be used to optimize the query.
6283  **
6284  ** 2. Human readable text that describes the child table and columns. e.g.
6285  **
6286  **       "child_table(child_key1, child_key2)"
6287  **
6288  ** 3. Human readable text that describes the parent table and columns. e.g.
6289  **
6290  **       "parent_table(parent_key1, parent_key2)"
6291  **
6292  ** 4. A full CREATE INDEX statement for an index that could be used to
6293  **    optimize DELETE or UPDATE statements on the parent table. e.g.
6294  **
6295  **       "CREATE INDEX child_table_child_key ON child_table(child_key)"
6296  **
6297  ** 5. The name of the parent table.
6298  **
6299  ** These six values are used by the C logic below to generate the report.
6300  */
6301  const char *zSql =
6302  "SELECT "
6303    "     'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
6304    "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
6305    "  || fkey_collate_clause("
6306    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
6307    ", "
6308    "     'SEARCH ' || s.name || ' USING COVERING INDEX*('"
6309    "  || group_concat('*=?', ' AND ') || ')'"
6310    ", "
6311    "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
6312    ", "
6313    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
6314    ", "
6315    "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
6316    "  || ' ON ' || quote(s.name) || '('"
6317    "  || group_concat(quote(f.[from]) ||"
6318    "        fkey_collate_clause("
6319    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
6320    "  || ');'"
6321    ", "
6322    "     f.[table] "
6323    "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
6324    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
6325    "GROUP BY s.name, f.id "
6326    "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
6327  ;
6328  const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
6329
6330  for(i=2; i<nArg; i++){
6331    int n = strlen30(azArg[i]);
6332    if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
6333      bVerbose = 1;
6334    }
6335    else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
6336      bGroupByParent = 1;
6337      zIndent = "    ";
6338    }
6339    else{
6340      raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
6341          azArg[0], azArg[1]
6342      );
6343      return SQLITE_ERROR;
6344    }
6345  }
6346
6347  /* Register the fkey_collate_clause() SQL function */
6348  rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
6349      0, shellFkeyCollateClause, 0, 0
6350  );
6351
6352
6353  if( rc==SQLITE_OK ){
6354    rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
6355  }
6356  if( rc==SQLITE_OK ){
6357    sqlite3_bind_int(pSql, 1, bGroupByParent);
6358  }
6359
6360  if( rc==SQLITE_OK ){
6361    int rc2;
6362    char *zPrev = 0;
6363    while( SQLITE_ROW==sqlite3_step(pSql) ){
6364      int res = -1;
6365      sqlite3_stmt *pExplain = 0;
6366      const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
6367      const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
6368      const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
6369      const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
6370      const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
6371      const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
6372
6373      if( zEQP==0 ) continue;
6374      if( zGlob==0 ) continue;
6375      rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6376      if( rc!=SQLITE_OK ) break;
6377      if( SQLITE_ROW==sqlite3_step(pExplain) ){
6378        const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6379        res = zPlan!=0 && (  0==sqlite3_strglob(zGlob, zPlan)
6380                          || 0==sqlite3_strglob(zGlobIPK, zPlan));
6381      }
6382      rc = sqlite3_finalize(pExplain);
6383      if( rc!=SQLITE_OK ) break;
6384
6385      if( res<0 ){
6386        raw_printf(stderr, "Error: internal error");
6387        break;
6388      }else{
6389        if( bGroupByParent
6390        && (bVerbose || res==0)
6391        && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6392        ){
6393          raw_printf(out, "-- Parent table %s\n", zParent);
6394          sqlite3_free(zPrev);
6395          zPrev = sqlite3_mprintf("%s", zParent);
6396        }
6397
6398        if( res==0 ){
6399          raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6400        }else if( bVerbose ){
6401          raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6402              zIndent, zFrom, zTarget
6403          );
6404        }
6405      }
6406    }
6407    sqlite3_free(zPrev);
6408
6409    if( rc!=SQLITE_OK ){
6410      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6411    }
6412
6413    rc2 = sqlite3_finalize(pSql);
6414    if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6415      rc = rc2;
6416      raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6417    }
6418  }else{
6419    raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6420  }
6421
6422  return rc;
6423}
6424
6425/*
6426** Implementation of ".lint" dot command.
6427*/
6428static int lintDotCommand(
6429  ShellState *pState,             /* Current shell tool state */
6430  char **azArg,                   /* Array of arguments passed to dot command */
6431  int nArg                        /* Number of entries in azArg[] */
6432){
6433  int n;
6434  n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6435  if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6436  return lintFkeyIndexes(pState, azArg, nArg);
6437
6438 usage:
6439  raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6440  raw_printf(stderr, "Where sub-commands are:\n");
6441  raw_printf(stderr, "    fkey-indexes\n");
6442  return SQLITE_ERROR;
6443}
6444
6445#if !defined SQLITE_OMIT_VIRTUALTABLE
6446static void shellPrepare(
6447  sqlite3 *db,
6448  int *pRc,
6449  const char *zSql,
6450  sqlite3_stmt **ppStmt
6451){
6452  *ppStmt = 0;
6453  if( *pRc==SQLITE_OK ){
6454    int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6455    if( rc!=SQLITE_OK ){
6456      raw_printf(stderr, "sql error: %s (%d)\n",
6457          sqlite3_errmsg(db), sqlite3_errcode(db)
6458      );
6459      *pRc = rc;
6460    }
6461  }
6462}
6463
6464/*
6465** Create a prepared statement using printf-style arguments for the SQL.
6466**
6467** This routine is could be marked "static".  But it is not always used,
6468** depending on compile-time options.  By omitting the "static", we avoid
6469** nuisance compiler warnings about "defined but not used".
6470*/
6471void shellPreparePrintf(
6472  sqlite3 *db,
6473  int *pRc,
6474  sqlite3_stmt **ppStmt,
6475  const char *zFmt,
6476  ...
6477){
6478  *ppStmt = 0;
6479  if( *pRc==SQLITE_OK ){
6480    va_list ap;
6481    char *z;
6482    va_start(ap, zFmt);
6483    z = sqlite3_vmprintf(zFmt, ap);
6484    va_end(ap);
6485    if( z==0 ){
6486      *pRc = SQLITE_NOMEM;
6487    }else{
6488      shellPrepare(db, pRc, z, ppStmt);
6489      sqlite3_free(z);
6490    }
6491  }
6492}
6493
6494/* Finalize the prepared statement created using shellPreparePrintf().
6495**
6496** This routine is could be marked "static".  But it is not always used,
6497** depending on compile-time options.  By omitting the "static", we avoid
6498** nuisance compiler warnings about "defined but not used".
6499*/
6500void shellFinalize(
6501  int *pRc,
6502  sqlite3_stmt *pStmt
6503){
6504  if( pStmt ){
6505    sqlite3 *db = sqlite3_db_handle(pStmt);
6506    int rc = sqlite3_finalize(pStmt);
6507    if( *pRc==SQLITE_OK ){
6508      if( rc!=SQLITE_OK ){
6509        raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6510      }
6511      *pRc = rc;
6512    }
6513  }
6514}
6515
6516/* Reset the prepared statement created using shellPreparePrintf().
6517**
6518** This routine is could be marked "static".  But it is not always used,
6519** depending on compile-time options.  By omitting the "static", we avoid
6520** nuisance compiler warnings about "defined but not used".
6521*/
6522void shellReset(
6523  int *pRc,
6524  sqlite3_stmt *pStmt
6525){
6526  int rc = sqlite3_reset(pStmt);
6527  if( *pRc==SQLITE_OK ){
6528    if( rc!=SQLITE_OK ){
6529      sqlite3 *db = sqlite3_db_handle(pStmt);
6530      raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6531    }
6532    *pRc = rc;
6533  }
6534}
6535#endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6536
6537#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6538/******************************************************************************
6539** The ".archive" or ".ar" command.
6540*/
6541/*
6542** Structure representing a single ".ar" command.
6543*/
6544typedef struct ArCommand ArCommand;
6545struct ArCommand {
6546  u8 eCmd;                        /* An AR_CMD_* value */
6547  u8 bVerbose;                    /* True if --verbose */
6548  u8 bZip;                        /* True if the archive is a ZIP */
6549  u8 bDryRun;                     /* True if --dry-run */
6550  u8 bAppend;                     /* True if --append */
6551  u8 bGlob;                       /* True if --glob */
6552  u8 fromCmdLine;                 /* Run from -A instead of .archive */
6553  int nArg;                       /* Number of command arguments */
6554  char *zSrcTable;                /* "sqlar", "zipfile($file)" or "zip" */
6555  const char *zFile;              /* --file argument, or NULL */
6556  const char *zDir;               /* --directory argument, or NULL */
6557  char **azArg;                   /* Array of command arguments */
6558  ShellState *p;                  /* Shell state */
6559  sqlite3 *db;                    /* Database containing the archive */
6560};
6561
6562/*
6563** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6564*/
6565static int arUsage(FILE *f){
6566  showHelp(f,"archive");
6567  return SQLITE_ERROR;
6568}
6569
6570/*
6571** Print an error message for the .ar command to stderr and return
6572** SQLITE_ERROR.
6573*/
6574static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6575  va_list ap;
6576  char *z;
6577  va_start(ap, zFmt);
6578  z = sqlite3_vmprintf(zFmt, ap);
6579  va_end(ap);
6580  utf8_printf(stderr, "Error: %s\n", z);
6581  if( pAr->fromCmdLine ){
6582    utf8_printf(stderr, "Use \"-A\" for more help\n");
6583  }else{
6584    utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6585  }
6586  sqlite3_free(z);
6587  return SQLITE_ERROR;
6588}
6589
6590/*
6591** Values for ArCommand.eCmd.
6592*/
6593#define AR_CMD_CREATE       1
6594#define AR_CMD_UPDATE       2
6595#define AR_CMD_INSERT       3
6596#define AR_CMD_EXTRACT      4
6597#define AR_CMD_LIST         5
6598#define AR_CMD_HELP         6
6599#define AR_CMD_REMOVE       7
6600
6601/*
6602** Other (non-command) switches.
6603*/
6604#define AR_SWITCH_VERBOSE     8
6605#define AR_SWITCH_FILE        9
6606#define AR_SWITCH_DIRECTORY  10
6607#define AR_SWITCH_APPEND     11
6608#define AR_SWITCH_DRYRUN     12
6609#define AR_SWITCH_GLOB       13
6610
6611static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6612  switch( eSwitch ){
6613    case AR_CMD_CREATE:
6614    case AR_CMD_EXTRACT:
6615    case AR_CMD_LIST:
6616    case AR_CMD_REMOVE:
6617    case AR_CMD_UPDATE:
6618    case AR_CMD_INSERT:
6619    case AR_CMD_HELP:
6620      if( pAr->eCmd ){
6621        return arErrorMsg(pAr, "multiple command options");
6622      }
6623      pAr->eCmd = eSwitch;
6624      break;
6625
6626    case AR_SWITCH_DRYRUN:
6627      pAr->bDryRun = 1;
6628      break;
6629    case AR_SWITCH_GLOB:
6630      pAr->bGlob = 1;
6631      break;
6632    case AR_SWITCH_VERBOSE:
6633      pAr->bVerbose = 1;
6634      break;
6635    case AR_SWITCH_APPEND:
6636      pAr->bAppend = 1;
6637      /* Fall thru into --file */
6638    case AR_SWITCH_FILE:
6639      pAr->zFile = zArg;
6640      break;
6641    case AR_SWITCH_DIRECTORY:
6642      pAr->zDir = zArg;
6643      break;
6644  }
6645
6646  return SQLITE_OK;
6647}
6648
6649/*
6650** Parse the command line for an ".ar" command. The results are written into
6651** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6652** successfully, otherwise an error message is written to stderr and
6653** SQLITE_ERROR returned.
6654*/
6655static int arParseCommand(
6656  char **azArg,                   /* Array of arguments passed to dot command */
6657  int nArg,                       /* Number of entries in azArg[] */
6658  ArCommand *pAr                  /* Populate this object */
6659){
6660  struct ArSwitch {
6661    const char *zLong;
6662    char cShort;
6663    u8 eSwitch;
6664    u8 bArg;
6665  } aSwitch[] = {
6666    { "create",    'c', AR_CMD_CREATE,       0 },
6667    { "extract",   'x', AR_CMD_EXTRACT,      0 },
6668    { "insert",    'i', AR_CMD_INSERT,       0 },
6669    { "list",      't', AR_CMD_LIST,         0 },
6670    { "remove",    'r', AR_CMD_REMOVE,       0 },
6671    { "update",    'u', AR_CMD_UPDATE,       0 },
6672    { "help",      'h', AR_CMD_HELP,         0 },
6673    { "verbose",   'v', AR_SWITCH_VERBOSE,   0 },
6674    { "file",      'f', AR_SWITCH_FILE,      1 },
6675    { "append",    'a', AR_SWITCH_APPEND,    1 },
6676    { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6677    { "dryrun",    'n', AR_SWITCH_DRYRUN,    0 },
6678    { "glob",      'g', AR_SWITCH_GLOB,      0 },
6679  };
6680  int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6681  struct ArSwitch *pEnd = &aSwitch[nSwitch];
6682
6683  if( nArg<=1 ){
6684    utf8_printf(stderr, "Wrong number of arguments.  Usage:\n");
6685    return arUsage(stderr);
6686  }else{
6687    char *z = azArg[1];
6688    if( z[0]!='-' ){
6689      /* Traditional style [tar] invocation */
6690      int i;
6691      int iArg = 2;
6692      for(i=0; z[i]; i++){
6693        const char *zArg = 0;
6694        struct ArSwitch *pOpt;
6695        for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6696          if( z[i]==pOpt->cShort ) break;
6697        }
6698        if( pOpt==pEnd ){
6699          return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6700        }
6701        if( pOpt->bArg ){
6702          if( iArg>=nArg ){
6703            return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6704          }
6705          zArg = azArg[iArg++];
6706        }
6707        if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6708      }
6709      pAr->nArg = nArg-iArg;
6710      if( pAr->nArg>0 ){
6711        pAr->azArg = &azArg[iArg];
6712      }
6713    }else{
6714      /* Non-traditional invocation */
6715      int iArg;
6716      for(iArg=1; iArg<nArg; iArg++){
6717        int n;
6718        z = azArg[iArg];
6719        if( z[0]!='-' ){
6720          /* All remaining command line words are command arguments. */
6721          pAr->azArg = &azArg[iArg];
6722          pAr->nArg = nArg-iArg;
6723          break;
6724        }
6725        n = strlen30(z);
6726
6727        if( z[1]!='-' ){
6728          int i;
6729          /* One or more short options */
6730          for(i=1; i<n; i++){
6731            const char *zArg = 0;
6732            struct ArSwitch *pOpt;
6733            for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6734              if( z[i]==pOpt->cShort ) break;
6735            }
6736            if( pOpt==pEnd ){
6737              return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6738            }
6739            if( pOpt->bArg ){
6740              if( i<(n-1) ){
6741                zArg = &z[i+1];
6742                i = n;
6743              }else{
6744                if( iArg>=(nArg-1) ){
6745                  return arErrorMsg(pAr, "option requires an argument: %c",
6746                                    z[i]);
6747                }
6748                zArg = azArg[++iArg];
6749              }
6750            }
6751            if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6752          }
6753        }else if( z[2]=='\0' ){
6754          /* A -- option, indicating that all remaining command line words
6755          ** are command arguments.  */
6756          pAr->azArg = &azArg[iArg+1];
6757          pAr->nArg = nArg-iArg-1;
6758          break;
6759        }else{
6760          /* A long option */
6761          const char *zArg = 0;             /* Argument for option, if any */
6762          struct ArSwitch *pMatch = 0;      /* Matching option */
6763          struct ArSwitch *pOpt;            /* Iterator */
6764          for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6765            const char *zLong = pOpt->zLong;
6766            if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6767              if( pMatch ){
6768                return arErrorMsg(pAr, "ambiguous option: %s",z);
6769              }else{
6770                pMatch = pOpt;
6771              }
6772            }
6773          }
6774
6775          if( pMatch==0 ){
6776            return arErrorMsg(pAr, "unrecognized option: %s", z);
6777          }
6778          if( pMatch->bArg ){
6779            if( iArg>=(nArg-1) ){
6780              return arErrorMsg(pAr, "option requires an argument: %s", z);
6781            }
6782            zArg = azArg[++iArg];
6783          }
6784          if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6785        }
6786      }
6787    }
6788  }
6789
6790  return SQLITE_OK;
6791}
6792
6793/*
6794** This function assumes that all arguments within the ArCommand.azArg[]
6795** array refer to archive members, as for the --extract, --list or --remove
6796** commands. It checks that each of them are "present". If any specified
6797** file is not present in the archive, an error is printed to stderr and an
6798** error code returned. Otherwise, if all specified arguments are present
6799** in the archive, SQLITE_OK is returned. Here, "present" means either an
6800** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6801** when pAr->bGlob is true.
6802**
6803** This function strips any trailing '/' characters from each argument.
6804** This is consistent with the way the [tar] command seems to work on
6805** Linux.
6806*/
6807static int arCheckEntries(ArCommand *pAr){
6808  int rc = SQLITE_OK;
6809  if( pAr->nArg ){
6810    int i, j;
6811    sqlite3_stmt *pTest = 0;
6812    const char *zSel = (pAr->bGlob)
6813      ? "SELECT name FROM %s WHERE glob($name,name)"
6814      : "SELECT name FROM %s WHERE name=$name";
6815
6816    shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6817    j = sqlite3_bind_parameter_index(pTest, "$name");
6818    for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6819      char *z = pAr->azArg[i];
6820      int n = strlen30(z);
6821      int bOk = 0;
6822      while( n>0 && z[n-1]=='/' ) n--;
6823      z[n] = '\0';
6824      sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6825      if( SQLITE_ROW==sqlite3_step(pTest) ){
6826        bOk = 1;
6827      }
6828      shellReset(&rc, pTest);
6829      if( rc==SQLITE_OK && bOk==0 ){
6830        utf8_printf(stderr, "not found in archive: %s\n", z);
6831        rc = SQLITE_ERROR;
6832      }
6833    }
6834    shellFinalize(&rc, pTest);
6835  }
6836  return rc;
6837}
6838
6839/*
6840** Format a WHERE clause that can be used against the "sqlar" table to
6841** identify all archive members that match the command arguments held
6842** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6843** The caller is responsible for eventually calling sqlite3_free() on
6844** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6845** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6846*/
6847static void arWhereClause(
6848  int *pRc,
6849  ArCommand *pAr,
6850  char **pzWhere                  /* OUT: New WHERE clause */
6851){
6852  char *zWhere = 0;
6853  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6854  if( *pRc==SQLITE_OK ){
6855    if( pAr->nArg==0 ){
6856      zWhere = sqlite3_mprintf("1");
6857    }else{
6858      int i;
6859      const char *zSep = "";
6860      for(i=0; i<pAr->nArg; i++){
6861        const char *z = pAr->azArg[i];
6862        zWhere = sqlite3_mprintf(
6863          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6864          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6865        );
6866        if( zWhere==0 ){
6867          *pRc = SQLITE_NOMEM;
6868          break;
6869        }
6870        zSep = " OR ";
6871      }
6872    }
6873  }
6874  *pzWhere = zWhere;
6875}
6876
6877/*
6878** Implementation of .ar "lisT" command.
6879*/
6880static int arListCommand(ArCommand *pAr){
6881  const char *zSql = "SELECT %s FROM %s WHERE %s";
6882  const char *azCols[] = {
6883    "name",
6884    "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6885  };
6886
6887  char *zWhere = 0;
6888  sqlite3_stmt *pSql = 0;
6889  int rc;
6890
6891  rc = arCheckEntries(pAr);
6892  arWhereClause(&rc, pAr, &zWhere);
6893
6894  shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6895                     pAr->zSrcTable, zWhere);
6896  if( pAr->bDryRun ){
6897    utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6898  }else{
6899    while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6900      if( pAr->bVerbose ){
6901        utf8_printf(pAr->p->out, "%s % 10d  %s  %s\n",
6902            sqlite3_column_text(pSql, 0),
6903            sqlite3_column_int(pSql, 1),
6904            sqlite3_column_text(pSql, 2),
6905            sqlite3_column_text(pSql, 3)
6906        );
6907      }else{
6908        utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6909      }
6910    }
6911  }
6912  shellFinalize(&rc, pSql);
6913  sqlite3_free(zWhere);
6914  return rc;
6915}
6916
6917
6918/*
6919** Implementation of .ar "Remove" command.
6920*/
6921static int arRemoveCommand(ArCommand *pAr){
6922  int rc = 0;
6923  char *zSql = 0;
6924  char *zWhere = 0;
6925
6926  if( pAr->nArg ){
6927    /* Verify that args actually exist within the archive before proceeding.
6928    ** And formulate a WHERE clause to match them.  */
6929    rc = arCheckEntries(pAr);
6930    arWhereClause(&rc, pAr, &zWhere);
6931  }
6932  if( rc==SQLITE_OK ){
6933    zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6934                           pAr->zSrcTable, zWhere);
6935    if( pAr->bDryRun ){
6936      utf8_printf(pAr->p->out, "%s\n", zSql);
6937    }else{
6938      char *zErr = 0;
6939      rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6940      if( rc==SQLITE_OK ){
6941        rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6942        if( rc!=SQLITE_OK ){
6943          sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6944        }else{
6945          rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6946        }
6947      }
6948      if( zErr ){
6949        utf8_printf(stdout, "ERROR: %s\n", zErr);
6950        sqlite3_free(zErr);
6951      }
6952    }
6953  }
6954  sqlite3_free(zWhere);
6955  sqlite3_free(zSql);
6956  return rc;
6957}
6958
6959/*
6960** Implementation of .ar "eXtract" command.
6961*/
6962static int arExtractCommand(ArCommand *pAr){
6963  const char *zSql1 =
6964    "SELECT "
6965    " ($dir || name),"
6966    " writefile(($dir || name), %s, mode, mtime) "
6967    "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6968    " AND name NOT GLOB '*..[/\\]*'";
6969
6970  const char *azExtraArg[] = {
6971    "sqlar_uncompress(data, sz)",
6972    "data"
6973  };
6974
6975  sqlite3_stmt *pSql = 0;
6976  int rc = SQLITE_OK;
6977  char *zDir = 0;
6978  char *zWhere = 0;
6979  int i, j;
6980
6981  /* If arguments are specified, check that they actually exist within
6982  ** the archive before proceeding. And formulate a WHERE clause to
6983  ** match them.  */
6984  rc = arCheckEntries(pAr);
6985  arWhereClause(&rc, pAr, &zWhere);
6986
6987  if( rc==SQLITE_OK ){
6988    if( pAr->zDir ){
6989      zDir = sqlite3_mprintf("%s/", pAr->zDir);
6990    }else{
6991      zDir = sqlite3_mprintf("");
6992    }
6993    if( zDir==0 ) rc = SQLITE_NOMEM;
6994  }
6995
6996  shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6997      azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6998  );
6999
7000  if( rc==SQLITE_OK ){
7001    j = sqlite3_bind_parameter_index(pSql, "$dir");
7002    sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
7003
7004    /* Run the SELECT statement twice. The first time, writefile() is called
7005    ** for all archive members that should be extracted. The second time,
7006    ** only for the directories. This is because the timestamps for
7007    ** extracted directories must be reset after they are populated (as
7008    ** populating them changes the timestamp).  */
7009    for(i=0; i<2; i++){
7010      j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
7011      sqlite3_bind_int(pSql, j, i);
7012      if( pAr->bDryRun ){
7013        utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
7014      }else{
7015        while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
7016          if( i==0 && pAr->bVerbose ){
7017            utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
7018          }
7019        }
7020      }
7021      shellReset(&rc, pSql);
7022    }
7023    shellFinalize(&rc, pSql);
7024  }
7025
7026  sqlite3_free(zDir);
7027  sqlite3_free(zWhere);
7028  return rc;
7029}
7030
7031/*
7032** Run the SQL statement in zSql.  Or if doing a --dryrun, merely print it out.
7033*/
7034static int arExecSql(ArCommand *pAr, const char *zSql){
7035  int rc;
7036  if( pAr->bDryRun ){
7037    utf8_printf(pAr->p->out, "%s\n", zSql);
7038    rc = SQLITE_OK;
7039  }else{
7040    char *zErr = 0;
7041    rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
7042    if( zErr ){
7043      utf8_printf(stdout, "ERROR: %s\n", zErr);
7044      sqlite3_free(zErr);
7045    }
7046  }
7047  return rc;
7048}
7049
7050
7051/*
7052** Implementation of .ar "create", "insert", and "update" commands.
7053**
7054**     create    ->     Create a new SQL archive
7055**     insert    ->     Insert or reinsert all files listed
7056**     update    ->     Insert files that have changed or that were not
7057**                      previously in the archive
7058**
7059** Create the "sqlar" table in the database if it does not already exist.
7060** Then add each file in the azFile[] array to the archive. Directories
7061** are added recursively. If argument bVerbose is non-zero, a message is
7062** printed on stdout for each file archived.
7063**
7064** The create command is the same as update, except that it drops
7065** any existing "sqlar" table before beginning.  The "insert" command
7066** always overwrites every file named on the command-line, where as
7067** "update" only overwrites if the size or mtime or mode has changed.
7068*/
7069static int arCreateOrUpdateCommand(
7070  ArCommand *pAr,                 /* Command arguments and options */
7071  int bUpdate,                    /* true for a --create. */
7072  int bOnlyIfChanged              /* Only update if file has changed */
7073){
7074  const char *zCreate =
7075      "CREATE TABLE IF NOT EXISTS sqlar(\n"
7076      "  name TEXT PRIMARY KEY,  -- name of the file\n"
7077      "  mode INT,               -- access permissions\n"
7078      "  mtime INT,              -- last modification time\n"
7079      "  sz INT,                 -- original file size\n"
7080      "  data BLOB               -- compressed content\n"
7081      ")";
7082  const char *zDrop = "DROP TABLE IF EXISTS sqlar";
7083  const char *zInsertFmt[2] = {
7084     "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
7085     "  SELECT\n"
7086     "    %s,\n"
7087     "    mode,\n"
7088     "    mtime,\n"
7089     "    CASE substr(lsmode(mode),1,1)\n"
7090     "      WHEN '-' THEN length(data)\n"
7091     "      WHEN 'd' THEN 0\n"
7092     "      ELSE -1 END,\n"
7093     "    sqlar_compress(data)\n"
7094     "  FROM fsdir(%Q,%Q) AS disk\n"
7095     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
7096     ,
7097     "REPLACE INTO %s(name,mode,mtime,data)\n"
7098     "  SELECT\n"
7099     "    %s,\n"
7100     "    mode,\n"
7101     "    mtime,\n"
7102     "    data\n"
7103     "  FROM fsdir(%Q,%Q) AS disk\n"
7104     "  WHERE lsmode(mode) NOT LIKE '?%%'%s;"
7105  };
7106  int i;                          /* For iterating through azFile[] */
7107  int rc;                         /* Return code */
7108  const char *zTab = 0;           /* SQL table into which to insert */
7109  char *zSql;
7110  char zTemp[50];
7111  char *zExists = 0;
7112
7113  arExecSql(pAr, "PRAGMA page_size=512");
7114  rc = arExecSql(pAr, "SAVEPOINT ar;");
7115  if( rc!=SQLITE_OK ) return rc;
7116  zTemp[0] = 0;
7117  if( pAr->bZip ){
7118    /* Initialize the zipfile virtual table, if necessary */
7119    if( pAr->zFile ){
7120      sqlite3_uint64 r;
7121      sqlite3_randomness(sizeof(r),&r);
7122      sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
7123      zTab = zTemp;
7124      zSql = sqlite3_mprintf(
7125         "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
7126         zTab, pAr->zFile
7127      );
7128      rc = arExecSql(pAr, zSql);
7129      sqlite3_free(zSql);
7130    }else{
7131      zTab = "zip";
7132    }
7133  }else{
7134    /* Initialize the table for an SQLAR */
7135    zTab = "sqlar";
7136    if( bUpdate==0 ){
7137      rc = arExecSql(pAr, zDrop);
7138      if( rc!=SQLITE_OK ) goto end_ar_transaction;
7139    }
7140    rc = arExecSql(pAr, zCreate);
7141  }
7142  if( bOnlyIfChanged ){
7143    zExists = sqlite3_mprintf(
7144      " AND NOT EXISTS("
7145          "SELECT 1 FROM %s AS mem"
7146          " WHERE mem.name=disk.name"
7147          " AND mem.mtime=disk.mtime"
7148          " AND mem.mode=disk.mode)", zTab);
7149  }else{
7150    zExists = sqlite3_mprintf("");
7151  }
7152  if( zExists==0 ) rc = SQLITE_NOMEM;
7153  for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
7154    char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
7155        pAr->bVerbose ? "shell_putsnl(name)" : "name",
7156        pAr->azArg[i], pAr->zDir, zExists);
7157    rc = arExecSql(pAr, zSql2);
7158    sqlite3_free(zSql2);
7159  }
7160end_ar_transaction:
7161  if( rc!=SQLITE_OK ){
7162    sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
7163  }else{
7164    rc = arExecSql(pAr, "RELEASE ar;");
7165    if( pAr->bZip && pAr->zFile ){
7166      zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
7167      arExecSql(pAr, zSql);
7168      sqlite3_free(zSql);
7169    }
7170  }
7171  sqlite3_free(zExists);
7172  return rc;
7173}
7174
7175/*
7176** Implementation of ".ar" dot command.
7177*/
7178static int arDotCommand(
7179  ShellState *pState,          /* Current shell tool state */
7180  int fromCmdLine,             /* True if -A command-line option, not .ar cmd */
7181  char **azArg,                /* Array of arguments passed to dot command */
7182  int nArg                     /* Number of entries in azArg[] */
7183){
7184  ArCommand cmd;
7185  int rc;
7186  memset(&cmd, 0, sizeof(cmd));
7187  cmd.fromCmdLine = fromCmdLine;
7188  rc = arParseCommand(azArg, nArg, &cmd);
7189  if( rc==SQLITE_OK ){
7190    int eDbType = SHELL_OPEN_UNSPEC;
7191    cmd.p = pState;
7192    cmd.db = pState->db;
7193    if( cmd.zFile ){
7194      eDbType = deduceDatabaseType(cmd.zFile, 1);
7195    }else{
7196      eDbType = pState->openMode;
7197    }
7198    if( eDbType==SHELL_OPEN_ZIPFILE ){
7199      if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
7200        if( cmd.zFile==0 ){
7201          cmd.zSrcTable = sqlite3_mprintf("zip");
7202        }else{
7203          cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
7204        }
7205      }
7206      cmd.bZip = 1;
7207    }else if( cmd.zFile ){
7208      int flags;
7209      if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
7210      if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
7211           || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
7212        flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
7213      }else{
7214        flags = SQLITE_OPEN_READONLY;
7215      }
7216      cmd.db = 0;
7217      if( cmd.bDryRun ){
7218        utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
7219             eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
7220      }
7221      rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
7222             eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
7223      if( rc!=SQLITE_OK ){
7224        utf8_printf(stderr, "cannot open file: %s (%s)\n",
7225            cmd.zFile, sqlite3_errmsg(cmd.db)
7226        );
7227        goto end_ar_command;
7228      }
7229      sqlite3_fileio_init(cmd.db, 0, 0);
7230      sqlite3_sqlar_init(cmd.db, 0, 0);
7231      sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
7232                              shellPutsFunc, 0, 0);
7233
7234    }
7235    if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
7236      if( cmd.eCmd!=AR_CMD_CREATE
7237       && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
7238      ){
7239        utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
7240        rc = SQLITE_ERROR;
7241        goto end_ar_command;
7242      }
7243      cmd.zSrcTable = sqlite3_mprintf("sqlar");
7244    }
7245
7246    switch( cmd.eCmd ){
7247      case AR_CMD_CREATE:
7248        rc = arCreateOrUpdateCommand(&cmd, 0, 0);
7249        break;
7250
7251      case AR_CMD_EXTRACT:
7252        rc = arExtractCommand(&cmd);
7253        break;
7254
7255      case AR_CMD_LIST:
7256        rc = arListCommand(&cmd);
7257        break;
7258
7259      case AR_CMD_HELP:
7260        arUsage(pState->out);
7261        break;
7262
7263      case AR_CMD_INSERT:
7264        rc = arCreateOrUpdateCommand(&cmd, 1, 0);
7265        break;
7266
7267      case AR_CMD_REMOVE:
7268        rc = arRemoveCommand(&cmd);
7269        break;
7270
7271      default:
7272        assert( cmd.eCmd==AR_CMD_UPDATE );
7273        rc = arCreateOrUpdateCommand(&cmd, 1, 1);
7274        break;
7275    }
7276  }
7277end_ar_command:
7278  if( cmd.db!=pState->db ){
7279    close_db(cmd.db);
7280  }
7281  sqlite3_free(cmd.zSrcTable);
7282
7283  return rc;
7284}
7285/* End of the ".archive" or ".ar" command logic
7286*******************************************************************************/
7287#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
7288
7289#if SQLITE_SHELL_HAVE_RECOVER
7290
7291/*
7292** This function is used as a callback by the recover extension. Simply
7293** print the supplied SQL statement to stdout.
7294*/
7295static int recoverSqlCb(void *pCtx, const char *zSql){
7296  ShellState *pState = (ShellState*)pCtx;
7297  utf8_printf(pState->out, "%s;\n", zSql);
7298  return SQLITE_OK;
7299}
7300
7301/*
7302** This function is called to recover data from the database. A script
7303** to construct a new database containing all recovered data is output
7304** on stream pState->out.
7305*/
7306static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7307  int rc = SQLITE_OK;
7308  const char *zRecoveryDb = "";   /* Name of "recovery" database.  Debug only */
7309  const char *zLAF = "lost_and_found";
7310  int bFreelist = 1;              /* 0 if --ignore-freelist is specified */
7311  int bRowids = 1;                /* 0 if --no-rowids */
7312  sqlite3_recover *p = 0;
7313  int i = 0;
7314
7315  for(i=1; i<nArg; i++){
7316    char *z = azArg[i];
7317    int n;
7318    if( z[0]=='-' && z[1]=='-' ) z++;
7319    n = strlen30(z);
7320    if( n<=17 && memcmp("-ignore-freelist", z, n)==0 ){
7321      bFreelist = 0;
7322    }else
7323    if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7324      /* This option determines the name of the ATTACH-ed database used
7325      ** internally by the recovery extension.  The default is "" which
7326      ** means to use a temporary database that is automatically deleted
7327      ** when closed.  This option is undocumented and might disappear at
7328      ** any moment. */
7329      i++;
7330      zRecoveryDb = azArg[i];
7331    }else
7332    if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7333      i++;
7334      zLAF = azArg[i];
7335    }else
7336    if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7337      bRowids = 0;
7338    }
7339    else{
7340      utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7341      showHelp(pState->out, azArg[0]);
7342      return 1;
7343    }
7344  }
7345
7346  p = sqlite3_recover_init_sql(
7347      pState->db, "main", recoverSqlCb, (void*)pState
7348  );
7349
7350  sqlite3_recover_config(p, 789, (void*)zRecoveryDb);  /* Debug use only */
7351  sqlite3_recover_config(p, SQLITE_RECOVER_LOST_AND_FOUND, (void*)zLAF);
7352  sqlite3_recover_config(p, SQLITE_RECOVER_ROWIDS, (void*)&bRowids);
7353  sqlite3_recover_config(p, SQLITE_RECOVER_FREELIST_CORRUPT,(void*)&bFreelist);
7354
7355  sqlite3_recover_run(p);
7356  if( sqlite3_recover_errcode(p)!=SQLITE_OK ){
7357    const char *zErr = sqlite3_recover_errmsg(p);
7358    int errCode = sqlite3_recover_errcode(p);
7359    raw_printf(stderr, "sql error: %s (%d)\n", zErr, errCode);
7360  }
7361  rc = sqlite3_recover_finish(p);
7362  return rc;
7363}
7364#endif /* SQLITE_SHELL_HAVE_RECOVER */
7365
7366
7367/*
7368 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
7369 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
7370 *   close db and set it to 0, and return the columns spec, to later
7371 *   be sqlite3_free()'ed by the caller.
7372 * The return is 0 when either:
7373 *   (a) The db was not initialized and zCol==0 (There are no columns.)
7374 *   (b) zCol!=0  (Column was added, db initialized as needed.)
7375 * The 3rd argument, pRenamed, references an out parameter. If the
7376 * pointer is non-zero, its referent will be set to a summary of renames
7377 * done if renaming was necessary, or set to 0 if none was done. The out
7378 * string (if any) must be sqlite3_free()'ed by the caller.
7379 */
7380#ifdef SHELL_DEBUG
7381#define rc_err_oom_die(rc) \
7382  if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
7383  else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
7384    fprintf(stderr,"E:%d\n",rc), assert(0)
7385#else
7386static void rc_err_oom_die(int rc){
7387  if( rc==SQLITE_NOMEM ) shell_check_oom(0);
7388  assert(rc==SQLITE_OK||rc==SQLITE_DONE);
7389}
7390#endif
7391
7392#ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
7393static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
7394#else  /* Otherwise, memory is faster/better for the transient DB. */
7395static const char *zCOL_DB = ":memory:";
7396#endif
7397
7398/* Define character (as C string) to separate generated column ordinal
7399 * from protected part of incoming column names. This defaults to "_"
7400 * so that incoming column identifiers that did not need not be quoted
7401 * remain usable without being quoted. It must be one character.
7402 */
7403#ifndef SHELL_AUTOCOLUMN_SEP
7404# define AUTOCOLUMN_SEP "_"
7405#else
7406# define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
7407#endif
7408
7409static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
7410  /* Queries and D{D,M}L used here */
7411  static const char * const zTabMake = "\
7412CREATE TABLE ColNames(\
7413 cpos INTEGER PRIMARY KEY,\
7414 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
7415CREATE VIEW RepeatedNames AS \
7416SELECT DISTINCT t.name FROM ColNames t \
7417WHERE t.name COLLATE NOCASE IN (\
7418 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
7419);\
7420";
7421  static const char * const zTabFill = "\
7422INSERT INTO ColNames(name,nlen,chop,reps,suff)\
7423 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
7424";
7425  static const char * const zHasDupes = "\
7426SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
7427 <count(name) FROM ColNames\
7428";
7429#ifdef SHELL_COLUMN_RENAME_CLEAN
7430  static const char * const zDedoctor = "\
7431UPDATE ColNames SET chop=iif(\
7432  (substring(name,nlen,1) BETWEEN '0' AND '9')\
7433  AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
7434 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
7435 0\
7436)\
7437";
7438#endif
7439  static const char * const zSetReps = "\
7440UPDATE ColNames AS t SET reps=\
7441(SELECT count(*) FROM ColNames d \
7442 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
7443 COLLATE NOCASE\
7444)\
7445";
7446#ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7447  static const char * const zColDigits = "\
7448SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
7449";
7450#else
7451  /* Counting on SQLITE_MAX_COLUMN < 100,000 here. (32767 is the hard limit.) */
7452  static const char * const zColDigits = "\
7453SELECT CASE WHEN (nc < 10) THEN 1 WHEN (nc < 100) THEN 2 \
7454 WHEN (nc < 1000) THEN 3 WHEN (nc < 10000) THEN 4 \
7455 ELSE 5 FROM (SELECT count(*) AS nc FROM ColNames) \
7456";
7457#endif
7458  static const char * const zRenameRank =
7459#ifdef SHELL_COLUMN_RENAME_CLEAN
7460    "UPDATE ColNames AS t SET suff="
7461    "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
7462#else /* ...RENAME_MINIMAL_ONE_PASS */
7463"WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
7464"  SELECT 0 AS nlz"
7465"  UNION"
7466"  SELECT nlz+1 AS nlz FROM Lzn"
7467"  WHERE EXISTS("
7468"   SELECT 1"
7469"   FROM ColNames t, ColNames o"
7470"   WHERE"
7471"    iif(t.name IN (SELECT * FROM RepeatedNames),"
7472"     printf('%s"AUTOCOLUMN_SEP"%s',"
7473"      t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
7474"     t.name"
7475"    )"
7476"    ="
7477"    iif(o.name IN (SELECT * FROM RepeatedNames),"
7478"     printf('%s"AUTOCOLUMN_SEP"%s',"
7479"      o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
7480"     o.name"
7481"    )"
7482"    COLLATE NOCASE"
7483"    AND o.cpos<>t.cpos"
7484"   GROUP BY t.cpos"
7485"  )"
7486") UPDATE Colnames AS t SET"
7487" chop = 0," /* No chopping, never touch incoming names. */
7488" suff = iif(name IN (SELECT * FROM RepeatedNames),"
7489"  printf('"AUTOCOLUMN_SEP"%s', substring("
7490"   printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
7491"  ''"
7492" )"
7493#endif
7494    ;
7495  static const char * const zCollectVar = "\
7496SELECT\
7497 '('||x'0a'\
7498 || group_concat(\
7499  cname||' TEXT',\
7500  ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
7501 ||')' AS ColsSpec \
7502FROM (\
7503 SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
7504 FROM ColNames ORDER BY cpos\
7505)";
7506  static const char * const zRenamesDone =
7507    "SELECT group_concat("
7508    " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
7509    " ','||x'0a')"
7510    "FROM ColNames WHERE suff<>'' OR chop!=0"
7511    ;
7512  int rc;
7513  sqlite3_stmt *pStmt = 0;
7514  assert(pDb!=0);
7515  if( zColNew ){
7516    /* Add initial or additional column. Init db if necessary. */
7517    if( *pDb==0 ){
7518      if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
7519#ifdef SHELL_COLFIX_DB
7520      if(*zCOL_DB!=':')
7521        sqlite3_exec(*pDb,"drop table if exists ColNames;"
7522                     "drop view if exists RepeatedNames;",0,0,0);
7523#endif
7524      rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
7525      rc_err_oom_die(rc);
7526    }
7527    assert(*pDb!=0);
7528    rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
7529    rc_err_oom_die(rc);
7530    rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
7531    rc_err_oom_die(rc);
7532    rc = sqlite3_step(pStmt);
7533    rc_err_oom_die(rc);
7534    sqlite3_finalize(pStmt);
7535    return 0;
7536  }else if( *pDb==0 ){
7537    return 0;
7538  }else{
7539    /* Formulate the columns spec, close the DB, zero *pDb. */
7540    char *zColsSpec = 0;
7541    int hasDupes = db_int(*pDb, zHasDupes);
7542    int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
7543    if( hasDupes ){
7544#ifdef SHELL_COLUMN_RENAME_CLEAN
7545      rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
7546      rc_err_oom_die(rc);
7547#endif
7548      rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
7549      rc_err_oom_die(rc);
7550      rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
7551      rc_err_oom_die(rc);
7552      sqlite3_bind_int(pStmt, 1, nDigits);
7553      rc = sqlite3_step(pStmt);
7554      sqlite3_finalize(pStmt);
7555      assert(rc==SQLITE_DONE);
7556    }
7557    assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
7558    rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
7559    rc_err_oom_die(rc);
7560    rc = sqlite3_step(pStmt);
7561    if( rc==SQLITE_ROW ){
7562      zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
7563    }else{
7564      zColsSpec = 0;
7565    }
7566    if( pzRenamed!=0 ){
7567      if( !hasDupes ) *pzRenamed = 0;
7568      else{
7569        sqlite3_finalize(pStmt);
7570        if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
7571            && SQLITE_ROW==sqlite3_step(pStmt) ){
7572          *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
7573        }else
7574          *pzRenamed = 0;
7575      }
7576    }
7577    sqlite3_finalize(pStmt);
7578    sqlite3_close(*pDb);
7579    *pDb = 0;
7580    return zColsSpec;
7581  }
7582}
7583
7584/*
7585** If an input line begins with "." then invoke this routine to
7586** process that line.
7587**
7588** Return 1 on error, 2 to exit, and 0 otherwise.
7589*/
7590static int do_meta_command(char *zLine, ShellState *p){
7591  int h = 1;
7592  int nArg = 0;
7593  int n, c;
7594  int rc = 0;
7595  char *azArg[52];
7596
7597#ifndef SQLITE_OMIT_VIRTUALTABLE
7598  if( p->expert.pExpert ){
7599    expertFinish(p, 1, 0);
7600  }
7601#endif
7602
7603  /* Parse the input line into tokens.
7604  */
7605  while( zLine[h] && nArg<ArraySize(azArg)-1 ){
7606    while( IsSpace(zLine[h]) ){ h++; }
7607    if( zLine[h]==0 ) break;
7608    if( zLine[h]=='\'' || zLine[h]=='"' ){
7609      int delim = zLine[h++];
7610      azArg[nArg++] = &zLine[h];
7611      while( zLine[h] && zLine[h]!=delim ){
7612        if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
7613        h++;
7614      }
7615      if( zLine[h]==delim ){
7616        zLine[h++] = 0;
7617      }
7618      if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
7619    }else{
7620      azArg[nArg++] = &zLine[h];
7621      while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
7622      if( zLine[h] ) zLine[h++] = 0;
7623      resolve_backslashes(azArg[nArg-1]);
7624    }
7625  }
7626  azArg[nArg] = 0;
7627
7628  /* Process the input line.
7629  */
7630  if( nArg==0 ) return 0; /* no tokens, no error */
7631  n = strlen30(azArg[0]);
7632  c = azArg[0][0];
7633  clearTempFile(p);
7634
7635#ifndef SQLITE_OMIT_AUTHORIZATION
7636  if( c=='a' && cli_strncmp(azArg[0], "auth", n)==0 ){
7637    if( nArg!=2 ){
7638      raw_printf(stderr, "Usage: .auth ON|OFF\n");
7639      rc = 1;
7640      goto meta_command_exit;
7641    }
7642    open_db(p, 0);
7643    if( booleanValue(azArg[1]) ){
7644      sqlite3_set_authorizer(p->db, shellAuth, p);
7645    }else if( p->bSafeModePersist ){
7646      sqlite3_set_authorizer(p->db, safeModeAuth, p);
7647    }else{
7648      sqlite3_set_authorizer(p->db, 0, 0);
7649    }
7650  }else
7651#endif
7652
7653#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) \
7654  && !defined(SQLITE_SHELL_FIDDLE)
7655  if( c=='a' && cli_strncmp(azArg[0], "archive", n)==0 ){
7656    open_db(p, 0);
7657    failIfSafeMode(p, "cannot run .archive in safe mode");
7658    rc = arDotCommand(p, 0, azArg, nArg);
7659  }else
7660#endif
7661
7662#ifndef SQLITE_SHELL_FIDDLE
7663  if( (c=='b' && n>=3 && cli_strncmp(azArg[0], "backup", n)==0)
7664   || (c=='s' && n>=3 && cli_strncmp(azArg[0], "save", n)==0)
7665  ){
7666    const char *zDestFile = 0;
7667    const char *zDb = 0;
7668    sqlite3 *pDest;
7669    sqlite3_backup *pBackup;
7670    int j;
7671    int bAsync = 0;
7672    const char *zVfs = 0;
7673    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
7674    for(j=1; j<nArg; j++){
7675      const char *z = azArg[j];
7676      if( z[0]=='-' ){
7677        if( z[1]=='-' ) z++;
7678        if( cli_strcmp(z, "-append")==0 ){
7679          zVfs = "apndvfs";
7680        }else
7681        if( cli_strcmp(z, "-async")==0 ){
7682          bAsync = 1;
7683        }else
7684        {
7685          utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
7686          return 1;
7687        }
7688      }else if( zDestFile==0 ){
7689        zDestFile = azArg[j];
7690      }else if( zDb==0 ){
7691        zDb = zDestFile;
7692        zDestFile = azArg[j];
7693      }else{
7694        raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
7695        return 1;
7696      }
7697    }
7698    if( zDestFile==0 ){
7699      raw_printf(stderr, "missing FILENAME argument on .backup\n");
7700      return 1;
7701    }
7702    if( zDb==0 ) zDb = "main";
7703    rc = sqlite3_open_v2(zDestFile, &pDest,
7704                  SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
7705    if( rc!=SQLITE_OK ){
7706      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
7707      close_db(pDest);
7708      return 1;
7709    }
7710    if( bAsync ){
7711      sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
7712                   0, 0, 0);
7713    }
7714    open_db(p, 0);
7715    pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
7716    if( pBackup==0 ){
7717      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7718      close_db(pDest);
7719      return 1;
7720    }
7721    while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
7722    sqlite3_backup_finish(pBackup);
7723    if( rc==SQLITE_DONE ){
7724      rc = 0;
7725    }else{
7726      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
7727      rc = 1;
7728    }
7729    close_db(pDest);
7730  }else
7731#endif /* !defined(SQLITE_SHELL_FIDDLE) */
7732
7733  if( c=='b' && n>=3 && cli_strncmp(azArg[0], "bail", n)==0 ){
7734    if( nArg==2 ){
7735      bail_on_error = booleanValue(azArg[1]);
7736    }else{
7737      raw_printf(stderr, "Usage: .bail on|off\n");
7738      rc = 1;
7739    }
7740  }else
7741
7742  if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
7743    if( nArg==2 ){
7744      if( booleanValue(azArg[1]) ){
7745        setBinaryMode(p->out, 1);
7746      }else{
7747        setTextMode(p->out, 1);
7748      }
7749    }else{
7750      raw_printf(stderr, "Usage: .binary on|off\n");
7751      rc = 1;
7752    }
7753  }else
7754
7755  /* The undocumented ".breakpoint" command causes a call to the no-op
7756  ** routine named test_breakpoint().
7757  */
7758  if( c=='b' && n>=3 && cli_strncmp(azArg[0], "breakpoint", n)==0 ){
7759    test_breakpoint();
7760  }else
7761
7762#ifndef SQLITE_SHELL_FIDDLE
7763  if( c=='c' && cli_strcmp(azArg[0],"cd")==0 ){
7764    failIfSafeMode(p, "cannot run .cd in safe mode");
7765    if( nArg==2 ){
7766#if defined(_WIN32) || defined(WIN32)
7767      wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
7768      rc = !SetCurrentDirectoryW(z);
7769      sqlite3_free(z);
7770#else
7771      rc = chdir(azArg[1]);
7772#endif
7773      if( rc ){
7774        utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
7775        rc = 1;
7776      }
7777    }else{
7778      raw_printf(stderr, "Usage: .cd DIRECTORY\n");
7779      rc = 1;
7780    }
7781  }else
7782#endif /* !defined(SQLITE_SHELL_FIDDLE) */
7783
7784  if( c=='c' && n>=3 && cli_strncmp(azArg[0], "changes", n)==0 ){
7785    if( nArg==2 ){
7786      setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
7787    }else{
7788      raw_printf(stderr, "Usage: .changes on|off\n");
7789      rc = 1;
7790    }
7791  }else
7792
7793#ifndef SQLITE_SHELL_FIDDLE
7794  /* Cancel output redirection, if it is currently set (by .testcase)
7795  ** Then read the content of the testcase-out.txt file and compare against
7796  ** azArg[1].  If there are differences, report an error and exit.
7797  */
7798  if( c=='c' && n>=3 && cli_strncmp(azArg[0], "check", n)==0 ){
7799    char *zRes = 0;
7800    output_reset(p);
7801    if( nArg!=2 ){
7802      raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
7803      rc = 2;
7804    }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
7805      raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
7806      rc = 2;
7807    }else if( testcase_glob(azArg[1],zRes)==0 ){
7808      utf8_printf(stderr,
7809                 "testcase-%s FAILED\n Expected: [%s]\n      Got: [%s]\n",
7810                 p->zTestcase, azArg[1], zRes);
7811      rc = 1;
7812    }else{
7813      utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
7814      p->nCheck++;
7815    }
7816    sqlite3_free(zRes);
7817  }else
7818#endif /* !defined(SQLITE_SHELL_FIDDLE) */
7819
7820#ifndef SQLITE_SHELL_FIDDLE
7821  if( c=='c' && cli_strncmp(azArg[0], "clone", n)==0 ){
7822    failIfSafeMode(p, "cannot run .clone in safe mode");
7823    if( nArg==2 ){
7824      tryToClone(p, azArg[1]);
7825    }else{
7826      raw_printf(stderr, "Usage: .clone FILENAME\n");
7827      rc = 1;
7828    }
7829  }else
7830#endif /* !defined(SQLITE_SHELL_FIDDLE) */
7831
7832  if( c=='c' && cli_strncmp(azArg[0], "connection", n)==0 ){
7833    if( nArg==1 ){
7834      /* List available connections */
7835      int i;
7836      for(i=0; i<ArraySize(p->aAuxDb); i++){
7837        const char *zFile = p->aAuxDb[i].zDbFilename;
7838        if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
7839          zFile = "(not open)";
7840        }else if( zFile==0 ){
7841          zFile = "(memory)";
7842        }else if( zFile[0]==0 ){
7843          zFile = "(temporary-file)";
7844        }
7845        if( p->pAuxDb == &p->aAuxDb[i] ){
7846          utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
7847        }else if( p->aAuxDb[i].db!=0 ){
7848          utf8_printf(stdout, "       %d: %s\n", i, zFile);
7849        }
7850      }
7851    }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
7852      int i = azArg[1][0] - '0';
7853      if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
7854        p->pAuxDb->db = p->db;
7855        p->pAuxDb = &p->aAuxDb[i];
7856        globalDb = p->db = p->pAuxDb->db;
7857        p->pAuxDb->db = 0;
7858      }
7859    }else if( nArg==3 && cli_strcmp(azArg[1], "close")==0
7860           && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
7861      int i = azArg[2][0] - '0';
7862      if( i<0 || i>=ArraySize(p->aAuxDb) ){
7863        /* No-op */
7864      }else if( p->pAuxDb == &p->aAuxDb[i] ){
7865        raw_printf(stderr, "cannot close the active database connection\n");
7866        rc = 1;
7867      }else if( p->aAuxDb[i].db ){
7868        session_close_all(p, i);
7869        close_db(p->aAuxDb[i].db);
7870        p->aAuxDb[i].db = 0;
7871      }
7872    }else{
7873      raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
7874      rc = 1;
7875    }
7876  }else
7877
7878  if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
7879    char **azName = 0;
7880    int nName = 0;
7881    sqlite3_stmt *pStmt;
7882    int i;
7883    open_db(p, 0);
7884    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
7885    if( rc ){
7886      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
7887      rc = 1;
7888    }else{
7889      while( sqlite3_step(pStmt)==SQLITE_ROW ){
7890        const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
7891        const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
7892        if( zSchema==0 || zFile==0 ) continue;
7893        azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
7894        shell_check_oom(azName);
7895        azName[nName*2] = strdup(zSchema);
7896        azName[nName*2+1] = strdup(zFile);
7897        nName++;
7898      }
7899    }
7900    sqlite3_finalize(pStmt);
7901    for(i=0; i<nName; i++){
7902      int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
7903      int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
7904      const char *z = azName[i*2+1];
7905      utf8_printf(p->out, "%s: %s %s%s\n",
7906         azName[i*2],
7907         z && z[0] ? z : "\"\"",
7908         bRdonly ? "r/o" : "r/w",
7909         eTxn==SQLITE_TXN_NONE ? "" :
7910            eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
7911      free(azName[i*2]);
7912      free(azName[i*2+1]);
7913    }
7914    sqlite3_free(azName);
7915  }else
7916
7917  if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbconfig", n)==0 ){
7918    static const struct DbConfigChoices {
7919      const char *zName;
7920      int op;
7921    } aDbConfig[] = {
7922        { "defensive",          SQLITE_DBCONFIG_DEFENSIVE             },
7923        { "dqs_ddl",            SQLITE_DBCONFIG_DQS_DDL               },
7924        { "dqs_dml",            SQLITE_DBCONFIG_DQS_DML               },
7925        { "enable_fkey",        SQLITE_DBCONFIG_ENABLE_FKEY           },
7926        { "enable_qpsg",        SQLITE_DBCONFIG_ENABLE_QPSG           },
7927        { "enable_trigger",     SQLITE_DBCONFIG_ENABLE_TRIGGER        },
7928        { "enable_view",        SQLITE_DBCONFIG_ENABLE_VIEW           },
7929        { "fts3_tokenizer",     SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
7930        { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    },
7931        { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
7932        { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
7933        { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
7934        { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
7935        { "trigger_eqp",        SQLITE_DBCONFIG_TRIGGER_EQP           },
7936        { "trusted_schema",     SQLITE_DBCONFIG_TRUSTED_SCHEMA        },
7937        { "writable_schema",    SQLITE_DBCONFIG_WRITABLE_SCHEMA       },
7938    };
7939    int ii, v;
7940    open_db(p, 0);
7941    for(ii=0; ii<ArraySize(aDbConfig); ii++){
7942      if( nArg>1 && cli_strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
7943      if( nArg>=3 ){
7944        sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
7945      }
7946      sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
7947      utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
7948      if( nArg>1 ) break;
7949    }
7950    if( nArg>1 && ii==ArraySize(aDbConfig) ){
7951      utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
7952      utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
7953    }
7954  }else
7955
7956#if SQLITE_SHELL_HAVE_RECOVER
7957  if( c=='d' && n>=3 && cli_strncmp(azArg[0], "dbinfo", n)==0 ){
7958    rc = shell_dbinfo_command(p, nArg, azArg);
7959  }else
7960
7961  if( c=='r' && cli_strncmp(azArg[0], "recover", n)==0 ){
7962    open_db(p, 0);
7963    rc = recoverDatabaseCmd(p, nArg, azArg);
7964  }else
7965#endif /* SQLITE_SHELL_HAVE_RECOVER */
7966
7967  if( c=='d' && cli_strncmp(azArg[0], "dump", n)==0 ){
7968    char *zLike = 0;
7969    char *zSql;
7970    int i;
7971    int savedShowHeader = p->showHeader;
7972    int savedShellFlags = p->shellFlgs;
7973    ShellClearFlag(p,
7974       SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
7975       |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
7976    for(i=1; i<nArg; i++){
7977      if( azArg[i][0]=='-' ){
7978        const char *z = azArg[i]+1;
7979        if( z[0]=='-' ) z++;
7980        if( cli_strcmp(z,"preserve-rowids")==0 ){
7981#ifdef SQLITE_OMIT_VIRTUALTABLE
7982          raw_printf(stderr, "The --preserve-rowids option is not compatible"
7983                             " with SQLITE_OMIT_VIRTUALTABLE\n");
7984          rc = 1;
7985          sqlite3_free(zLike);
7986          goto meta_command_exit;
7987#else
7988          ShellSetFlag(p, SHFLG_PreserveRowid);
7989#endif
7990        }else
7991        if( cli_strcmp(z,"newlines")==0 ){
7992          ShellSetFlag(p, SHFLG_Newlines);
7993        }else
7994        if( cli_strcmp(z,"data-only")==0 ){
7995          ShellSetFlag(p, SHFLG_DumpDataOnly);
7996        }else
7997        if( cli_strcmp(z,"nosys")==0 ){
7998          ShellSetFlag(p, SHFLG_DumpNoSys);
7999        }else
8000        {
8001          raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8002          rc = 1;
8003          sqlite3_free(zLike);
8004          goto meta_command_exit;
8005        }
8006      }else{
8007        /* azArg[i] contains a LIKE pattern. This ".dump" request should
8008        ** only dump data for tables for which either the table name matches
8009        ** the LIKE pattern, or the table appears to be a shadow table of
8010        ** a virtual table for which the name matches the LIKE pattern.
8011        */
8012        char *zExpr = sqlite3_mprintf(
8013            "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8014            "  SELECT 1 FROM sqlite_schema WHERE "
8015            "    name LIKE %Q ESCAPE '\\' AND"
8016            "    sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8017            "    substr(o.name, 1, length(name)+1) == (name||'_')"
8018            ")", azArg[i], azArg[i]
8019        );
8020
8021        if( zLike ){
8022          zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8023        }else{
8024          zLike = zExpr;
8025        }
8026      }
8027    }
8028
8029    open_db(p, 0);
8030
8031    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8032      /* When playing back a "dump", the content might appear in an order
8033      ** which causes immediate foreign key constraints to be violated.
8034      ** So disable foreign-key constraint enforcement to prevent problems. */
8035      raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8036      raw_printf(p->out, "BEGIN TRANSACTION;\n");
8037    }
8038    p->writableSchema = 0;
8039    p->showHeader = 0;
8040    /* Set writable_schema=ON since doing so forces SQLite to initialize
8041    ** as much of the schema as it can even if the sqlite_schema table is
8042    ** corrupt. */
8043    sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8044    p->nErr = 0;
8045    if( zLike==0 ) zLike = sqlite3_mprintf("true");
8046    zSql = sqlite3_mprintf(
8047      "SELECT name, type, sql FROM sqlite_schema AS o "
8048      "WHERE (%s) AND type=='table'"
8049      "  AND sql NOT NULL"
8050      " ORDER BY tbl_name='sqlite_sequence', rowid",
8051      zLike
8052    );
8053    run_schema_dump_query(p,zSql);
8054    sqlite3_free(zSql);
8055    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8056      zSql = sqlite3_mprintf(
8057        "SELECT sql FROM sqlite_schema AS o "
8058        "WHERE (%s) AND sql NOT NULL"
8059        "  AND type IN ('index','trigger','view')",
8060        zLike
8061      );
8062      run_table_dump_query(p, zSql);
8063      sqlite3_free(zSql);
8064    }
8065    sqlite3_free(zLike);
8066    if( p->writableSchema ){
8067      raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8068      p->writableSchema = 0;
8069    }
8070    sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8071    sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8072    if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8073      raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8074    }
8075    p->showHeader = savedShowHeader;
8076    p->shellFlgs = savedShellFlags;
8077  }else
8078
8079  if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){
8080    if( nArg==2 ){
8081      setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8082    }else{
8083      raw_printf(stderr, "Usage: .echo on|off\n");
8084      rc = 1;
8085    }
8086  }else
8087
8088  if( c=='e' && cli_strncmp(azArg[0], "eqp", n)==0 ){
8089    if( nArg==2 ){
8090      p->autoEQPtest = 0;
8091      if( p->autoEQPtrace ){
8092        if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8093        p->autoEQPtrace = 0;
8094      }
8095      if( cli_strcmp(azArg[1],"full")==0 ){
8096        p->autoEQP = AUTOEQP_full;
8097      }else if( cli_strcmp(azArg[1],"trigger")==0 ){
8098        p->autoEQP = AUTOEQP_trigger;
8099#ifdef SQLITE_DEBUG
8100      }else if( cli_strcmp(azArg[1],"test")==0 ){
8101        p->autoEQP = AUTOEQP_on;
8102        p->autoEQPtest = 1;
8103      }else if( cli_strcmp(azArg[1],"trace")==0 ){
8104        p->autoEQP = AUTOEQP_full;
8105        p->autoEQPtrace = 1;
8106        open_db(p, 0);
8107        sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8108        sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8109#endif
8110      }else{
8111        p->autoEQP = (u8)booleanValue(azArg[1]);
8112      }
8113    }else{
8114      raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8115      rc = 1;
8116    }
8117  }else
8118
8119#ifndef SQLITE_SHELL_FIDDLE
8120  if( c=='e' && cli_strncmp(azArg[0], "exit", n)==0 ){
8121    if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8122    rc = 2;
8123  }else
8124#endif
8125
8126  /* The ".explain" command is automatic now.  It is largely pointless.  It
8127  ** retained purely for backwards compatibility */
8128  if( c=='e' && cli_strncmp(azArg[0], "explain", n)==0 ){
8129    int val = 1;
8130    if( nArg>=2 ){
8131      if( cli_strcmp(azArg[1],"auto")==0 ){
8132        val = 99;
8133      }else{
8134        val =  booleanValue(azArg[1]);
8135      }
8136    }
8137    if( val==1 && p->mode!=MODE_Explain ){
8138      p->normalMode = p->mode;
8139      p->mode = MODE_Explain;
8140      p->autoExplain = 0;
8141    }else if( val==0 ){
8142      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8143      p->autoExplain = 0;
8144    }else if( val==99 ){
8145      if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8146      p->autoExplain = 1;
8147    }
8148  }else
8149
8150#ifndef SQLITE_OMIT_VIRTUALTABLE
8151  if( c=='e' && cli_strncmp(azArg[0], "expert", n)==0 ){
8152    if( p->bSafeMode ){
8153      raw_printf(stderr,
8154        "Cannot run experimental commands such as \"%s\" in safe mode\n",
8155        azArg[0]);
8156      rc = 1;
8157    }else{
8158      open_db(p, 0);
8159      expertDotCommand(p, azArg, nArg);
8160    }
8161  }else
8162#endif
8163
8164  if( c=='f' && cli_strncmp(azArg[0], "filectrl", n)==0 ){
8165    static const struct {
8166       const char *zCtrlName;   /* Name of a test-control option */
8167       int ctrlCode;            /* Integer code for that option */
8168       const char *zUsage;      /* Usage notes */
8169    } aCtrl[] = {
8170      { "chunk_size",     SQLITE_FCNTL_CHUNK_SIZE,      "SIZE"           },
8171      { "data_version",   SQLITE_FCNTL_DATA_VERSION,    ""               },
8172      { "has_moved",      SQLITE_FCNTL_HAS_MOVED,       ""               },
8173      { "lock_timeout",   SQLITE_FCNTL_LOCK_TIMEOUT,    "MILLISEC"       },
8174      { "persist_wal",    SQLITE_FCNTL_PERSIST_WAL,     "[BOOLEAN]"      },
8175   /* { "pragma",         SQLITE_FCNTL_PRAGMA,          "NAME ARG"       },*/
8176      { "psow",       SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]"      },
8177      { "reserve_bytes",  SQLITE_FCNTL_RESERVE_BYTES,   "[N]"            },
8178      { "size_limit",     SQLITE_FCNTL_SIZE_LIMIT,      "[LIMIT]"        },
8179      { "tempfilename",   SQLITE_FCNTL_TEMPFILENAME,    ""               },
8180   /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY,  "COUNT DELAY"    },*/
8181    };
8182    int filectrl = -1;
8183    int iCtrl = -1;
8184    sqlite3_int64 iRes = 0;  /* Integer result to display if rc2==1 */
8185    int isOk = 0;            /* 0: usage  1: %lld  2: no-result */
8186    int n2, i;
8187    const char *zCmd = 0;
8188    const char *zSchema = 0;
8189
8190    open_db(p, 0);
8191    zCmd = nArg>=2 ? azArg[1] : "help";
8192
8193    if( zCmd[0]=='-'
8194     && (cli_strcmp(zCmd,"--schema")==0 || cli_strcmp(zCmd,"-schema")==0)
8195     && nArg>=4
8196    ){
8197      zSchema = azArg[2];
8198      for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8199      nArg -= 2;
8200      zCmd = azArg[1];
8201    }
8202
8203    /* The argument can optionally begin with "-" or "--" */
8204    if( zCmd[0]=='-' && zCmd[1] ){
8205      zCmd++;
8206      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8207    }
8208
8209    /* --help lists all file-controls */
8210    if( cli_strcmp(zCmd,"help")==0 ){
8211      utf8_printf(p->out, "Available file-controls:\n");
8212      for(i=0; i<ArraySize(aCtrl); i++){
8213        utf8_printf(p->out, "  .filectrl %s %s\n",
8214                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8215      }
8216      rc = 1;
8217      goto meta_command_exit;
8218    }
8219
8220    /* convert filectrl text option to value. allow any unique prefix
8221    ** of the option name, or a numerical value. */
8222    n2 = strlen30(zCmd);
8223    for(i=0; i<ArraySize(aCtrl); i++){
8224      if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8225        if( filectrl<0 ){
8226          filectrl = aCtrl[i].ctrlCode;
8227          iCtrl = i;
8228        }else{
8229          utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8230                              "Use \".filectrl --help\" for help\n", zCmd);
8231          rc = 1;
8232          goto meta_command_exit;
8233        }
8234      }
8235    }
8236    if( filectrl<0 ){
8237      utf8_printf(stderr,"Error: unknown file-control: %s\n"
8238                         "Use \".filectrl --help\" for help\n", zCmd);
8239    }else{
8240      switch(filectrl){
8241        case SQLITE_FCNTL_SIZE_LIMIT: {
8242          if( nArg!=2 && nArg!=3 ) break;
8243          iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8244          sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8245          isOk = 1;
8246          break;
8247        }
8248        case SQLITE_FCNTL_LOCK_TIMEOUT:
8249        case SQLITE_FCNTL_CHUNK_SIZE: {
8250          int x;
8251          if( nArg!=3 ) break;
8252          x = (int)integerValue(azArg[2]);
8253          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8254          isOk = 2;
8255          break;
8256        }
8257        case SQLITE_FCNTL_PERSIST_WAL:
8258        case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8259          int x;
8260          if( nArg!=2 && nArg!=3 ) break;
8261          x = nArg==3 ? booleanValue(azArg[2]) : -1;
8262          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8263          iRes = x;
8264          isOk = 1;
8265          break;
8266        }
8267        case SQLITE_FCNTL_DATA_VERSION:
8268        case SQLITE_FCNTL_HAS_MOVED: {
8269          int x;
8270          if( nArg!=2 ) break;
8271          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8272          iRes = x;
8273          isOk = 1;
8274          break;
8275        }
8276        case SQLITE_FCNTL_TEMPFILENAME: {
8277          char *z = 0;
8278          if( nArg!=2 ) break;
8279          sqlite3_file_control(p->db, zSchema, filectrl, &z);
8280          if( z ){
8281            utf8_printf(p->out, "%s\n", z);
8282            sqlite3_free(z);
8283          }
8284          isOk = 2;
8285          break;
8286        }
8287        case SQLITE_FCNTL_RESERVE_BYTES: {
8288          int x;
8289          if( nArg>=3 ){
8290            x = atoi(azArg[2]);
8291            sqlite3_file_control(p->db, zSchema, filectrl, &x);
8292          }
8293          x = -1;
8294          sqlite3_file_control(p->db, zSchema, filectrl, &x);
8295          utf8_printf(p->out,"%d\n", x);
8296          isOk = 2;
8297          break;
8298        }
8299      }
8300    }
8301    if( isOk==0 && iCtrl>=0 ){
8302      utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8303      rc = 1;
8304    }else if( isOk==1 ){
8305      char zBuf[100];
8306      sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8307      raw_printf(p->out, "%s\n", zBuf);
8308    }
8309  }else
8310
8311  if( c=='f' && cli_strncmp(azArg[0], "fullschema", n)==0 ){
8312    ShellState data;
8313    int doStats = 0;
8314    memcpy(&data, p, sizeof(data));
8315    data.showHeader = 0;
8316    data.cMode = data.mode = MODE_Semi;
8317    if( nArg==2 && optionMatch(azArg[1], "indent") ){
8318      data.cMode = data.mode = MODE_Pretty;
8319      nArg = 1;
8320    }
8321    if( nArg!=1 ){
8322      raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8323      rc = 1;
8324      goto meta_command_exit;
8325    }
8326    open_db(p, 0);
8327    rc = sqlite3_exec(p->db,
8328       "SELECT sql FROM"
8329       "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8330       "     FROM sqlite_schema UNION ALL"
8331       "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8332       "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8333       "ORDER BY x",
8334       callback, &data, 0
8335    );
8336    if( rc==SQLITE_OK ){
8337      sqlite3_stmt *pStmt;
8338      rc = sqlite3_prepare_v2(p->db,
8339               "SELECT rowid FROM sqlite_schema"
8340               " WHERE name GLOB 'sqlite_stat[134]'",
8341               -1, &pStmt, 0);
8342      doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8343      sqlite3_finalize(pStmt);
8344    }
8345    if( doStats==0 ){
8346      raw_printf(p->out, "/* No STAT tables available */\n");
8347    }else{
8348      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8349      data.cMode = data.mode = MODE_Insert;
8350      data.zDestTable = "sqlite_stat1";
8351      shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8352      data.zDestTable = "sqlite_stat4";
8353      shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8354      raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8355    }
8356  }else
8357
8358  if( c=='h' && cli_strncmp(azArg[0], "headers", n)==0 ){
8359    if( nArg==2 ){
8360      p->showHeader = booleanValue(azArg[1]);
8361      p->shellFlgs |= SHFLG_HeaderSet;
8362    }else{
8363      raw_printf(stderr, "Usage: .headers on|off\n");
8364      rc = 1;
8365    }
8366  }else
8367
8368  if( c=='h' && cli_strncmp(azArg[0], "help", n)==0 ){
8369    if( nArg>=2 ){
8370      n = showHelp(p->out, azArg[1]);
8371      if( n==0 ){
8372        utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8373      }
8374    }else{
8375      showHelp(p->out, 0);
8376    }
8377  }else
8378
8379#ifndef SQLITE_SHELL_FIDDLE
8380  if( c=='i' && cli_strncmp(azArg[0], "import", n)==0 ){
8381    char *zTable = 0;           /* Insert data into this table */
8382    char *zSchema = 0;          /* within this schema (may default to "main") */
8383    char *zFile = 0;            /* Name of file to extra content from */
8384    sqlite3_stmt *pStmt = NULL; /* A statement */
8385    int nCol;                   /* Number of columns in the table */
8386    int nByte;                  /* Number of bytes in an SQL string */
8387    int i, j;                   /* Loop counters */
8388    int needCommit;             /* True to COMMIT or ROLLBACK at end */
8389    int nSep;                   /* Number of bytes in p->colSeparator[] */
8390    char *zSql;                 /* An SQL statement */
8391    char *zFullTabName;         /* Table name with schema if applicable */
8392    ImportCtx sCtx;             /* Reader context */
8393    char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8394    int eVerbose = 0;           /* Larger for more console output */
8395    int nSkip = 0;              /* Initial lines to skip */
8396    int useOutputMode = 1;      /* Use output mode to determine separators */
8397    char *zCreate = 0;          /* CREATE TABLE statement text */
8398
8399    failIfSafeMode(p, "cannot run .import in safe mode");
8400    memset(&sCtx, 0, sizeof(sCtx));
8401    if( p->mode==MODE_Ascii ){
8402      xRead = ascii_read_one_field;
8403    }else{
8404      xRead = csv_read_one_field;
8405    }
8406    rc = 1;
8407    for(i=1; i<nArg; i++){
8408      char *z = azArg[i];
8409      if( z[0]=='-' && z[1]=='-' ) z++;
8410      if( z[0]!='-' ){
8411        if( zFile==0 ){
8412          zFile = z;
8413        }else if( zTable==0 ){
8414          zTable = z;
8415        }else{
8416          utf8_printf(p->out, "ERROR: extra argument: \"%s\".  Usage:\n", z);
8417          showHelp(p->out, "import");
8418          goto meta_command_exit;
8419        }
8420      }else if( cli_strcmp(z,"-v")==0 ){
8421        eVerbose++;
8422      }else if( cli_strcmp(z,"-schema")==0 && i<nArg-1 ){
8423        zSchema = azArg[++i];
8424      }else if( cli_strcmp(z,"-skip")==0 && i<nArg-1 ){
8425        nSkip = integerValue(azArg[++i]);
8426      }else if( cli_strcmp(z,"-ascii")==0 ){
8427        sCtx.cColSep = SEP_Unit[0];
8428        sCtx.cRowSep = SEP_Record[0];
8429        xRead = ascii_read_one_field;
8430        useOutputMode = 0;
8431      }else if( cli_strcmp(z,"-csv")==0 ){
8432        sCtx.cColSep = ',';
8433        sCtx.cRowSep = '\n';
8434        xRead = csv_read_one_field;
8435        useOutputMode = 0;
8436      }else{
8437        utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n", z);
8438        showHelp(p->out, "import");
8439        goto meta_command_exit;
8440      }
8441    }
8442    if( zTable==0 ){
8443      utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8444                  zFile==0 ? "FILE" : "TABLE");
8445      showHelp(p->out, "import");
8446      goto meta_command_exit;
8447    }
8448    seenInterrupt = 0;
8449    open_db(p, 0);
8450    if( useOutputMode ){
8451      /* If neither the --csv or --ascii options are specified, then set
8452      ** the column and row separator characters from the output mode. */
8453      nSep = strlen30(p->colSeparator);
8454      if( nSep==0 ){
8455        raw_printf(stderr,
8456                   "Error: non-null column separator required for import\n");
8457        goto meta_command_exit;
8458      }
8459      if( nSep>1 ){
8460        raw_printf(stderr,
8461              "Error: multi-character column separators not allowed"
8462              " for import\n");
8463        goto meta_command_exit;
8464      }
8465      nSep = strlen30(p->rowSeparator);
8466      if( nSep==0 ){
8467        raw_printf(stderr,
8468            "Error: non-null row separator required for import\n");
8469        goto meta_command_exit;
8470      }
8471      if( nSep==2 && p->mode==MODE_Csv
8472       && cli_strcmp(p->rowSeparator,SEP_CrLf)==0
8473      ){
8474        /* When importing CSV (only), if the row separator is set to the
8475        ** default output row separator, change it to the default input
8476        ** row separator.  This avoids having to maintain different input
8477        ** and output row separators. */
8478        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8479        nSep = strlen30(p->rowSeparator);
8480      }
8481      if( nSep>1 ){
8482        raw_printf(stderr, "Error: multi-character row separators not allowed"
8483                           " for import\n");
8484        goto meta_command_exit;
8485      }
8486      sCtx.cColSep = p->colSeparator[0];
8487      sCtx.cRowSep = p->rowSeparator[0];
8488    }
8489    sCtx.zFile = zFile;
8490    sCtx.nLine = 1;
8491    if( sCtx.zFile[0]=='|' ){
8492#ifdef SQLITE_OMIT_POPEN
8493      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8494      goto meta_command_exit;
8495#else
8496      sCtx.in = popen(sCtx.zFile+1, "r");
8497      sCtx.zFile = "<pipe>";
8498      sCtx.xCloser = pclose;
8499#endif
8500    }else{
8501      sCtx.in = fopen(sCtx.zFile, "rb");
8502      sCtx.xCloser = fclose;
8503    }
8504    if( sCtx.in==0 ){
8505      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8506      goto meta_command_exit;
8507    }
8508    if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8509      char zSep[2];
8510      zSep[1] = 0;
8511      zSep[0] = sCtx.cColSep;
8512      utf8_printf(p->out, "Column separator ");
8513      output_c_string(p->out, zSep);
8514      utf8_printf(p->out, ", row separator ");
8515      zSep[0] = sCtx.cRowSep;
8516      output_c_string(p->out, zSep);
8517      utf8_printf(p->out, "\n");
8518    }
8519    sCtx.z = sqlite3_malloc64(120);
8520    if( sCtx.z==0 ){
8521      import_cleanup(&sCtx);
8522      shell_out_of_memory();
8523    }
8524    /* Below, resources must be freed before exit. */
8525    while( (nSkip--)>0 ){
8526      while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8527    }
8528    if( zSchema!=0 ){
8529      zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
8530    }else{
8531      zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
8532    }
8533    zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
8534    if( zSql==0 || zFullTabName==0 ){
8535      import_cleanup(&sCtx);
8536      shell_out_of_memory();
8537    }
8538    nByte = strlen30(zSql);
8539    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8540    import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
8541    if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8542      sqlite3 *dbCols = 0;
8543      char *zRenames = 0;
8544      char *zColDefs;
8545      zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
8546      while( xRead(&sCtx) ){
8547        zAutoColumn(sCtx.z, &dbCols, 0);
8548        if( sCtx.cTerm!=sCtx.cColSep ) break;
8549      }
8550      zColDefs = zAutoColumn(0, &dbCols, &zRenames);
8551      if( zRenames!=0 ){
8552        utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
8553                    "Columns renamed during .import %s due to duplicates:\n"
8554                    "%s\n", sCtx.zFile, zRenames);
8555        sqlite3_free(zRenames);
8556      }
8557      assert(dbCols==0);
8558      if( zColDefs==0 ){
8559        utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
8560      import_fail:
8561        sqlite3_free(zCreate);
8562        sqlite3_free(zSql);
8563        sqlite3_free(zFullTabName);
8564        import_cleanup(&sCtx);
8565        rc = 1;
8566        goto meta_command_exit;
8567      }
8568      zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
8569      if( eVerbose>=1 ){
8570        utf8_printf(p->out, "%s\n", zCreate);
8571      }
8572      rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
8573      if( rc ){
8574        utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
8575        goto import_fail;
8576      }
8577      sqlite3_free(zCreate);
8578      zCreate = 0;
8579      rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8580    }
8581    if( rc ){
8582      if (pStmt) sqlite3_finalize(pStmt);
8583      utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
8584      goto import_fail;
8585    }
8586    sqlite3_free(zSql);
8587    nCol = sqlite3_column_count(pStmt);
8588    sqlite3_finalize(pStmt);
8589    pStmt = 0;
8590    if( nCol==0 ) return 0; /* no columns, no error */
8591    zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
8592    if( zSql==0 ){
8593      import_cleanup(&sCtx);
8594      shell_out_of_memory();
8595    }
8596    sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
8597    j = strlen30(zSql);
8598    for(i=1; i<nCol; i++){
8599      zSql[j++] = ',';
8600      zSql[j++] = '?';
8601    }
8602    zSql[j++] = ')';
8603    zSql[j] = 0;
8604    if( eVerbose>=2 ){
8605      utf8_printf(p->out, "Insert using: %s\n", zSql);
8606    }
8607    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8608    if( rc ){
8609      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8610      if (pStmt) sqlite3_finalize(pStmt);
8611      goto import_fail;
8612    }
8613    sqlite3_free(zSql);
8614    sqlite3_free(zFullTabName);
8615    needCommit = sqlite3_get_autocommit(p->db);
8616    if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
8617    do{
8618      int startLine = sCtx.nLine;
8619      for(i=0; i<nCol; i++){
8620        char *z = xRead(&sCtx);
8621        /*
8622        ** Did we reach end-of-file before finding any columns?
8623        ** If so, stop instead of NULL filling the remaining columns.
8624        */
8625        if( z==0 && i==0 ) break;
8626        /*
8627        ** Did we reach end-of-file OR end-of-line before finding any
8628        ** columns in ASCII mode?  If so, stop instead of NULL filling
8629        ** the remaining columns.
8630        */
8631        if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
8632        sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
8633        if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
8634          utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8635                          "filling the rest with NULL\n",
8636                          sCtx.zFile, startLine, nCol, i+1);
8637          i += 2;
8638          while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
8639        }
8640      }
8641      if( sCtx.cTerm==sCtx.cColSep ){
8642        do{
8643          xRead(&sCtx);
8644          i++;
8645        }while( sCtx.cTerm==sCtx.cColSep );
8646        utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
8647                        "extras ignored\n",
8648                        sCtx.zFile, startLine, nCol, i);
8649      }
8650      if( i>=nCol ){
8651        sqlite3_step(pStmt);
8652        rc = sqlite3_reset(pStmt);
8653        if( rc!=SQLITE_OK ){
8654          utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
8655                      startLine, sqlite3_errmsg(p->db));
8656          sCtx.nErr++;
8657        }else{
8658          sCtx.nRow++;
8659        }
8660      }
8661    }while( sCtx.cTerm!=EOF );
8662
8663    import_cleanup(&sCtx);
8664    sqlite3_finalize(pStmt);
8665    if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
8666    if( eVerbose>0 ){
8667      utf8_printf(p->out,
8668          "Added %d rows with %d errors using %d lines of input\n",
8669          sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
8670    }
8671  }else
8672#endif /* !defined(SQLITE_SHELL_FIDDLE) */
8673
8674#ifndef SQLITE_UNTESTABLE
8675  if( c=='i' && cli_strncmp(azArg[0], "imposter", n)==0 ){
8676    char *zSql;
8677    char *zCollist = 0;
8678    sqlite3_stmt *pStmt;
8679    int tnum = 0;
8680    int isWO = 0;  /* True if making an imposter of a WITHOUT ROWID table */
8681    int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
8682    int i;
8683    if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
8684      utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
8685                          "       .imposter off\n");
8686      /* Also allowed, but not documented:
8687      **
8688      **    .imposter TABLE IMPOSTER
8689      **
8690      ** where TABLE is a WITHOUT ROWID table.  In that case, the
8691      ** imposter is another WITHOUT ROWID table with the columns in
8692      ** storage order. */
8693      rc = 1;
8694      goto meta_command_exit;
8695    }
8696    open_db(p, 0);
8697    if( nArg==2 ){
8698      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
8699      goto meta_command_exit;
8700    }
8701    zSql = sqlite3_mprintf(
8702      "SELECT rootpage, 0 FROM sqlite_schema"
8703      " WHERE name='%q' AND type='index'"
8704      "UNION ALL "
8705      "SELECT rootpage, 1 FROM sqlite_schema"
8706      " WHERE name='%q' AND type='table'"
8707      "   AND sql LIKE '%%without%%rowid%%'",
8708      azArg[1], azArg[1]
8709    );
8710    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8711    sqlite3_free(zSql);
8712    if( sqlite3_step(pStmt)==SQLITE_ROW ){
8713      tnum = sqlite3_column_int(pStmt, 0);
8714      isWO = sqlite3_column_int(pStmt, 1);
8715    }
8716    sqlite3_finalize(pStmt);
8717    zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
8718    rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8719    sqlite3_free(zSql);
8720    i = 0;
8721    while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
8722      char zLabel[20];
8723      const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
8724      i++;
8725      if( zCol==0 ){
8726        if( sqlite3_column_int(pStmt,1)==-1 ){
8727          zCol = "_ROWID_";
8728        }else{
8729          sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
8730          zCol = zLabel;
8731        }
8732      }
8733      if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
8734        lenPK = (int)strlen(zCollist);
8735      }
8736      if( zCollist==0 ){
8737        zCollist = sqlite3_mprintf("\"%w\"", zCol);
8738      }else{
8739        zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
8740      }
8741    }
8742    sqlite3_finalize(pStmt);
8743    if( i==0 || tnum==0 ){
8744      utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
8745      rc = 1;
8746      sqlite3_free(zCollist);
8747      goto meta_command_exit;
8748    }
8749    if( lenPK==0 ) lenPK = 100000;
8750    zSql = sqlite3_mprintf(
8751          "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
8752          azArg[2], zCollist, lenPK, zCollist);
8753    sqlite3_free(zCollist);
8754    rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
8755    if( rc==SQLITE_OK ){
8756      rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
8757      sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
8758      if( rc ){
8759        utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
8760      }else{
8761        utf8_printf(stdout, "%s;\n", zSql);
8762        raw_printf(stdout,
8763          "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
8764          azArg[1], isWO ? "table" : "index"
8765        );
8766      }
8767    }else{
8768      raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
8769      rc = 1;
8770    }
8771    sqlite3_free(zSql);
8772  }else
8773#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
8774
8775#ifdef SQLITE_ENABLE_IOTRACE
8776  if( c=='i' && cli_strncmp(azArg[0], "iotrace", n)==0 ){
8777    SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
8778    if( iotrace && iotrace!=stdout ) fclose(iotrace);
8779    iotrace = 0;
8780    if( nArg<2 ){
8781      sqlite3IoTrace = 0;
8782    }else if( cli_strcmp(azArg[1], "-")==0 ){
8783      sqlite3IoTrace = iotracePrintf;
8784      iotrace = stdout;
8785    }else{
8786      iotrace = fopen(azArg[1], "w");
8787      if( iotrace==0 ){
8788        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
8789        sqlite3IoTrace = 0;
8790        rc = 1;
8791      }else{
8792        sqlite3IoTrace = iotracePrintf;
8793      }
8794    }
8795  }else
8796#endif
8797
8798  if( c=='l' && n>=5 && cli_strncmp(azArg[0], "limits", n)==0 ){
8799    static const struct {
8800       const char *zLimitName;   /* Name of a limit */
8801       int limitCode;            /* Integer code for that limit */
8802    } aLimit[] = {
8803      { "length",                SQLITE_LIMIT_LENGTH                    },
8804      { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
8805      { "column",                SQLITE_LIMIT_COLUMN                    },
8806      { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
8807      { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
8808      { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
8809      { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
8810      { "attached",              SQLITE_LIMIT_ATTACHED                  },
8811      { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
8812      { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
8813      { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
8814      { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
8815    };
8816    int i, n2;
8817    open_db(p, 0);
8818    if( nArg==1 ){
8819      for(i=0; i<ArraySize(aLimit); i++){
8820        printf("%20s %d\n", aLimit[i].zLimitName,
8821               sqlite3_limit(p->db, aLimit[i].limitCode, -1));
8822      }
8823    }else if( nArg>3 ){
8824      raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
8825      rc = 1;
8826      goto meta_command_exit;
8827    }else{
8828      int iLimit = -1;
8829      n2 = strlen30(azArg[1]);
8830      for(i=0; i<ArraySize(aLimit); i++){
8831        if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
8832          if( iLimit<0 ){
8833            iLimit = i;
8834          }else{
8835            utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
8836            rc = 1;
8837            goto meta_command_exit;
8838          }
8839        }
8840      }
8841      if( iLimit<0 ){
8842        utf8_printf(stderr, "unknown limit: \"%s\"\n"
8843                        "enter \".limits\" with no arguments for a list.\n",
8844                         azArg[1]);
8845        rc = 1;
8846        goto meta_command_exit;
8847      }
8848      if( nArg==3 ){
8849        sqlite3_limit(p->db, aLimit[iLimit].limitCode,
8850                      (int)integerValue(azArg[2]));
8851      }
8852      printf("%20s %d\n", aLimit[iLimit].zLimitName,
8853             sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
8854    }
8855  }else
8856
8857  if( c=='l' && n>2 && cli_strncmp(azArg[0], "lint", n)==0 ){
8858    open_db(p, 0);
8859    lintDotCommand(p, azArg, nArg);
8860  }else
8861
8862#if !defined(SQLITE_OMIT_LOAD_EXTENSION) && !defined(SQLITE_SHELL_FIDDLE)
8863  if( c=='l' && cli_strncmp(azArg[0], "load", n)==0 ){
8864    const char *zFile, *zProc;
8865    char *zErrMsg = 0;
8866    failIfSafeMode(p, "cannot run .load in safe mode");
8867    if( nArg<2 ){
8868      raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
8869      rc = 1;
8870      goto meta_command_exit;
8871    }
8872    zFile = azArg[1];
8873    zProc = nArg>=3 ? azArg[2] : 0;
8874    open_db(p, 0);
8875    rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
8876    if( rc!=SQLITE_OK ){
8877      utf8_printf(stderr, "Error: %s\n", zErrMsg);
8878      sqlite3_free(zErrMsg);
8879      rc = 1;
8880    }
8881  }else
8882#endif
8883
8884#ifndef SQLITE_SHELL_FIDDLE
8885  if( c=='l' && cli_strncmp(azArg[0], "log", n)==0 ){
8886    failIfSafeMode(p, "cannot run .log in safe mode");
8887    if( nArg!=2 ){
8888      raw_printf(stderr, "Usage: .log FILENAME\n");
8889      rc = 1;
8890    }else{
8891      const char *zFile = azArg[1];
8892      output_file_close(p->pLog);
8893      p->pLog = output_file_open(zFile, 0);
8894    }
8895  }else
8896#endif
8897
8898  if( c=='m' && cli_strncmp(azArg[0], "mode", n)==0 ){
8899    const char *zMode = 0;
8900    const char *zTabname = 0;
8901    int i, n2;
8902    ColModeOpts cmOpts = ColModeOpts_default;
8903    for(i=1; i<nArg; i++){
8904      const char *z = azArg[i];
8905      if( optionMatch(z,"wrap") && i+1<nArg ){
8906        cmOpts.iWrap = integerValue(azArg[++i]);
8907      }else if( optionMatch(z,"ww") ){
8908        cmOpts.bWordWrap = 1;
8909      }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
8910        cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
8911      }else if( optionMatch(z,"quote") ){
8912        cmOpts.bQuote = 1;
8913      }else if( optionMatch(z,"noquote") ){
8914        cmOpts.bQuote = 0;
8915      }else if( zMode==0 ){
8916        zMode = z;
8917        /* Apply defaults for qbox pseudo-mode.  If that
8918         * overwrites already-set values, user was informed of this.
8919         */
8920        if( cli_strcmp(z, "qbox")==0 ){
8921          ColModeOpts cmo = ColModeOpts_default_qbox;
8922          zMode = "box";
8923          cmOpts = cmo;
8924        }
8925      }else if( zTabname==0 ){
8926        zTabname = z;
8927      }else if( z[0]=='-' ){
8928        utf8_printf(stderr, "unknown option: %s\n", z);
8929        utf8_printf(stderr, "options:\n"
8930                            "  --noquote\n"
8931                            "  --quote\n"
8932                            "  --wordwrap on/off\n"
8933                            "  --wrap N\n"
8934                            "  --ww\n");
8935        rc = 1;
8936        goto meta_command_exit;
8937      }else{
8938        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
8939        rc = 1;
8940        goto meta_command_exit;
8941      }
8942    }
8943    if( zMode==0 ){
8944      if( p->mode==MODE_Column
8945       || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
8946      ){
8947        raw_printf
8948          (p->out,
8949           "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
8950           modeDescr[p->mode], p->cmOpts.iWrap,
8951           p->cmOpts.bWordWrap ? "on" : "off",
8952           p->cmOpts.bQuote ? "" : "no");
8953      }else{
8954        raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
8955      }
8956      zMode = modeDescr[p->mode];
8957    }
8958    n2 = strlen30(zMode);
8959    if( cli_strncmp(zMode,"lines",n2)==0 ){
8960      p->mode = MODE_Line;
8961      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8962    }else if( cli_strncmp(zMode,"columns",n2)==0 ){
8963      p->mode = MODE_Column;
8964      if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
8965        p->showHeader = 1;
8966      }
8967      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8968      p->cmOpts = cmOpts;
8969    }else if( cli_strncmp(zMode,"list",n2)==0 ){
8970      p->mode = MODE_List;
8971      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
8972      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8973    }else if( cli_strncmp(zMode,"html",n2)==0 ){
8974      p->mode = MODE_Html;
8975    }else if( cli_strncmp(zMode,"tcl",n2)==0 ){
8976      p->mode = MODE_Tcl;
8977      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
8978      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8979    }else if( cli_strncmp(zMode,"csv",n2)==0 ){
8980      p->mode = MODE_Csv;
8981      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8982      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
8983    }else if( cli_strncmp(zMode,"tabs",n2)==0 ){
8984      p->mode = MODE_List;
8985      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
8986    }else if( cli_strncmp(zMode,"insert",n2)==0 ){
8987      p->mode = MODE_Insert;
8988      set_table_name(p, zTabname ? zTabname : "table");
8989    }else if( cli_strncmp(zMode,"quote",n2)==0 ){
8990      p->mode = MODE_Quote;
8991      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
8992      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8993    }else if( cli_strncmp(zMode,"ascii",n2)==0 ){
8994      p->mode = MODE_Ascii;
8995      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
8996      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
8997    }else if( cli_strncmp(zMode,"markdown",n2)==0 ){
8998      p->mode = MODE_Markdown;
8999      p->cmOpts = cmOpts;
9000    }else if( cli_strncmp(zMode,"table",n2)==0 ){
9001      p->mode = MODE_Table;
9002      p->cmOpts = cmOpts;
9003    }else if( cli_strncmp(zMode,"box",n2)==0 ){
9004      p->mode = MODE_Box;
9005      p->cmOpts = cmOpts;
9006    }else if( cli_strncmp(zMode,"count",n2)==0 ){
9007      p->mode = MODE_Count;
9008    }else if( cli_strncmp(zMode,"off",n2)==0 ){
9009      p->mode = MODE_Off;
9010    }else if( cli_strncmp(zMode,"json",n2)==0 ){
9011      p->mode = MODE_Json;
9012    }else{
9013      raw_printf(stderr, "Error: mode should be one of: "
9014         "ascii box column csv html insert json line list markdown "
9015         "qbox quote table tabs tcl\n");
9016      rc = 1;
9017    }
9018    p->cMode = p->mode;
9019  }else
9020
9021#ifndef SQLITE_SHELL_FIDDLE
9022  if( c=='n' && cli_strcmp(azArg[0], "nonce")==0 ){
9023    if( nArg!=2 ){
9024      raw_printf(stderr, "Usage: .nonce NONCE\n");
9025      rc = 1;
9026    }else if( p->zNonce==0 || cli_strcmp(azArg[1],p->zNonce)!=0 ){
9027      raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
9028                 p->lineno, azArg[1]);
9029      exit(1);
9030    }else{
9031      p->bSafeMode = 0;
9032      return 0;  /* Return immediately to bypass the safe mode reset
9033                 ** at the end of this procedure */
9034    }
9035  }else
9036#endif /* !defined(SQLITE_SHELL_FIDDLE) */
9037
9038  if( c=='n' && cli_strncmp(azArg[0], "nullvalue", n)==0 ){
9039    if( nArg==2 ){
9040      sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
9041                       "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
9042    }else{
9043      raw_printf(stderr, "Usage: .nullvalue STRING\n");
9044      rc = 1;
9045    }
9046  }else
9047
9048  if( c=='o' && cli_strncmp(azArg[0], "open", n)==0 && n>=2 ){
9049    const char *zFN = 0;     /* Pointer to constant filename */
9050    char *zNewFilename = 0;  /* Name of the database file to open */
9051    int iName = 1;           /* Index in azArg[] of the filename */
9052    int newFlag = 0;         /* True to delete file before opening */
9053    int openMode = SHELL_OPEN_UNSPEC;
9054
9055    /* Check for command-line arguments */
9056    for(iName=1; iName<nArg; iName++){
9057      const char *z = azArg[iName];
9058#ifndef SQLITE_SHELL_FIDDLE
9059      if( optionMatch(z,"new") ){
9060        newFlag = 1;
9061#ifdef SQLITE_HAVE_ZLIB
9062      }else if( optionMatch(z, "zip") ){
9063        openMode = SHELL_OPEN_ZIPFILE;
9064#endif
9065      }else if( optionMatch(z, "append") ){
9066        openMode = SHELL_OPEN_APPENDVFS;
9067      }else if( optionMatch(z, "readonly") ){
9068        openMode = SHELL_OPEN_READONLY;
9069      }else if( optionMatch(z, "nofollow") ){
9070        p->openFlags |= SQLITE_OPEN_NOFOLLOW;
9071#ifndef SQLITE_OMIT_DESERIALIZE
9072      }else if( optionMatch(z, "deserialize") ){
9073        openMode = SHELL_OPEN_DESERIALIZE;
9074      }else if( optionMatch(z, "hexdb") ){
9075        openMode = SHELL_OPEN_HEXDB;
9076      }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
9077        p->szMax = integerValue(azArg[++iName]);
9078#endif /* SQLITE_OMIT_DESERIALIZE */
9079      }else
9080#endif /* !SQLITE_SHELL_FIDDLE */
9081      if( z[0]=='-' ){
9082        utf8_printf(stderr, "unknown option: %s\n", z);
9083        rc = 1;
9084        goto meta_command_exit;
9085      }else if( zFN ){
9086        utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9087        rc = 1;
9088        goto meta_command_exit;
9089      }else{
9090        zFN = z;
9091      }
9092    }
9093
9094    /* Close the existing database */
9095    session_close_all(p, -1);
9096    close_db(p->db);
9097    p->db = 0;
9098    p->pAuxDb->zDbFilename = 0;
9099    sqlite3_free(p->pAuxDb->zFreeOnClose);
9100    p->pAuxDb->zFreeOnClose = 0;
9101    p->openMode = openMode;
9102    p->openFlags = 0;
9103    p->szMax = 0;
9104
9105    /* If a filename is specified, try to open it first */
9106    if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9107      if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9108#ifndef SQLITE_SHELL_FIDDLE
9109      if( p->bSafeMode
9110       && p->openMode!=SHELL_OPEN_HEXDB
9111       && zFN
9112       && cli_strcmp(zFN,":memory:")!=0
9113      ){
9114        failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9115      }
9116#else
9117      /* WASM mode has its own sandboxed pseudo-filesystem. */
9118#endif
9119      if( zFN ){
9120        zNewFilename = sqlite3_mprintf("%s", zFN);
9121        shell_check_oom(zNewFilename);
9122      }else{
9123        zNewFilename = 0;
9124      }
9125      p->pAuxDb->zDbFilename = zNewFilename;
9126      open_db(p, OPEN_DB_KEEPALIVE);
9127      if( p->db==0 ){
9128        utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9129        sqlite3_free(zNewFilename);
9130      }else{
9131        p->pAuxDb->zFreeOnClose = zNewFilename;
9132      }
9133    }
9134    if( p->db==0 ){
9135      /* As a fall-back open a TEMP database */
9136      p->pAuxDb->zDbFilename = 0;
9137      open_db(p, 0);
9138    }
9139  }else
9140
9141#ifndef SQLITE_SHELL_FIDDLE
9142  if( (c=='o'
9143        && (cli_strncmp(azArg[0], "output", n)==0
9144            || cli_strncmp(azArg[0], "once", n)==0))
9145   || (c=='e' && n==5 && cli_strcmp(azArg[0],"excel")==0)
9146  ){
9147    char *zFile = 0;
9148    int bTxtMode = 0;
9149    int i;
9150    int eMode = 0;
9151    int bOnce = 0;            /* 0: .output, 1: .once, 2: .excel */
9152    unsigned char zBOM[4];    /* Byte-order mark to using if --bom is present */
9153
9154    zBOM[0] = 0;
9155    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9156    if( c=='e' ){
9157      eMode = 'x';
9158      bOnce = 2;
9159    }else if( cli_strncmp(azArg[0],"once",n)==0 ){
9160      bOnce = 1;
9161    }
9162    for(i=1; i<nArg; i++){
9163      char *z = azArg[i];
9164      if( z[0]=='-' ){
9165        if( z[1]=='-' ) z++;
9166        if( cli_strcmp(z,"-bom")==0 ){
9167          zBOM[0] = 0xef;
9168          zBOM[1] = 0xbb;
9169          zBOM[2] = 0xbf;
9170          zBOM[3] = 0;
9171        }else if( c!='e' && cli_strcmp(z,"-x")==0 ){
9172          eMode = 'x';  /* spreadsheet */
9173        }else if( c!='e' && cli_strcmp(z,"-e")==0 ){
9174          eMode = 'e';  /* text editor */
9175        }else{
9176          utf8_printf(p->out, "ERROR: unknown option: \"%s\".  Usage:\n",
9177                      azArg[i]);
9178          showHelp(p->out, azArg[0]);
9179          rc = 1;
9180          goto meta_command_exit;
9181        }
9182      }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9183        zFile = sqlite3_mprintf("%s", z);
9184        if( zFile && zFile[0]=='|' ){
9185          while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9186          break;
9187        }
9188      }else{
9189        utf8_printf(p->out,"ERROR: extra parameter: \"%s\".  Usage:\n",
9190                    azArg[i]);
9191        showHelp(p->out, azArg[0]);
9192        rc = 1;
9193        sqlite3_free(zFile);
9194        goto meta_command_exit;
9195      }
9196    }
9197    if( zFile==0 ){
9198      zFile = sqlite3_mprintf("stdout");
9199    }
9200    if( bOnce ){
9201      p->outCount = 2;
9202    }else{
9203      p->outCount = 0;
9204    }
9205    output_reset(p);
9206#ifndef SQLITE_NOHAVE_SYSTEM
9207    if( eMode=='e' || eMode=='x' ){
9208      p->doXdgOpen = 1;
9209      outputModePush(p);
9210      if( eMode=='x' ){
9211        /* spreadsheet mode.  Output as CSV. */
9212        newTempFile(p, "csv");
9213        ShellClearFlag(p, SHFLG_Echo);
9214        p->mode = MODE_Csv;
9215        sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9216        sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9217      }else{
9218        /* text editor mode */
9219        newTempFile(p, "txt");
9220        bTxtMode = 1;
9221      }
9222      sqlite3_free(zFile);
9223      zFile = sqlite3_mprintf("%s", p->zTempFile);
9224    }
9225#endif /* SQLITE_NOHAVE_SYSTEM */
9226    shell_check_oom(zFile);
9227    if( zFile[0]=='|' ){
9228#ifdef SQLITE_OMIT_POPEN
9229      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9230      rc = 1;
9231      p->out = stdout;
9232#else
9233      p->out = popen(zFile + 1, "w");
9234      if( p->out==0 ){
9235        utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9236        p->out = stdout;
9237        rc = 1;
9238      }else{
9239        if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
9240        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9241      }
9242#endif
9243    }else{
9244      p->out = output_file_open(zFile, bTxtMode);
9245      if( p->out==0 ){
9246        if( cli_strcmp(zFile,"off")!=0 ){
9247          utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9248        }
9249        p->out = stdout;
9250        rc = 1;
9251      } else {
9252        if( zBOM[0] ) fwrite(zBOM, 1, 3, p->out);
9253        sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9254      }
9255    }
9256    sqlite3_free(zFile);
9257  }else
9258#endif /* !defined(SQLITE_SHELL_FIDDLE) */
9259
9260  if( c=='p' && n>=3 && cli_strncmp(azArg[0], "parameter", n)==0 ){
9261    open_db(p,0);
9262    if( nArg<=1 ) goto parameter_syntax_error;
9263
9264    /* .parameter clear
9265    ** Clear all bind parameters by dropping the TEMP table that holds them.
9266    */
9267    if( nArg==2 && cli_strcmp(azArg[1],"clear")==0 ){
9268      sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9269                   0, 0, 0);
9270    }else
9271
9272    /* .parameter list
9273    ** List all bind parameters.
9274    */
9275    if( nArg==2 && cli_strcmp(azArg[1],"list")==0 ){
9276      sqlite3_stmt *pStmt = 0;
9277      int rx;
9278      int len = 0;
9279      rx = sqlite3_prepare_v2(p->db,
9280             "SELECT max(length(key)) "
9281             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9282      if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9283        len = sqlite3_column_int(pStmt, 0);
9284        if( len>40 ) len = 40;
9285      }
9286      sqlite3_finalize(pStmt);
9287      pStmt = 0;
9288      if( len ){
9289        rx = sqlite3_prepare_v2(p->db,
9290             "SELECT key, quote(value) "
9291             "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9292        while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9293          utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9294                      sqlite3_column_text(pStmt,1));
9295        }
9296        sqlite3_finalize(pStmt);
9297      }
9298    }else
9299
9300    /* .parameter init
9301    ** Make sure the TEMP table used to hold bind parameters exists.
9302    ** Create it if necessary.
9303    */
9304    if( nArg==2 && cli_strcmp(azArg[1],"init")==0 ){
9305      bind_table_init(p);
9306    }else
9307
9308    /* .parameter set NAME VALUE
9309    ** Set or reset a bind parameter.  NAME should be the full parameter
9310    ** name exactly as it appears in the query.  (ex: $abc, @def).  The
9311    ** VALUE can be in either SQL literal notation, or if not it will be
9312    ** understood to be a text string.
9313    */
9314    if( nArg==4 && cli_strcmp(azArg[1],"set")==0 ){
9315      int rx;
9316      char *zSql;
9317      sqlite3_stmt *pStmt;
9318      const char *zKey = azArg[2];
9319      const char *zValue = azArg[3];
9320      bind_table_init(p);
9321      zSql = sqlite3_mprintf(
9322                  "REPLACE INTO temp.sqlite_parameters(key,value)"
9323                  "VALUES(%Q,%s);", zKey, zValue);
9324      shell_check_oom(zSql);
9325      pStmt = 0;
9326      rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9327      sqlite3_free(zSql);
9328      if( rx!=SQLITE_OK ){
9329        sqlite3_finalize(pStmt);
9330        pStmt = 0;
9331        zSql = sqlite3_mprintf(
9332                   "REPLACE INTO temp.sqlite_parameters(key,value)"
9333                   "VALUES(%Q,%Q);", zKey, zValue);
9334        shell_check_oom(zSql);
9335        rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9336        sqlite3_free(zSql);
9337        if( rx!=SQLITE_OK ){
9338          utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9339          sqlite3_finalize(pStmt);
9340          pStmt = 0;
9341          rc = 1;
9342        }
9343      }
9344      sqlite3_step(pStmt);
9345      sqlite3_finalize(pStmt);
9346    }else
9347
9348    /* .parameter unset NAME
9349    ** Remove the NAME binding from the parameter binding table, if it
9350    ** exists.
9351    */
9352    if( nArg==3 && cli_strcmp(azArg[1],"unset")==0 ){
9353      char *zSql = sqlite3_mprintf(
9354          "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9355      shell_check_oom(zSql);
9356      sqlite3_exec(p->db, zSql, 0, 0, 0);
9357      sqlite3_free(zSql);
9358    }else
9359    /* If no command name matches, show a syntax error */
9360    parameter_syntax_error:
9361    showHelp(p->out, "parameter");
9362  }else
9363
9364  if( c=='p' && n>=3 && cli_strncmp(azArg[0], "print", n)==0 ){
9365    int i;
9366    for(i=1; i<nArg; i++){
9367      if( i>1 ) raw_printf(p->out, " ");
9368      utf8_printf(p->out, "%s", azArg[i]);
9369    }
9370    raw_printf(p->out, "\n");
9371  }else
9372
9373#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9374  if( c=='p' && n>=3 && cli_strncmp(azArg[0], "progress", n)==0 ){
9375    int i;
9376    int nn = 0;
9377    p->flgProgress = 0;
9378    p->mxProgress = 0;
9379    p->nProgress = 0;
9380    for(i=1; i<nArg; i++){
9381      const char *z = azArg[i];
9382      if( z[0]=='-' ){
9383        z++;
9384        if( z[0]=='-' ) z++;
9385        if( cli_strcmp(z,"quiet")==0 || cli_strcmp(z,"q")==0 ){
9386          p->flgProgress |= SHELL_PROGRESS_QUIET;
9387          continue;
9388        }
9389        if( cli_strcmp(z,"reset")==0 ){
9390          p->flgProgress |= SHELL_PROGRESS_RESET;
9391          continue;
9392        }
9393        if( cli_strcmp(z,"once")==0 ){
9394          p->flgProgress |= SHELL_PROGRESS_ONCE;
9395          continue;
9396        }
9397        if( cli_strcmp(z,"limit")==0 ){
9398          if( i+1>=nArg ){
9399            utf8_printf(stderr, "Error: missing argument on --limit\n");
9400            rc = 1;
9401            goto meta_command_exit;
9402          }else{
9403            p->mxProgress = (int)integerValue(azArg[++i]);
9404          }
9405          continue;
9406        }
9407        utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9408        rc = 1;
9409        goto meta_command_exit;
9410      }else{
9411        nn = (int)integerValue(z);
9412      }
9413    }
9414    open_db(p, 0);
9415    sqlite3_progress_handler(p->db, nn, progress_handler, p);
9416  }else
9417#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9418
9419  if( c=='p' && cli_strncmp(azArg[0], "prompt", n)==0 ){
9420    if( nArg >= 2) {
9421      strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9422    }
9423    if( nArg >= 3) {
9424      strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9425    }
9426  }else
9427
9428#ifndef SQLITE_SHELL_FIDDLE
9429  if( c=='q' && cli_strncmp(azArg[0], "quit", n)==0 ){
9430    rc = 2;
9431  }else
9432#endif
9433
9434#ifndef SQLITE_SHELL_FIDDLE
9435  if( c=='r' && n>=3 && cli_strncmp(azArg[0], "read", n)==0 ){
9436    FILE *inSaved = p->in;
9437    int savedLineno = p->lineno;
9438    failIfSafeMode(p, "cannot run .read in safe mode");
9439    if( nArg!=2 ){
9440      raw_printf(stderr, "Usage: .read FILE\n");
9441      rc = 1;
9442      goto meta_command_exit;
9443    }
9444    if( azArg[1][0]=='|' ){
9445#ifdef SQLITE_OMIT_POPEN
9446      raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9447      rc = 1;
9448      p->out = stdout;
9449#else
9450      p->in = popen(azArg[1]+1, "r");
9451      if( p->in==0 ){
9452        utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9453        rc = 1;
9454      }else{
9455        rc = process_input(p);
9456        pclose(p->in);
9457      }
9458#endif
9459    }else if( (p->in = openChrSource(azArg[1]))==0 ){
9460      utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9461      rc = 1;
9462    }else{
9463      rc = process_input(p);
9464      fclose(p->in);
9465    }
9466    p->in = inSaved;
9467    p->lineno = savedLineno;
9468  }else
9469#endif /* !defined(SQLITE_SHELL_FIDDLE) */
9470
9471#ifndef SQLITE_SHELL_FIDDLE
9472  if( c=='r' && n>=3 && cli_strncmp(azArg[0], "restore", n)==0 ){
9473    const char *zSrcFile;
9474    const char *zDb;
9475    sqlite3 *pSrc;
9476    sqlite3_backup *pBackup;
9477    int nTimeout = 0;
9478
9479    failIfSafeMode(p, "cannot run .restore in safe mode");
9480    if( nArg==2 ){
9481      zSrcFile = azArg[1];
9482      zDb = "main";
9483    }else if( nArg==3 ){
9484      zSrcFile = azArg[2];
9485      zDb = azArg[1];
9486    }else{
9487      raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9488      rc = 1;
9489      goto meta_command_exit;
9490    }
9491    rc = sqlite3_open(zSrcFile, &pSrc);
9492    if( rc!=SQLITE_OK ){
9493      utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9494      close_db(pSrc);
9495      return 1;
9496    }
9497    open_db(p, 0);
9498    pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9499    if( pBackup==0 ){
9500      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9501      close_db(pSrc);
9502      return 1;
9503    }
9504    while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9505          || rc==SQLITE_BUSY  ){
9506      if( rc==SQLITE_BUSY ){
9507        if( nTimeout++ >= 3 ) break;
9508        sqlite3_sleep(100);
9509      }
9510    }
9511    sqlite3_backup_finish(pBackup);
9512    if( rc==SQLITE_DONE ){
9513      rc = 0;
9514    }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9515      raw_printf(stderr, "Error: source database is busy\n");
9516      rc = 1;
9517    }else{
9518      utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9519      rc = 1;
9520    }
9521    close_db(pSrc);
9522  }else
9523#endif /* !defined(SQLITE_SHELL_FIDDLE) */
9524
9525  if( c=='s' && cli_strncmp(azArg[0], "scanstats", n)==0 ){
9526    if( nArg==2 ){
9527      p->scanstatsOn = (u8)booleanValue(azArg[1]);
9528#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9529      raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9530#endif
9531    }else{
9532      raw_printf(stderr, "Usage: .scanstats on|off\n");
9533      rc = 1;
9534    }
9535  }else
9536
9537  if( c=='s' && cli_strncmp(azArg[0], "schema", n)==0 ){
9538    ShellText sSelect;
9539    ShellState data;
9540    char *zErrMsg = 0;
9541    const char *zDiv = "(";
9542    const char *zName = 0;
9543    int iSchema = 0;
9544    int bDebug = 0;
9545    int bNoSystemTabs = 0;
9546    int ii;
9547
9548    open_db(p, 0);
9549    memcpy(&data, p, sizeof(data));
9550    data.showHeader = 0;
9551    data.cMode = data.mode = MODE_Semi;
9552    initText(&sSelect);
9553    for(ii=1; ii<nArg; ii++){
9554      if( optionMatch(azArg[ii],"indent") ){
9555        data.cMode = data.mode = MODE_Pretty;
9556      }else if( optionMatch(azArg[ii],"debug") ){
9557        bDebug = 1;
9558      }else if( optionMatch(azArg[ii],"nosys") ){
9559        bNoSystemTabs = 1;
9560      }else if( azArg[ii][0]=='-' ){
9561        utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9562        rc = 1;
9563        goto meta_command_exit;
9564      }else if( zName==0 ){
9565        zName = azArg[ii];
9566      }else{
9567        raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9568        rc = 1;
9569        goto meta_command_exit;
9570      }
9571    }
9572    if( zName!=0 ){
9573      int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
9574                  || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
9575                  || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
9576                  || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
9577      if( isSchema ){
9578        char *new_argv[2], *new_colv[2];
9579        new_argv[0] = sqlite3_mprintf(
9580                      "CREATE TABLE %s (\n"
9581                      "  type text,\n"
9582                      "  name text,\n"
9583                      "  tbl_name text,\n"
9584                      "  rootpage integer,\n"
9585                      "  sql text\n"
9586                      ")", zName);
9587        shell_check_oom(new_argv[0]);
9588        new_argv[1] = 0;
9589        new_colv[0] = "sql";
9590        new_colv[1] = 0;
9591        callback(&data, 1, new_argv, new_colv);
9592        sqlite3_free(new_argv[0]);
9593      }
9594    }
9595    if( zDiv ){
9596      sqlite3_stmt *pStmt = 0;
9597      rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
9598                              -1, &pStmt, 0);
9599      if( rc ){
9600        utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9601        sqlite3_finalize(pStmt);
9602        rc = 1;
9603        goto meta_command_exit;
9604      }
9605      appendText(&sSelect, "SELECT sql FROM", 0);
9606      iSchema = 0;
9607      while( sqlite3_step(pStmt)==SQLITE_ROW ){
9608        const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
9609        char zScNum[30];
9610        sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
9611        appendText(&sSelect, zDiv, 0);
9612        zDiv = " UNION ALL ";
9613        appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
9614        if( sqlite3_stricmp(zDb, "main")!=0 ){
9615          appendText(&sSelect, zDb, '\'');
9616        }else{
9617          appendText(&sSelect, "NULL", 0);
9618        }
9619        appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
9620        appendText(&sSelect, zScNum, 0);
9621        appendText(&sSelect, " AS snum, ", 0);
9622        appendText(&sSelect, zDb, '\'');
9623        appendText(&sSelect, " AS sname FROM ", 0);
9624        appendText(&sSelect, zDb, quoteChar(zDb));
9625        appendText(&sSelect, ".sqlite_schema", 0);
9626      }
9627      sqlite3_finalize(pStmt);
9628#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
9629      if( zName ){
9630        appendText(&sSelect,
9631           " UNION ALL SELECT shell_module_schema(name),"
9632           " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
9633        0);
9634      }
9635#endif
9636      appendText(&sSelect, ") WHERE ", 0);
9637      if( zName ){
9638        char *zQarg = sqlite3_mprintf("%Q", zName);
9639        int bGlob;
9640        shell_check_oom(zQarg);
9641        bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
9642                strchr(zName, '[') != 0;
9643        if( strchr(zName, '.') ){
9644          appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
9645        }else{
9646          appendText(&sSelect, "lower(tbl_name)", 0);
9647        }
9648        appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
9649        appendText(&sSelect, zQarg, 0);
9650        if( !bGlob ){
9651          appendText(&sSelect, " ESCAPE '\\' ", 0);
9652        }
9653        appendText(&sSelect, " AND ", 0);
9654        sqlite3_free(zQarg);
9655      }
9656      if( bNoSystemTabs ){
9657        appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
9658      }
9659      appendText(&sSelect, "sql IS NOT NULL"
9660                           " ORDER BY snum, rowid", 0);
9661      if( bDebug ){
9662        utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
9663      }else{
9664        rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
9665      }
9666      freeText(&sSelect);
9667    }
9668    if( zErrMsg ){
9669      utf8_printf(stderr,"Error: %s\n", zErrMsg);
9670      sqlite3_free(zErrMsg);
9671      rc = 1;
9672    }else if( rc != SQLITE_OK ){
9673      raw_printf(stderr,"Error: querying schema information\n");
9674      rc = 1;
9675    }else{
9676      rc = 0;
9677    }
9678  }else
9679
9680  if( (c=='s' && n==11 && cli_strncmp(azArg[0], "selecttrace", n)==0)
9681   || (c=='t' && n==9  && cli_strncmp(azArg[0], "treetrace", n)==0)
9682  ){
9683    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
9684    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
9685  }else
9686
9687#if defined(SQLITE_ENABLE_SESSION)
9688  if( c=='s' && cli_strncmp(azArg[0],"session",n)==0 && n>=3 ){
9689    struct AuxDb *pAuxDb = p->pAuxDb;
9690    OpenSession *pSession = &pAuxDb->aSession[0];
9691    char **azCmd = &azArg[1];
9692    int iSes = 0;
9693    int nCmd = nArg - 1;
9694    int i;
9695    if( nArg<=1 ) goto session_syntax_error;
9696    open_db(p, 0);
9697    if( nArg>=3 ){
9698      for(iSes=0; iSes<pAuxDb->nSession; iSes++){
9699        if( cli_strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
9700      }
9701      if( iSes<pAuxDb->nSession ){
9702        pSession = &pAuxDb->aSession[iSes];
9703        azCmd++;
9704        nCmd--;
9705      }else{
9706        pSession = &pAuxDb->aSession[0];
9707        iSes = 0;
9708      }
9709    }
9710
9711    /* .session attach TABLE
9712    ** Invoke the sqlite3session_attach() interface to attach a particular
9713    ** table so that it is never filtered.
9714    */
9715    if( cli_strcmp(azCmd[0],"attach")==0 ){
9716      if( nCmd!=2 ) goto session_syntax_error;
9717      if( pSession->p==0 ){
9718        session_not_open:
9719        raw_printf(stderr, "ERROR: No sessions are open\n");
9720      }else{
9721        rc = sqlite3session_attach(pSession->p, azCmd[1]);
9722        if( rc ){
9723          raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
9724          rc = 0;
9725        }
9726      }
9727    }else
9728
9729    /* .session changeset FILE
9730    ** .session patchset FILE
9731    ** Write a changeset or patchset into a file.  The file is overwritten.
9732    */
9733    if( cli_strcmp(azCmd[0],"changeset")==0
9734     || cli_strcmp(azCmd[0],"patchset")==0
9735    ){
9736      FILE *out = 0;
9737      failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
9738      if( nCmd!=2 ) goto session_syntax_error;
9739      if( pSession->p==0 ) goto session_not_open;
9740      out = fopen(azCmd[1], "wb");
9741      if( out==0 ){
9742        utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
9743                    azCmd[1]);
9744      }else{
9745        int szChng;
9746        void *pChng;
9747        if( azCmd[0][0]=='c' ){
9748          rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
9749        }else{
9750          rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
9751        }
9752        if( rc ){
9753          printf("Error: error code %d\n", rc);
9754          rc = 0;
9755        }
9756        if( pChng
9757          && fwrite(pChng, szChng, 1, out)!=1 ){
9758          raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
9759                  szChng);
9760        }
9761        sqlite3_free(pChng);
9762        fclose(out);
9763      }
9764    }else
9765
9766    /* .session close
9767    ** Close the identified session
9768    */
9769    if( cli_strcmp(azCmd[0], "close")==0 ){
9770      if( nCmd!=1 ) goto session_syntax_error;
9771      if( pAuxDb->nSession ){
9772        session_close(pSession);
9773        pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
9774      }
9775    }else
9776
9777    /* .session enable ?BOOLEAN?
9778    ** Query or set the enable flag
9779    */
9780    if( cli_strcmp(azCmd[0], "enable")==0 ){
9781      int ii;
9782      if( nCmd>2 ) goto session_syntax_error;
9783      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9784      if( pAuxDb->nSession ){
9785        ii = sqlite3session_enable(pSession->p, ii);
9786        utf8_printf(p->out, "session %s enable flag = %d\n",
9787                    pSession->zName, ii);
9788      }
9789    }else
9790
9791    /* .session filter GLOB ....
9792    ** Set a list of GLOB patterns of table names to be excluded.
9793    */
9794    if( cli_strcmp(azCmd[0], "filter")==0 ){
9795      int ii, nByte;
9796      if( nCmd<2 ) goto session_syntax_error;
9797      if( pAuxDb->nSession ){
9798        for(ii=0; ii<pSession->nFilter; ii++){
9799          sqlite3_free(pSession->azFilter[ii]);
9800        }
9801        sqlite3_free(pSession->azFilter);
9802        nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
9803        pSession->azFilter = sqlite3_malloc( nByte );
9804        if( pSession->azFilter==0 ){
9805          raw_printf(stderr, "Error: out or memory\n");
9806          exit(1);
9807        }
9808        for(ii=1; ii<nCmd; ii++){
9809          char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
9810          shell_check_oom(x);
9811        }
9812        pSession->nFilter = ii-1;
9813      }
9814    }else
9815
9816    /* .session indirect ?BOOLEAN?
9817    ** Query or set the indirect flag
9818    */
9819    if( cli_strcmp(azCmd[0], "indirect")==0 ){
9820      int ii;
9821      if( nCmd>2 ) goto session_syntax_error;
9822      ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
9823      if( pAuxDb->nSession ){
9824        ii = sqlite3session_indirect(pSession->p, ii);
9825        utf8_printf(p->out, "session %s indirect flag = %d\n",
9826                    pSession->zName, ii);
9827      }
9828    }else
9829
9830    /* .session isempty
9831    ** Determine if the session is empty
9832    */
9833    if( cli_strcmp(azCmd[0], "isempty")==0 ){
9834      int ii;
9835      if( nCmd!=1 ) goto session_syntax_error;
9836      if( pAuxDb->nSession ){
9837        ii = sqlite3session_isempty(pSession->p);
9838        utf8_printf(p->out, "session %s isempty flag = %d\n",
9839                    pSession->zName, ii);
9840      }
9841    }else
9842
9843    /* .session list
9844    ** List all currently open sessions
9845    */
9846    if( cli_strcmp(azCmd[0],"list")==0 ){
9847      for(i=0; i<pAuxDb->nSession; i++){
9848        utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
9849      }
9850    }else
9851
9852    /* .session open DB NAME
9853    ** Open a new session called NAME on the attached database DB.
9854    ** DB is normally "main".
9855    */
9856    if( cli_strcmp(azCmd[0],"open")==0 ){
9857      char *zName;
9858      if( nCmd!=3 ) goto session_syntax_error;
9859      zName = azCmd[2];
9860      if( zName[0]==0 ) goto session_syntax_error;
9861      for(i=0; i<pAuxDb->nSession; i++){
9862        if( cli_strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
9863          utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
9864          goto meta_command_exit;
9865        }
9866      }
9867      if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
9868        raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
9869        goto meta_command_exit;
9870      }
9871      pSession = &pAuxDb->aSession[pAuxDb->nSession];
9872      rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
9873      if( rc ){
9874        raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
9875        rc = 0;
9876        goto meta_command_exit;
9877      }
9878      pSession->nFilter = 0;
9879      sqlite3session_table_filter(pSession->p, session_filter, pSession);
9880      pAuxDb->nSession++;
9881      pSession->zName = sqlite3_mprintf("%s", zName);
9882      shell_check_oom(pSession->zName);
9883    }else
9884    /* If no command name matches, show a syntax error */
9885    session_syntax_error:
9886    showHelp(p->out, "session");
9887  }else
9888#endif
9889
9890#ifdef SQLITE_DEBUG
9891  /* Undocumented commands for internal testing.  Subject to change
9892  ** without notice. */
9893  if( c=='s' && n>=10 && cli_strncmp(azArg[0], "selftest-", 9)==0 ){
9894    if( cli_strncmp(azArg[0]+9, "boolean", n-9)==0 ){
9895      int i, v;
9896      for(i=1; i<nArg; i++){
9897        v = booleanValue(azArg[i]);
9898        utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
9899      }
9900    }
9901    if( cli_strncmp(azArg[0]+9, "integer", n-9)==0 ){
9902      int i; sqlite3_int64 v;
9903      for(i=1; i<nArg; i++){
9904        char zBuf[200];
9905        v = integerValue(azArg[i]);
9906        sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
9907        utf8_printf(p->out, "%s", zBuf);
9908      }
9909    }
9910  }else
9911#endif
9912
9913  if( c=='s' && n>=4 && cli_strncmp(azArg[0],"selftest",n)==0 ){
9914    int bIsInit = 0;         /* True to initialize the SELFTEST table */
9915    int bVerbose = 0;        /* Verbose output */
9916    int bSelftestExists;     /* True if SELFTEST already exists */
9917    int i, k;                /* Loop counters */
9918    int nTest = 0;           /* Number of tests runs */
9919    int nErr = 0;            /* Number of errors seen */
9920    ShellText str;           /* Answer for a query */
9921    sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
9922
9923    open_db(p,0);
9924    for(i=1; i<nArg; i++){
9925      const char *z = azArg[i];
9926      if( z[0]=='-' && z[1]=='-' ) z++;
9927      if( cli_strcmp(z,"-init")==0 ){
9928        bIsInit = 1;
9929      }else
9930      if( cli_strcmp(z,"-v")==0 ){
9931        bVerbose++;
9932      }else
9933      {
9934        utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
9935                    azArg[i], azArg[0]);
9936        raw_printf(stderr, "Should be one of: --init -v\n");
9937        rc = 1;
9938        goto meta_command_exit;
9939      }
9940    }
9941    if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
9942           != SQLITE_OK ){
9943      bSelftestExists = 0;
9944    }else{
9945      bSelftestExists = 1;
9946    }
9947    if( bIsInit ){
9948      createSelftestTable(p);
9949      bSelftestExists = 1;
9950    }
9951    initText(&str);
9952    appendText(&str, "x", 0);
9953    for(k=bSelftestExists; k>=0; k--){
9954      if( k==1 ){
9955        rc = sqlite3_prepare_v2(p->db,
9956            "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
9957            -1, &pStmt, 0);
9958      }else{
9959        rc = sqlite3_prepare_v2(p->db,
9960          "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
9961          "      (1,'run','PRAGMA integrity_check','ok')",
9962          -1, &pStmt, 0);
9963      }
9964      if( rc ){
9965        raw_printf(stderr, "Error querying the selftest table\n");
9966        rc = 1;
9967        sqlite3_finalize(pStmt);
9968        goto meta_command_exit;
9969      }
9970      for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
9971        int tno = sqlite3_column_int(pStmt, 0);
9972        const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
9973        const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
9974        const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
9975
9976        if( zOp==0 ) continue;
9977        if( zSql==0 ) continue;
9978        if( zAns==0 ) continue;
9979        k = 0;
9980        if( bVerbose>0 ){
9981          printf("%d: %s %s\n", tno, zOp, zSql);
9982        }
9983        if( cli_strcmp(zOp,"memo")==0 ){
9984          utf8_printf(p->out, "%s\n", zSql);
9985        }else
9986        if( cli_strcmp(zOp,"run")==0 ){
9987          char *zErrMsg = 0;
9988          str.n = 0;
9989          str.z[0] = 0;
9990          rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
9991          nTest++;
9992          if( bVerbose ){
9993            utf8_printf(p->out, "Result: %s\n", str.z);
9994          }
9995          if( rc || zErrMsg ){
9996            nErr++;
9997            rc = 1;
9998            utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
9999            sqlite3_free(zErrMsg);
10000          }else if( cli_strcmp(zAns,str.z)!=0 ){
10001            nErr++;
10002            rc = 1;
10003            utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
10004            utf8_printf(p->out, "%d:      Got: [%s]\n", tno, str.z);
10005          }
10006        }else
10007        {
10008          utf8_printf(stderr,
10009            "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
10010          rc = 1;
10011          break;
10012        }
10013      } /* End loop over rows of content from SELFTEST */
10014      sqlite3_finalize(pStmt);
10015    } /* End loop over k */
10016    freeText(&str);
10017    utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
10018  }else
10019
10020  if( c=='s' && cli_strncmp(azArg[0], "separator", n)==0 ){
10021    if( nArg<2 || nArg>3 ){
10022      raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
10023      rc = 1;
10024    }
10025    if( nArg>=2 ){
10026      sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
10027                       "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
10028    }
10029    if( nArg>=3 ){
10030      sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
10031                       "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
10032    }
10033  }else
10034
10035  if( c=='s' && n>=4 && cli_strncmp(azArg[0],"sha3sum",n)==0 ){
10036    const char *zLike = 0;   /* Which table to checksum. 0 means everything */
10037    int i;                   /* Loop counter */
10038    int bSchema = 0;         /* Also hash the schema */
10039    int bSeparate = 0;       /* Hash each table separately */
10040    int iSize = 224;         /* Hash algorithm to use */
10041    int bDebug = 0;          /* Only show the query that would have run */
10042    sqlite3_stmt *pStmt;     /* For querying tables names */
10043    char *zSql;              /* SQL to be run */
10044    char *zSep;              /* Separator */
10045    ShellText sSql;          /* Complete SQL for the query to run the hash */
10046    ShellText sQuery;        /* Set of queries used to read all content */
10047    open_db(p, 0);
10048    for(i=1; i<nArg; i++){
10049      const char *z = azArg[i];
10050      if( z[0]=='-' ){
10051        z++;
10052        if( z[0]=='-' ) z++;
10053        if( cli_strcmp(z,"schema")==0 ){
10054          bSchema = 1;
10055        }else
10056        if( cli_strcmp(z,"sha3-224")==0 || cli_strcmp(z,"sha3-256")==0
10057         || cli_strcmp(z,"sha3-384")==0 || cli_strcmp(z,"sha3-512")==0
10058        ){
10059          iSize = atoi(&z[5]);
10060        }else
10061        if( cli_strcmp(z,"debug")==0 ){
10062          bDebug = 1;
10063        }else
10064        {
10065          utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10066                      azArg[i], azArg[0]);
10067          showHelp(p->out, azArg[0]);
10068          rc = 1;
10069          goto meta_command_exit;
10070        }
10071      }else if( zLike ){
10072        raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
10073        rc = 1;
10074        goto meta_command_exit;
10075      }else{
10076        zLike = z;
10077        bSeparate = 1;
10078        if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
10079      }
10080    }
10081    if( bSchema ){
10082      zSql = "SELECT lower(name) FROM sqlite_schema"
10083             " WHERE type='table' AND coalesce(rootpage,0)>1"
10084             " UNION ALL SELECT 'sqlite_schema'"
10085             " ORDER BY 1 collate nocase";
10086    }else{
10087      zSql = "SELECT lower(name) FROM sqlite_schema"
10088             " WHERE type='table' AND coalesce(rootpage,0)>1"
10089             " AND name NOT LIKE 'sqlite_%'"
10090             " ORDER BY 1 collate nocase";
10091    }
10092    sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10093    initText(&sQuery);
10094    initText(&sSql);
10095    appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
10096    zSep = "VALUES(";
10097    while( SQLITE_ROW==sqlite3_step(pStmt) ){
10098      const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
10099      if( zTab==0 ) continue;
10100      if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
10101      if( cli_strncmp(zTab, "sqlite_",7)!=0 ){
10102        appendText(&sQuery,"SELECT * FROM ", 0);
10103        appendText(&sQuery,zTab,'"');
10104        appendText(&sQuery," NOT INDEXED;", 0);
10105      }else if( cli_strcmp(zTab, "sqlite_schema")==0 ){
10106        appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10107                           " ORDER BY name;", 0);
10108      }else if( cli_strcmp(zTab, "sqlite_sequence")==0 ){
10109        appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10110                           " ORDER BY name;", 0);
10111      }else if( cli_strcmp(zTab, "sqlite_stat1")==0 ){
10112        appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10113                           " ORDER BY tbl,idx;", 0);
10114      }else if( cli_strcmp(zTab, "sqlite_stat4")==0 ){
10115        appendText(&sQuery, "SELECT * FROM ", 0);
10116        appendText(&sQuery, zTab, 0);
10117        appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10118      }
10119      appendText(&sSql, zSep, 0);
10120      appendText(&sSql, sQuery.z, '\'');
10121      sQuery.n = 0;
10122      appendText(&sSql, ",", 0);
10123      appendText(&sSql, zTab, '\'');
10124      zSep = "),(";
10125    }
10126    sqlite3_finalize(pStmt);
10127    if( bSeparate ){
10128      zSql = sqlite3_mprintf(
10129          "%s))"
10130          " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10131          "   FROM [sha3sum$query]",
10132          sSql.z, iSize);
10133    }else{
10134      zSql = sqlite3_mprintf(
10135          "%s))"
10136          " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10137          "   FROM [sha3sum$query]",
10138          sSql.z, iSize);
10139    }
10140    shell_check_oom(zSql);
10141    freeText(&sQuery);
10142    freeText(&sSql);
10143    if( bDebug ){
10144      utf8_printf(p->out, "%s\n", zSql);
10145    }else{
10146      shell_exec(p, zSql, 0);
10147    }
10148    sqlite3_free(zSql);
10149  }else
10150
10151#if !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE)
10152  if( c=='s'
10153   && (cli_strncmp(azArg[0], "shell", n)==0
10154       || cli_strncmp(azArg[0],"system",n)==0)
10155  ){
10156    char *zCmd;
10157    int i, x;
10158    failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10159    if( nArg<2 ){
10160      raw_printf(stderr, "Usage: .system COMMAND\n");
10161      rc = 1;
10162      goto meta_command_exit;
10163    }
10164    zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10165    for(i=2; i<nArg && zCmd!=0; i++){
10166      zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10167                             zCmd, azArg[i]);
10168    }
10169    x = zCmd!=0 ? system(zCmd) : 1;
10170    sqlite3_free(zCmd);
10171    if( x ) raw_printf(stderr, "System command returns %d\n", x);
10172  }else
10173#endif /* !defined(SQLITE_NOHAVE_SYSTEM) && !defined(SQLITE_SHELL_FIDDLE) */
10174
10175  if( c=='s' && cli_strncmp(azArg[0], "show", n)==0 ){
10176    static const char *azBool[] = { "off", "on", "trigger", "full"};
10177    const char *zOut;
10178    int i;
10179    if( nArg!=1 ){
10180      raw_printf(stderr, "Usage: .show\n");
10181      rc = 1;
10182      goto meta_command_exit;
10183    }
10184    utf8_printf(p->out, "%12.12s: %s\n","echo",
10185                azBool[ShellHasFlag(p, SHFLG_Echo)]);
10186    utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10187    utf8_printf(p->out, "%12.12s: %s\n","explain",
10188         p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10189    utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10190    if( p->mode==MODE_Column
10191     || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
10192    ){
10193      utf8_printf
10194        (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
10195         modeDescr[p->mode], p->cmOpts.iWrap,
10196         p->cmOpts.bWordWrap ? "on" : "off",
10197         p->cmOpts.bQuote ? "" : "no");
10198    }else{
10199      utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10200    }
10201    utf8_printf(p->out, "%12.12s: ", "nullvalue");
10202      output_c_string(p->out, p->nullValue);
10203      raw_printf(p->out, "\n");
10204    utf8_printf(p->out,"%12.12s: %s\n","output",
10205            strlen30(p->outfile) ? p->outfile : "stdout");
10206    utf8_printf(p->out,"%12.12s: ", "colseparator");
10207      output_c_string(p->out, p->colSeparator);
10208      raw_printf(p->out, "\n");
10209    utf8_printf(p->out,"%12.12s: ", "rowseparator");
10210      output_c_string(p->out, p->rowSeparator);
10211      raw_printf(p->out, "\n");
10212    switch( p->statsOn ){
10213      case 0:  zOut = "off";     break;
10214      default: zOut = "on";      break;
10215      case 2:  zOut = "stmt";    break;
10216      case 3:  zOut = "vmstep";  break;
10217    }
10218    utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10219    utf8_printf(p->out, "%12.12s: ", "width");
10220    for (i=0;i<p->nWidth;i++) {
10221      raw_printf(p->out, "%d ", p->colWidth[i]);
10222    }
10223    raw_printf(p->out, "\n");
10224    utf8_printf(p->out, "%12.12s: %s\n", "filename",
10225                p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10226  }else
10227
10228  if( c=='s' && cli_strncmp(azArg[0], "stats", n)==0 ){
10229    if( nArg==2 ){
10230      if( cli_strcmp(azArg[1],"stmt")==0 ){
10231        p->statsOn = 2;
10232      }else if( cli_strcmp(azArg[1],"vmstep")==0 ){
10233        p->statsOn = 3;
10234      }else{
10235        p->statsOn = (u8)booleanValue(azArg[1]);
10236      }
10237    }else if( nArg==1 ){
10238      display_stats(p->db, p, 0);
10239    }else{
10240      raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10241      rc = 1;
10242    }
10243  }else
10244
10245  if( (c=='t' && n>1 && cli_strncmp(azArg[0], "tables", n)==0)
10246   || (c=='i' && (cli_strncmp(azArg[0], "indices", n)==0
10247                 || cli_strncmp(azArg[0], "indexes", n)==0) )
10248  ){
10249    sqlite3_stmt *pStmt;
10250    char **azResult;
10251    int nRow, nAlloc;
10252    int ii;
10253    ShellText s;
10254    initText(&s);
10255    open_db(p, 0);
10256    rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10257    if( rc ){
10258      sqlite3_finalize(pStmt);
10259      return shellDatabaseError(p->db);
10260    }
10261
10262    if( nArg>2 && c=='i' ){
10263      /* It is an historical accident that the .indexes command shows an error
10264      ** when called with the wrong number of arguments whereas the .tables
10265      ** command does not. */
10266      raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10267      rc = 1;
10268      sqlite3_finalize(pStmt);
10269      goto meta_command_exit;
10270    }
10271    for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10272      const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10273      if( zDbName==0 ) continue;
10274      if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10275      if( sqlite3_stricmp(zDbName, "main")==0 ){
10276        appendText(&s, "SELECT name FROM ", 0);
10277      }else{
10278        appendText(&s, "SELECT ", 0);
10279        appendText(&s, zDbName, '\'');
10280        appendText(&s, "||'.'||name FROM ", 0);
10281      }
10282      appendText(&s, zDbName, '"');
10283      appendText(&s, ".sqlite_schema ", 0);
10284      if( c=='t' ){
10285        appendText(&s," WHERE type IN ('table','view')"
10286                      "   AND name NOT LIKE 'sqlite_%'"
10287                      "   AND name LIKE ?1", 0);
10288      }else{
10289        appendText(&s," WHERE type='index'"
10290                      "   AND tbl_name LIKE ?1", 0);
10291      }
10292    }
10293    rc = sqlite3_finalize(pStmt);
10294    if( rc==SQLITE_OK ){
10295      appendText(&s, " ORDER BY 1", 0);
10296      rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10297    }
10298    freeText(&s);
10299    if( rc ) return shellDatabaseError(p->db);
10300
10301    /* Run the SQL statement prepared by the above block. Store the results
10302    ** as an array of nul-terminated strings in azResult[].  */
10303    nRow = nAlloc = 0;
10304    azResult = 0;
10305    if( nArg>1 ){
10306      sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10307    }else{
10308      sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10309    }
10310    while( sqlite3_step(pStmt)==SQLITE_ROW ){
10311      if( nRow>=nAlloc ){
10312        char **azNew;
10313        int n2 = nAlloc*2 + 10;
10314        azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10315        shell_check_oom(azNew);
10316        nAlloc = n2;
10317        azResult = azNew;
10318      }
10319      azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10320      shell_check_oom(azResult[nRow]);
10321      nRow++;
10322    }
10323    if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10324      rc = shellDatabaseError(p->db);
10325    }
10326
10327    /* Pretty-print the contents of array azResult[] to the output */
10328    if( rc==0 && nRow>0 ){
10329      int len, maxlen = 0;
10330      int i, j;
10331      int nPrintCol, nPrintRow;
10332      for(i=0; i<nRow; i++){
10333        len = strlen30(azResult[i]);
10334        if( len>maxlen ) maxlen = len;
10335      }
10336      nPrintCol = 80/(maxlen+2);
10337      if( nPrintCol<1 ) nPrintCol = 1;
10338      nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10339      for(i=0; i<nPrintRow; i++){
10340        for(j=i; j<nRow; j+=nPrintRow){
10341          char *zSp = j<nPrintRow ? "" : "  ";
10342          utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10343                      azResult[j] ? azResult[j]:"");
10344        }
10345        raw_printf(p->out, "\n");
10346      }
10347    }
10348
10349    for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10350    sqlite3_free(azResult);
10351  }else
10352
10353#ifndef SQLITE_SHELL_FIDDLE
10354  /* Begin redirecting output to the file "testcase-out.txt" */
10355  if( c=='t' && cli_strcmp(azArg[0],"testcase")==0 ){
10356    output_reset(p);
10357    p->out = output_file_open("testcase-out.txt", 0);
10358    if( p->out==0 ){
10359      raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10360    }
10361    if( nArg>=2 ){
10362      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10363    }else{
10364      sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10365    }
10366  }else
10367#endif /* !defined(SQLITE_SHELL_FIDDLE) */
10368
10369#ifndef SQLITE_UNTESTABLE
10370  if( c=='t' && n>=8 && cli_strncmp(azArg[0], "testctrl", n)==0 ){
10371    static const struct {
10372       const char *zCtrlName;   /* Name of a test-control option */
10373       int ctrlCode;            /* Integer code for that option */
10374       int unSafe;              /* Not valid for --safe mode */
10375       const char *zUsage;      /* Usage notes */
10376    } aCtrl[] = {
10377      { "always",             SQLITE_TESTCTRL_ALWAYS, 1,     "BOOLEAN"         },
10378      { "assert",             SQLITE_TESTCTRL_ASSERT, 1,     "BOOLEAN"         },
10379    /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, ""        },*/
10380    /*{ "bitvec_test",        SQLITE_TESTCTRL_BITVEC_TEST, 1,  ""              },*/
10381      { "byteorder",          SQLITE_TESTCTRL_BYTEORDER, 0,  ""                },
10382      { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN"  },
10383    /*{ "fault_install",      SQLITE_TESTCTRL_FAULT_INSTALL, 1,""              },*/
10384      { "imposter",         SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10385      { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,""          },
10386      { "localtime_fault",    SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN"      },
10387      { "never_corrupt",      SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN"       },
10388      { "optimizations",      SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK"   },
10389#ifdef YYCOVERAGE
10390      { "parser_coverage",    SQLITE_TESTCTRL_PARSER_COVERAGE,0,""             },
10391#endif
10392      { "pending_byte",       SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET  "       },
10393      { "prng_restore",       SQLITE_TESTCTRL_PRNG_RESTORE,0, ""               },
10394      { "prng_save",          SQLITE_TESTCTRL_PRNG_SAVE,   0, ""               },
10395      { "prng_seed",          SQLITE_TESTCTRL_PRNG_SEED,   0, "SEED ?db?"      },
10396      { "seek_count",         SQLITE_TESTCTRL_SEEK_COUNT,  0, ""               },
10397      { "sorter_mmap",        SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX"           },
10398      { "tune",               SQLITE_TESTCTRL_TUNE,        1, "ID VALUE"       },
10399    };
10400    int testctrl = -1;
10401    int iCtrl = -1;
10402    int rc2 = 0;    /* 0: usage.  1: %d  2: %x  3: no-output */
10403    int isOk = 0;
10404    int i, n2;
10405    const char *zCmd = 0;
10406
10407    open_db(p, 0);
10408    zCmd = nArg>=2 ? azArg[1] : "help";
10409
10410    /* The argument can optionally begin with "-" or "--" */
10411    if( zCmd[0]=='-' && zCmd[1] ){
10412      zCmd++;
10413      if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10414    }
10415
10416    /* --help lists all test-controls */
10417    if( cli_strcmp(zCmd,"help")==0 ){
10418      utf8_printf(p->out, "Available test-controls:\n");
10419      for(i=0; i<ArraySize(aCtrl); i++){
10420        utf8_printf(p->out, "  .testctrl %s %s\n",
10421                    aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10422      }
10423      rc = 1;
10424      goto meta_command_exit;
10425    }
10426
10427    /* convert testctrl text option to value. allow any unique prefix
10428    ** of the option name, or a numerical value. */
10429    n2 = strlen30(zCmd);
10430    for(i=0; i<ArraySize(aCtrl); i++){
10431      if( cli_strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10432        if( testctrl<0 ){
10433          testctrl = aCtrl[i].ctrlCode;
10434          iCtrl = i;
10435        }else{
10436          utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10437                              "Use \".testctrl --help\" for help\n", zCmd);
10438          rc = 1;
10439          goto meta_command_exit;
10440        }
10441      }
10442    }
10443    if( testctrl<0 ){
10444      utf8_printf(stderr,"Error: unknown test-control: %s\n"
10445                         "Use \".testctrl --help\" for help\n", zCmd);
10446    }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10447      utf8_printf(stderr,
10448         "line %d: \".testctrl %s\" may not be used in safe mode\n",
10449         p->lineno, aCtrl[iCtrl].zCtrlName);
10450      exit(1);
10451    }else{
10452      switch(testctrl){
10453
10454        /* sqlite3_test_control(int, db, int) */
10455        case SQLITE_TESTCTRL_OPTIMIZATIONS:
10456          if( nArg==3 ){
10457            unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10458            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10459            isOk = 3;
10460          }
10461          break;
10462
10463        /* sqlite3_test_control(int) */
10464        case SQLITE_TESTCTRL_PRNG_SAVE:
10465        case SQLITE_TESTCTRL_PRNG_RESTORE:
10466        case SQLITE_TESTCTRL_BYTEORDER:
10467          if( nArg==2 ){
10468            rc2 = sqlite3_test_control(testctrl);
10469            isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10470          }
10471          break;
10472
10473        /* sqlite3_test_control(int, uint) */
10474        case SQLITE_TESTCTRL_PENDING_BYTE:
10475          if( nArg==3 ){
10476            unsigned int opt = (unsigned int)integerValue(azArg[2]);
10477            rc2 = sqlite3_test_control(testctrl, opt);
10478            isOk = 3;
10479          }
10480          break;
10481
10482        /* sqlite3_test_control(int, int, sqlite3*) */
10483        case SQLITE_TESTCTRL_PRNG_SEED:
10484          if( nArg==3 || nArg==4 ){
10485            int ii = (int)integerValue(azArg[2]);
10486            sqlite3 *db;
10487            if( ii==0 && cli_strcmp(azArg[2],"random")==0 ){
10488              sqlite3_randomness(sizeof(ii),&ii);
10489              printf("-- random seed: %d\n", ii);
10490            }
10491            if( nArg==3 ){
10492              db = 0;
10493            }else{
10494              db = p->db;
10495              /* Make sure the schema has been loaded */
10496              sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10497            }
10498            rc2 = sqlite3_test_control(testctrl, ii, db);
10499            isOk = 3;
10500          }
10501          break;
10502
10503        /* sqlite3_test_control(int, int) */
10504        case SQLITE_TESTCTRL_ASSERT:
10505        case SQLITE_TESTCTRL_ALWAYS:
10506          if( nArg==3 ){
10507            int opt = booleanValue(azArg[2]);
10508            rc2 = sqlite3_test_control(testctrl, opt);
10509            isOk = 1;
10510          }
10511          break;
10512
10513        /* sqlite3_test_control(int, int) */
10514        case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10515        case SQLITE_TESTCTRL_NEVER_CORRUPT:
10516          if( nArg==3 ){
10517            int opt = booleanValue(azArg[2]);
10518            rc2 = sqlite3_test_control(testctrl, opt);
10519            isOk = 3;
10520          }
10521          break;
10522
10523        /* sqlite3_test_control(sqlite3*) */
10524        case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10525          rc2 = sqlite3_test_control(testctrl, p->db);
10526          isOk = 3;
10527          break;
10528
10529        case SQLITE_TESTCTRL_IMPOSTER:
10530          if( nArg==5 ){
10531            rc2 = sqlite3_test_control(testctrl, p->db,
10532                          azArg[2],
10533                          integerValue(azArg[3]),
10534                          integerValue(azArg[4]));
10535            isOk = 3;
10536          }
10537          break;
10538
10539        case SQLITE_TESTCTRL_SEEK_COUNT: {
10540          u64 x = 0;
10541          rc2 = sqlite3_test_control(testctrl, p->db, &x);
10542          utf8_printf(p->out, "%llu\n", x);
10543          isOk = 3;
10544          break;
10545        }
10546
10547#ifdef YYCOVERAGE
10548        case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10549          if( nArg==2 ){
10550            sqlite3_test_control(testctrl, p->out);
10551            isOk = 3;
10552          }
10553          break;
10554        }
10555#endif
10556#ifdef SQLITE_DEBUG
10557        case SQLITE_TESTCTRL_TUNE: {
10558          if( nArg==4 ){
10559            int id = (int)integerValue(azArg[2]);
10560            int val = (int)integerValue(azArg[3]);
10561            sqlite3_test_control(testctrl, id, &val);
10562            isOk = 3;
10563          }else if( nArg==3 ){
10564            int id = (int)integerValue(azArg[2]);
10565            sqlite3_test_control(testctrl, -id, &rc2);
10566            isOk = 1;
10567          }else if( nArg==2 ){
10568            int id = 1;
10569            while(1){
10570              int val = 0;
10571              rc2 = sqlite3_test_control(testctrl, -id, &val);
10572              if( rc2!=SQLITE_OK ) break;
10573              if( id>1 ) utf8_printf(p->out, "  ");
10574              utf8_printf(p->out, "%d: %d", id, val);
10575              id++;
10576            }
10577            if( id>1 ) utf8_printf(p->out, "\n");
10578            isOk = 3;
10579          }
10580          break;
10581        }
10582#endif
10583        case SQLITE_TESTCTRL_SORTER_MMAP:
10584          if( nArg==3 ){
10585            int opt = (unsigned int)integerValue(azArg[2]);
10586            rc2 = sqlite3_test_control(testctrl, p->db, opt);
10587            isOk = 3;
10588          }
10589          break;
10590      }
10591    }
10592    if( isOk==0 && iCtrl>=0 ){
10593      utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
10594      rc = 1;
10595    }else if( isOk==1 ){
10596      raw_printf(p->out, "%d\n", rc2);
10597    }else if( isOk==2 ){
10598      raw_printf(p->out, "0x%08x\n", rc2);
10599    }
10600  }else
10601#endif /* !defined(SQLITE_UNTESTABLE) */
10602
10603  if( c=='t' && n>4 && cli_strncmp(azArg[0], "timeout", n)==0 ){
10604    open_db(p, 0);
10605    sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
10606  }else
10607
10608  if( c=='t' && n>=5 && cli_strncmp(azArg[0], "timer", n)==0 ){
10609    if( nArg==2 ){
10610      enableTimer = booleanValue(azArg[1]);
10611      if( enableTimer && !HAS_TIMER ){
10612        raw_printf(stderr, "Error: timer not available on this system.\n");
10613        enableTimer = 0;
10614      }
10615    }else{
10616      raw_printf(stderr, "Usage: .timer on|off\n");
10617      rc = 1;
10618    }
10619  }else
10620
10621#ifndef SQLITE_OMIT_TRACE
10622  if( c=='t' && cli_strncmp(azArg[0], "trace", n)==0 ){
10623    int mType = 0;
10624    int jj;
10625    open_db(p, 0);
10626    for(jj=1; jj<nArg; jj++){
10627      const char *z = azArg[jj];
10628      if( z[0]=='-' ){
10629        if( optionMatch(z, "expanded") ){
10630          p->eTraceType = SHELL_TRACE_EXPANDED;
10631        }
10632#ifdef SQLITE_ENABLE_NORMALIZE
10633        else if( optionMatch(z, "normalized") ){
10634          p->eTraceType = SHELL_TRACE_NORMALIZED;
10635        }
10636#endif
10637        else if( optionMatch(z, "plain") ){
10638          p->eTraceType = SHELL_TRACE_PLAIN;
10639        }
10640        else if( optionMatch(z, "profile") ){
10641          mType |= SQLITE_TRACE_PROFILE;
10642        }
10643        else if( optionMatch(z, "row") ){
10644          mType |= SQLITE_TRACE_ROW;
10645        }
10646        else if( optionMatch(z, "stmt") ){
10647          mType |= SQLITE_TRACE_STMT;
10648        }
10649        else if( optionMatch(z, "close") ){
10650          mType |= SQLITE_TRACE_CLOSE;
10651        }
10652        else {
10653          raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
10654          rc = 1;
10655          goto meta_command_exit;
10656        }
10657      }else{
10658        output_file_close(p->traceOut);
10659        p->traceOut = output_file_open(azArg[1], 0);
10660      }
10661    }
10662    if( p->traceOut==0 ){
10663      sqlite3_trace_v2(p->db, 0, 0, 0);
10664    }else{
10665      if( mType==0 ) mType = SQLITE_TRACE_STMT;
10666      sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
10667    }
10668  }else
10669#endif /* !defined(SQLITE_OMIT_TRACE) */
10670
10671#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
10672  if( c=='u' && cli_strncmp(azArg[0], "unmodule", n)==0 ){
10673    int ii;
10674    int lenOpt;
10675    char *zOpt;
10676    if( nArg<2 ){
10677      raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
10678      rc = 1;
10679      goto meta_command_exit;
10680    }
10681    open_db(p, 0);
10682    zOpt = azArg[1];
10683    if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
10684    lenOpt = (int)strlen(zOpt);
10685    if( lenOpt>=3 && cli_strncmp(zOpt, "-allexcept",lenOpt)==0 ){
10686      assert( azArg[nArg]==0 );
10687      sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
10688    }else{
10689      for(ii=1; ii<nArg; ii++){
10690        sqlite3_create_module(p->db, azArg[ii], 0, 0);
10691      }
10692    }
10693  }else
10694#endif
10695
10696#if SQLITE_USER_AUTHENTICATION
10697  if( c=='u' && cli_strncmp(azArg[0], "user", n)==0 ){
10698    if( nArg<2 ){
10699      raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
10700      rc = 1;
10701      goto meta_command_exit;
10702    }
10703    open_db(p, 0);
10704    if( cli_strcmp(azArg[1],"login")==0 ){
10705      if( nArg!=4 ){
10706        raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
10707        rc = 1;
10708        goto meta_command_exit;
10709      }
10710      rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
10711                                     strlen30(azArg[3]));
10712      if( rc ){
10713        utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
10714        rc = 1;
10715      }
10716    }else if( cli_strcmp(azArg[1],"add")==0 ){
10717      if( nArg!=5 ){
10718        raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
10719        rc = 1;
10720        goto meta_command_exit;
10721      }
10722      rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10723                            booleanValue(azArg[4]));
10724      if( rc ){
10725        raw_printf(stderr, "User-Add failed: %d\n", rc);
10726        rc = 1;
10727      }
10728    }else if( cli_strcmp(azArg[1],"edit")==0 ){
10729      if( nArg!=5 ){
10730        raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
10731        rc = 1;
10732        goto meta_command_exit;
10733      }
10734      rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
10735                              booleanValue(azArg[4]));
10736      if( rc ){
10737        raw_printf(stderr, "User-Edit failed: %d\n", rc);
10738        rc = 1;
10739      }
10740    }else if( cli_strcmp(azArg[1],"delete")==0 ){
10741      if( nArg!=3 ){
10742        raw_printf(stderr, "Usage: .user delete USER\n");
10743        rc = 1;
10744        goto meta_command_exit;
10745      }
10746      rc = sqlite3_user_delete(p->db, azArg[2]);
10747      if( rc ){
10748        raw_printf(stderr, "User-Delete failed: %d\n", rc);
10749        rc = 1;
10750      }
10751    }else{
10752      raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
10753      rc = 1;
10754      goto meta_command_exit;
10755    }
10756  }else
10757#endif /* SQLITE_USER_AUTHENTICATION */
10758
10759  if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
10760    utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
10761        sqlite3_libversion(), sqlite3_sourceid());
10762#if SQLITE_HAVE_ZLIB
10763    utf8_printf(p->out, "zlib version %s\n", zlibVersion());
10764#endif
10765#define CTIMEOPT_VAL_(opt) #opt
10766#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
10767#if defined(__clang__) && defined(__clang_major__)
10768    utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
10769                    CTIMEOPT_VAL(__clang_minor__) "."
10770                    CTIMEOPT_VAL(__clang_patchlevel__) "\n");
10771#elif defined(_MSC_VER)
10772    utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
10773#elif defined(__GNUC__) && defined(__VERSION__)
10774    utf8_printf(p->out, "gcc-" __VERSION__ "\n");
10775#endif
10776  }else
10777
10778  if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
10779    const char *zDbName = nArg==2 ? azArg[1] : "main";
10780    sqlite3_vfs *pVfs = 0;
10781    if( p->db ){
10782      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
10783      if( pVfs ){
10784        utf8_printf(p->out, "vfs.zName      = \"%s\"\n", pVfs->zName);
10785        raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10786        raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10787        raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10788      }
10789    }
10790  }else
10791
10792  if( c=='v' && cli_strncmp(azArg[0], "vfslist", n)==0 ){
10793    sqlite3_vfs *pVfs;
10794    sqlite3_vfs *pCurrent = 0;
10795    if( p->db ){
10796      sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
10797    }
10798    for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
10799      utf8_printf(p->out, "vfs.zName      = \"%s\"%s\n", pVfs->zName,
10800           pVfs==pCurrent ? "  <--- CURRENT" : "");
10801      raw_printf(p->out, "vfs.iVersion   = %d\n", pVfs->iVersion);
10802      raw_printf(p->out, "vfs.szOsFile   = %d\n", pVfs->szOsFile);
10803      raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
10804      if( pVfs->pNext ){
10805        raw_printf(p->out, "-----------------------------------\n");
10806      }
10807    }
10808  }else
10809
10810  if( c=='v' && cli_strncmp(azArg[0], "vfsname", n)==0 ){
10811    const char *zDbName = nArg==2 ? azArg[1] : "main";
10812    char *zVfsName = 0;
10813    if( p->db ){
10814      sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
10815      if( zVfsName ){
10816        utf8_printf(p->out, "%s\n", zVfsName);
10817        sqlite3_free(zVfsName);
10818      }
10819    }
10820  }else
10821
10822  if( c=='w' && cli_strncmp(azArg[0], "wheretrace", n)==0 ){
10823    unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10824    sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
10825  }else
10826
10827  if( c=='w' && cli_strncmp(azArg[0], "width", n)==0 ){
10828    int j;
10829    assert( nArg<=ArraySize(azArg) );
10830    p->nWidth = nArg-1;
10831    p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
10832    if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
10833    if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
10834    for(j=1; j<nArg; j++){
10835      p->colWidth[j-1] = (int)integerValue(azArg[j]);
10836    }
10837  }else
10838
10839  {
10840    utf8_printf(stderr, "Error: unknown command or invalid arguments: "
10841      " \"%s\". Enter \".help\" for help\n", azArg[0]);
10842    rc = 1;
10843  }
10844
10845meta_command_exit:
10846  if( p->outCount ){
10847    p->outCount--;
10848    if( p->outCount==0 ) output_reset(p);
10849  }
10850  p->bSafeMode = p->bSafeModePersist;
10851  return rc;
10852}
10853
10854/* Line scan result and intermediate states (supporting scan resumption)
10855*/
10856#ifndef CHAR_BIT
10857# define CHAR_BIT 8
10858#endif
10859typedef enum {
10860  QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
10861  QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
10862  QSS_Start = 0
10863} QuickScanState;
10864#define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
10865#define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
10866#define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
10867#define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
10868#define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
10869
10870/*
10871** Scan line for classification to guide shell's handling.
10872** The scan is resumable for subsequent lines when prior
10873** return values are passed as the 2nd argument.
10874*/
10875static QuickScanState quickscan(char *zLine, QuickScanState qss){
10876  char cin;
10877  char cWait = (char)qss; /* intentional narrowing loss */
10878  if( cWait==0 ){
10879  PlainScan:
10880    assert( cWait==0 );
10881    while( (cin = *zLine++)!=0 ){
10882      if( IsSpace(cin) )
10883        continue;
10884      switch (cin){
10885      case '-':
10886        if( *zLine!='-' )
10887          break;
10888        while((cin = *++zLine)!=0 )
10889          if( cin=='\n')
10890            goto PlainScan;
10891        return qss;
10892      case ';':
10893        qss |= QSS_EndingSemi;
10894        continue;
10895      case '/':
10896        if( *zLine=='*' ){
10897          ++zLine;
10898          cWait = '*';
10899          qss = QSS_SETV(qss, cWait);
10900          goto TermScan;
10901        }
10902        break;
10903      case '[':
10904        cin = ']';
10905        /* fall thru */
10906      case '`': case '\'': case '"':
10907        cWait = cin;
10908        qss = QSS_HasDark | cWait;
10909        goto TermScan;
10910      default:
10911        break;
10912      }
10913      qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
10914    }
10915  }else{
10916  TermScan:
10917    while( (cin = *zLine++)!=0 ){
10918      if( cin==cWait ){
10919        switch( cWait ){
10920        case '*':
10921          if( *zLine != '/' )
10922            continue;
10923          ++zLine;
10924          cWait = 0;
10925          qss = QSS_SETV(qss, 0);
10926          goto PlainScan;
10927        case '`': case '\'': case '"':
10928          if(*zLine==cWait){
10929            ++zLine;
10930            continue;
10931          }
10932          /* fall thru */
10933        case ']':
10934          cWait = 0;
10935          qss = QSS_SETV(qss, 0);
10936          goto PlainScan;
10937        default: assert(0);
10938        }
10939      }
10940    }
10941  }
10942  return qss;
10943}
10944
10945/*
10946** Return TRUE if the line typed in is an SQL command terminator other
10947** than a semi-colon.  The SQL Server style "go" command is understood
10948** as is the Oracle "/".
10949*/
10950static int line_is_command_terminator(char *zLine){
10951  while( IsSpace(zLine[0]) ){ zLine++; };
10952  if( zLine[0]=='/' )
10953    zLine += 1; /* Oracle */
10954  else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
10955    zLine += 2; /* SQL Server */
10956  else
10957    return 0;
10958  return quickscan(zLine, QSS_Start)==QSS_Start;
10959}
10960
10961/*
10962** We need a default sqlite3_complete() implementation to use in case
10963** the shell is compiled with SQLITE_OMIT_COMPLETE.  The default assumes
10964** any arbitrary text is a complete SQL statement.  This is not very
10965** user-friendly, but it does seem to work.
10966*/
10967#ifdef SQLITE_OMIT_COMPLETE
10968#define sqlite3_complete(x) 1
10969#endif
10970
10971/*
10972** Return true if zSql is a complete SQL statement.  Return false if it
10973** ends in the middle of a string literal or C-style comment.
10974*/
10975static int line_is_complete(char *zSql, int nSql){
10976  int rc;
10977  if( zSql==0 ) return 1;
10978  zSql[nSql] = ';';
10979  zSql[nSql+1] = 0;
10980  rc = sqlite3_complete(zSql);
10981  zSql[nSql] = 0;
10982  return rc;
10983}
10984
10985/*
10986** Run a single line of SQL.  Return the number of errors.
10987*/
10988static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
10989  int rc;
10990  char *zErrMsg = 0;
10991
10992  open_db(p, 0);
10993  if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
10994  if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
10995  BEGIN_TIMER;
10996  rc = shell_exec(p, zSql, &zErrMsg);
10997  END_TIMER;
10998  if( rc || zErrMsg ){
10999    char zPrefix[100];
11000    const char *zErrorTail;
11001    const char *zErrorType;
11002    if( zErrMsg==0 ){
11003      zErrorType = "Error";
11004      zErrorTail = sqlite3_errmsg(p->db);
11005    }else if( cli_strncmp(zErrMsg, "in prepare, ",12)==0 ){
11006      zErrorType = "Parse error";
11007      zErrorTail = &zErrMsg[12];
11008    }else if( cli_strncmp(zErrMsg, "stepping, ", 10)==0 ){
11009      zErrorType = "Runtime error";
11010      zErrorTail = &zErrMsg[10];
11011    }else{
11012      zErrorType = "Error";
11013      zErrorTail = zErrMsg;
11014    }
11015    if( in!=0 || !stdin_is_interactive ){
11016      sqlite3_snprintf(sizeof(zPrefix), zPrefix,
11017                       "%s near line %d:", zErrorType, startline);
11018    }else{
11019      sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
11020    }
11021    utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
11022    sqlite3_free(zErrMsg);
11023    zErrMsg = 0;
11024    return 1;
11025  }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
11026    char zLineBuf[2000];
11027    sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
11028            "changes: %lld   total_changes: %lld",
11029            sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
11030    raw_printf(p->out, "%s\n", zLineBuf);
11031  }
11032  return 0;
11033}
11034
11035static void echo_group_input(ShellState *p, const char *zDo){
11036  if( ShellHasFlag(p, SHFLG_Echo) ) utf8_printf(p->out, "%s\n", zDo);
11037}
11038
11039#ifdef SQLITE_SHELL_FIDDLE
11040/*
11041** Alternate one_input_line() impl for wasm mode. This is not in the primary impl
11042** because we need the global shellState and cannot access it from that function
11043** without moving lots of code around (creating a larger/messier diff).
11044*/
11045static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
11046  /* Parse the next line from shellState.wasm.zInput. */
11047  const char *zBegin = shellState.wasm.zPos;
11048  const char *z = zBegin;
11049  char *zLine = 0;
11050  i64 nZ = 0;
11051
11052  UNUSED_PARAMETER(in);
11053  UNUSED_PARAMETER(isContinuation);
11054  if(!z || !*z){
11055    return 0;
11056  }
11057  while(*z && isspace(*z)) ++z;
11058  zBegin = z;
11059  for(; *z && '\n'!=*z; ++nZ, ++z){}
11060  if(nZ>0 && '\r'==zBegin[nZ-1]){
11061    --nZ;
11062  }
11063  shellState.wasm.zPos = z;
11064  zLine = realloc(zPrior, nZ+1);
11065  shell_check_oom(zLine);
11066  memcpy(zLine, zBegin, nZ);
11067  zLine[nZ] = 0;
11068  return zLine;
11069}
11070#endif /* SQLITE_SHELL_FIDDLE */
11071
11072/*
11073** Read input from *in and process it.  If *in==0 then input
11074** is interactive - the user is typing it it.  Otherwise, input
11075** is coming from a file or device.  A prompt is issued and history
11076** is saved only if input is interactive.  An interrupt signal will
11077** cause this routine to exit immediately, unless input is interactive.
11078**
11079** Return the number of errors.
11080*/
11081static int process_input(ShellState *p){
11082  char *zLine = 0;          /* A single input line */
11083  char *zSql = 0;           /* Accumulated SQL text */
11084  i64 nLine;                /* Length of current line */
11085  i64 nSql = 0;             /* Bytes of zSql[] used */
11086  i64 nAlloc = 0;           /* Allocated zSql[] space */
11087  int rc;                   /* Error code */
11088  int errCnt = 0;           /* Number of errors seen */
11089  i64 startline = 0;        /* Line number for start of current input */
11090  QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
11091
11092  if( p->inputNesting==MAX_INPUT_NESTING ){
11093    /* This will be more informative in a later version. */
11094    utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
11095                " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
11096    return 1;
11097  }
11098  ++p->inputNesting;
11099  p->lineno = 0;
11100  while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
11101    fflush(p->out);
11102    zLine = one_input_line(p->in, zLine, nSql>0);
11103    if( zLine==0 ){
11104      /* End of input */
11105      if( p->in==0 && stdin_is_interactive ) printf("\n");
11106      break;
11107    }
11108    if( seenInterrupt ){
11109      if( p->in!=0 ) break;
11110      seenInterrupt = 0;
11111    }
11112    p->lineno++;
11113    if( QSS_INPLAIN(qss)
11114        && line_is_command_terminator(zLine)
11115        && line_is_complete(zSql, nSql) ){
11116      memcpy(zLine,";",2);
11117    }
11118    qss = quickscan(zLine, qss);
11119    if( QSS_PLAINWHITE(qss) && nSql==0 ){
11120      /* Just swallow single-line whitespace */
11121      echo_group_input(p, zLine);
11122      qss = QSS_Start;
11123      continue;
11124    }
11125    if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
11126      echo_group_input(p, zLine);
11127      if( zLine[0]=='.' ){
11128        rc = do_meta_command(zLine, p);
11129        if( rc==2 ){ /* exit requested */
11130          break;
11131        }else if( rc ){
11132          errCnt++;
11133        }
11134      }
11135      qss = QSS_Start;
11136      continue;
11137    }
11138    /* No single-line dispositions remain; accumulate line(s). */
11139    nLine = strlen(zLine);
11140    if( nSql+nLine+2>=nAlloc ){
11141      /* Grow buffer by half-again increments when big. */
11142      nAlloc = nSql+(nSql>>1)+nLine+100;
11143      zSql = realloc(zSql, nAlloc);
11144      shell_check_oom(zSql);
11145    }
11146    if( nSql==0 ){
11147      i64 i;
11148      for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
11149      assert( nAlloc>0 && zSql!=0 );
11150      memcpy(zSql, zLine+i, nLine+1-i);
11151      startline = p->lineno;
11152      nSql = nLine-i;
11153    }else{
11154      zSql[nSql++] = '\n';
11155      memcpy(zSql+nSql, zLine, nLine+1);
11156      nSql += nLine;
11157    }
11158    if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
11159      echo_group_input(p, zSql);
11160      errCnt += runOneSqlLine(p, zSql, p->in, startline);
11161      nSql = 0;
11162      if( p->outCount ){
11163        output_reset(p);
11164        p->outCount = 0;
11165      }else{
11166        clearTempFile(p);
11167      }
11168      p->bSafeMode = p->bSafeModePersist;
11169      qss = QSS_Start;
11170    }else if( nSql && QSS_PLAINWHITE(qss) ){
11171      echo_group_input(p, zSql);
11172      nSql = 0;
11173      qss = QSS_Start;
11174    }
11175  }
11176  if( nSql ){
11177    /* This may be incomplete. Let the SQL parser deal with that. */
11178    echo_group_input(p, zSql);
11179    errCnt += runOneSqlLine(p, zSql, p->in, startline);
11180  }
11181  free(zSql);
11182  free(zLine);
11183  --p->inputNesting;
11184  return errCnt>0;
11185}
11186
11187/*
11188** Return a pathname which is the user's home directory.  A
11189** 0 return indicates an error of some kind.
11190*/
11191static char *find_home_dir(int clearFlag){
11192  static char *home_dir = NULL;
11193  if( clearFlag ){
11194    free(home_dir);
11195    home_dir = 0;
11196    return 0;
11197  }
11198  if( home_dir ) return home_dir;
11199
11200#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11201     && !defined(__RTP__) && !defined(_WRS_KERNEL)
11202  {
11203    struct passwd *pwent;
11204    uid_t uid = getuid();
11205    if( (pwent=getpwuid(uid)) != NULL) {
11206      home_dir = pwent->pw_dir;
11207    }
11208  }
11209#endif
11210
11211#if defined(_WIN32_WCE)
11212  /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11213   */
11214  home_dir = "/";
11215#else
11216
11217#if defined(_WIN32) || defined(WIN32)
11218  if (!home_dir) {
11219    home_dir = getenv("USERPROFILE");
11220  }
11221#endif
11222
11223  if (!home_dir) {
11224    home_dir = getenv("HOME");
11225  }
11226
11227#if defined(_WIN32) || defined(WIN32)
11228  if (!home_dir) {
11229    char *zDrive, *zPath;
11230    int n;
11231    zDrive = getenv("HOMEDRIVE");
11232    zPath = getenv("HOMEPATH");
11233    if( zDrive && zPath ){
11234      n = strlen30(zDrive) + strlen30(zPath) + 1;
11235      home_dir = malloc( n );
11236      if( home_dir==0 ) return 0;
11237      sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11238      return home_dir;
11239    }
11240    home_dir = "c:\\";
11241  }
11242#endif
11243
11244#endif /* !_WIN32_WCE */
11245
11246  if( home_dir ){
11247    i64 n = strlen(home_dir) + 1;
11248    char *z = malloc( n );
11249    if( z ) memcpy(z, home_dir, n);
11250    home_dir = z;
11251  }
11252
11253  return home_dir;
11254}
11255
11256/*
11257** Read input from the file given by sqliterc_override.  Or if that
11258** parameter is NULL, take input from ~/.sqliterc
11259**
11260** Returns the number of errors.
11261*/
11262static void process_sqliterc(
11263  ShellState *p,                  /* Configuration data */
11264  const char *sqliterc_override   /* Name of config file. NULL to use default */
11265){
11266  char *home_dir = NULL;
11267  const char *sqliterc = sqliterc_override;
11268  char *zBuf = 0;
11269  FILE *inSaved = p->in;
11270  int savedLineno = p->lineno;
11271
11272  if (sqliterc == NULL) {
11273    home_dir = find_home_dir(0);
11274    if( home_dir==0 ){
11275      raw_printf(stderr, "-- warning: cannot find home directory;"
11276                      " cannot read ~/.sqliterc\n");
11277      return;
11278    }
11279    zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11280    shell_check_oom(zBuf);
11281    sqliterc = zBuf;
11282  }
11283  p->in = fopen(sqliterc,"rb");
11284  if( p->in ){
11285    if( stdin_is_interactive ){
11286      utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11287    }
11288    if( process_input(p) && bail_on_error ) exit(1);
11289    fclose(p->in);
11290  }else if( sqliterc_override!=0 ){
11291    utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11292    if( bail_on_error ) exit(1);
11293  }
11294  p->in = inSaved;
11295  p->lineno = savedLineno;
11296  sqlite3_free(zBuf);
11297}
11298
11299/*
11300** Show available command line options
11301*/
11302static const char zOptions[] =
11303#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11304  "   -A ARGS...           run \".archive ARGS\" and exit\n"
11305#endif
11306  "   -append              append the database to the end of the file\n"
11307  "   -ascii               set output mode to 'ascii'\n"
11308  "   -bail                stop after hitting an error\n"
11309  "   -batch               force batch I/O\n"
11310  "   -box                 set output mode to 'box'\n"
11311  "   -column              set output mode to 'column'\n"
11312  "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
11313  "   -csv                 set output mode to 'csv'\n"
11314#if !defined(SQLITE_OMIT_DESERIALIZE)
11315  "   -deserialize         open the database using sqlite3_deserialize()\n"
11316#endif
11317  "   -echo                print inputs before execution\n"
11318  "   -init FILENAME       read/process named file\n"
11319  "   -[no]header          turn headers on or off\n"
11320#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11321  "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
11322#endif
11323  "   -help                show this message\n"
11324  "   -html                set output mode to HTML\n"
11325  "   -interactive         force interactive I/O\n"
11326  "   -json                set output mode to 'json'\n"
11327  "   -line                set output mode to 'line'\n"
11328  "   -list                set output mode to 'list'\n"
11329  "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
11330  "   -markdown            set output mode to 'markdown'\n"
11331#if !defined(SQLITE_OMIT_DESERIALIZE)
11332  "   -maxsize N           maximum size for a --deserialize database\n"
11333#endif
11334  "   -memtrace            trace all memory allocations and deallocations\n"
11335  "   -mmap N              default mmap size set to N\n"
11336#ifdef SQLITE_ENABLE_MULTIPLEX
11337  "   -multiplex           enable the multiplexor VFS\n"
11338#endif
11339  "   -newline SEP         set output row separator. Default: '\\n'\n"
11340  "   -nofollow            refuse to open symbolic links to database files\n"
11341  "   -nonce STRING        set the safe-mode escape nonce\n"
11342  "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
11343  "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
11344  "   -quote               set output mode to 'quote'\n"
11345  "   -readonly            open the database read-only\n"
11346  "   -safe                enable safe-mode\n"
11347  "   -separator SEP       set output column separator. Default: '|'\n"
11348#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11349  "   -sorterref SIZE      sorter references threshold size\n"
11350#endif
11351  "   -stats               print memory stats before each finalize\n"
11352  "   -table               set output mode to 'table'\n"
11353  "   -tabs                set output mode to 'tabs'\n"
11354  "   -version             show SQLite version\n"
11355  "   -vfs NAME            use NAME as the default VFS\n"
11356#ifdef SQLITE_ENABLE_VFSTRACE
11357  "   -vfstrace            enable tracing of all VFS calls\n"
11358#endif
11359#ifdef SQLITE_HAVE_ZLIB
11360  "   -zip                 open the file as a ZIP Archive\n"
11361#endif
11362;
11363static void usage(int showDetail){
11364  utf8_printf(stderr,
11365      "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11366      "FILENAME is the name of an SQLite database. A new database is created\n"
11367      "if the file does not previously exist.\n", Argv0);
11368  if( showDetail ){
11369    utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11370  }else{
11371    raw_printf(stderr, "Use the -help option for additional information\n");
11372  }
11373  exit(1);
11374}
11375
11376/*
11377** Internal check:  Verify that the SQLite is uninitialized.  Print a
11378** error message if it is initialized.
11379*/
11380static void verify_uninitialized(void){
11381  if( sqlite3_config(-1)==SQLITE_MISUSE ){
11382    utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11383                        " initialization.\n");
11384  }
11385}
11386
11387/*
11388** Initialize the state information in data
11389*/
11390static void main_init(ShellState *data) {
11391  memset(data, 0, sizeof(*data));
11392  data->normalMode = data->cMode = data->mode = MODE_List;
11393  data->autoExplain = 1;
11394  data->pAuxDb = &data->aAuxDb[0];
11395  memcpy(data->colSeparator,SEP_Column, 2);
11396  memcpy(data->rowSeparator,SEP_Row, 2);
11397  data->showHeader = 0;
11398  data->shellFlgs = SHFLG_Lookaside;
11399  verify_uninitialized();
11400  sqlite3_config(SQLITE_CONFIG_URI, 1);
11401  sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11402  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11403  sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11404  sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
11405}
11406
11407/*
11408** Output text to the console in a font that attracts extra attention.
11409*/
11410#ifdef _WIN32
11411static void printBold(const char *zText){
11412#if !SQLITE_OS_WINRT
11413  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11414  CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11415  GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11416  SetConsoleTextAttribute(out,
11417         FOREGROUND_RED|FOREGROUND_INTENSITY
11418  );
11419#endif
11420  printf("%s", zText);
11421#if !SQLITE_OS_WINRT
11422  SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11423#endif
11424}
11425#else
11426static void printBold(const char *zText){
11427  printf("\033[1m%s\033[0m", zText);
11428}
11429#endif
11430
11431/*
11432** Get the argument to an --option.  Throw an error and die if no argument
11433** is available.
11434*/
11435static char *cmdline_option_value(int argc, char **argv, int i){
11436  if( i==argc ){
11437    utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11438            argv[0], argv[argc-1]);
11439    exit(1);
11440  }
11441  return argv[i];
11442}
11443
11444#ifndef SQLITE_SHELL_IS_UTF8
11445#  if (defined(_WIN32) || defined(WIN32)) \
11446   && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11447#    define SQLITE_SHELL_IS_UTF8          (0)
11448#  else
11449#    define SQLITE_SHELL_IS_UTF8          (1)
11450#  endif
11451#endif
11452
11453#ifdef SQLITE_SHELL_FIDDLE
11454#  define main fiddle_main
11455#endif
11456
11457#if SQLITE_SHELL_IS_UTF8
11458int SQLITE_CDECL main(int argc, char **argv){
11459#else
11460int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11461  char **argv;
11462#endif
11463#ifdef SQLITE_DEBUG
11464  sqlite3_int64 mem_main_enter = sqlite3_memory_used();
11465#endif
11466  char *zErrMsg = 0;
11467#ifdef SQLITE_SHELL_FIDDLE
11468#  define data shellState
11469#else
11470  ShellState data;
11471#endif
11472  const char *zInitFile = 0;
11473  int i;
11474  int rc = 0;
11475  int warnInmemoryDb = 0;
11476  int readStdin = 1;
11477  int nCmd = 0;
11478  char **azCmd = 0;
11479  const char *zVfs = 0;           /* Value of -vfs command-line option */
11480#if !SQLITE_SHELL_IS_UTF8
11481  char **argvToFree = 0;
11482  int argcToFree = 0;
11483#endif
11484
11485  setBinaryMode(stdin, 0);
11486  setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11487#ifdef SQLITE_SHELL_FIDDLE
11488  stdin_is_interactive = 0;
11489  stdout_is_console = 1;
11490  data.wasm.zDefaultDbName = "/fiddle.sqlite3";
11491#else
11492  stdin_is_interactive = isatty(0);
11493  stdout_is_console = isatty(1);
11494#endif
11495
11496#if !defined(_WIN32_WCE)
11497  if( getenv("SQLITE_DEBUG_BREAK") ){
11498    if( isatty(0) && isatty(2) ){
11499      fprintf(stderr,
11500          "attach debugger to process %d and press any key to continue.\n",
11501          GETPID());
11502      fgetc(stdin);
11503    }else{
11504#if defined(_WIN32) || defined(WIN32)
11505#if SQLITE_OS_WINRT
11506      __debugbreak();
11507#else
11508      DebugBreak();
11509#endif
11510#elif defined(SIGTRAP)
11511      raise(SIGTRAP);
11512#endif
11513    }
11514  }
11515#endif
11516
11517#if USE_SYSTEM_SQLITE+0!=1
11518  if( cli_strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11519    utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11520            sqlite3_sourceid(), SQLITE_SOURCE_ID);
11521    exit(1);
11522  }
11523#endif
11524  main_init(&data);
11525
11526  /* On Windows, we must translate command-line arguments into UTF-8.
11527  ** The SQLite memory allocator subsystem has to be enabled in order to
11528  ** do this.  But we want to run an sqlite3_shutdown() afterwards so that
11529  ** subsequent sqlite3_config() calls will work.  So copy all results into
11530  ** memory that does not come from the SQLite memory allocator.
11531  */
11532#if !SQLITE_SHELL_IS_UTF8
11533  sqlite3_initialize();
11534  argvToFree = malloc(sizeof(argv[0])*argc*2);
11535  shell_check_oom(argvToFree);
11536  argcToFree = argc;
11537  argv = argvToFree + argc;
11538  for(i=0; i<argc; i++){
11539    char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11540    i64 n;
11541    shell_check_oom(z);
11542    n = strlen(z);
11543    argv[i] = malloc( n+1 );
11544    shell_check_oom(argv[i]);
11545    memcpy(argv[i], z, n+1);
11546    argvToFree[i] = argv[i];
11547    sqlite3_free(z);
11548  }
11549  sqlite3_shutdown();
11550#endif
11551
11552  assert( argc>=1 && argv && argv[0] );
11553  Argv0 = argv[0];
11554
11555  /* Make sure we have a valid signal handler early, before anything
11556  ** else is done.
11557  */
11558#ifdef SIGINT
11559  signal(SIGINT, interrupt_handler);
11560#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11561  SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11562#endif
11563
11564#ifdef SQLITE_SHELL_DBNAME_PROC
11565  {
11566    /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11567    ** of a C-function that will provide the name of the database file.  Use
11568    ** this compile-time option to embed this shell program in larger
11569    ** applications. */
11570    extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11571    SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11572    warnInmemoryDb = 0;
11573  }
11574#endif
11575
11576  /* Do an initial pass through the command-line argument to locate
11577  ** the name of the database file, the name of the initialization file,
11578  ** the size of the alternative malloc heap,
11579  ** and the first command to execute.
11580  */
11581  verify_uninitialized();
11582  for(i=1; i<argc; i++){
11583    char *z;
11584    z = argv[i];
11585    if( z[0]!='-' ){
11586      if( data.aAuxDb->zDbFilename==0 ){
11587        data.aAuxDb->zDbFilename = z;
11588      }else{
11589        /* Excesss arguments are interpreted as SQL (or dot-commands) and
11590        ** mean that nothing is read from stdin */
11591        readStdin = 0;
11592        nCmd++;
11593        azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11594        shell_check_oom(azCmd);
11595        azCmd[nCmd-1] = z;
11596      }
11597    }
11598    if( z[1]=='-' ) z++;
11599    if( cli_strcmp(z,"-separator")==0
11600     || cli_strcmp(z,"-nullvalue")==0
11601     || cli_strcmp(z,"-newline")==0
11602     || cli_strcmp(z,"-cmd")==0
11603    ){
11604      (void)cmdline_option_value(argc, argv, ++i);
11605    }else if( cli_strcmp(z,"-init")==0 ){
11606      zInitFile = cmdline_option_value(argc, argv, ++i);
11607    }else if( cli_strcmp(z,"-batch")==0 ){
11608      /* Need to check for batch mode here to so we can avoid printing
11609      ** informational messages (like from process_sqliterc) before
11610      ** we do the actual processing of arguments later in a second pass.
11611      */
11612      stdin_is_interactive = 0;
11613    }else if( cli_strcmp(z,"-heap")==0 ){
11614#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11615      const char *zSize;
11616      sqlite3_int64 szHeap;
11617
11618      zSize = cmdline_option_value(argc, argv, ++i);
11619      szHeap = integerValue(zSize);
11620      if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11621      sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11622#else
11623      (void)cmdline_option_value(argc, argv, ++i);
11624#endif
11625    }else if( cli_strcmp(z,"-pagecache")==0 ){
11626      sqlite3_int64 n, sz;
11627      sz = integerValue(cmdline_option_value(argc,argv,++i));
11628      if( sz>70000 ) sz = 70000;
11629      if( sz<0 ) sz = 0;
11630      n = integerValue(cmdline_option_value(argc,argv,++i));
11631      if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
11632        n = 0xffffffffffffLL/sz;
11633      }
11634      sqlite3_config(SQLITE_CONFIG_PAGECACHE,
11635                    (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
11636      data.shellFlgs |= SHFLG_Pagecache;
11637    }else if( cli_strcmp(z,"-lookaside")==0 ){
11638      int n, sz;
11639      sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
11640      if( sz<0 ) sz = 0;
11641      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11642      if( n<0 ) n = 0;
11643      sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
11644      if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
11645    }else if( cli_strcmp(z,"-threadsafe")==0 ){
11646      int n;
11647      n = (int)integerValue(cmdline_option_value(argc,argv,++i));
11648      switch( n ){
11649         case 0:  sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);  break;
11650         case 2:  sqlite3_config(SQLITE_CONFIG_MULTITHREAD);   break;
11651         default: sqlite3_config(SQLITE_CONFIG_SERIALIZED);    break;
11652      }
11653#ifdef SQLITE_ENABLE_VFSTRACE
11654    }else if( cli_strcmp(z,"-vfstrace")==0 ){
11655      extern int vfstrace_register(
11656         const char *zTraceName,
11657         const char *zOldVfsName,
11658         int (*xOut)(const char*,void*),
11659         void *pOutArg,
11660         int makeDefault
11661      );
11662      vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
11663#endif
11664#ifdef SQLITE_ENABLE_MULTIPLEX
11665    }else if( cli_strcmp(z,"-multiplex")==0 ){
11666      extern int sqlite3_multiple_initialize(const char*,int);
11667      sqlite3_multiplex_initialize(0, 1);
11668#endif
11669    }else if( cli_strcmp(z,"-mmap")==0 ){
11670      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11671      sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
11672#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11673    }else if( cli_strcmp(z,"-sorterref")==0 ){
11674      sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
11675      sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
11676#endif
11677    }else if( cli_strcmp(z,"-vfs")==0 ){
11678      zVfs = cmdline_option_value(argc, argv, ++i);
11679#ifdef SQLITE_HAVE_ZLIB
11680    }else if( cli_strcmp(z,"-zip")==0 ){
11681      data.openMode = SHELL_OPEN_ZIPFILE;
11682#endif
11683    }else if( cli_strcmp(z,"-append")==0 ){
11684      data.openMode = SHELL_OPEN_APPENDVFS;
11685#ifndef SQLITE_OMIT_DESERIALIZE
11686    }else if( cli_strcmp(z,"-deserialize")==0 ){
11687      data.openMode = SHELL_OPEN_DESERIALIZE;
11688    }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
11689      data.szMax = integerValue(argv[++i]);
11690#endif
11691    }else if( cli_strcmp(z,"-readonly")==0 ){
11692      data.openMode = SHELL_OPEN_READONLY;
11693    }else if( cli_strcmp(z,"-nofollow")==0 ){
11694      data.openFlags = SQLITE_OPEN_NOFOLLOW;
11695#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11696    }else if( cli_strncmp(z, "-A",2)==0 ){
11697      /* All remaining command-line arguments are passed to the ".archive"
11698      ** command, so ignore them */
11699      break;
11700#endif
11701    }else if( cli_strcmp(z, "-memtrace")==0 ){
11702      sqlite3MemTraceActivate(stderr);
11703    }else if( cli_strcmp(z,"-bail")==0 ){
11704      bail_on_error = 1;
11705    }else if( cli_strcmp(z,"-nonce")==0 ){
11706      free(data.zNonce);
11707      data.zNonce = strdup(argv[++i]);
11708    }else if( cli_strcmp(z,"-safe")==0 ){
11709      /* no-op - catch this on the second pass */
11710    }
11711  }
11712  verify_uninitialized();
11713
11714
11715#ifdef SQLITE_SHELL_INIT_PROC
11716  {
11717    /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
11718    ** of a C-function that will perform initialization actions on SQLite that
11719    ** occur just before or after sqlite3_initialize(). Use this compile-time
11720    ** option to embed this shell program in larger applications. */
11721    extern void SQLITE_SHELL_INIT_PROC(void);
11722    SQLITE_SHELL_INIT_PROC();
11723  }
11724#else
11725  /* All the sqlite3_config() calls have now been made. So it is safe
11726  ** to call sqlite3_initialize() and process any command line -vfs option. */
11727  sqlite3_initialize();
11728#endif
11729
11730  if( zVfs ){
11731    sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
11732    if( pVfs ){
11733      sqlite3_vfs_register(pVfs, 1);
11734    }else{
11735      utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
11736      exit(1);
11737    }
11738  }
11739
11740  if( data.pAuxDb->zDbFilename==0 ){
11741#ifndef SQLITE_OMIT_MEMORYDB
11742    data.pAuxDb->zDbFilename = ":memory:";
11743    warnInmemoryDb = argc==1;
11744#else
11745    utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
11746    return 1;
11747#endif
11748  }
11749  data.out = stdout;
11750#ifndef SQLITE_SHELL_FIDDLE
11751  sqlite3_appendvfs_init(0,0,0);
11752#endif
11753
11754  /* Go ahead and open the database file if it already exists.  If the
11755  ** file does not exist, delay opening it.  This prevents empty database
11756  ** files from being created if a user mistypes the database name argument
11757  ** to the sqlite command-line tool.
11758  */
11759  if( access(data.pAuxDb->zDbFilename, 0)==0 ){
11760    open_db(&data, 0);
11761  }
11762
11763  /* Process the initialization file if there is one.  If no -init option
11764  ** is given on the command line, look for a file named ~/.sqliterc and
11765  ** try to process it.
11766  */
11767  process_sqliterc(&data,zInitFile);
11768
11769  /* Make a second pass through the command-line argument and set
11770  ** options.  This second pass is delayed until after the initialization
11771  ** file is processed so that the command-line arguments will override
11772  ** settings in the initialization file.
11773  */
11774  for(i=1; i<argc; i++){
11775    char *z = argv[i];
11776    if( z[0]!='-' ) continue;
11777    if( z[1]=='-' ){ z++; }
11778    if( cli_strcmp(z,"-init")==0 ){
11779      i++;
11780    }else if( cli_strcmp(z,"-html")==0 ){
11781      data.mode = MODE_Html;
11782    }else if( cli_strcmp(z,"-list")==0 ){
11783      data.mode = MODE_List;
11784    }else if( cli_strcmp(z,"-quote")==0 ){
11785      data.mode = MODE_Quote;
11786      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
11787      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11788    }else if( cli_strcmp(z,"-line")==0 ){
11789      data.mode = MODE_Line;
11790    }else if( cli_strcmp(z,"-column")==0 ){
11791      data.mode = MODE_Column;
11792    }else if( cli_strcmp(z,"-json")==0 ){
11793      data.mode = MODE_Json;
11794    }else if( cli_strcmp(z,"-markdown")==0 ){
11795      data.mode = MODE_Markdown;
11796    }else if( cli_strcmp(z,"-table")==0 ){
11797      data.mode = MODE_Table;
11798    }else if( cli_strcmp(z,"-box")==0 ){
11799      data.mode = MODE_Box;
11800    }else if( cli_strcmp(z,"-csv")==0 ){
11801      data.mode = MODE_Csv;
11802      memcpy(data.colSeparator,",",2);
11803#ifdef SQLITE_HAVE_ZLIB
11804    }else if( cli_strcmp(z,"-zip")==0 ){
11805      data.openMode = SHELL_OPEN_ZIPFILE;
11806#endif
11807    }else if( cli_strcmp(z,"-append")==0 ){
11808      data.openMode = SHELL_OPEN_APPENDVFS;
11809#ifndef SQLITE_OMIT_DESERIALIZE
11810    }else if( cli_strcmp(z,"-deserialize")==0 ){
11811      data.openMode = SHELL_OPEN_DESERIALIZE;
11812    }else if( cli_strcmp(z,"-maxsize")==0 && i+1<argc ){
11813      data.szMax = integerValue(argv[++i]);
11814#endif
11815    }else if( cli_strcmp(z,"-readonly")==0 ){
11816      data.openMode = SHELL_OPEN_READONLY;
11817    }else if( cli_strcmp(z,"-nofollow")==0 ){
11818      data.openFlags |= SQLITE_OPEN_NOFOLLOW;
11819    }else if( cli_strcmp(z,"-ascii")==0 ){
11820      data.mode = MODE_Ascii;
11821      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
11822      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
11823    }else if( cli_strcmp(z,"-tabs")==0 ){
11824      data.mode = MODE_List;
11825      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
11826      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
11827    }else if( cli_strcmp(z,"-separator")==0 ){
11828      sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
11829                       "%s",cmdline_option_value(argc,argv,++i));
11830    }else if( cli_strcmp(z,"-newline")==0 ){
11831      sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
11832                       "%s",cmdline_option_value(argc,argv,++i));
11833    }else if( cli_strcmp(z,"-nullvalue")==0 ){
11834      sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
11835                       "%s",cmdline_option_value(argc,argv,++i));
11836    }else if( cli_strcmp(z,"-header")==0 ){
11837      data.showHeader = 1;
11838      ShellSetFlag(&data, SHFLG_HeaderSet);
11839     }else if( cli_strcmp(z,"-noheader")==0 ){
11840      data.showHeader = 0;
11841      ShellSetFlag(&data, SHFLG_HeaderSet);
11842    }else if( cli_strcmp(z,"-echo")==0 ){
11843      ShellSetFlag(&data, SHFLG_Echo);
11844    }else if( cli_strcmp(z,"-eqp")==0 ){
11845      data.autoEQP = AUTOEQP_on;
11846    }else if( cli_strcmp(z,"-eqpfull")==0 ){
11847      data.autoEQP = AUTOEQP_full;
11848    }else if( cli_strcmp(z,"-stats")==0 ){
11849      data.statsOn = 1;
11850    }else if( cli_strcmp(z,"-scanstats")==0 ){
11851      data.scanstatsOn = 1;
11852    }else if( cli_strcmp(z,"-backslash")==0 ){
11853      /* Undocumented command-line option: -backslash
11854      ** Causes C-style backslash escapes to be evaluated in SQL statements
11855      ** prior to sending the SQL into SQLite.  Useful for injecting
11856      ** crazy bytes in the middle of SQL statements for testing and debugging.
11857      */
11858      ShellSetFlag(&data, SHFLG_Backslash);
11859    }else if( cli_strcmp(z,"-bail")==0 ){
11860      /* No-op.  The bail_on_error flag should already be set. */
11861    }else if( cli_strcmp(z,"-version")==0 ){
11862      printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
11863      return 0;
11864    }else if( cli_strcmp(z,"-interactive")==0 ){
11865      stdin_is_interactive = 1;
11866    }else if( cli_strcmp(z,"-batch")==0 ){
11867      stdin_is_interactive = 0;
11868    }else if( cli_strcmp(z,"-heap")==0 ){
11869      i++;
11870    }else if( cli_strcmp(z,"-pagecache")==0 ){
11871      i+=2;
11872    }else if( cli_strcmp(z,"-lookaside")==0 ){
11873      i+=2;
11874    }else if( cli_strcmp(z,"-threadsafe")==0 ){
11875      i+=2;
11876    }else if( cli_strcmp(z,"-nonce")==0 ){
11877      i += 2;
11878    }else if( cli_strcmp(z,"-mmap")==0 ){
11879      i++;
11880    }else if( cli_strcmp(z,"-memtrace")==0 ){
11881      i++;
11882#ifdef SQLITE_ENABLE_SORTER_REFERENCES
11883    }else if( cli_strcmp(z,"-sorterref")==0 ){
11884      i++;
11885#endif
11886    }else if( cli_strcmp(z,"-vfs")==0 ){
11887      i++;
11888#ifdef SQLITE_ENABLE_VFSTRACE
11889    }else if( cli_strcmp(z,"-vfstrace")==0 ){
11890      i++;
11891#endif
11892#ifdef SQLITE_ENABLE_MULTIPLEX
11893    }else if( cli_strcmp(z,"-multiplex")==0 ){
11894      i++;
11895#endif
11896    }else if( cli_strcmp(z,"-help")==0 ){
11897      usage(1);
11898    }else if( cli_strcmp(z,"-cmd")==0 ){
11899      /* Run commands that follow -cmd first and separately from commands
11900      ** that simply appear on the command-line.  This seems goofy.  It would
11901      ** be better if all commands ran in the order that they appear.  But
11902      ** we retain the goofy behavior for historical compatibility. */
11903      if( i==argc-1 ) break;
11904      z = cmdline_option_value(argc,argv,++i);
11905      if( z[0]=='.' ){
11906        rc = do_meta_command(z, &data);
11907        if( rc && bail_on_error ) return rc==2 ? 0 : rc;
11908      }else{
11909        open_db(&data, 0);
11910        rc = shell_exec(&data, z, &zErrMsg);
11911        if( zErrMsg!=0 ){
11912          utf8_printf(stderr,"Error: %s\n", zErrMsg);
11913          if( bail_on_error ) return rc!=0 ? rc : 1;
11914        }else if( rc!=0 ){
11915          utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
11916          if( bail_on_error ) return rc;
11917        }
11918      }
11919#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
11920    }else if( cli_strncmp(z, "-A", 2)==0 ){
11921      if( nCmd>0 ){
11922        utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
11923                            " with \"%s\"\n", z);
11924        return 1;
11925      }
11926      open_db(&data, OPEN_DB_ZIPFILE);
11927      if( z[2] ){
11928        argv[i] = &z[2];
11929        arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
11930      }else{
11931        arDotCommand(&data, 1, argv+i, argc-i);
11932      }
11933      readStdin = 0;
11934      break;
11935#endif
11936    }else if( cli_strcmp(z,"-safe")==0 ){
11937      data.bSafeMode = data.bSafeModePersist = 1;
11938    }else{
11939      utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
11940      raw_printf(stderr,"Use -help for a list of options.\n");
11941      return 1;
11942    }
11943    data.cMode = data.mode;
11944  }
11945
11946  if( !readStdin ){
11947    /* Run all arguments that do not begin with '-' as if they were separate
11948    ** command-line inputs, except for the argToSkip argument which contains
11949    ** the database filename.
11950    */
11951    for(i=0; i<nCmd; i++){
11952      if( azCmd[i][0]=='.' ){
11953        rc = do_meta_command(azCmd[i], &data);
11954        if( rc ){
11955          free(azCmd);
11956          return rc==2 ? 0 : rc;
11957        }
11958      }else{
11959        open_db(&data, 0);
11960        rc = shell_exec(&data, azCmd[i], &zErrMsg);
11961        if( zErrMsg || rc ){
11962          if( zErrMsg!=0 ){
11963            utf8_printf(stderr,"Error: %s\n", zErrMsg);
11964          }else{
11965            utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
11966          }
11967          sqlite3_free(zErrMsg);
11968          free(azCmd);
11969          return rc!=0 ? rc : 1;
11970        }
11971      }
11972    }
11973  }else{
11974    /* Run commands received from standard input
11975    */
11976    if( stdin_is_interactive ){
11977      char *zHome;
11978      char *zHistory;
11979      int nHistory;
11980      printf(
11981        "SQLite version %s %.19s\n" /*extra-version-info*/
11982        "Enter \".help\" for usage hints.\n",
11983        sqlite3_libversion(), sqlite3_sourceid()
11984      );
11985      if( warnInmemoryDb ){
11986        printf("Connected to a ");
11987        printBold("transient in-memory database");
11988        printf(".\nUse \".open FILENAME\" to reopen on a "
11989               "persistent database.\n");
11990      }
11991      zHistory = getenv("SQLITE_HISTORY");
11992      if( zHistory ){
11993        zHistory = strdup(zHistory);
11994      }else if( (zHome = find_home_dir(0))!=0 ){
11995        nHistory = strlen30(zHome) + 20;
11996        if( (zHistory = malloc(nHistory))!=0 ){
11997          sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
11998        }
11999      }
12000      if( zHistory ){ shell_read_history(zHistory); }
12001#if HAVE_READLINE || HAVE_EDITLINE
12002      rl_attempted_completion_function = readline_completion;
12003#elif HAVE_LINENOISE
12004      linenoiseSetCompletionCallback(linenoise_completion);
12005#endif
12006      data.in = 0;
12007      rc = process_input(&data);
12008      if( zHistory ){
12009        shell_stifle_history(2000);
12010        shell_write_history(zHistory);
12011        free(zHistory);
12012      }
12013    }else{
12014      data.in = stdin;
12015      rc = process_input(&data);
12016    }
12017  }
12018#ifndef SQLITE_SHELL_FIDDLE
12019  /* In WASM mode we have to leave the db state in place so that
12020  ** client code can "push" SQL into it after this call returns. */
12021  free(azCmd);
12022  set_table_name(&data, 0);
12023  if( data.db ){
12024    session_close_all(&data, -1);
12025    close_db(data.db);
12026  }
12027  for(i=0; i<ArraySize(data.aAuxDb); i++){
12028    sqlite3_free(data.aAuxDb[i].zFreeOnClose);
12029    if( data.aAuxDb[i].db ){
12030      session_close_all(&data, i);
12031      close_db(data.aAuxDb[i].db);
12032    }
12033  }
12034  find_home_dir(1);
12035  output_reset(&data);
12036  data.doXdgOpen = 0;
12037  clearTempFile(&data);
12038#if !SQLITE_SHELL_IS_UTF8
12039  for(i=0; i<argcToFree; i++) free(argvToFree[i]);
12040  free(argvToFree);
12041#endif
12042  free(data.colWidth);
12043  free(data.zNonce);
12044  /* Clear the global data structure so that valgrind will detect memory
12045  ** leaks */
12046  memset(&data, 0, sizeof(data));
12047#ifdef SQLITE_DEBUG
12048  if( sqlite3_memory_used()>mem_main_enter ){
12049    utf8_printf(stderr, "Memory leaked: %u bytes\n",
12050                (unsigned int)(sqlite3_memory_used()-mem_main_enter));
12051  }
12052#endif
12053#endif /* !SQLITE_SHELL_FIDDLE */
12054  return rc;
12055}
12056
12057
12058#ifdef SQLITE_SHELL_FIDDLE
12059/* Only for emcc experimentation purposes. */
12060int fiddle_experiment(int a,int b){
12061  return a + b;
12062}
12063
12064/*
12065** Returns a pointer to the current DB handle.
12066*/
12067sqlite3 * fiddle_db_handle(){
12068  return globalDb;
12069}
12070
12071/*
12072** Returns a pointer to the given DB name's VFS. If zDbName is 0 then
12073** "main" is assumed. Returns 0 if no db with the given name is
12074** open.
12075*/
12076sqlite3_vfs * fiddle_db_vfs(const char *zDbName){
12077  sqlite3_vfs * pVfs = 0;
12078  if(globalDb){
12079    sqlite3_file_control(globalDb, zDbName ? zDbName : "main",
12080                         SQLITE_FCNTL_VFS_POINTER, &pVfs);
12081  }
12082  return pVfs;
12083}
12084
12085/* Only for emcc experimentation purposes. */
12086sqlite3 * fiddle_db_arg(sqlite3 *arg){
12087    printf("fiddle_db_arg(%p)\n", (const void*)arg);
12088    return arg;
12089}
12090
12091/*
12092** Intended to be called via a SharedWorker() while a separate
12093** SharedWorker() (which manages the wasm module) is performing work
12094** which should be interrupted. Unfortunately, SharedWorker is not
12095** portable enough to make real use of.
12096*/
12097void fiddle_interrupt(void){
12098  if( globalDb ) sqlite3_interrupt(globalDb);
12099}
12100
12101/*
12102** Returns the filename of the given db name, assuming "main" if
12103** zDbName is NULL. Returns NULL if globalDb is not opened.
12104*/
12105const char * fiddle_db_filename(const char * zDbName){
12106    return globalDb
12107      ? sqlite3_db_filename(globalDb, zDbName ? zDbName : "main")
12108      : NULL;
12109}
12110
12111/*
12112** Completely wipes out the contents of the currently-opened database
12113** but leaves its storage intact for reuse.
12114*/
12115void fiddle_reset_db(void){
12116  if( globalDb ){
12117    int rc = sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
12118    if( 0==rc ) rc = sqlite3_exec(globalDb, "VACUUM", 0, 0, 0);
12119    sqlite3_db_config(globalDb, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
12120  }
12121}
12122
12123/*
12124** Uses the current database's VFS xRead to stream the db file's
12125** contents out to the given callback. The callback gets a single
12126** chunk of size n (its 2nd argument) on each call and must return 0
12127** on success, non-0 on error. This function returns 0 on success,
12128** SQLITE_NOTFOUND if no db is open, or propagates any other non-0
12129** code from the callback. Note that this is not thread-friendly: it
12130** expects that it will be the only thread reading the db file and
12131** takes no measures to ensure that is the case.
12132*/
12133int fiddle_export_db( int (*xCallback)(unsigned const char *zOut, int n) ){
12134  sqlite3_int64 nSize = 0;
12135  sqlite3_int64 nPos = 0;
12136  sqlite3_file * pFile = 0;
12137  unsigned char buf[1024 * 8];
12138  int nBuf = (int)sizeof(buf);
12139  int rc = shellState.db
12140    ? sqlite3_file_control(shellState.db, "main",
12141                           SQLITE_FCNTL_FILE_POINTER, &pFile)
12142    : SQLITE_NOTFOUND;
12143  if( rc ) return rc;
12144  rc = pFile->pMethods->xFileSize(pFile, &nSize);
12145  if( rc ) return rc;
12146  if(nSize % nBuf){
12147    /* DB size is not an even multiple of the buffer size. Reduce
12148    ** buffer size so that we do not unduly inflate the db size when
12149    ** exporting. */
12150    if(0 == nSize % 4096) nBuf = 4096;
12151    else if(0 == nSize % 2048) nBuf = 2048;
12152    else if(0 == nSize % 1024) nBuf = 1024;
12153    else nBuf = 512;
12154  }
12155  for( ; 0==rc && nPos<nSize; nPos += nBuf ){
12156    rc = pFile->pMethods->xRead(pFile, buf, nBuf, nPos);
12157    if(SQLITE_IOERR_SHORT_READ == rc){
12158      rc = (nPos + nBuf) < nSize ? rc : 0/*assume EOF*/;
12159    }
12160    if( 0==rc ) rc = xCallback(buf, nBuf);
12161  }
12162  return rc;
12163}
12164
12165/*
12166** Trivial exportable function for emscripten. It processes zSql as if
12167** it were input to the sqlite3 shell and redirects all output to the
12168** wasm binding. fiddle_main() must have been called before this
12169** is called, or results are undefined.
12170*/
12171void fiddle_exec(const char * zSql){
12172  if(zSql && *zSql){
12173    if('.'==*zSql) puts(zSql);
12174    shellState.wasm.zInput = zSql;
12175    shellState.wasm.zPos = zSql;
12176    process_input(&shellState);
12177    shellState.wasm.zInput = shellState.wasm.zPos = 0;
12178  }
12179}
12180#endif /* SQLITE_SHELL_FIDDLE */
12181