1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases.
14 */
15 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16 /* This needs to come before any includes for MSVC compiler */
17 #define _CRT_SECURE_NO_WARNINGS
18 #endif
19 
20 /*
21 ** If requested, include the SQLite compiler options file for MSVC.
22 */
23 #if defined(INCLUDE_MSVC_H)
24 #include "msvc.h"
25 #endif
26 
27 /*
28 ** No support for loadable extensions in VxWorks.
29 */
30 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
31 # define SQLITE_OMIT_LOAD_EXTENSION 1
32 #endif
33 
34 /*
35 ** Enable large-file support for fopen() and friends on unix.
36 */
37 #ifndef SQLITE_DISABLE_LFS
38 # define _LARGE_FILE       1
39 # ifndef _FILE_OFFSET_BITS
40 #   define _FILE_OFFSET_BITS 64
41 # endif
42 # define _LARGEFILE_SOURCE 1
43 #endif
44 
45 #include <stdlib.h>
46 #include <string.h>
47 #include <stdio.h>
48 #include <assert.h>
49 #include "sqlite3.h"
50 #if SQLITE_USER_AUTHENTICATION
51 # include "sqlite3userauth.h"
52 #endif
53 #include <ctype.h>
54 #include <stdarg.h>
55 
56 #if !defined(_WIN32) && !defined(WIN32)
57 # include <signal.h>
58 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
59 #  include <pwd.h>
60 # endif
61 # include <unistd.h>
62 # include <sys/types.h>
63 #endif
64 
65 #if HAVE_READLINE
66 # include <readline/readline.h>
67 # include <readline/history.h>
68 #endif
69 
70 #if HAVE_EDITLINE
71 # include <editline/readline.h>
72 #endif
73 
74 #if HAVE_EDITLINE || HAVE_READLINE
75 
76 # define shell_add_history(X) add_history(X)
77 # define shell_read_history(X) read_history(X)
78 # define shell_write_history(X) write_history(X)
79 # define shell_stifle_history(X) stifle_history(X)
80 # define shell_readline(X) readline(X)
81 
82 #elif HAVE_LINENOISE
83 
84 # include "linenoise.h"
85 # define shell_add_history(X) linenoiseHistoryAdd(X)
86 # define shell_read_history(X) linenoiseHistoryLoad(X)
87 # define shell_write_history(X) linenoiseHistorySave(X)
88 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89 # define shell_readline(X) linenoise(X)
90 
91 #else
92 
93 # define shell_read_history(X)
94 # define shell_write_history(X)
95 # define shell_stifle_history(X)
96 
97 # define SHELL_USE_LOCAL_GETLINE 1
98 #endif
99 
100 
101 #if defined(_WIN32) || defined(WIN32)
102 # include <io.h>
103 # include <fcntl.h>
104 #define isatty(h) _isatty(h)
105 #ifndef access
106 # define access(f,m) _access((f),(m))
107 #endif
108 #undef popen
109 #define popen _popen
110 #undef pclose
111 #define pclose _pclose
112 #else
113 /* Make sure isatty() has a prototype.
114 */
115 extern int isatty(int);
116 
117 #if !defined(__RTP__) && !defined(_WRS_KERNEL)
118   /* popen and pclose are not C89 functions and so are sometimes omitted from
119   ** the <stdio.h> header */
120   extern FILE *popen(const char*,const char*);
121   extern int pclose(FILE*);
122 #else
123 # define SQLITE_OMIT_POPEN 1
124 #endif
125 
126 #endif
127 
128 #if defined(_WIN32_WCE)
129 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
130  * thus we always assume that we have a console. That can be
131  * overridden with the -batch command line option.
132  */
133 #define isatty(x) 1
134 #endif
135 
136 /* ctype macros that work with signed characters */
137 #define IsSpace(X)  isspace((unsigned char)X)
138 #define IsDigit(X)  isdigit((unsigned char)X)
139 #define ToLower(X)  (char)tolower((unsigned char)X)
140 
141 /* On Windows, we normally run with output mode of TEXT so that \n characters
142 ** are automatically translated into \r\n.  However, this behavior needs
143 ** to be disabled in some cases (ex: when generating CSV output and when
144 ** rendering quoted strings that contain \n characters).  The following
145 ** routines take care of that.
146 */
147 #if defined(_WIN32) || defined(WIN32)
setBinaryMode(FILE * out)148 static void setBinaryMode(FILE *out){
149   fflush(out);
150   _setmode(_fileno(out), _O_BINARY);
151 }
setTextMode(FILE * out)152 static void setTextMode(FILE *out){
153   fflush(out);
154   _setmode(_fileno(out), _O_TEXT);
155 }
156 #else
157 # define setBinaryMode(X)
158 # define setTextMode(X)
159 #endif
160 
161 
162 /* True if the timer is enabled */
163 static int enableTimer = 0;
164 
165 /* Return the current wall-clock time */
timeOfDay(void)166 static sqlite3_int64 timeOfDay(void){
167   static sqlite3_vfs *clockVfs = 0;
168   sqlite3_int64 t;
169   if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
170   if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
171     clockVfs->xCurrentTimeInt64(clockVfs, &t);
172   }else{
173     double r;
174     clockVfs->xCurrentTime(clockVfs, &r);
175     t = (sqlite3_int64)(r*86400000.0);
176   }
177   return t;
178 }
179 
180 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
181 #include <sys/time.h>
182 #include <sys/resource.h>
183 
184 /* VxWorks does not support getrusage() as far as we can determine */
185 #if defined(_WRS_KERNEL) || defined(__RTP__)
186 struct rusage {
187   struct timeval ru_utime; /* user CPU time used */
188   struct timeval ru_stime; /* system CPU time used */
189 };
190 #define getrusage(A,B) memset(B,0,sizeof(*B))
191 #endif
192 
193 /* Saved resource information for the beginning of an operation */
194 static struct rusage sBegin;  /* CPU time at start */
195 static sqlite3_int64 iBegin;  /* Wall-clock time at start */
196 
197 /*
198 ** Begin timing an operation
199 */
beginTimer(void)200 static void beginTimer(void){
201   if( enableTimer ){
202     getrusage(RUSAGE_SELF, &sBegin);
203     iBegin = timeOfDay();
204   }
205 }
206 
207 /* Return the difference of two time_structs in seconds */
timeDiff(struct timeval * pStart,struct timeval * pEnd)208 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
209   return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
210          (double)(pEnd->tv_sec - pStart->tv_sec);
211 }
212 
213 /*
214 ** Print the timing results.
215 */
endTimer(void)216 static void endTimer(void){
217   if( enableTimer ){
218     sqlite3_int64 iEnd = timeOfDay();
219     struct rusage sEnd;
220     getrusage(RUSAGE_SELF, &sEnd);
221     printf("Run Time: real %.3f user %f sys %f\n",
222        (iEnd - iBegin)*0.001,
223        timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
224        timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
225   }
226 }
227 
228 #define BEGIN_TIMER beginTimer()
229 #define END_TIMER endTimer()
230 #define HAS_TIMER 1
231 
232 #elif (defined(_WIN32) || defined(WIN32))
233 
234 #include <windows.h>
235 
236 /* Saved resource information for the beginning of an operation */
237 static HANDLE hProcess;
238 static FILETIME ftKernelBegin;
239 static FILETIME ftUserBegin;
240 static sqlite3_int64 ftWallBegin;
241 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
242                                     LPFILETIME, LPFILETIME);
243 static GETPROCTIMES getProcessTimesAddr = NULL;
244 
245 /*
246 ** Check to see if we have timer support.  Return 1 if necessary
247 ** support found (or found previously).
248 */
hasTimer(void)249 static int hasTimer(void){
250   if( getProcessTimesAddr ){
251     return 1;
252   } else {
253     /* GetProcessTimes() isn't supported in WIN95 and some other Windows
254     ** versions. See if the version we are running on has it, and if it
255     ** does, save off a pointer to it and the current process handle.
256     */
257     hProcess = GetCurrentProcess();
258     if( hProcess ){
259       HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
260       if( NULL != hinstLib ){
261         getProcessTimesAddr =
262             (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
263         if( NULL != getProcessTimesAddr ){
264           return 1;
265         }
266         FreeLibrary(hinstLib);
267       }
268     }
269   }
270   return 0;
271 }
272 
273 /*
274 ** Begin timing an operation
275 */
beginTimer(void)276 static void beginTimer(void){
277   if( enableTimer && getProcessTimesAddr ){
278     FILETIME ftCreation, ftExit;
279     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
280                         &ftKernelBegin,&ftUserBegin);
281     ftWallBegin = timeOfDay();
282   }
283 }
284 
285 /* Return the difference of two FILETIME structs in seconds */
timeDiff(FILETIME * pStart,FILETIME * pEnd)286 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
287   sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
288   sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
289   return (double) ((i64End - i64Start) / 10000000.0);
290 }
291 
292 /*
293 ** Print the timing results.
294 */
endTimer(void)295 static void endTimer(void){
296   if( enableTimer && getProcessTimesAddr){
297     FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
298     sqlite3_int64 ftWallEnd = timeOfDay();
299     getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
300     printf("Run Time: real %.3f user %f sys %f\n",
301        (ftWallEnd - ftWallBegin)*0.001,
302        timeDiff(&ftUserBegin, &ftUserEnd),
303        timeDiff(&ftKernelBegin, &ftKernelEnd));
304   }
305 }
306 
307 #define BEGIN_TIMER beginTimer()
308 #define END_TIMER endTimer()
309 #define HAS_TIMER hasTimer()
310 
311 #else
312 #define BEGIN_TIMER
313 #define END_TIMER
314 #define HAS_TIMER 0
315 #endif
316 
317 /*
318 ** Used to prevent warnings about unused parameters
319 */
320 #define UNUSED_PARAMETER(x) (void)(x)
321 
322 /*
323 ** If the following flag is set, then command execution stops
324 ** at an error if we are not interactive.
325 */
326 static int bail_on_error = 0;
327 
328 /*
329 ** Threat stdin as an interactive input if the following variable
330 ** is true.  Otherwise, assume stdin is connected to a file or pipe.
331 */
332 static int stdin_is_interactive = 1;
333 
334 /*
335 ** The following is the open SQLite database.  We make a pointer
336 ** to this database a static variable so that it can be accessed
337 ** by the SIGINT handler to interrupt database processing.
338 */
339 static sqlite3 *globalDb = 0;
340 
341 /*
342 ** True if an interrupt (Control-C) has been received.
343 */
344 static volatile int seenInterrupt = 0;
345 
346 /*
347 ** This is the name of our program. It is set in main(), used
348 ** in a number of other places, mostly for error messages.
349 */
350 static char *Argv0;
351 
352 /*
353 ** Prompt strings. Initialized in main. Settable with
354 **   .prompt main continue
355 */
356 static char mainPrompt[20];     /* First line prompt. default: "sqlite> "*/
357 static char continuePrompt[20]; /* Continuation prompt. default: "   ...> " */
358 
359 /*
360 ** Write I/O traces to the following stream.
361 */
362 #ifdef SQLITE_ENABLE_IOTRACE
363 static FILE *iotrace = 0;
364 #endif
365 
366 /*
367 ** This routine works like printf in that its first argument is a
368 ** format string and subsequent arguments are values to be substituted
369 ** in place of % fields.  The result of formatting this string
370 ** is written to iotrace.
371 */
372 #ifdef SQLITE_ENABLE_IOTRACE
iotracePrintf(const char * zFormat,...)373 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
374   va_list ap;
375   char *z;
376   if( iotrace==0 ) return;
377   va_start(ap, zFormat);
378   z = sqlite3_vmprintf(zFormat, ap);
379   va_end(ap);
380   fprintf(iotrace, "%s", z);
381   sqlite3_free(z);
382 }
383 #endif
384 
385 
386 /*
387 ** Determines if a string is a number of not.
388 */
isNumber(const char * z,int * realnum)389 static int isNumber(const char *z, int *realnum){
390   if( *z=='-' || *z=='+' ) z++;
391   if( !IsDigit(*z) ){
392     return 0;
393   }
394   z++;
395   if( realnum ) *realnum = 0;
396   while( IsDigit(*z) ){ z++; }
397   if( *z=='.' ){
398     z++;
399     if( !IsDigit(*z) ) return 0;
400     while( IsDigit(*z) ){ z++; }
401     if( realnum ) *realnum = 1;
402   }
403   if( *z=='e' || *z=='E' ){
404     z++;
405     if( *z=='+' || *z=='-' ) z++;
406     if( !IsDigit(*z) ) return 0;
407     while( IsDigit(*z) ){ z++; }
408     if( realnum ) *realnum = 1;
409   }
410   return *z==0;
411 }
412 
413 /*
414 ** A global char* and an SQL function to access its current value
415 ** from within an SQL statement. This program used to use the
416 ** sqlite_exec_printf() API to substitue a string into an SQL statement.
417 ** The correct way to do this with sqlite3 is to use the bind API, but
418 ** since the shell is built around the callback paradigm it would be a lot
419 ** of work. Instead just use this hack, which is quite harmless.
420 */
421 static const char *zShellStatic = 0;
shellstaticFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)422 static void shellstaticFunc(
423   sqlite3_context *context,
424   int argc,
425   sqlite3_value **argv
426 ){
427   assert( 0==argc );
428   assert( zShellStatic );
429   UNUSED_PARAMETER(argc);
430   UNUSED_PARAMETER(argv);
431   sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
432 }
433 
434 
435 /*
436 ** This routine reads a line of text from FILE in, stores
437 ** the text in memory obtained from malloc() and returns a pointer
438 ** to the text.  NULL is returned at end of file, or if malloc()
439 ** fails.
440 **
441 ** If zLine is not NULL then it is a malloced buffer returned from
442 ** a previous call to this routine that may be reused.
443 */
local_getline(char * zLine,FILE * in)444 static char *local_getline(char *zLine, FILE *in){
445   int nLine = zLine==0 ? 0 : 100;
446   int n = 0;
447 
448   while( 1 ){
449     if( n+100>nLine ){
450       nLine = nLine*2 + 100;
451       zLine = realloc(zLine, nLine);
452       if( zLine==0 ) return 0;
453     }
454     if( fgets(&zLine[n], nLine - n, in)==0 ){
455       if( n==0 ){
456         free(zLine);
457         return 0;
458       }
459       zLine[n] = 0;
460       break;
461     }
462     while( zLine[n] ) n++;
463     if( n>0 && zLine[n-1]=='\n' ){
464       n--;
465       if( n>0 && zLine[n-1]=='\r' ) n--;
466       zLine[n] = 0;
467       break;
468     }
469   }
470   return zLine;
471 }
472 
473 /*
474 ** Retrieve a single line of input text.
475 **
476 ** If in==0 then read from standard input and prompt before each line.
477 ** If isContinuation is true, then a continuation prompt is appropriate.
478 ** If isContinuation is zero, then the main prompt should be used.
479 **
480 ** If zPrior is not NULL then it is a buffer from a prior call to this
481 ** routine that can be reused.
482 **
483 ** The result is stored in space obtained from malloc() and must either
484 ** be freed by the caller or else passed back into this routine via the
485 ** zPrior argument for reuse.
486 */
one_input_line(FILE * in,char * zPrior,int isContinuation)487 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
488   char *zPrompt;
489   char *zResult;
490   if( in!=0 ){
491     zResult = local_getline(zPrior, in);
492   }else{
493     zPrompt = isContinuation ? continuePrompt : mainPrompt;
494 #if SHELL_USE_LOCAL_GETLINE
495     printf("%s", zPrompt);
496     fflush(stdout);
497     zResult = local_getline(zPrior, stdin);
498 #else
499     free(zPrior);
500     zResult = shell_readline(zPrompt);
501     if( zResult && *zResult ) shell_add_history(zResult);
502 #endif
503   }
504   return zResult;
505 }
506 
507 /*
508 ** Shell output mode information from before ".explain on",
509 ** saved so that it can be restored by ".explain off"
510 */
511 typedef struct SavedModeInfo SavedModeInfo;
512 struct SavedModeInfo {
513   int valid;          /* Is there legit data in here? */
514   int mode;           /* Mode prior to ".explain on" */
515   int showHeader;     /* The ".header" setting prior to ".explain on" */
516   int colWidth[100];  /* Column widths prior to ".explain on" */
517 };
518 
519 /*
520 ** State information about the database connection is contained in an
521 ** instance of the following structure.
522 */
523 typedef struct ShellState ShellState;
524 struct ShellState {
525   sqlite3 *db;           /* The database */
526   int echoOn;            /* True to echo input commands */
527   int autoEQP;           /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
528   int statsOn;           /* True to display memory stats before each finalize */
529   int scanstatsOn;       /* True to display scan stats before each finalize */
530   int backslashOn;       /* Resolve C-style \x escapes in SQL input text */
531   int outCount;          /* Revert to stdout when reaching zero */
532   int cnt;               /* Number of records displayed so far */
533   FILE *out;             /* Write results here */
534   FILE *traceOut;        /* Output for sqlite3_trace() */
535   int nErr;              /* Number of errors seen */
536   int mode;              /* An output mode setting */
537   int writableSchema;    /* True if PRAGMA writable_schema=ON */
538   int showHeader;        /* True to show column names in List or Column mode */
539   unsigned shellFlgs;    /* Various flags */
540   char *zDestTable;      /* Name of destination table when MODE_Insert */
541   char colSeparator[20]; /* Column separator character for several modes */
542   char rowSeparator[20]; /* Row separator character for MODE_Ascii */
543   int colWidth[100];     /* Requested width of each column when in column mode*/
544   int actualWidth[100];  /* Actual width of each column */
545   char nullValue[20];    /* The text to print when a NULL comes back from
546                          ** the database */
547   SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
548   char outfile[FILENAME_MAX]; /* Filename for *out */
549   const char *zDbFilename;    /* name of the database file */
550   char *zFreeOnClose;         /* Filename to free when closing */
551   const char *zVfs;           /* Name of VFS to use */
552   sqlite3_stmt *pStmt;   /* Current statement if any. */
553   FILE *pLog;            /* Write log output here */
554   int *aiIndent;         /* Array of indents used in MODE_Explain */
555   int nIndent;           /* Size of array aiIndent[] */
556   int iIndent;           /* Index of current op in aiIndent[] */
557 };
558 
559 /*
560 ** These are the allowed shellFlgs values
561 */
562 #define SHFLG_Scratch     0x00001     /* The --scratch option is used */
563 #define SHFLG_Pagecache   0x00002     /* The --pagecache option is used */
564 #define SHFLG_Lookaside   0x00004     /* Lookaside memory is used */
565 
566 /*
567 ** These are the allowed modes.
568 */
569 #define MODE_Line     0  /* One column per line.  Blank line between records */
570 #define MODE_Column   1  /* One record per line in neat columns */
571 #define MODE_List     2  /* One record per line with a separator */
572 #define MODE_Semi     3  /* Same as MODE_List but append ";" to each line */
573 #define MODE_Html     4  /* Generate an XHTML table */
574 #define MODE_Insert   5  /* Generate SQL "insert" statements */
575 #define MODE_Tcl      6  /* Generate ANSI-C or TCL quoted elements */
576 #define MODE_Csv      7  /* Quote strings, numbers are plain */
577 #define MODE_Explain  8  /* Like MODE_Column, but do not truncate data */
578 #define MODE_Ascii    9  /* Use ASCII unit and record separators (0x1F/0x1E) */
579 
580 static const char *modeDescr[] = {
581   "line",
582   "column",
583   "list",
584   "semi",
585   "html",
586   "insert",
587   "tcl",
588   "csv",
589   "explain",
590   "ascii",
591 };
592 
593 /*
594 ** These are the column/row/line separators used by the various
595 ** import/export modes.
596 */
597 #define SEP_Column    "|"
598 #define SEP_Row       "\n"
599 #define SEP_Tab       "\t"
600 #define SEP_Space     " "
601 #define SEP_Comma     ","
602 #define SEP_CrLf      "\r\n"
603 #define SEP_Unit      "\x1F"
604 #define SEP_Record    "\x1E"
605 
606 /*
607 ** Number of elements in an array
608 */
609 #define ArraySize(X)  (int)(sizeof(X)/sizeof(X[0]))
610 
611 /*
612 ** Compute a string length that is limited to what can be stored in
613 ** lower 30 bits of a 32-bit signed integer.
614 */
strlen30(const char * z)615 static int strlen30(const char *z){
616   const char *z2 = z;
617   while( *z2 ){ z2++; }
618   return 0x3fffffff & (int)(z2 - z);
619 }
620 
621 /*
622 ** A callback for the sqlite3_log() interface.
623 */
shellLog(void * pArg,int iErrCode,const char * zMsg)624 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
625   ShellState *p = (ShellState*)pArg;
626   if( p->pLog==0 ) return;
627   fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
628   fflush(p->pLog);
629 }
630 
631 /*
632 ** Output the given string as a hex-encoded blob (eg. X'1234' )
633 */
output_hex_blob(FILE * out,const void * pBlob,int nBlob)634 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
635   int i;
636   char *zBlob = (char *)pBlob;
637   fprintf(out,"X'");
638   for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
639   fprintf(out,"'");
640 }
641 
642 /*
643 ** Output the given string as a quoted string using SQL quoting conventions.
644 */
output_quoted_string(FILE * out,const char * z)645 static void output_quoted_string(FILE *out, const char *z){
646   int i;
647   int nSingle = 0;
648   setBinaryMode(out);
649   for(i=0; z[i]; i++){
650     if( z[i]=='\'' ) nSingle++;
651   }
652   if( nSingle==0 ){
653     fprintf(out,"'%s'",z);
654   }else{
655     fprintf(out,"'");
656     while( *z ){
657       for(i=0; z[i] && z[i]!='\''; i++){}
658       if( i==0 ){
659         fprintf(out,"''");
660         z++;
661       }else if( z[i]=='\'' ){
662         fprintf(out,"%.*s''",i,z);
663         z += i+1;
664       }else{
665         fprintf(out,"%s",z);
666         break;
667       }
668     }
669     fprintf(out,"'");
670   }
671   setTextMode(out);
672 }
673 
674 /*
675 ** Output the given string as a quoted according to C or TCL quoting rules.
676 */
output_c_string(FILE * out,const char * z)677 static void output_c_string(FILE *out, const char *z){
678   unsigned int c;
679   fputc('"', out);
680   while( (c = *(z++))!=0 ){
681     if( c=='\\' ){
682       fputc(c, out);
683       fputc(c, out);
684     }else if( c=='"' ){
685       fputc('\\', out);
686       fputc('"', out);
687     }else if( c=='\t' ){
688       fputc('\\', out);
689       fputc('t', out);
690     }else if( c=='\n' ){
691       fputc('\\', out);
692       fputc('n', out);
693     }else if( c=='\r' ){
694       fputc('\\', out);
695       fputc('r', out);
696     }else if( !isprint(c&0xff) ){
697       fprintf(out, "\\%03o", c&0xff);
698     }else{
699       fputc(c, out);
700     }
701   }
702   fputc('"', out);
703 }
704 
705 /*
706 ** Output the given string with characters that are special to
707 ** HTML escaped.
708 */
output_html_string(FILE * out,const char * z)709 static void output_html_string(FILE *out, const char *z){
710   int i;
711   if( z==0 ) z = "";
712   while( *z ){
713     for(i=0;   z[i]
714             && z[i]!='<'
715             && z[i]!='&'
716             && z[i]!='>'
717             && z[i]!='\"'
718             && z[i]!='\'';
719         i++){}
720     if( i>0 ){
721       fprintf(out,"%.*s",i,z);
722     }
723     if( z[i]=='<' ){
724       fprintf(out,"&lt;");
725     }else if( z[i]=='&' ){
726       fprintf(out,"&amp;");
727     }else if( z[i]=='>' ){
728       fprintf(out,"&gt;");
729     }else if( z[i]=='\"' ){
730       fprintf(out,"&quot;");
731     }else if( z[i]=='\'' ){
732       fprintf(out,"&#39;");
733     }else{
734       break;
735     }
736     z += i + 1;
737   }
738 }
739 
740 /*
741 ** If a field contains any character identified by a 1 in the following
742 ** array, then the string must be quoted for CSV.
743 */
744 static const char needCsvQuote[] = {
745   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
746   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
747   1, 0, 1, 0, 0, 0, 0, 1,   0, 0, 0, 0, 0, 0, 0, 0,
748   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
749   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
750   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
751   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0,
752   0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 1,
753   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
754   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
755   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
756   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
757   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
758   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
759   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
760   1, 1, 1, 1, 1, 1, 1, 1,   1, 1, 1, 1, 1, 1, 1, 1,
761 };
762 
763 /*
764 ** Output a single term of CSV.  Actually, p->colSeparator is used for
765 ** the separator, which may or may not be a comma.  p->nullValue is
766 ** the null value.  Strings are quoted if necessary.  The separator
767 ** is only issued if bSep is true.
768 */
output_csv(ShellState * p,const char * z,int bSep)769 static void output_csv(ShellState *p, const char *z, int bSep){
770   FILE *out = p->out;
771   if( z==0 ){
772     fprintf(out,"%s",p->nullValue);
773   }else{
774     int i;
775     int nSep = strlen30(p->colSeparator);
776     for(i=0; z[i]; i++){
777       if( needCsvQuote[((unsigned char*)z)[i]]
778          || (z[i]==p->colSeparator[0] &&
779              (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
780         i = 0;
781         break;
782       }
783     }
784     if( i==0 ){
785       putc('"', out);
786       for(i=0; z[i]; i++){
787         if( z[i]=='"' ) putc('"', out);
788         putc(z[i], out);
789       }
790       putc('"', out);
791     }else{
792       fprintf(out, "%s", z);
793     }
794   }
795   if( bSep ){
796     fprintf(p->out, "%s", p->colSeparator);
797   }
798 }
799 
800 #ifdef SIGINT
801 /*
802 ** This routine runs when the user presses Ctrl-C
803 */
interrupt_handler(int NotUsed)804 static void interrupt_handler(int NotUsed){
805   UNUSED_PARAMETER(NotUsed);
806   seenInterrupt++;
807   if( seenInterrupt>2 ) exit(1);
808   if( globalDb ) sqlite3_interrupt(globalDb);
809 }
810 #endif
811 
812 /*
813 ** This is the callback routine that the shell
814 ** invokes for each row of a query result.
815 */
shell_callback(void * pArg,int nArg,char ** azArg,char ** azCol,int * aiType)816 static int shell_callback(
817   void *pArg,
818   int nArg,        /* Number of result columns */
819   char **azArg,    /* Text of each result column */
820   char **azCol,    /* Column names */
821   int *aiType      /* Column types */
822 ){
823   int i;
824   ShellState *p = (ShellState*)pArg;
825 
826   switch( p->mode ){
827     case MODE_Line: {
828       int w = 5;
829       if( azArg==0 ) break;
830       for(i=0; i<nArg; i++){
831         int len = strlen30(azCol[i] ? azCol[i] : "");
832         if( len>w ) w = len;
833       }
834       if( p->cnt++>0 ) fprintf(p->out, "%s", p->rowSeparator);
835       for(i=0; i<nArg; i++){
836         fprintf(p->out,"%*s = %s%s", w, azCol[i],
837                 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
838       }
839       break;
840     }
841     case MODE_Explain:
842     case MODE_Column: {
843       if( p->cnt++==0 ){
844         for(i=0; i<nArg; i++){
845           int w, n;
846           if( i<ArraySize(p->colWidth) ){
847             w = p->colWidth[i];
848           }else{
849             w = 0;
850           }
851           if( w==0 ){
852             w = strlen30(azCol[i] ? azCol[i] : "");
853             if( w<10 ) w = 10;
854             n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
855             if( w<n ) w = n;
856           }
857           if( i<ArraySize(p->actualWidth) ){
858             p->actualWidth[i] = w;
859           }
860           if( p->showHeader ){
861             if( w<0 ){
862               fprintf(p->out,"%*.*s%s",-w,-w,azCol[i],
863                       i==nArg-1 ? p->rowSeparator : "  ");
864             }else{
865               fprintf(p->out,"%-*.*s%s",w,w,azCol[i],
866                       i==nArg-1 ? p->rowSeparator : "  ");
867             }
868           }
869         }
870         if( p->showHeader ){
871           for(i=0; i<nArg; i++){
872             int w;
873             if( i<ArraySize(p->actualWidth) ){
874                w = p->actualWidth[i];
875                if( w<0 ) w = -w;
876             }else{
877                w = 10;
878             }
879             fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
880                    "----------------------------------------------------------",
881                     i==nArg-1 ? p->rowSeparator : "  ");
882           }
883         }
884       }
885       if( azArg==0 ) break;
886       for(i=0; i<nArg; i++){
887         int w;
888         if( i<ArraySize(p->actualWidth) ){
889            w = p->actualWidth[i];
890         }else{
891            w = 10;
892         }
893         if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
894           w = strlen30(azArg[i]);
895         }
896         if( i==1 && p->aiIndent && p->pStmt ){
897           if( p->iIndent<p->nIndent ){
898             fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
899           }
900           p->iIndent++;
901         }
902         if( w<0 ){
903           fprintf(p->out,"%*.*s%s",-w,-w,
904               azArg[i] ? azArg[i] : p->nullValue,
905               i==nArg-1 ? p->rowSeparator : "  ");
906         }else{
907           fprintf(p->out,"%-*.*s%s",w,w,
908               azArg[i] ? azArg[i] : p->nullValue,
909               i==nArg-1 ? p->rowSeparator : "  ");
910         }
911       }
912       break;
913     }
914     case MODE_Semi:
915     case MODE_List: {
916       if( p->cnt++==0 && p->showHeader ){
917         for(i=0; i<nArg; i++){
918           fprintf(p->out,"%s%s",azCol[i],
919                   i==nArg-1 ? p->rowSeparator : p->colSeparator);
920         }
921       }
922       if( azArg==0 ) break;
923       for(i=0; i<nArg; i++){
924         char *z = azArg[i];
925         if( z==0 ) z = p->nullValue;
926         fprintf(p->out, "%s", z);
927         if( i<nArg-1 ){
928           fprintf(p->out, "%s", p->colSeparator);
929         }else if( p->mode==MODE_Semi ){
930           fprintf(p->out, ";%s", p->rowSeparator);
931         }else{
932           fprintf(p->out, "%s", p->rowSeparator);
933         }
934       }
935       break;
936     }
937     case MODE_Html: {
938       if( p->cnt++==0 && p->showHeader ){
939         fprintf(p->out,"<TR>");
940         for(i=0; i<nArg; i++){
941           fprintf(p->out,"<TH>");
942           output_html_string(p->out, azCol[i]);
943           fprintf(p->out,"</TH>\n");
944         }
945         fprintf(p->out,"</TR>\n");
946       }
947       if( azArg==0 ) break;
948       fprintf(p->out,"<TR>");
949       for(i=0; i<nArg; i++){
950         fprintf(p->out,"<TD>");
951         output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
952         fprintf(p->out,"</TD>\n");
953       }
954       fprintf(p->out,"</TR>\n");
955       break;
956     }
957     case MODE_Tcl: {
958       if( p->cnt++==0 && p->showHeader ){
959         for(i=0; i<nArg; i++){
960           output_c_string(p->out,azCol[i] ? azCol[i] : "");
961           if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
962         }
963         fprintf(p->out, "%s", p->rowSeparator);
964       }
965       if( azArg==0 ) break;
966       for(i=0; i<nArg; i++){
967         output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
968         if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
969       }
970       fprintf(p->out, "%s", p->rowSeparator);
971       break;
972     }
973     case MODE_Csv: {
974       setBinaryMode(p->out);
975       if( p->cnt++==0 && p->showHeader ){
976         for(i=0; i<nArg; i++){
977           output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
978         }
979         fprintf(p->out, "%s", p->rowSeparator);
980       }
981       if( nArg>0 ){
982         for(i=0; i<nArg; i++){
983           output_csv(p, azArg[i], i<nArg-1);
984         }
985         fprintf(p->out, "%s", p->rowSeparator);
986       }
987       setTextMode(p->out);
988       break;
989     }
990     case MODE_Insert: {
991       p->cnt++;
992       if( azArg==0 ) break;
993       fprintf(p->out,"INSERT INTO %s",p->zDestTable);
994       if( p->showHeader ){
995         fprintf(p->out,"(");
996         for(i=0; i<nArg; i++){
997           char *zSep = i>0 ? ",": "";
998           fprintf(p->out, "%s%s", zSep, azCol[i]);
999         }
1000         fprintf(p->out,")");
1001       }
1002       fprintf(p->out," VALUES(");
1003       for(i=0; i<nArg; i++){
1004         char *zSep = i>0 ? ",": "";
1005         if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1006           fprintf(p->out,"%sNULL",zSep);
1007         }else if( aiType && aiType[i]==SQLITE_TEXT ){
1008           if( zSep[0] ) fprintf(p->out,"%s",zSep);
1009           output_quoted_string(p->out, azArg[i]);
1010         }else if( aiType && (aiType[i]==SQLITE_INTEGER
1011                              || aiType[i]==SQLITE_FLOAT) ){
1012           fprintf(p->out,"%s%s",zSep, azArg[i]);
1013         }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1014           const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1015           int nBlob = sqlite3_column_bytes(p->pStmt, i);
1016           if( zSep[0] ) fprintf(p->out,"%s",zSep);
1017           output_hex_blob(p->out, pBlob, nBlob);
1018         }else if( isNumber(azArg[i], 0) ){
1019           fprintf(p->out,"%s%s",zSep, azArg[i]);
1020         }else{
1021           if( zSep[0] ) fprintf(p->out,"%s",zSep);
1022           output_quoted_string(p->out, azArg[i]);
1023         }
1024       }
1025       fprintf(p->out,");\n");
1026       break;
1027     }
1028     case MODE_Ascii: {
1029       if( p->cnt++==0 && p->showHeader ){
1030         for(i=0; i<nArg; i++){
1031           if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1032           fprintf(p->out,"%s",azCol[i] ? azCol[i] : "");
1033         }
1034         fprintf(p->out, "%s", p->rowSeparator);
1035       }
1036       if( azArg==0 ) break;
1037       for(i=0; i<nArg; i++){
1038         if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1039         fprintf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
1040       }
1041       fprintf(p->out, "%s", p->rowSeparator);
1042       break;
1043     }
1044   }
1045   return 0;
1046 }
1047 
1048 /*
1049 ** This is the callback routine that the SQLite library
1050 ** invokes for each row of a query result.
1051 */
callback(void * pArg,int nArg,char ** azArg,char ** azCol)1052 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1053   /* since we don't have type info, call the shell_callback with a NULL value */
1054   return shell_callback(pArg, nArg, azArg, azCol, NULL);
1055 }
1056 
1057 /*
1058 ** Set the destination table field of the ShellState structure to
1059 ** the name of the table given.  Escape any quote characters in the
1060 ** table name.
1061 */
set_table_name(ShellState * p,const char * zName)1062 static void set_table_name(ShellState *p, const char *zName){
1063   int i, n;
1064   int needQuote;
1065   char *z;
1066 
1067   if( p->zDestTable ){
1068     free(p->zDestTable);
1069     p->zDestTable = 0;
1070   }
1071   if( zName==0 ) return;
1072   needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
1073   for(i=n=0; zName[i]; i++, n++){
1074     if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
1075       needQuote = 1;
1076       if( zName[i]=='\'' ) n++;
1077     }
1078   }
1079   if( needQuote ) n += 2;
1080   z = p->zDestTable = malloc( n+1 );
1081   if( z==0 ){
1082     fprintf(stderr,"Error: out of memory\n");
1083     exit(1);
1084   }
1085   n = 0;
1086   if( needQuote ) z[n++] = '\'';
1087   for(i=0; zName[i]; i++){
1088     z[n++] = zName[i];
1089     if( zName[i]=='\'' ) z[n++] = '\'';
1090   }
1091   if( needQuote ) z[n++] = '\'';
1092   z[n] = 0;
1093 }
1094 
1095 /* zIn is either a pointer to a NULL-terminated string in memory obtained
1096 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1097 ** added to zIn, and the result returned in memory obtained from malloc().
1098 ** zIn, if it was not NULL, is freed.
1099 **
1100 ** If the third argument, quote, is not '\0', then it is used as a
1101 ** quote character for zAppend.
1102 */
appendText(char * zIn,char const * zAppend,char quote)1103 static char *appendText(char *zIn, char const *zAppend, char quote){
1104   int len;
1105   int i;
1106   int nAppend = strlen30(zAppend);
1107   int nIn = (zIn?strlen30(zIn):0);
1108 
1109   len = nAppend+nIn+1;
1110   if( quote ){
1111     len += 2;
1112     for(i=0; i<nAppend; i++){
1113       if( zAppend[i]==quote ) len++;
1114     }
1115   }
1116 
1117   zIn = (char *)realloc(zIn, len);
1118   if( !zIn ){
1119     return 0;
1120   }
1121 
1122   if( quote ){
1123     char *zCsr = &zIn[nIn];
1124     *zCsr++ = quote;
1125     for(i=0; i<nAppend; i++){
1126       *zCsr++ = zAppend[i];
1127       if( zAppend[i]==quote ) *zCsr++ = quote;
1128     }
1129     *zCsr++ = quote;
1130     *zCsr++ = '\0';
1131     assert( (zCsr-zIn)==len );
1132   }else{
1133     memcpy(&zIn[nIn], zAppend, nAppend);
1134     zIn[len-1] = '\0';
1135   }
1136 
1137   return zIn;
1138 }
1139 
1140 
1141 /*
1142 ** Execute a query statement that will generate SQL output.  Print
1143 ** the result columns, comma-separated, on a line and then add a
1144 ** semicolon terminator to the end of that line.
1145 **
1146 ** If the number of columns is 1 and that column contains text "--"
1147 ** then write the semicolon on a separate line.  That way, if a
1148 ** "--" comment occurs at the end of the statement, the comment
1149 ** won't consume the semicolon terminator.
1150 */
run_table_dump_query(ShellState * p,const char * zSelect,const char * zFirstRow)1151 static int run_table_dump_query(
1152   ShellState *p,           /* Query context */
1153   const char *zSelect,     /* SELECT statement to extract content */
1154   const char *zFirstRow    /* Print before first row, if not NULL */
1155 ){
1156   sqlite3_stmt *pSelect;
1157   int rc;
1158   int nResult;
1159   int i;
1160   const char *z;
1161   rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
1162   if( rc!=SQLITE_OK || !pSelect ){
1163     fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1164     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1165     return rc;
1166   }
1167   rc = sqlite3_step(pSelect);
1168   nResult = sqlite3_column_count(pSelect);
1169   while( rc==SQLITE_ROW ){
1170     if( zFirstRow ){
1171       fprintf(p->out, "%s", zFirstRow);
1172       zFirstRow = 0;
1173     }
1174     z = (const char*)sqlite3_column_text(pSelect, 0);
1175     fprintf(p->out, "%s", z);
1176     for(i=1; i<nResult; i++){
1177       fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1178     }
1179     if( z==0 ) z = "";
1180     while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1181     if( z[0] ){
1182       fprintf(p->out, "\n;\n");
1183     }else{
1184       fprintf(p->out, ";\n");
1185     }
1186     rc = sqlite3_step(pSelect);
1187   }
1188   rc = sqlite3_finalize(pSelect);
1189   if( rc!=SQLITE_OK ){
1190     fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
1191     if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1192   }
1193   return rc;
1194 }
1195 
1196 /*
1197 ** Allocate space and save off current error string.
1198 */
save_err_msg(sqlite3 * db)1199 static char *save_err_msg(
1200   sqlite3 *db            /* Database to query */
1201 ){
1202   int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1203   char *zErrMsg = sqlite3_malloc64(nErrMsg);
1204   if( zErrMsg ){
1205     memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1206   }
1207   return zErrMsg;
1208 }
1209 
1210 /*
1211 ** Display memory stats.
1212 */
display_stats(sqlite3 * db,ShellState * pArg,int bReset)1213 static int display_stats(
1214   sqlite3 *db,                /* Database to query */
1215   ShellState *pArg,           /* Pointer to ShellState */
1216   int bReset                  /* True to reset the stats */
1217 ){
1218   int iCur;
1219   int iHiwtr;
1220 
1221   if( pArg && pArg->out ){
1222 
1223     iHiwtr = iCur = -1;
1224     sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
1225     fprintf(pArg->out,
1226             "Memory Used:                         %d (max %d) bytes\n",
1227             iCur, iHiwtr);
1228     iHiwtr = iCur = -1;
1229     sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
1230     fprintf(pArg->out, "Number of Outstanding Allocations:   %d (max %d)\n",
1231             iCur, iHiwtr);
1232     if( pArg->shellFlgs & SHFLG_Pagecache ){
1233       iHiwtr = iCur = -1;
1234       sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
1235       fprintf(pArg->out,
1236               "Number of Pcache Pages Used:         %d (max %d) pages\n",
1237               iCur, iHiwtr);
1238     }
1239     iHiwtr = iCur = -1;
1240     sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
1241     fprintf(pArg->out,
1242             "Number of Pcache Overflow Bytes:     %d (max %d) bytes\n",
1243             iCur, iHiwtr);
1244     if( pArg->shellFlgs & SHFLG_Scratch ){
1245       iHiwtr = iCur = -1;
1246       sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
1247       fprintf(pArg->out, "Number of Scratch Allocations Used:  %d (max %d)\n",
1248               iCur, iHiwtr);
1249     }
1250     iHiwtr = iCur = -1;
1251     sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
1252     fprintf(pArg->out,
1253             "Number of Scratch Overflow Bytes:    %d (max %d) bytes\n",
1254             iCur, iHiwtr);
1255     iHiwtr = iCur = -1;
1256     sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
1257     fprintf(pArg->out, "Largest Allocation:                  %d bytes\n",
1258             iHiwtr);
1259     iHiwtr = iCur = -1;
1260     sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
1261     fprintf(pArg->out, "Largest Pcache Allocation:           %d bytes\n",
1262             iHiwtr);
1263     iHiwtr = iCur = -1;
1264     sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
1265     fprintf(pArg->out, "Largest Scratch Allocation:          %d bytes\n",
1266             iHiwtr);
1267 #ifdef YYTRACKMAXSTACKDEPTH
1268     iHiwtr = iCur = -1;
1269     sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
1270     fprintf(pArg->out, "Deepest Parser Stack:                %d (max %d)\n",
1271             iCur, iHiwtr);
1272 #endif
1273   }
1274 
1275   if( pArg && pArg->out && db ){
1276     if( pArg->shellFlgs & SHFLG_Lookaside ){
1277       iHiwtr = iCur = -1;
1278       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1279                         &iCur, &iHiwtr, bReset);
1280       fprintf(pArg->out, "Lookaside Slots Used:                %d (max %d)\n",
1281               iCur, iHiwtr);
1282       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1283                         &iCur, &iHiwtr, bReset);
1284       fprintf(pArg->out, "Successful lookaside attempts:       %d\n", iHiwtr);
1285       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1286                         &iCur, &iHiwtr, bReset);
1287       fprintf(pArg->out, "Lookaside failures due to size:      %d\n", iHiwtr);
1288       sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1289                         &iCur, &iHiwtr, bReset);
1290       fprintf(pArg->out, "Lookaside failures due to OOM:       %d\n", iHiwtr);
1291     }
1292     iHiwtr = iCur = -1;
1293     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1294     fprintf(pArg->out, "Pager Heap Usage:                    %d bytes\n",iCur);
1295     iHiwtr = iCur = -1;
1296     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1297     fprintf(pArg->out, "Page cache hits:                     %d\n", iCur);
1298     iHiwtr = iCur = -1;
1299     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1300     fprintf(pArg->out, "Page cache misses:                   %d\n", iCur);
1301     iHiwtr = iCur = -1;
1302     sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1303     fprintf(pArg->out, "Page cache writes:                   %d\n", iCur);
1304     iHiwtr = iCur = -1;
1305     sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1306     fprintf(pArg->out, "Schema Heap Usage:                   %d bytes\n",iCur);
1307     iHiwtr = iCur = -1;
1308     sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1309     fprintf(pArg->out, "Statement Heap/Lookaside Usage:      %d bytes\n",iCur);
1310   }
1311 
1312   if( pArg && pArg->out && db && pArg->pStmt ){
1313     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1314                                bReset);
1315     fprintf(pArg->out, "Fullscan Steps:                      %d\n", iCur);
1316     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1317     fprintf(pArg->out, "Sort Operations:                     %d\n", iCur);
1318     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
1319     fprintf(pArg->out, "Autoindex Inserts:                   %d\n", iCur);
1320     iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1321     fprintf(pArg->out, "Virtual Machine Steps:               %d\n", iCur);
1322   }
1323 
1324   return 0;
1325 }
1326 
1327 /*
1328 ** Display scan stats.
1329 */
display_scanstats(sqlite3 * db,ShellState * pArg)1330 static void display_scanstats(
1331   sqlite3 *db,                    /* Database to query */
1332   ShellState *pArg                /* Pointer to ShellState */
1333 ){
1334 #ifdef SQLITE_ENABLE_STMT_SCANSTATUS
1335   int i, k, n, mx;
1336   fprintf(pArg->out, "-------- scanstats --------\n");
1337   mx = 0;
1338   for(k=0; k<=mx; k++){
1339     double rEstLoop = 1.0;
1340     for(i=n=0; 1; i++){
1341       sqlite3_stmt *p = pArg->pStmt;
1342       sqlite3_int64 nLoop, nVisit;
1343       double rEst;
1344       int iSid;
1345       const char *zExplain;
1346       if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1347         break;
1348       }
1349       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
1350       if( iSid>mx ) mx = iSid;
1351       if( iSid!=k ) continue;
1352       if( n==0 ){
1353         rEstLoop = (double)nLoop;
1354         if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
1355       }
1356       n++;
1357       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1358       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1359       sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1360       fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1361       rEstLoop *= rEst;
1362       fprintf(pArg->out,
1363           "         nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
1364           nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
1365       );
1366     }
1367   }
1368   fprintf(pArg->out, "---------------------------\n");
1369 #endif
1370 }
1371 
1372 /*
1373 ** Parameter azArray points to a zero-terminated array of strings. zStr
1374 ** points to a single nul-terminated string. Return non-zero if zStr
1375 ** is equal, according to strcmp(), to any of the strings in the array.
1376 ** Otherwise, return zero.
1377 */
str_in_array(const char * zStr,const char ** azArray)1378 static int str_in_array(const char *zStr, const char **azArray){
1379   int i;
1380   for(i=0; azArray[i]; i++){
1381     if( 0==strcmp(zStr, azArray[i]) ) return 1;
1382   }
1383   return 0;
1384 }
1385 
1386 /*
1387 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
1388 ** and populate the ShellState.aiIndent[] array with the number of
1389 ** spaces each opcode should be indented before it is output.
1390 **
1391 ** The indenting rules are:
1392 **
1393 **     * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1394 **       all opcodes that occur between the p2 jump destination and the opcode
1395 **       itself by 2 spaces.
1396 **
1397 **     * For each "Goto", if the jump destination is earlier in the program
1398 **       and ends on one of:
1399 **          Yield  SeekGt  SeekLt  RowSetRead  Rewind
1400 **       or if the P1 parameter is one instead of zero,
1401 **       then indent all opcodes between the earlier instruction
1402 **       and "Goto" by 2 spaces.
1403 */
explain_data_prepare(ShellState * p,sqlite3_stmt * pSql)1404 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
1405   const char *zSql;               /* The text of the SQL statement */
1406   const char *z;                  /* Used to check if this is an EXPLAIN */
1407   int *abYield = 0;               /* True if op is an OP_Yield */
1408   int nAlloc = 0;                 /* Allocated size of p->aiIndent[], abYield */
1409   int iOp;                        /* Index of operation in p->aiIndent[] */
1410 
1411   const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1412                            "NextIfOpen", "PrevIfOpen", 0 };
1413   const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1414                             "Rewind", 0 };
1415   const char *azGoto[] = { "Goto", 0 };
1416 
1417   /* Try to figure out if this is really an EXPLAIN statement. If this
1418   ** cannot be verified, return early.  */
1419   zSql = sqlite3_sql(pSql);
1420   if( zSql==0 ) return;
1421   for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1422   if( sqlite3_strnicmp(z, "explain", 7) ) return;
1423 
1424   for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1425     int i;
1426     int iAddr = sqlite3_column_int(pSql, 0);
1427     const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
1428 
1429     /* Set p2 to the P2 field of the current opcode. Then, assuming that
1430     ** p2 is an instruction address, set variable p2op to the index of that
1431     ** instruction in the aiIndent[] array. p2 and p2op may be different if
1432     ** the current instruction is part of a sub-program generated by an
1433     ** SQL trigger or foreign key.  */
1434     int p2 = sqlite3_column_int(pSql, 3);
1435     int p2op = (p2 + (iOp-iAddr));
1436 
1437     /* Grow the p->aiIndent array as required */
1438     if( iOp>=nAlloc ){
1439       nAlloc += 100;
1440       p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
1441       abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
1442     }
1443     abYield[iOp] = str_in_array(zOp, azYield);
1444     p->aiIndent[iOp] = 0;
1445     p->nIndent = iOp+1;
1446 
1447     if( str_in_array(zOp, azNext) ){
1448       for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
1449     }
1450     if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1451      && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1452     ){
1453       for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
1454     }
1455   }
1456 
1457   p->iIndent = 0;
1458   sqlite3_free(abYield);
1459   sqlite3_reset(pSql);
1460 }
1461 
1462 /*
1463 ** Free the array allocated by explain_data_prepare().
1464 */
explain_data_delete(ShellState * p)1465 static void explain_data_delete(ShellState *p){
1466   sqlite3_free(p->aiIndent);
1467   p->aiIndent = 0;
1468   p->nIndent = 0;
1469   p->iIndent = 0;
1470 }
1471 
1472 /*
1473 ** Execute a statement or set of statements.  Print
1474 ** any result rows/columns depending on the current mode
1475 ** set via the supplied callback.
1476 **
1477 ** This is very similar to SQLite's built-in sqlite3_exec()
1478 ** function except it takes a slightly different callback
1479 ** and callback data argument.
1480 */
shell_exec(sqlite3 * db,const char * zSql,int (* xCallback)(void *,int,char **,char **,int *),ShellState * pArg,char ** pzErrMsg)1481 static int shell_exec(
1482   sqlite3 *db,                              /* An open database */
1483   const char *zSql,                         /* SQL to be evaluated */
1484   int (*xCallback)(void*,int,char**,char**,int*),   /* Callback function */
1485                                             /* (not the same as sqlite3_exec) */
1486   ShellState *pArg,                         /* Pointer to ShellState */
1487   char **pzErrMsg                           /* Error msg written here */
1488 ){
1489   sqlite3_stmt *pStmt = NULL;     /* Statement to execute. */
1490   int rc = SQLITE_OK;             /* Return Code */
1491   int rc2;
1492   const char *zLeftover;          /* Tail of unprocessed SQL */
1493 
1494   if( pzErrMsg ){
1495     *pzErrMsg = NULL;
1496   }
1497 
1498   while( zSql[0] && (SQLITE_OK == rc) ){
1499     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1500     if( SQLITE_OK != rc ){
1501       if( pzErrMsg ){
1502         *pzErrMsg = save_err_msg(db);
1503       }
1504     }else{
1505       if( !pStmt ){
1506         /* this happens for a comment or white-space */
1507         zSql = zLeftover;
1508         while( IsSpace(zSql[0]) ) zSql++;
1509         continue;
1510       }
1511 
1512       /* save off the prepared statment handle and reset row count */
1513       if( pArg ){
1514         pArg->pStmt = pStmt;
1515         pArg->cnt = 0;
1516       }
1517 
1518       /* echo the sql statement if echo on */
1519       if( pArg && pArg->echoOn ){
1520         const char *zStmtSql = sqlite3_sql(pStmt);
1521         fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
1522       }
1523 
1524       /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1525       if( pArg && pArg->autoEQP ){
1526         sqlite3_stmt *pExplain;
1527         char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1528                                      sqlite3_sql(pStmt));
1529         rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1530         if( rc==SQLITE_OK ){
1531           while( sqlite3_step(pExplain)==SQLITE_ROW ){
1532             fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1533             fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1534             fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1535             fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1536           }
1537         }
1538         sqlite3_finalize(pExplain);
1539         sqlite3_free(zEQP);
1540       }
1541 
1542       /* If the shell is currently in ".explain" mode, gather the extra
1543       ** data required to add indents to the output.*/
1544       if( pArg && pArg->mode==MODE_Explain ){
1545         explain_data_prepare(pArg, pStmt);
1546       }
1547 
1548       /* perform the first step.  this will tell us if we
1549       ** have a result set or not and how wide it is.
1550       */
1551       rc = sqlite3_step(pStmt);
1552       /* if we have a result set... */
1553       if( SQLITE_ROW == rc ){
1554         /* if we have a callback... */
1555         if( xCallback ){
1556           /* allocate space for col name ptr, value ptr, and type */
1557           int nCol = sqlite3_column_count(pStmt);
1558           void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
1559           if( !pData ){
1560             rc = SQLITE_NOMEM;
1561           }else{
1562             char **azCols = (char **)pData;      /* Names of result columns */
1563             char **azVals = &azCols[nCol];       /* Results */
1564             int *aiTypes = (int *)&azVals[nCol]; /* Result types */
1565             int i, x;
1566             assert(sizeof(int) <= sizeof(char *));
1567             /* save off ptrs to column names */
1568             for(i=0; i<nCol; i++){
1569               azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1570             }
1571             do{
1572               /* extract the data and data types */
1573               for(i=0; i<nCol; i++){
1574                 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
1575                 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
1576                   azVals[i] = "";
1577                 }else{
1578                   azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1579                 }
1580                 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1581                   rc = SQLITE_NOMEM;
1582                   break; /* from for */
1583                 }
1584               } /* end for */
1585 
1586               /* if data and types extracted successfully... */
1587               if( SQLITE_ROW == rc ){
1588                 /* call the supplied callback with the result row data */
1589                 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1590                   rc = SQLITE_ABORT;
1591                 }else{
1592                   rc = sqlite3_step(pStmt);
1593                 }
1594               }
1595             } while( SQLITE_ROW == rc );
1596             sqlite3_free(pData);
1597           }
1598         }else{
1599           do{
1600             rc = sqlite3_step(pStmt);
1601           } while( rc == SQLITE_ROW );
1602         }
1603       }
1604 
1605       explain_data_delete(pArg);
1606 
1607       /* print usage stats if stats on */
1608       if( pArg && pArg->statsOn ){
1609         display_stats(db, pArg, 0);
1610       }
1611 
1612       /* print loop-counters if required */
1613       if( pArg && pArg->scanstatsOn ){
1614         display_scanstats(db, pArg);
1615       }
1616 
1617       /* Finalize the statement just executed. If this fails, save a
1618       ** copy of the error message. Otherwise, set zSql to point to the
1619       ** next statement to execute. */
1620       rc2 = sqlite3_finalize(pStmt);
1621       if( rc!=SQLITE_NOMEM ) rc = rc2;
1622       if( rc==SQLITE_OK ){
1623         zSql = zLeftover;
1624         while( IsSpace(zSql[0]) ) zSql++;
1625       }else if( pzErrMsg ){
1626         *pzErrMsg = save_err_msg(db);
1627       }
1628 
1629       /* clear saved stmt handle */
1630       if( pArg ){
1631         pArg->pStmt = NULL;
1632       }
1633     }
1634   } /* end while */
1635 
1636   return rc;
1637 }
1638 
1639 
1640 /*
1641 ** This is a different callback routine used for dumping the database.
1642 ** Each row received by this callback consists of a table name,
1643 ** the table type ("index" or "table") and SQL to create the table.
1644 ** This routine should print text sufficient to recreate the table.
1645 */
dump_callback(void * pArg,int nArg,char ** azArg,char ** azCol)1646 static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
1647   int rc;
1648   const char *zTable;
1649   const char *zType;
1650   const char *zSql;
1651   const char *zPrepStmt = 0;
1652   ShellState *p = (ShellState *)pArg;
1653 
1654   UNUSED_PARAMETER(azCol);
1655   if( nArg!=3 ) return 1;
1656   zTable = azArg[0];
1657   zType = azArg[1];
1658   zSql = azArg[2];
1659 
1660   if( strcmp(zTable, "sqlite_sequence")==0 ){
1661     zPrepStmt = "DELETE FROM sqlite_sequence;\n";
1662   }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
1663     fprintf(p->out, "ANALYZE sqlite_master;\n");
1664   }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1665     return 0;
1666   }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1667     char *zIns;
1668     if( !p->writableSchema ){
1669       fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1670       p->writableSchema = 1;
1671     }
1672     zIns = sqlite3_mprintf(
1673        "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1674        "VALUES('table','%q','%q',0,'%q');",
1675        zTable, zTable, zSql);
1676     fprintf(p->out, "%s\n", zIns);
1677     sqlite3_free(zIns);
1678     return 0;
1679   }else{
1680     fprintf(p->out, "%s;\n", zSql);
1681   }
1682 
1683   if( strcmp(zType, "table")==0 ){
1684     sqlite3_stmt *pTableInfo = 0;
1685     char *zSelect = 0;
1686     char *zTableInfo = 0;
1687     char *zTmp = 0;
1688     int nRow = 0;
1689 
1690     zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1691     zTableInfo = appendText(zTableInfo, zTable, '"');
1692     zTableInfo = appendText(zTableInfo, ");", 0);
1693 
1694     rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
1695     free(zTableInfo);
1696     if( rc!=SQLITE_OK || !pTableInfo ){
1697       return 1;
1698     }
1699 
1700     zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
1701     /* Always quote the table name, even if it appears to be pure ascii,
1702     ** in case it is a keyword. Ex:  INSERT INTO "table" ... */
1703     zTmp = appendText(zTmp, zTable, '"');
1704     if( zTmp ){
1705       zSelect = appendText(zSelect, zTmp, '\'');
1706       free(zTmp);
1707     }
1708     zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1709     rc = sqlite3_step(pTableInfo);
1710     while( rc==SQLITE_ROW ){
1711       const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
1712       zSelect = appendText(zSelect, "quote(", 0);
1713       zSelect = appendText(zSelect, zText, '"');
1714       rc = sqlite3_step(pTableInfo);
1715       if( rc==SQLITE_ROW ){
1716         zSelect = appendText(zSelect, "), ", 0);
1717       }else{
1718         zSelect = appendText(zSelect, ") ", 0);
1719       }
1720       nRow++;
1721     }
1722     rc = sqlite3_finalize(pTableInfo);
1723     if( rc!=SQLITE_OK || nRow==0 ){
1724       free(zSelect);
1725       return 1;
1726     }
1727     zSelect = appendText(zSelect, "|| ')' FROM  ", 0);
1728     zSelect = appendText(zSelect, zTable, '"');
1729 
1730     rc = run_table_dump_query(p, zSelect, zPrepStmt);
1731     if( rc==SQLITE_CORRUPT ){
1732       zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
1733       run_table_dump_query(p, zSelect, 0);
1734     }
1735     free(zSelect);
1736   }
1737   return 0;
1738 }
1739 
1740 /*
1741 ** Run zQuery.  Use dump_callback() as the callback routine so that
1742 ** the contents of the query are output as SQL statements.
1743 **
1744 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
1745 ** "ORDER BY rowid DESC" to the end.
1746 */
run_schema_dump_query(ShellState * p,const char * zQuery)1747 static int run_schema_dump_query(
1748   ShellState *p,
1749   const char *zQuery
1750 ){
1751   int rc;
1752   char *zErr = 0;
1753   rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
1754   if( rc==SQLITE_CORRUPT ){
1755     char *zQ2;
1756     int len = strlen30(zQuery);
1757     fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1758     if( zErr ){
1759       fprintf(p->out, "/****** %s ******/\n", zErr);
1760       sqlite3_free(zErr);
1761       zErr = 0;
1762     }
1763     zQ2 = malloc( len+100 );
1764     if( zQ2==0 ) return rc;
1765     sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
1766     rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1767     if( rc ){
1768       fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1769     }else{
1770       rc = SQLITE_CORRUPT;
1771     }
1772     sqlite3_free(zErr);
1773     free(zQ2);
1774   }
1775   return rc;
1776 }
1777 
1778 /*
1779 ** Text of a help message
1780 */
1781 static char zHelp[] =
1782   ".backup ?DB? FILE      Backup DB (default \"main\") to FILE\n"
1783   ".bail on|off           Stop after hitting an error.  Default OFF\n"
1784   ".binary on|off         Turn binary output on or off.  Default OFF\n"
1785   ".clone NEWDB           Clone data into NEWDB from the existing database\n"
1786   ".databases             List names and files of attached databases\n"
1787   ".dbinfo ?DB?           Show status information about the database\n"
1788   ".dump ?TABLE? ...      Dump the database in an SQL text format\n"
1789   "                         If TABLE specified, only dump tables matching\n"
1790   "                         LIKE pattern TABLE.\n"
1791   ".echo on|off           Turn command echo on or off\n"
1792   ".eqp on|off            Enable or disable automatic EXPLAIN QUERY PLAN\n"
1793   ".exit                  Exit this program\n"
1794   ".explain ?on|off?      Turn output mode suitable for EXPLAIN on or off.\n"
1795   "                         With no args, it turns EXPLAIN on.\n"
1796   ".fullschema            Show schema and the content of sqlite_stat tables\n"
1797   ".headers on|off        Turn display of headers on or off\n"
1798   ".help                  Show this message\n"
1799   ".import FILE TABLE     Import data from FILE into TABLE\n"
1800   ".indexes ?TABLE?       Show names of all indexes\n"
1801   "                         If TABLE specified, only show indexes for tables\n"
1802   "                         matching LIKE pattern TABLE.\n"
1803 #ifdef SQLITE_ENABLE_IOTRACE
1804   ".iotrace FILE          Enable I/O diagnostic logging to FILE\n"
1805 #endif
1806   ".limit ?LIMIT? ?VAL?   Display or change the value of an SQLITE_LIMIT\n"
1807 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1808   ".load FILE ?ENTRY?     Load an extension library\n"
1809 #endif
1810   ".log FILE|off          Turn logging on or off.  FILE can be stderr/stdout\n"
1811   ".mode MODE ?TABLE?     Set output mode where MODE is one of:\n"
1812   "                         ascii    Columns/rows delimited by 0x1F and 0x1E\n"
1813   "                         csv      Comma-separated values\n"
1814   "                         column   Left-aligned columns.  (See .width)\n"
1815   "                         html     HTML <table> code\n"
1816   "                         insert   SQL insert statements for TABLE\n"
1817   "                         line     One value per line\n"
1818   "                         list     Values delimited by .separator strings\n"
1819   "                         tabs     Tab-separated values\n"
1820   "                         tcl      TCL list elements\n"
1821   ".nullvalue STRING      Use STRING in place of NULL values\n"
1822   ".once FILENAME         Output for the next SQL command only to FILENAME\n"
1823   ".open ?FILENAME?       Close existing database and reopen FILENAME\n"
1824   ".output ?FILENAME?     Send output to FILENAME or stdout\n"
1825   ".print STRING...       Print literal STRING\n"
1826   ".prompt MAIN CONTINUE  Replace the standard prompts\n"
1827   ".quit                  Exit this program\n"
1828   ".read FILENAME         Execute SQL in FILENAME\n"
1829   ".restore ?DB? FILE     Restore content of DB (default \"main\") from FILE\n"
1830   ".save FILE             Write in-memory database into FILE\n"
1831   ".scanstats on|off      Turn sqlite3_stmt_scanstatus() metrics on or off\n"
1832   ".schema ?TABLE?        Show the CREATE statements\n"
1833   "                         If TABLE specified, only show tables matching\n"
1834   "                         LIKE pattern TABLE.\n"
1835   ".separator COL ?ROW?   Change the column separator and optionally the row\n"
1836   "                         separator for both the output mode and .import\n"
1837   ".shell CMD ARGS...     Run CMD ARGS... in a system shell\n"
1838   ".show                  Show the current values for various settings\n"
1839   ".stats on|off          Turn stats on or off\n"
1840   ".system CMD ARGS...    Run CMD ARGS... in a system shell\n"
1841   ".tables ?TABLE?        List names of tables\n"
1842   "                         If TABLE specified, only list tables matching\n"
1843   "                         LIKE pattern TABLE.\n"
1844   ".timeout MS            Try opening locked tables for MS milliseconds\n"
1845   ".timer on|off          Turn SQL timer on or off\n"
1846   ".trace FILE|off        Output each SQL statement as it is run\n"
1847   ".vfsname ?AUX?         Print the name of the VFS stack\n"
1848   ".width NUM1 NUM2 ...   Set column widths for \"column\" mode\n"
1849   "                         Negative values right-justify\n"
1850 ;
1851 
1852 /* Forward reference */
1853 static int process_input(ShellState *p, FILE *in);
1854 /*
1855 ** Implementation of the "readfile(X)" SQL function.  The entire content
1856 ** of the file named X is read and returned as a BLOB.  NULL is returned
1857 ** if the file does not exist or is unreadable.
1858 */
readfileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)1859 static void readfileFunc(
1860   sqlite3_context *context,
1861   int argc,
1862   sqlite3_value **argv
1863 ){
1864   const char *zName;
1865   FILE *in;
1866   long nIn;
1867   void *pBuf;
1868 
1869   zName = (const char*)sqlite3_value_text(argv[0]);
1870   if( zName==0 ) return;
1871   in = fopen(zName, "rb");
1872   if( in==0 ) return;
1873   fseek(in, 0, SEEK_END);
1874   nIn = ftell(in);
1875   rewind(in);
1876   pBuf = sqlite3_malloc64( nIn );
1877   if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1878     sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1879   }else{
1880     sqlite3_free(pBuf);
1881   }
1882   fclose(in);
1883 }
1884 
1885 /*
1886 ** Implementation of the "writefile(X,Y)" SQL function.  The argument Y
1887 ** is written into file X.  The number of bytes written is returned.  Or
1888 ** NULL is returned if something goes wrong, such as being unable to open
1889 ** file X for writing.
1890 */
writefileFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)1891 static void writefileFunc(
1892   sqlite3_context *context,
1893   int argc,
1894   sqlite3_value **argv
1895 ){
1896   FILE *out;
1897   const char *z;
1898   sqlite3_int64 rc;
1899   const char *zFile;
1900 
1901   zFile = (const char*)sqlite3_value_text(argv[0]);
1902   if( zFile==0 ) return;
1903   out = fopen(zFile, "wb");
1904   if( out==0 ) return;
1905   z = (const char*)sqlite3_value_blob(argv[1]);
1906   if( z==0 ){
1907     rc = 0;
1908   }else{
1909     rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
1910   }
1911   fclose(out);
1912   sqlite3_result_int64(context, rc);
1913 }
1914 
1915 /*
1916 ** Make sure the database is open.  If it is not, then open it.  If
1917 ** the database fails to open, print an error message and exit.
1918 */
open_db(ShellState * p,int keepAlive)1919 static void open_db(ShellState *p, int keepAlive){
1920   if( p->db==0 ){
1921     sqlite3_initialize();
1922     sqlite3_open(p->zDbFilename, &p->db);
1923     globalDb = p->db;
1924     if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
1925       sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
1926           shellstaticFunc, 0, 0);
1927     }
1928     if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
1929       fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
1930           p->zDbFilename, sqlite3_errmsg(p->db));
1931       if( keepAlive ) return;
1932       exit(1);
1933     }
1934 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1935     sqlite3_enable_load_extension(p->db, 1);
1936 #endif
1937     sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
1938                             readfileFunc, 0, 0);
1939     sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
1940                             writefileFunc, 0, 0);
1941   }
1942 }
1943 
1944 /*
1945 ** Do C-language style dequoting.
1946 **
1947 **    \a    -> alarm
1948 **    \b    -> backspace
1949 **    \t    -> tab
1950 **    \n    -> newline
1951 **    \v    -> vertical tab
1952 **    \f    -> form feed
1953 **    \r    -> carriage return
1954 **    \s    -> space
1955 **    \"    -> "
1956 **    \'    -> '
1957 **    \\    -> backslash
1958 **    \NNN  -> ascii character NNN in octal
1959 */
resolve_backslashes(char * z)1960 static void resolve_backslashes(char *z){
1961   int i, j;
1962   char c;
1963   while( *z && *z!='\\' ) z++;
1964   for(i=j=0; (c = z[i])!=0; i++, j++){
1965     if( c=='\\' && z[i+1]!=0 ){
1966       c = z[++i];
1967       if( c=='a' ){
1968         c = '\a';
1969       }else if( c=='b' ){
1970         c = '\b';
1971       }else if( c=='t' ){
1972         c = '\t';
1973       }else if( c=='n' ){
1974         c = '\n';
1975       }else if( c=='v' ){
1976         c = '\v';
1977       }else if( c=='f' ){
1978         c = '\f';
1979       }else if( c=='r' ){
1980         c = '\r';
1981       }else if( c=='"' ){
1982         c = '"';
1983       }else if( c=='\'' ){
1984         c = '\'';
1985       }else if( c=='\\' ){
1986         c = '\\';
1987       }else if( c>='0' && c<='7' ){
1988         c -= '0';
1989         if( z[i+1]>='0' && z[i+1]<='7' ){
1990           i++;
1991           c = (c<<3) + z[i] - '0';
1992           if( z[i+1]>='0' && z[i+1]<='7' ){
1993             i++;
1994             c = (c<<3) + z[i] - '0';
1995           }
1996         }
1997       }
1998     }
1999     z[j] = c;
2000   }
2001   if( j<i ) z[j] = 0;
2002 }
2003 
2004 /*
2005 ** Return the value of a hexadecimal digit.  Return -1 if the input
2006 ** is not a hex digit.
2007 */
hexDigitValue(char c)2008 static int hexDigitValue(char c){
2009   if( c>='0' && c<='9' ) return c - '0';
2010   if( c>='a' && c<='f' ) return c - 'a' + 10;
2011   if( c>='A' && c<='F' ) return c - 'A' + 10;
2012   return -1;
2013 }
2014 
2015 /*
2016 ** Interpret zArg as an integer value, possibly with suffixes.
2017 */
integerValue(const char * zArg)2018 static sqlite3_int64 integerValue(const char *zArg){
2019   sqlite3_int64 v = 0;
2020   static const struct { char *zSuffix; int iMult; } aMult[] = {
2021     { "KiB", 1024 },
2022     { "MiB", 1024*1024 },
2023     { "GiB", 1024*1024*1024 },
2024     { "KB",  1000 },
2025     { "MB",  1000000 },
2026     { "GB",  1000000000 },
2027     { "K",   1000 },
2028     { "M",   1000000 },
2029     { "G",   1000000000 },
2030   };
2031   int i;
2032   int isNeg = 0;
2033   if( zArg[0]=='-' ){
2034     isNeg = 1;
2035     zArg++;
2036   }else if( zArg[0]=='+' ){
2037     zArg++;
2038   }
2039   if( zArg[0]=='0' && zArg[1]=='x' ){
2040     int x;
2041     zArg += 2;
2042     while( (x = hexDigitValue(zArg[0]))>=0 ){
2043       v = (v<<4) + x;
2044       zArg++;
2045     }
2046   }else{
2047     while( IsDigit(zArg[0]) ){
2048       v = v*10 + zArg[0] - '0';
2049       zArg++;
2050     }
2051   }
2052   for(i=0; i<ArraySize(aMult); i++){
2053     if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2054       v *= aMult[i].iMult;
2055       break;
2056     }
2057   }
2058   return isNeg? -v : v;
2059 }
2060 
2061 /*
2062 ** Interpret zArg as either an integer or a boolean value.  Return 1 or 0
2063 ** for TRUE and FALSE.  Return the integer value if appropriate.
2064 */
booleanValue(char * zArg)2065 static int booleanValue(char *zArg){
2066   int i;
2067   if( zArg[0]=='0' && zArg[1]=='x' ){
2068     for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2069   }else{
2070     for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2071   }
2072   if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2073   if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2074     return 1;
2075   }
2076   if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2077     return 0;
2078   }
2079   fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2080           zArg);
2081   return 0;
2082 }
2083 
2084 /*
2085 ** Close an output file, assuming it is not stderr or stdout
2086 */
output_file_close(FILE * f)2087 static void output_file_close(FILE *f){
2088   if( f && f!=stdout && f!=stderr ) fclose(f);
2089 }
2090 
2091 /*
2092 ** Try to open an output file.   The names "stdout" and "stderr" are
2093 ** recognized and do the right thing.  NULL is returned if the output
2094 ** filename is "off".
2095 */
output_file_open(const char * zFile)2096 static FILE *output_file_open(const char *zFile){
2097   FILE *f;
2098   if( strcmp(zFile,"stdout")==0 ){
2099     f = stdout;
2100   }else if( strcmp(zFile, "stderr")==0 ){
2101     f = stderr;
2102   }else if( strcmp(zFile, "off")==0 ){
2103     f = 0;
2104   }else{
2105     f = fopen(zFile, "wb");
2106     if( f==0 ){
2107       fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2108     }
2109   }
2110   return f;
2111 }
2112 
2113 /*
2114 ** A routine for handling output from sqlite3_trace().
2115 */
sql_trace_callback(void * pArg,const char * z)2116 static void sql_trace_callback(void *pArg, const char *z){
2117   FILE *f = (FILE*)pArg;
2118   if( f ){
2119     int i = (int)strlen(z);
2120     while( i>0 && z[i-1]==';' ){ i--; }
2121     fprintf(f, "%.*s;\n", i, z);
2122   }
2123 }
2124 
2125 /*
2126 ** A no-op routine that runs with the ".breakpoint" doc-command.  This is
2127 ** a useful spot to set a debugger breakpoint.
2128 */
test_breakpoint(void)2129 static void test_breakpoint(void){
2130   static int nCall = 0;
2131   nCall++;
2132 }
2133 
2134 /*
2135 ** An object used to read a CSV and other files for import.
2136 */
2137 typedef struct ImportCtx ImportCtx;
2138 struct ImportCtx {
2139   const char *zFile;  /* Name of the input file */
2140   FILE *in;           /* Read the CSV text from this input stream */
2141   char *z;            /* Accumulated text for a field */
2142   int n;              /* Number of bytes in z */
2143   int nAlloc;         /* Space allocated for z[] */
2144   int nLine;          /* Current line number */
2145   int cTerm;          /* Character that terminated the most recent field */
2146   int cColSep;        /* The column separator character.  (Usually ",") */
2147   int cRowSep;        /* The row separator character.  (Usually "\n") */
2148 };
2149 
2150 /* Append a single byte to z[] */
import_append_char(ImportCtx * p,int c)2151 static void import_append_char(ImportCtx *p, int c){
2152   if( p->n+1>=p->nAlloc ){
2153     p->nAlloc += p->nAlloc + 100;
2154     p->z = sqlite3_realloc64(p->z, p->nAlloc);
2155     if( p->z==0 ){
2156       fprintf(stderr, "out of memory\n");
2157       exit(1);
2158     }
2159   }
2160   p->z[p->n++] = (char)c;
2161 }
2162 
2163 /* Read a single field of CSV text.  Compatible with rfc4180 and extended
2164 ** with the option of having a separator other than ",".
2165 **
2166 **   +  Input comes from p->in.
2167 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
2168 **      from sqlite3_malloc64().
2169 **   +  Use p->cSep as the column separator.  The default is ",".
2170 **   +  Use p->rSep as the row separator.  The default is "\n".
2171 **   +  Keep track of the line number in p->nLine.
2172 **   +  Store the character that terminates the field in p->cTerm.  Store
2173 **      EOF on end-of-file.
2174 **   +  Report syntax errors on stderr
2175 */
csv_read_one_field(ImportCtx * p)2176 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
2177   int c;
2178   int cSep = p->cColSep;
2179   int rSep = p->cRowSep;
2180   p->n = 0;
2181   c = fgetc(p->in);
2182   if( c==EOF || seenInterrupt ){
2183     p->cTerm = EOF;
2184     return 0;
2185   }
2186   if( c=='"' ){
2187     int pc, ppc;
2188     int startLine = p->nLine;
2189     int cQuote = c;
2190     pc = ppc = 0;
2191     while( 1 ){
2192       c = fgetc(p->in);
2193       if( c==rSep ) p->nLine++;
2194       if( c==cQuote ){
2195         if( pc==cQuote ){
2196           pc = 0;
2197           continue;
2198         }
2199       }
2200       if( (c==cSep && pc==cQuote)
2201        || (c==rSep && pc==cQuote)
2202        || (c==rSep && pc=='\r' && ppc==cQuote)
2203        || (c==EOF && pc==cQuote)
2204       ){
2205         do{ p->n--; }while( p->z[p->n]!=cQuote );
2206         p->cTerm = c;
2207         break;
2208       }
2209       if( pc==cQuote && c!='\r' ){
2210         fprintf(stderr, "%s:%d: unescaped %c character\n",
2211                 p->zFile, p->nLine, cQuote);
2212       }
2213       if( c==EOF ){
2214         fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2215                 p->zFile, startLine, cQuote);
2216         p->cTerm = c;
2217         break;
2218       }
2219       import_append_char(p, c);
2220       ppc = pc;
2221       pc = c;
2222     }
2223   }else{
2224     while( c!=EOF && c!=cSep && c!=rSep ){
2225       import_append_char(p, c);
2226       c = fgetc(p->in);
2227     }
2228     if( c==rSep ){
2229       p->nLine++;
2230       if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
2231     }
2232     p->cTerm = c;
2233   }
2234   if( p->z ) p->z[p->n] = 0;
2235   return p->z;
2236 }
2237 
2238 /* Read a single field of ASCII delimited text.
2239 **
2240 **   +  Input comes from p->in.
2241 **   +  Store results in p->z of length p->n.  Space to hold p->z comes
2242 **      from sqlite3_malloc64().
2243 **   +  Use p->cSep as the column separator.  The default is "\x1F".
2244 **   +  Use p->rSep as the row separator.  The default is "\x1E".
2245 **   +  Keep track of the row number in p->nLine.
2246 **   +  Store the character that terminates the field in p->cTerm.  Store
2247 **      EOF on end-of-file.
2248 **   +  Report syntax errors on stderr
2249 */
ascii_read_one_field(ImportCtx * p)2250 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
2251   int c;
2252   int cSep = p->cColSep;
2253   int rSep = p->cRowSep;
2254   p->n = 0;
2255   c = fgetc(p->in);
2256   if( c==EOF || seenInterrupt ){
2257     p->cTerm = EOF;
2258     return 0;
2259   }
2260   while( c!=EOF && c!=cSep && c!=rSep ){
2261     import_append_char(p, c);
2262     c = fgetc(p->in);
2263   }
2264   if( c==rSep ){
2265     p->nLine++;
2266   }
2267   p->cTerm = c;
2268   if( p->z ) p->z[p->n] = 0;
2269   return p->z;
2270 }
2271 
2272 /*
2273 ** Try to transfer data for table zTable.  If an error is seen while
2274 ** moving forward, try to go backwards.  The backwards movement won't
2275 ** work for WITHOUT ROWID tables.
2276 */
tryToCloneData(ShellState * p,sqlite3 * newDb,const char * zTable)2277 static void tryToCloneData(
2278   ShellState *p,
2279   sqlite3 *newDb,
2280   const char *zTable
2281 ){
2282   sqlite3_stmt *pQuery = 0;
2283   sqlite3_stmt *pInsert = 0;
2284   char *zQuery = 0;
2285   char *zInsert = 0;
2286   int rc;
2287   int i, j, n;
2288   int nTable = (int)strlen(zTable);
2289   int k = 0;
2290   int cnt = 0;
2291   const int spinRate = 10000;
2292 
2293   zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2294   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2295   if( rc ){
2296     fprintf(stderr, "Error %d: %s on [%s]\n",
2297             sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2298             zQuery);
2299     goto end_data_xfer;
2300   }
2301   n = sqlite3_column_count(pQuery);
2302   zInsert = sqlite3_malloc64(200 + nTable + n*3);
2303   if( zInsert==0 ){
2304     fprintf(stderr, "out of memory\n");
2305     goto end_data_xfer;
2306   }
2307   sqlite3_snprintf(200+nTable,zInsert,
2308                    "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2309   i = (int)strlen(zInsert);
2310   for(j=1; j<n; j++){
2311     memcpy(zInsert+i, ",?", 2);
2312     i += 2;
2313   }
2314   memcpy(zInsert+i, ");", 3);
2315   rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2316   if( rc ){
2317     fprintf(stderr, "Error %d: %s on [%s]\n",
2318             sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2319             zQuery);
2320     goto end_data_xfer;
2321   }
2322   for(k=0; k<2; k++){
2323     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2324       for(i=0; i<n; i++){
2325         switch( sqlite3_column_type(pQuery, i) ){
2326           case SQLITE_NULL: {
2327             sqlite3_bind_null(pInsert, i+1);
2328             break;
2329           }
2330           case SQLITE_INTEGER: {
2331             sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2332             break;
2333           }
2334           case SQLITE_FLOAT: {
2335             sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2336             break;
2337           }
2338           case SQLITE_TEXT: {
2339             sqlite3_bind_text(pInsert, i+1,
2340                              (const char*)sqlite3_column_text(pQuery,i),
2341                              -1, SQLITE_STATIC);
2342             break;
2343           }
2344           case SQLITE_BLOB: {
2345             sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2346                                             sqlite3_column_bytes(pQuery,i),
2347                                             SQLITE_STATIC);
2348             break;
2349           }
2350         }
2351       } /* End for */
2352       rc = sqlite3_step(pInsert);
2353       if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2354         fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2355                         sqlite3_errmsg(newDb));
2356       }
2357       sqlite3_reset(pInsert);
2358       cnt++;
2359       if( (cnt%spinRate)==0 ){
2360         printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2361         fflush(stdout);
2362       }
2363     } /* End while */
2364     if( rc==SQLITE_DONE ) break;
2365     sqlite3_finalize(pQuery);
2366     sqlite3_free(zQuery);
2367     zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2368                              zTable);
2369     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2370     if( rc ){
2371       fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2372       break;
2373     }
2374   } /* End for(k=0...) */
2375 
2376 end_data_xfer:
2377   sqlite3_finalize(pQuery);
2378   sqlite3_finalize(pInsert);
2379   sqlite3_free(zQuery);
2380   sqlite3_free(zInsert);
2381 }
2382 
2383 
2384 /*
2385 ** Try to transfer all rows of the schema that match zWhere.  For
2386 ** each row, invoke xForEach() on the object defined by that row.
2387 ** If an error is encountered while moving forward through the
2388 ** sqlite_master table, try again moving backwards.
2389 */
tryToCloneSchema(ShellState * p,sqlite3 * newDb,const char * zWhere,void (* xForEach)(ShellState *,sqlite3 *,const char *))2390 static void tryToCloneSchema(
2391   ShellState *p,
2392   sqlite3 *newDb,
2393   const char *zWhere,
2394   void (*xForEach)(ShellState*,sqlite3*,const char*)
2395 ){
2396   sqlite3_stmt *pQuery = 0;
2397   char *zQuery = 0;
2398   int rc;
2399   const unsigned char *zName;
2400   const unsigned char *zSql;
2401   char *zErrMsg = 0;
2402 
2403   zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2404                            " WHERE %s", zWhere);
2405   rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2406   if( rc ){
2407     fprintf(stderr, "Error: (%d) %s on [%s]\n",
2408                     sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2409                     zQuery);
2410     goto end_schema_xfer;
2411   }
2412   while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2413     zName = sqlite3_column_text(pQuery, 0);
2414     zSql = sqlite3_column_text(pQuery, 1);
2415     printf("%s... ", zName); fflush(stdout);
2416     sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2417     if( zErrMsg ){
2418       fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2419       sqlite3_free(zErrMsg);
2420       zErrMsg = 0;
2421     }
2422     if( xForEach ){
2423       xForEach(p, newDb, (const char*)zName);
2424     }
2425     printf("done\n");
2426   }
2427   if( rc!=SQLITE_DONE ){
2428     sqlite3_finalize(pQuery);
2429     sqlite3_free(zQuery);
2430     zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2431                              " WHERE %s ORDER BY rowid DESC", zWhere);
2432     rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2433     if( rc ){
2434       fprintf(stderr, "Error: (%d) %s on [%s]\n",
2435                       sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2436                       zQuery);
2437       goto end_schema_xfer;
2438     }
2439     while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2440       zName = sqlite3_column_text(pQuery, 0);
2441       zSql = sqlite3_column_text(pQuery, 1);
2442       printf("%s... ", zName); fflush(stdout);
2443       sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2444       if( zErrMsg ){
2445         fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2446         sqlite3_free(zErrMsg);
2447         zErrMsg = 0;
2448       }
2449       if( xForEach ){
2450         xForEach(p, newDb, (const char*)zName);
2451       }
2452       printf("done\n");
2453     }
2454   }
2455 end_schema_xfer:
2456   sqlite3_finalize(pQuery);
2457   sqlite3_free(zQuery);
2458 }
2459 
2460 /*
2461 ** Open a new database file named "zNewDb".  Try to recover as much information
2462 ** as possible out of the main database (which might be corrupt) and write it
2463 ** into zNewDb.
2464 */
tryToClone(ShellState * p,const char * zNewDb)2465 static void tryToClone(ShellState *p, const char *zNewDb){
2466   int rc;
2467   sqlite3 *newDb = 0;
2468   if( access(zNewDb,0)==0 ){
2469     fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2470     return;
2471   }
2472   rc = sqlite3_open(zNewDb, &newDb);
2473   if( rc ){
2474     fprintf(stderr, "Cannot create output database: %s\n",
2475             sqlite3_errmsg(newDb));
2476   }else{
2477     sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
2478     sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
2479     tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2480     tryToCloneSchema(p, newDb, "type!='table'", 0);
2481     sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
2482     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2483   }
2484   sqlite3_close(newDb);
2485 }
2486 
2487 /*
2488 ** Change the output file back to stdout
2489 */
output_reset(ShellState * p)2490 static void output_reset(ShellState *p){
2491   if( p->outfile[0]=='|' ){
2492 #ifndef SQLITE_OMIT_POPEN
2493     pclose(p->out);
2494 #endif
2495   }else{
2496     output_file_close(p->out);
2497   }
2498   p->outfile[0] = 0;
2499   p->out = stdout;
2500 }
2501 
2502 /*
2503 ** Run an SQL command and return the single integer result.
2504 */
db_int(ShellState * p,const char * zSql)2505 static int db_int(ShellState *p, const char *zSql){
2506   sqlite3_stmt *pStmt;
2507   int res = 0;
2508   sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2509   if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2510     res = sqlite3_column_int(pStmt,0);
2511   }
2512   sqlite3_finalize(pStmt);
2513   return res;
2514 }
2515 
2516 /*
2517 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
2518 */
get2byteInt(unsigned char * a)2519 unsigned int get2byteInt(unsigned char *a){
2520   return (a[0]<<8) + a[1];
2521 }
get4byteInt(unsigned char * a)2522 unsigned int get4byteInt(unsigned char *a){
2523   return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2524 }
2525 
2526 /*
2527 ** Implementation of the ".info" command.
2528 **
2529 ** Return 1 on error, 2 to exit, and 0 otherwise.
2530 */
shell_dbinfo_command(ShellState * p,int nArg,char ** azArg)2531 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
2532   static const struct { const char *zName; int ofst; } aField[] = {
2533      { "file change counter:",  24  },
2534      { "database page count:",  28  },
2535      { "freelist page count:",  36  },
2536      { "schema cookie:",        40  },
2537      { "schema format:",        44  },
2538      { "default cache size:",   48  },
2539      { "autovacuum top root:",  52  },
2540      { "incremental vacuum:",   64  },
2541      { "text encoding:",        56  },
2542      { "user version:",         60  },
2543      { "application id:",       68  },
2544      { "software version:",     96  },
2545   };
2546   static const struct { const char *zName; const char *zSql; } aQuery[] = {
2547      { "number of tables:",
2548        "SELECT count(*) FROM %s WHERE type='table'" },
2549      { "number of indexes:",
2550        "SELECT count(*) FROM %s WHERE type='index'" },
2551      { "number of triggers:",
2552        "SELECT count(*) FROM %s WHERE type='trigger'" },
2553      { "number of views:",
2554        "SELECT count(*) FROM %s WHERE type='view'" },
2555      { "schema size:",
2556        "SELECT total(length(sql)) FROM %s" },
2557   };
2558   sqlite3_file *pFile;
2559   int i;
2560   char *zSchemaTab;
2561   char *zDb = nArg>=2 ? azArg[1] : "main";
2562   unsigned char aHdr[100];
2563   open_db(p, 0);
2564   if( p->db==0 ) return 1;
2565   sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
2566   if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2567     return 1;
2568   }
2569   i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2570   if( i!=SQLITE_OK ){
2571     fprintf(stderr, "unable to read database header\n");
2572     return 1;
2573   }
2574   i = get2byteInt(aHdr+16);
2575   if( i==1 ) i = 65536;
2576   fprintf(p->out, "%-20s %d\n", "database page size:", i);
2577   fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2578   fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2579   fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
2580   for(i=0; i<sizeof(aField)/sizeof(aField[0]); i++){
2581     int ofst = aField[i].ofst;
2582     unsigned int val = get4byteInt(aHdr + ofst);
2583     fprintf(p->out, "%-20s %u", aField[i].zName, val);
2584     switch( ofst ){
2585       case 56: {
2586         if( val==1 ) fprintf(p->out, " (utf8)");
2587         if( val==2 ) fprintf(p->out, " (utf16le)");
2588         if( val==3 ) fprintf(p->out, " (utf16be)");
2589       }
2590     }
2591     fprintf(p->out, "\n");
2592   }
2593   if( zDb==0 ){
2594     zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2595   }else if( strcmp(zDb,"temp")==0 ){
2596     zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2597   }else{
2598     zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2599   }
2600   for(i=0; i<sizeof(aQuery)/sizeof(aQuery[0]); i++){
2601     char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2602     int val = db_int(p, zSql);
2603     sqlite3_free(zSql);
2604     fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
2605   }
2606   sqlite3_free(zSchemaTab);
2607   return 0;
2608 }
2609 
2610 
2611 /*
2612 ** If an input line begins with "." then invoke this routine to
2613 ** process that line.
2614 **
2615 ** Return 1 on error, 2 to exit, and 0 otherwise.
2616 */
do_meta_command(char * zLine,ShellState * p)2617 static int do_meta_command(char *zLine, ShellState *p){
2618   int h = 1;
2619   int nArg = 0;
2620   int n, c;
2621   int rc = 0;
2622   char *azArg[50];
2623 
2624   /* Parse the input line into tokens.
2625   */
2626   while( zLine[h] && nArg<ArraySize(azArg) ){
2627     while( IsSpace(zLine[h]) ){ h++; }
2628     if( zLine[h]==0 ) break;
2629     if( zLine[h]=='\'' || zLine[h]=='"' ){
2630       int delim = zLine[h++];
2631       azArg[nArg++] = &zLine[h];
2632       while( zLine[h] && zLine[h]!=delim ){
2633         if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2634         h++;
2635       }
2636       if( zLine[h]==delim ){
2637         zLine[h++] = 0;
2638       }
2639       if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
2640     }else{
2641       azArg[nArg++] = &zLine[h];
2642       while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2643       if( zLine[h] ) zLine[h++] = 0;
2644       resolve_backslashes(azArg[nArg-1]);
2645     }
2646   }
2647 
2648   /* Process the input line.
2649   */
2650   if( nArg==0 ) return 0; /* no tokens, no error */
2651   n = strlen30(azArg[0]);
2652   c = azArg[0][0];
2653   if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2654    || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2655   ){
2656     const char *zDestFile = 0;
2657     const char *zDb = 0;
2658     sqlite3 *pDest;
2659     sqlite3_backup *pBackup;
2660     int j;
2661     for(j=1; j<nArg; j++){
2662       const char *z = azArg[j];
2663       if( z[0]=='-' ){
2664         while( z[0]=='-' ) z++;
2665         /* No options to process at this time */
2666         {
2667           fprintf(stderr, "unknown option: %s\n", azArg[j]);
2668           return 1;
2669         }
2670       }else if( zDestFile==0 ){
2671         zDestFile = azArg[j];
2672       }else if( zDb==0 ){
2673         zDb = zDestFile;
2674         zDestFile = azArg[j];
2675       }else{
2676         fprintf(stderr, "too many arguments to .backup\n");
2677         return 1;
2678       }
2679     }
2680     if( zDestFile==0 ){
2681       fprintf(stderr, "missing FILENAME argument on .backup\n");
2682       return 1;
2683     }
2684     if( zDb==0 ) zDb = "main";
2685     rc = sqlite3_open(zDestFile, &pDest);
2686     if( rc!=SQLITE_OK ){
2687       fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
2688       sqlite3_close(pDest);
2689       return 1;
2690     }
2691     open_db(p, 0);
2692     pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2693     if( pBackup==0 ){
2694       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2695       sqlite3_close(pDest);
2696       return 1;
2697     }
2698     while(  (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2699     sqlite3_backup_finish(pBackup);
2700     if( rc==SQLITE_DONE ){
2701       rc = 0;
2702     }else{
2703       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2704       rc = 1;
2705     }
2706     sqlite3_close(pDest);
2707   }else
2708 
2709   if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2710     if( nArg==2 ){
2711       bail_on_error = booleanValue(azArg[1]);
2712     }else{
2713       fprintf(stderr, "Usage: .bail on|off\n");
2714       rc = 1;
2715     }
2716   }else
2717 
2718   if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
2719     if( nArg==2 ){
2720       if( booleanValue(azArg[1]) ){
2721         setBinaryMode(p->out);
2722       }else{
2723         setTextMode(p->out);
2724       }
2725     }else{
2726       fprintf(stderr, "Usage: .binary on|off\n");
2727       rc = 1;
2728     }
2729   }else
2730 
2731   /* The undocumented ".breakpoint" command causes a call to the no-op
2732   ** routine named test_breakpoint().
2733   */
2734   if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2735     test_breakpoint();
2736   }else
2737 
2738   if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2739     if( nArg==2 ){
2740       tryToClone(p, azArg[1]);
2741     }else{
2742       fprintf(stderr, "Usage: .clone FILENAME\n");
2743       rc = 1;
2744     }
2745   }else
2746 
2747   if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
2748     ShellState data;
2749     char *zErrMsg = 0;
2750     open_db(p, 0);
2751     memcpy(&data, p, sizeof(data));
2752     data.showHeader = 1;
2753     data.mode = MODE_Column;
2754     data.colWidth[0] = 3;
2755     data.colWidth[1] = 15;
2756     data.colWidth[2] = 58;
2757     data.cnt = 0;
2758     sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
2759     if( zErrMsg ){
2760       fprintf(stderr,"Error: %s\n", zErrMsg);
2761       sqlite3_free(zErrMsg);
2762       rc = 1;
2763     }
2764   }else
2765 
2766   if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2767     rc = shell_dbinfo_command(p, nArg, azArg);
2768   }else
2769 
2770   if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
2771     open_db(p, 0);
2772     /* When playing back a "dump", the content might appear in an order
2773     ** which causes immediate foreign key constraints to be violated.
2774     ** So disable foreign-key constraint enforcement to prevent problems. */
2775     if( nArg!=1 && nArg!=2 ){
2776       fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2777       rc = 1;
2778       goto meta_command_exit;
2779     }
2780     fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
2781     fprintf(p->out, "BEGIN TRANSACTION;\n");
2782     p->writableSchema = 0;
2783     sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
2784     p->nErr = 0;
2785     if( nArg==1 ){
2786       run_schema_dump_query(p,
2787         "SELECT name, type, sql FROM sqlite_master "
2788         "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
2789       );
2790       run_schema_dump_query(p,
2791         "SELECT name, type, sql FROM sqlite_master "
2792         "WHERE name=='sqlite_sequence'"
2793       );
2794       run_table_dump_query(p,
2795         "SELECT sql FROM sqlite_master "
2796         "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
2797       );
2798     }else{
2799       int i;
2800       for(i=1; i<nArg; i++){
2801         zShellStatic = azArg[i];
2802         run_schema_dump_query(p,
2803           "SELECT name, type, sql FROM sqlite_master "
2804           "WHERE tbl_name LIKE shellstatic() AND type=='table'"
2805           "  AND sql NOT NULL");
2806         run_table_dump_query(p,
2807           "SELECT sql FROM sqlite_master "
2808           "WHERE sql NOT NULL"
2809           "  AND type IN ('index','trigger','view')"
2810           "  AND tbl_name LIKE shellstatic()", 0
2811         );
2812         zShellStatic = 0;
2813       }
2814     }
2815     if( p->writableSchema ){
2816       fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
2817       p->writableSchema = 0;
2818     }
2819     sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2820     sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
2821     fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
2822   }else
2823 
2824   if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2825     if( nArg==2 ){
2826       p->echoOn = booleanValue(azArg[1]);
2827     }else{
2828       fprintf(stderr, "Usage: .echo on|off\n");
2829       rc = 1;
2830     }
2831   }else
2832 
2833   if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2834     if( nArg==2 ){
2835       p->autoEQP = booleanValue(azArg[1]);
2836     }else{
2837       fprintf(stderr, "Usage: .eqp on|off\n");
2838       rc = 1;
2839     }
2840   }else
2841 
2842   if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
2843     if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
2844     rc = 2;
2845   }else
2846 
2847   if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
2848     int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
2849     if(val == 1) {
2850       if(!p->normalMode.valid) {
2851         p->normalMode.valid = 1;
2852         p->normalMode.mode = p->mode;
2853         p->normalMode.showHeader = p->showHeader;
2854         memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
2855       }
2856       /* We could put this code under the !p->explainValid
2857       ** condition so that it does not execute if we are already in
2858       ** explain mode. However, always executing it allows us an easy
2859       ** was to reset to explain mode in case the user previously
2860       ** did an .explain followed by a .width, .mode or .header
2861       ** command.
2862       */
2863       p->mode = MODE_Explain;
2864       p->showHeader = 1;
2865       memset(p->colWidth,0,sizeof(p->colWidth));
2866       p->colWidth[0] = 4;                  /* addr */
2867       p->colWidth[1] = 13;                 /* opcode */
2868       p->colWidth[2] = 4;                  /* P1 */
2869       p->colWidth[3] = 4;                  /* P2 */
2870       p->colWidth[4] = 4;                  /* P3 */
2871       p->colWidth[5] = 13;                 /* P4 */
2872       p->colWidth[6] = 2;                  /* P5 */
2873       p->colWidth[7] = 13;                  /* Comment */
2874     }else if (p->normalMode.valid) {
2875       p->normalMode.valid = 0;
2876       p->mode = p->normalMode.mode;
2877       p->showHeader = p->normalMode.showHeader;
2878       memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
2879     }
2880   }else
2881 
2882   if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
2883     ShellState data;
2884     char *zErrMsg = 0;
2885     int doStats = 0;
2886     if( nArg!=1 ){
2887       fprintf(stderr, "Usage: .fullschema\n");
2888       rc = 1;
2889       goto meta_command_exit;
2890     }
2891     open_db(p, 0);
2892     memcpy(&data, p, sizeof(data));
2893     data.showHeader = 0;
2894     data.mode = MODE_Semi;
2895     rc = sqlite3_exec(p->db,
2896        "SELECT sql FROM"
2897        "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2898        "     FROM sqlite_master UNION ALL"
2899        "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
2900        "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
2901        "ORDER BY rowid",
2902        callback, &data, &zErrMsg
2903     );
2904     if( rc==SQLITE_OK ){
2905       sqlite3_stmt *pStmt;
2906       rc = sqlite3_prepare_v2(p->db,
2907                "SELECT rowid FROM sqlite_master"
2908                " WHERE name GLOB 'sqlite_stat[134]'",
2909                -1, &pStmt, 0);
2910       doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2911       sqlite3_finalize(pStmt);
2912     }
2913     if( doStats==0 ){
2914       fprintf(p->out, "/* No STAT tables available */\n");
2915     }else{
2916       fprintf(p->out, "ANALYZE sqlite_master;\n");
2917       sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2918                    callback, &data, &zErrMsg);
2919       data.mode = MODE_Insert;
2920       data.zDestTable = "sqlite_stat1";
2921       shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2922                  shell_callback, &data,&zErrMsg);
2923       data.zDestTable = "sqlite_stat3";
2924       shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2925                  shell_callback, &data,&zErrMsg);
2926       data.zDestTable = "sqlite_stat4";
2927       shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2928                  shell_callback, &data, &zErrMsg);
2929       fprintf(p->out, "ANALYZE sqlite_master;\n");
2930     }
2931   }else
2932 
2933   if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2934     if( nArg==2 ){
2935       p->showHeader = booleanValue(azArg[1]);
2936     }else{
2937       fprintf(stderr, "Usage: .headers on|off\n");
2938       rc = 1;
2939     }
2940   }else
2941 
2942   if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2943     fprintf(p->out, "%s", zHelp);
2944   }else
2945 
2946   if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
2947     char *zTable;               /* Insert data into this table */
2948     char *zFile;                /* Name of file to extra content from */
2949     sqlite3_stmt *pStmt = NULL; /* A statement */
2950     int nCol;                   /* Number of columns in the table */
2951     int nByte;                  /* Number of bytes in an SQL string */
2952     int i, j;                   /* Loop counters */
2953     int needCommit;             /* True to COMMIT or ROLLBACK at end */
2954     int nSep;                   /* Number of bytes in p->colSeparator[] */
2955     char *zSql;                 /* An SQL statement */
2956     ImportCtx sCtx;             /* Reader context */
2957     char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
2958     int (SQLITE_CDECL *xCloser)(FILE*);      /* Func to close file */
2959 
2960     if( nArg!=3 ){
2961       fprintf(stderr, "Usage: .import FILE TABLE\n");
2962       goto meta_command_exit;
2963     }
2964     zFile = azArg[1];
2965     zTable = azArg[2];
2966     seenInterrupt = 0;
2967     memset(&sCtx, 0, sizeof(sCtx));
2968     open_db(p, 0);
2969     nSep = strlen30(p->colSeparator);
2970     if( nSep==0 ){
2971       fprintf(stderr, "Error: non-null column separator required for import\n");
2972       return 1;
2973     }
2974     if( nSep>1 ){
2975       fprintf(stderr, "Error: multi-character column separators not allowed"
2976                       " for import\n");
2977       return 1;
2978     }
2979     nSep = strlen30(p->rowSeparator);
2980     if( nSep==0 ){
2981       fprintf(stderr, "Error: non-null row separator required for import\n");
2982       return 1;
2983     }
2984     if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
2985       /* When importing CSV (only), if the row separator is set to the
2986       ** default output row separator, change it to the default input
2987       ** row separator.  This avoids having to maintain different input
2988       ** and output row separators. */
2989       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
2990       nSep = strlen30(p->rowSeparator);
2991     }
2992     if( nSep>1 ){
2993       fprintf(stderr, "Error: multi-character row separators not allowed"
2994                       " for import\n");
2995       return 1;
2996     }
2997     sCtx.zFile = zFile;
2998     sCtx.nLine = 1;
2999     if( sCtx.zFile[0]=='|' ){
3000 #ifdef SQLITE_OMIT_POPEN
3001       fprintf(stderr, "Error: pipes are not supported in this OS\n");
3002       return 1;
3003 #else
3004       sCtx.in = popen(sCtx.zFile+1, "r");
3005       sCtx.zFile = "<pipe>";
3006       xCloser = pclose;
3007 #endif
3008     }else{
3009       sCtx.in = fopen(sCtx.zFile, "rb");
3010       xCloser = fclose;
3011     }
3012     if( p->mode==MODE_Ascii ){
3013       xRead = ascii_read_one_field;
3014     }else{
3015       xRead = csv_read_one_field;
3016     }
3017     if( sCtx.in==0 ){
3018       fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
3019       return 1;
3020     }
3021     sCtx.cColSep = p->colSeparator[0];
3022     sCtx.cRowSep = p->rowSeparator[0];
3023     zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
3024     if( zSql==0 ){
3025       fprintf(stderr, "Error: out of memory\n");
3026       xCloser(sCtx.in);
3027       return 1;
3028     }
3029     nByte = strlen30(zSql);
3030     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3031     import_append_char(&sCtx, 0);    /* To ensure sCtx.z is allocated */
3032     if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
3033       char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
3034       char cSep = '(';
3035       while( xRead(&sCtx) ){
3036         zCreate = sqlite3_mprintf("%z%c\n  \"%s\" TEXT", zCreate, cSep, sCtx.z);
3037         cSep = ',';
3038         if( sCtx.cTerm!=sCtx.cColSep ) break;
3039       }
3040       if( cSep=='(' ){
3041         sqlite3_free(zCreate);
3042         sqlite3_free(sCtx.z);
3043         xCloser(sCtx.in);
3044         fprintf(stderr,"%s: empty file\n", sCtx.zFile);
3045         return 1;
3046       }
3047       zCreate = sqlite3_mprintf("%z\n)", zCreate);
3048       rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3049       sqlite3_free(zCreate);
3050       if( rc ){
3051         fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
3052                 sqlite3_errmsg(p->db));
3053         sqlite3_free(sCtx.z);
3054         xCloser(sCtx.in);
3055         return 1;
3056       }
3057       rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3058     }
3059     sqlite3_free(zSql);
3060     if( rc ){
3061       if (pStmt) sqlite3_finalize(pStmt);
3062       fprintf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
3063       xCloser(sCtx.in);
3064       return 1;
3065     }
3066     nCol = sqlite3_column_count(pStmt);
3067     sqlite3_finalize(pStmt);
3068     pStmt = 0;
3069     if( nCol==0 ) return 0; /* no columns, no error */
3070     zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
3071     if( zSql==0 ){
3072       fprintf(stderr, "Error: out of memory\n");
3073       xCloser(sCtx.in);
3074       return 1;
3075     }
3076     sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
3077     j = strlen30(zSql);
3078     for(i=1; i<nCol; i++){
3079       zSql[j++] = ',';
3080       zSql[j++] = '?';
3081     }
3082     zSql[j++] = ')';
3083     zSql[j] = 0;
3084     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3085     sqlite3_free(zSql);
3086     if( rc ){
3087       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3088       if (pStmt) sqlite3_finalize(pStmt);
3089       xCloser(sCtx.in);
3090       return 1;
3091     }
3092     needCommit = sqlite3_get_autocommit(p->db);
3093     if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
3094     do{
3095       int startLine = sCtx.nLine;
3096       for(i=0; i<nCol; i++){
3097         char *z = xRead(&sCtx);
3098         /*
3099         ** Did we reach end-of-file before finding any columns?
3100         ** If so, stop instead of NULL filling the remaining columns.
3101         */
3102         if( z==0 && i==0 ) break;
3103         /*
3104         ** Did we reach end-of-file OR end-of-line before finding any
3105         ** columns in ASCII mode?  If so, stop instead of NULL filling
3106         ** the remaining columns.
3107         */
3108         if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
3109         sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
3110         if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
3111           fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3112                           "filling the rest with NULL\n",
3113                           sCtx.zFile, startLine, nCol, i+1);
3114           i += 2;
3115           while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
3116         }
3117       }
3118       if( sCtx.cTerm==sCtx.cColSep ){
3119         do{
3120           xRead(&sCtx);
3121           i++;
3122         }while( sCtx.cTerm==sCtx.cColSep );
3123         fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3124                         "extras ignored\n",
3125                         sCtx.zFile, startLine, nCol, i);
3126       }
3127       if( i>=nCol ){
3128         sqlite3_step(pStmt);
3129         rc = sqlite3_reset(pStmt);
3130         if( rc!=SQLITE_OK ){
3131           fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
3132                   sqlite3_errmsg(p->db));
3133         }
3134       }
3135     }while( sCtx.cTerm!=EOF );
3136 
3137     xCloser(sCtx.in);
3138     sqlite3_free(sCtx.z);
3139     sqlite3_finalize(pStmt);
3140     if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
3141   }else
3142 
3143   if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3144                  || strncmp(azArg[0], "indexes", n)==0) ){
3145     ShellState data;
3146     char *zErrMsg = 0;
3147     open_db(p, 0);
3148     memcpy(&data, p, sizeof(data));
3149     data.showHeader = 0;
3150     data.mode = MODE_List;
3151     if( nArg==1 ){
3152       rc = sqlite3_exec(p->db,
3153         "SELECT name FROM sqlite_master "
3154         "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3155         "UNION ALL "
3156         "SELECT name FROM sqlite_temp_master "
3157         "WHERE type='index' "
3158         "ORDER BY 1",
3159         callback, &data, &zErrMsg
3160       );
3161     }else if( nArg==2 ){
3162       zShellStatic = azArg[1];
3163       rc = sqlite3_exec(p->db,
3164         "SELECT name FROM sqlite_master "
3165         "WHERE type='index' AND tbl_name LIKE shellstatic() "
3166         "UNION ALL "
3167         "SELECT name FROM sqlite_temp_master "
3168         "WHERE type='index' AND tbl_name LIKE shellstatic() "
3169         "ORDER BY 1",
3170         callback, &data, &zErrMsg
3171       );
3172       zShellStatic = 0;
3173     }else{
3174       fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
3175       rc = 1;
3176       goto meta_command_exit;
3177     }
3178     if( zErrMsg ){
3179       fprintf(stderr,"Error: %s\n", zErrMsg);
3180       sqlite3_free(zErrMsg);
3181       rc = 1;
3182     }else if( rc != SQLITE_OK ){
3183       fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3184       rc = 1;
3185     }
3186   }else
3187 
3188 #ifdef SQLITE_ENABLE_IOTRACE
3189   if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
3190     SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
3191     if( iotrace && iotrace!=stdout ) fclose(iotrace);
3192     iotrace = 0;
3193     if( nArg<2 ){
3194       sqlite3IoTrace = 0;
3195     }else if( strcmp(azArg[1], "-")==0 ){
3196       sqlite3IoTrace = iotracePrintf;
3197       iotrace = stdout;
3198     }else{
3199       iotrace = fopen(azArg[1], "w");
3200       if( iotrace==0 ){
3201         fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
3202         sqlite3IoTrace = 0;
3203         rc = 1;
3204       }else{
3205         sqlite3IoTrace = iotracePrintf;
3206       }
3207     }
3208   }else
3209 #endif
3210   if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
3211     static const struct {
3212        const char *zLimitName;   /* Name of a limit */
3213        int limitCode;            /* Integer code for that limit */
3214     } aLimit[] = {
3215       { "length",                SQLITE_LIMIT_LENGTH                    },
3216       { "sql_length",            SQLITE_LIMIT_SQL_LENGTH                },
3217       { "column",                SQLITE_LIMIT_COLUMN                    },
3218       { "expr_depth",            SQLITE_LIMIT_EXPR_DEPTH                },
3219       { "compound_select",       SQLITE_LIMIT_COMPOUND_SELECT           },
3220       { "vdbe_op",               SQLITE_LIMIT_VDBE_OP                   },
3221       { "function_arg",          SQLITE_LIMIT_FUNCTION_ARG              },
3222       { "attached",              SQLITE_LIMIT_ATTACHED                  },
3223       { "like_pattern_length",   SQLITE_LIMIT_LIKE_PATTERN_LENGTH       },
3224       { "variable_number",       SQLITE_LIMIT_VARIABLE_NUMBER           },
3225       { "trigger_depth",         SQLITE_LIMIT_TRIGGER_DEPTH             },
3226       { "worker_threads",        SQLITE_LIMIT_WORKER_THREADS            },
3227     };
3228     int i, n2;
3229     open_db(p, 0);
3230     if( nArg==1 ){
3231       for(i=0; i<sizeof(aLimit)/sizeof(aLimit[0]); i++){
3232         printf("%20s %d\n", aLimit[i].zLimitName,
3233                sqlite3_limit(p->db, aLimit[i].limitCode, -1));
3234       }
3235     }else if( nArg>3 ){
3236       fprintf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
3237       rc = 1;
3238       goto meta_command_exit;
3239     }else{
3240       int iLimit = -1;
3241       n2 = strlen30(azArg[1]);
3242       for(i=0; i<sizeof(aLimit)/sizeof(aLimit[0]); i++){
3243         if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
3244           if( iLimit<0 ){
3245             iLimit = i;
3246           }else{
3247             fprintf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
3248             rc = 1;
3249             goto meta_command_exit;
3250           }
3251         }
3252       }
3253       if( iLimit<0 ){
3254         fprintf(stderr, "unknown limit: \"%s\"\n"
3255                         "enter \".limits\" with no arguments for a list.\n",
3256                          azArg[1]);
3257         rc = 1;
3258         goto meta_command_exit;
3259       }
3260       if( nArg==3 ){
3261         sqlite3_limit(p->db, aLimit[iLimit].limitCode,
3262                       (int)integerValue(azArg[2]));
3263       }
3264       printf("%20s %d\n", aLimit[iLimit].zLimitName,
3265              sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
3266     }
3267   }else
3268 
3269 #ifndef SQLITE_OMIT_LOAD_EXTENSION
3270   if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
3271     const char *zFile, *zProc;
3272     char *zErrMsg = 0;
3273     if( nArg<2 ){
3274       fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3275       rc = 1;
3276       goto meta_command_exit;
3277     }
3278     zFile = azArg[1];
3279     zProc = nArg>=3 ? azArg[2] : 0;
3280     open_db(p, 0);
3281     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3282     if( rc!=SQLITE_OK ){
3283       fprintf(stderr, "Error: %s\n", zErrMsg);
3284       sqlite3_free(zErrMsg);
3285       rc = 1;
3286     }
3287   }else
3288 #endif
3289 
3290   if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3291     if( nArg!=2 ){
3292       fprintf(stderr, "Usage: .log FILENAME\n");
3293       rc = 1;
3294     }else{
3295       const char *zFile = azArg[1];
3296       output_file_close(p->pLog);
3297       p->pLog = output_file_open(zFile);
3298     }
3299   }else
3300 
3301   if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3302     const char *zMode = nArg>=2 ? azArg[1] : "";
3303     int n2 = (int)strlen(zMode);
3304     int c2 = zMode[0];
3305     if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
3306       p->mode = MODE_Line;
3307     }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
3308       p->mode = MODE_Column;
3309     }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
3310       p->mode = MODE_List;
3311     }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
3312       p->mode = MODE_Html;
3313     }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
3314       p->mode = MODE_Tcl;
3315       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
3316     }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
3317       p->mode = MODE_Csv;
3318       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
3319       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
3320     }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
3321       p->mode = MODE_List;
3322       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
3323     }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
3324       p->mode = MODE_Insert;
3325       set_table_name(p, nArg>=3 ? azArg[2] : "table");
3326     }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3327       p->mode = MODE_Ascii;
3328       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3329       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
3330     }else {
3331       fprintf(stderr,"Error: mode should be one of: "
3332          "ascii column csv html insert line list tabs tcl\n");
3333       rc = 1;
3334     }
3335   }else
3336 
3337   if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3338     if( nArg==2 ){
3339       sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3340                        "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
3341     }else{
3342       fprintf(stderr, "Usage: .nullvalue STRING\n");
3343       rc = 1;
3344     }
3345   }else
3346 
3347   if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3348     sqlite3 *savedDb = p->db;
3349     const char *zSavedFilename = p->zDbFilename;
3350     char *zNewFilename = 0;
3351     p->db = 0;
3352     if( nArg>=2 ){
3353       p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3354     }
3355     open_db(p, 1);
3356     if( p->db!=0 ){
3357       sqlite3_close(savedDb);
3358       sqlite3_free(p->zFreeOnClose);
3359       p->zFreeOnClose = zNewFilename;
3360     }else{
3361       sqlite3_free(zNewFilename);
3362       p->db = savedDb;
3363       p->zDbFilename = zSavedFilename;
3364     }
3365   }else
3366 
3367   if( c=='o'
3368    && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3369   ){
3370     const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3371     if( nArg>2 ){
3372       fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3373       rc = 1;
3374       goto meta_command_exit;
3375     }
3376     if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3377       if( nArg<2 ){
3378         fprintf(stderr, "Usage: .once FILE\n");
3379         rc = 1;
3380         goto meta_command_exit;
3381       }
3382       p->outCount = 2;
3383     }else{
3384       p->outCount = 0;
3385     }
3386     output_reset(p);
3387     if( zFile[0]=='|' ){
3388 #ifdef SQLITE_OMIT_POPEN
3389       fprintf(stderr,"Error: pipes are not supported in this OS\n");
3390       rc = 1;
3391       p->out = stdout;
3392 #else
3393       p->out = popen(zFile + 1, "w");
3394       if( p->out==0 ){
3395         fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
3396         p->out = stdout;
3397         rc = 1;
3398       }else{
3399         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3400       }
3401 #endif
3402     }else{
3403       p->out = output_file_open(zFile);
3404       if( p->out==0 ){
3405         if( strcmp(zFile,"off")!=0 ){
3406           fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
3407         }
3408         p->out = stdout;
3409         rc = 1;
3410       } else {
3411         sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
3412       }
3413     }
3414   }else
3415 
3416   if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3417     int i;
3418     for(i=1; i<nArg; i++){
3419       if( i>1 ) fprintf(p->out, " ");
3420       fprintf(p->out, "%s", azArg[i]);
3421     }
3422     fprintf(p->out, "\n");
3423   }else
3424 
3425   if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
3426     if( nArg >= 2) {
3427       strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3428     }
3429     if( nArg >= 3) {
3430       strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3431     }
3432   }else
3433 
3434   if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
3435     rc = 2;
3436   }else
3437 
3438   if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3439     FILE *alt;
3440     if( nArg!=2 ){
3441       fprintf(stderr, "Usage: .read FILE\n");
3442       rc = 1;
3443       goto meta_command_exit;
3444     }
3445     alt = fopen(azArg[1], "rb");
3446     if( alt==0 ){
3447       fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3448       rc = 1;
3449     }else{
3450       rc = process_input(p, alt);
3451       fclose(alt);
3452     }
3453   }else
3454 
3455   if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
3456     const char *zSrcFile;
3457     const char *zDb;
3458     sqlite3 *pSrc;
3459     sqlite3_backup *pBackup;
3460     int nTimeout = 0;
3461 
3462     if( nArg==2 ){
3463       zSrcFile = azArg[1];
3464       zDb = "main";
3465     }else if( nArg==3 ){
3466       zSrcFile = azArg[2];
3467       zDb = azArg[1];
3468     }else{
3469       fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3470       rc = 1;
3471       goto meta_command_exit;
3472     }
3473     rc = sqlite3_open(zSrcFile, &pSrc);
3474     if( rc!=SQLITE_OK ){
3475       fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
3476       sqlite3_close(pSrc);
3477       return 1;
3478     }
3479     open_db(p, 0);
3480     pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3481     if( pBackup==0 ){
3482       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3483       sqlite3_close(pSrc);
3484       return 1;
3485     }
3486     while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3487           || rc==SQLITE_BUSY  ){
3488       if( rc==SQLITE_BUSY ){
3489         if( nTimeout++ >= 3 ) break;
3490         sqlite3_sleep(100);
3491       }
3492     }
3493     sqlite3_backup_finish(pBackup);
3494     if( rc==SQLITE_DONE ){
3495       rc = 0;
3496     }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
3497       fprintf(stderr, "Error: source database is busy\n");
3498       rc = 1;
3499     }else{
3500       fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3501       rc = 1;
3502     }
3503     sqlite3_close(pSrc);
3504   }else
3505 
3506 
3507   if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3508     if( nArg==2 ){
3509       p->scanstatsOn = booleanValue(azArg[1]);
3510 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3511       fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3512 #endif
3513     }else{
3514       fprintf(stderr, "Usage: .scanstats on|off\n");
3515       rc = 1;
3516     }
3517   }else
3518 
3519   if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
3520     ShellState data;
3521     char *zErrMsg = 0;
3522     open_db(p, 0);
3523     memcpy(&data, p, sizeof(data));
3524     data.showHeader = 0;
3525     data.mode = MODE_Semi;
3526     if( nArg==2 ){
3527       int i;
3528       for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
3529       if( strcmp(azArg[1],"sqlite_master")==0 ){
3530         char *new_argv[2], *new_colv[2];
3531         new_argv[0] = "CREATE TABLE sqlite_master (\n"
3532                       "  type text,\n"
3533                       "  name text,\n"
3534                       "  tbl_name text,\n"
3535                       "  rootpage integer,\n"
3536                       "  sql text\n"
3537                       ")";
3538         new_argv[1] = 0;
3539         new_colv[0] = "sql";
3540         new_colv[1] = 0;
3541         callback(&data, 1, new_argv, new_colv);
3542         rc = SQLITE_OK;
3543       }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
3544         char *new_argv[2], *new_colv[2];
3545         new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3546                       "  type text,\n"
3547                       "  name text,\n"
3548                       "  tbl_name text,\n"
3549                       "  rootpage integer,\n"
3550                       "  sql text\n"
3551                       ")";
3552         new_argv[1] = 0;
3553         new_colv[0] = "sql";
3554         new_colv[1] = 0;
3555         callback(&data, 1, new_argv, new_colv);
3556         rc = SQLITE_OK;
3557       }else{
3558         zShellStatic = azArg[1];
3559         rc = sqlite3_exec(p->db,
3560           "SELECT sql FROM "
3561           "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3562           "     FROM sqlite_master UNION ALL"
3563           "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
3564           "WHERE lower(tbl_name) LIKE shellstatic()"
3565           "  AND type!='meta' AND sql NOTNULL "
3566           "ORDER BY rowid",
3567           callback, &data, &zErrMsg);
3568         zShellStatic = 0;
3569       }
3570     }else if( nArg==1 ){
3571       rc = sqlite3_exec(p->db,
3572          "SELECT sql FROM "
3573          "  (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
3574          "     FROM sqlite_master UNION ALL"
3575          "   SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
3576          "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
3577          "ORDER BY rowid",
3578          callback, &data, &zErrMsg
3579       );
3580     }else{
3581       fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3582       rc = 1;
3583       goto meta_command_exit;
3584     }
3585     if( zErrMsg ){
3586       fprintf(stderr,"Error: %s\n", zErrMsg);
3587       sqlite3_free(zErrMsg);
3588       rc = 1;
3589     }else if( rc != SQLITE_OK ){
3590       fprintf(stderr,"Error: querying schema information\n");
3591       rc = 1;
3592     }else{
3593       rc = 0;
3594     }
3595   }else
3596 
3597 
3598 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3599   if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3600     extern int sqlite3SelectTrace;
3601     sqlite3SelectTrace = integerValue(azArg[1]);
3602   }else
3603 #endif
3604 
3605 
3606 #ifdef SQLITE_DEBUG
3607   /* Undocumented commands for internal testing.  Subject to change
3608   ** without notice. */
3609   if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3610     if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3611       int i, v;
3612       for(i=1; i<nArg; i++){
3613         v = booleanValue(azArg[i]);
3614         fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3615       }
3616     }
3617     if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3618       int i; sqlite3_int64 v;
3619       for(i=1; i<nArg; i++){
3620         char zBuf[200];
3621         v = integerValue(azArg[i]);
3622         sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
3623         fprintf(p->out, "%s", zBuf);
3624       }
3625     }
3626   }else
3627 #endif
3628 
3629   if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
3630     if( nArg<2 || nArg>3 ){
3631       fprintf(stderr, "Usage: .separator COL ?ROW?\n");
3632       rc = 1;
3633     }
3634     if( nArg>=2 ){
3635       sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
3636                        "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
3637     }
3638     if( nArg>=3 ){
3639       sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3640                        "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
3641     }
3642   }else
3643 
3644   if( c=='s'
3645    && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
3646   ){
3647     char *zCmd;
3648     int i, x;
3649     if( nArg<2 ){
3650       fprintf(stderr, "Usage: .system COMMAND\n");
3651       rc = 1;
3652       goto meta_command_exit;
3653     }
3654     zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
3655     for(i=2; i<nArg; i++){
3656       zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3657                              zCmd, azArg[i]);
3658     }
3659     x = system(zCmd);
3660     sqlite3_free(zCmd);
3661     if( x ) fprintf(stderr, "System command returns %d\n", x);
3662   }else
3663 
3664   if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
3665     int i;
3666     if( nArg!=1 ){
3667       fprintf(stderr, "Usage: .show\n");
3668       rc = 1;
3669       goto meta_command_exit;
3670     }
3671     fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3672     fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
3673     fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
3674     fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3675     fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3676     fprintf(p->out,"%12.12s: ", "nullvalue");
3677       output_c_string(p->out, p->nullValue);
3678       fprintf(p->out, "\n");
3679     fprintf(p->out,"%12.12s: %s\n","output",
3680             strlen30(p->outfile) ? p->outfile : "stdout");
3681     fprintf(p->out,"%12.12s: ", "colseparator");
3682       output_c_string(p->out, p->colSeparator);
3683       fprintf(p->out, "\n");
3684     fprintf(p->out,"%12.12s: ", "rowseparator");
3685       output_c_string(p->out, p->rowSeparator);
3686       fprintf(p->out, "\n");
3687     fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3688     fprintf(p->out,"%12.12s: ","width");
3689     for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
3690       fprintf(p->out,"%d ",p->colWidth[i]);
3691     }
3692     fprintf(p->out,"\n");
3693   }else
3694 
3695   if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3696     if( nArg==2 ){
3697       p->statsOn = booleanValue(azArg[1]);
3698     }else{
3699       fprintf(stderr, "Usage: .stats on|off\n");
3700       rc = 1;
3701     }
3702   }else
3703 
3704   if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
3705     sqlite3_stmt *pStmt;
3706     char **azResult;
3707     int nRow, nAlloc;
3708     char *zSql = 0;
3709     int ii;
3710     open_db(p, 0);
3711     rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3712     if( rc ) return rc;
3713     zSql = sqlite3_mprintf(
3714         "SELECT name FROM sqlite_master"
3715         " WHERE type IN ('table','view')"
3716         "   AND name NOT LIKE 'sqlite_%%'"
3717         "   AND name LIKE ?1");
3718     while( sqlite3_step(pStmt)==SQLITE_ROW ){
3719       const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3720       if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3721       if( strcmp(zDbName,"temp")==0 ){
3722         zSql = sqlite3_mprintf(
3723                  "%z UNION ALL "
3724                  "SELECT 'temp.' || name FROM sqlite_temp_master"
3725                  " WHERE type IN ('table','view')"
3726                  "   AND name NOT LIKE 'sqlite_%%'"
3727                  "   AND name LIKE ?1", zSql);
3728       }else{
3729         zSql = sqlite3_mprintf(
3730                  "%z UNION ALL "
3731                  "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3732                  " WHERE type IN ('table','view')"
3733                  "   AND name NOT LIKE 'sqlite_%%'"
3734                  "   AND name LIKE ?1", zSql, zDbName, zDbName);
3735       }
3736     }
3737     sqlite3_finalize(pStmt);
3738     zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3739     rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3740     sqlite3_free(zSql);
3741     if( rc ) return rc;
3742     nRow = nAlloc = 0;
3743     azResult = 0;
3744     if( nArg>1 ){
3745       sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
3746     }else{
3747       sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3748     }
3749     while( sqlite3_step(pStmt)==SQLITE_ROW ){
3750       if( nRow>=nAlloc ){
3751         char **azNew;
3752         int n2 = nAlloc*2 + 10;
3753         azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
3754         if( azNew==0 ){
3755           fprintf(stderr, "Error: out of memory\n");
3756           break;
3757         }
3758         nAlloc = n2;
3759         azResult = azNew;
3760       }
3761       azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3762       if( azResult[nRow] ) nRow++;
3763     }
3764     sqlite3_finalize(pStmt);
3765     if( nRow>0 ){
3766       int len, maxlen = 0;
3767       int i, j;
3768       int nPrintCol, nPrintRow;
3769       for(i=0; i<nRow; i++){
3770         len = strlen30(azResult[i]);
3771         if( len>maxlen ) maxlen = len;
3772       }
3773       nPrintCol = 80/(maxlen+2);
3774       if( nPrintCol<1 ) nPrintCol = 1;
3775       nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3776       for(i=0; i<nPrintRow; i++){
3777         for(j=i; j<nRow; j+=nPrintRow){
3778           char *zSp = j<nPrintRow ? "" : "  ";
3779           fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
3780         }
3781         fprintf(p->out, "\n");
3782       }
3783     }
3784     for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3785     sqlite3_free(azResult);
3786   }else
3787 
3788   if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
3789     static const struct {
3790        const char *zCtrlName;   /* Name of a test-control option */
3791        int ctrlCode;            /* Integer code for that option */
3792     } aCtrl[] = {
3793       { "prng_save",             SQLITE_TESTCTRL_PRNG_SAVE              },
3794       { "prng_restore",          SQLITE_TESTCTRL_PRNG_RESTORE           },
3795       { "prng_reset",            SQLITE_TESTCTRL_PRNG_RESET             },
3796       { "bitvec_test",           SQLITE_TESTCTRL_BITVEC_TEST            },
3797       { "fault_install",         SQLITE_TESTCTRL_FAULT_INSTALL          },
3798       { "benign_malloc_hooks",   SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS    },
3799       { "pending_byte",          SQLITE_TESTCTRL_PENDING_BYTE           },
3800       { "assert",                SQLITE_TESTCTRL_ASSERT                 },
3801       { "always",                SQLITE_TESTCTRL_ALWAYS                 },
3802       { "reserve",               SQLITE_TESTCTRL_RESERVE                },
3803       { "optimizations",         SQLITE_TESTCTRL_OPTIMIZATIONS          },
3804       { "iskeyword",             SQLITE_TESTCTRL_ISKEYWORD              },
3805       { "scratchmalloc",         SQLITE_TESTCTRL_SCRATCHMALLOC          },
3806       { "byteorder",             SQLITE_TESTCTRL_BYTEORDER              },
3807       { "never_corrupt",         SQLITE_TESTCTRL_NEVER_CORRUPT          },
3808       { "imposter",              SQLITE_TESTCTRL_IMPOSTER               },
3809     };
3810     int testctrl = -1;
3811     int rc2 = 0;
3812     int i, n2;
3813     open_db(p, 0);
3814 
3815     /* convert testctrl text option to value. allow any unique prefix
3816     ** of the option name, or a numerical value. */
3817     n2 = strlen30(azArg[1]);
3818     for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
3819       if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
3820         if( testctrl<0 ){
3821           testctrl = aCtrl[i].ctrlCode;
3822         }else{
3823           fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
3824           testctrl = -1;
3825           break;
3826         }
3827       }
3828     }
3829     if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
3830     if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3831       fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3832     }else{
3833       switch(testctrl){
3834 
3835         /* sqlite3_test_control(int, db, int) */
3836         case SQLITE_TESTCTRL_OPTIMIZATIONS:
3837         case SQLITE_TESTCTRL_RESERVE:
3838           if( nArg==3 ){
3839             int opt = (int)strtol(azArg[2], 0, 0);
3840             rc2 = sqlite3_test_control(testctrl, p->db, opt);
3841             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3842           } else {
3843             fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3844                     azArg[1]);
3845           }
3846           break;
3847 
3848         /* sqlite3_test_control(int) */
3849         case SQLITE_TESTCTRL_PRNG_SAVE:
3850         case SQLITE_TESTCTRL_PRNG_RESTORE:
3851         case SQLITE_TESTCTRL_PRNG_RESET:
3852         case SQLITE_TESTCTRL_BYTEORDER:
3853           if( nArg==2 ){
3854             rc2 = sqlite3_test_control(testctrl);
3855             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3856           } else {
3857             fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3858           }
3859           break;
3860 
3861         /* sqlite3_test_control(int, uint) */
3862         case SQLITE_TESTCTRL_PENDING_BYTE:
3863           if( nArg==3 ){
3864             unsigned int opt = (unsigned int)integerValue(azArg[2]);
3865             rc2 = sqlite3_test_control(testctrl, opt);
3866             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3867           } else {
3868             fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3869                            " int option\n", azArg[1]);
3870           }
3871           break;
3872 
3873         /* sqlite3_test_control(int, int) */
3874         case SQLITE_TESTCTRL_ASSERT:
3875         case SQLITE_TESTCTRL_ALWAYS:
3876         case SQLITE_TESTCTRL_NEVER_CORRUPT:
3877           if( nArg==3 ){
3878             int opt = booleanValue(azArg[2]);
3879             rc2 = sqlite3_test_control(testctrl, opt);
3880             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3881           } else {
3882             fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3883                             azArg[1]);
3884           }
3885           break;
3886 
3887         /* sqlite3_test_control(int, char *) */
3888 #ifdef SQLITE_N_KEYWORD
3889         case SQLITE_TESTCTRL_ISKEYWORD:
3890           if( nArg==3 ){
3891             const char *opt = azArg[2];
3892             rc2 = sqlite3_test_control(testctrl, opt);
3893             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3894           } else {
3895             fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3896                             azArg[1]);
3897           }
3898           break;
3899 #endif
3900 
3901         case SQLITE_TESTCTRL_IMPOSTER:
3902           if( nArg==5 ){
3903             rc2 = sqlite3_test_control(testctrl, p->db,
3904                           azArg[2],
3905                           integerValue(azArg[3]),
3906                           integerValue(azArg[4]));
3907             fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
3908           }else{
3909             fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
3910           }
3911           break;
3912 
3913         case SQLITE_TESTCTRL_BITVEC_TEST:
3914         case SQLITE_TESTCTRL_FAULT_INSTALL:
3915         case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3916         case SQLITE_TESTCTRL_SCRATCHMALLOC:
3917         default:
3918           fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3919                   azArg[1]);
3920           break;
3921       }
3922     }
3923   }else
3924 
3925   if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
3926     open_db(p, 0);
3927     sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
3928   }else
3929 
3930   if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3931     if( nArg==2 ){
3932       enableTimer = booleanValue(azArg[1]);
3933       if( enableTimer && !HAS_TIMER ){
3934         fprintf(stderr, "Error: timer not available on this system.\n");
3935         enableTimer = 0;
3936       }
3937     }else{
3938       fprintf(stderr, "Usage: .timer on|off\n");
3939       rc = 1;
3940     }
3941   }else
3942 
3943   if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
3944     open_db(p, 0);
3945     if( nArg!=2 ){
3946       fprintf(stderr, "Usage: .trace FILE|off\n");
3947       rc = 1;
3948       goto meta_command_exit;
3949     }
3950     output_file_close(p->traceOut);
3951     p->traceOut = output_file_open(azArg[1]);
3952 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3953     if( p->traceOut==0 ){
3954       sqlite3_trace(p->db, 0, 0);
3955     }else{
3956       sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3957     }
3958 #endif
3959   }else
3960 
3961 #if SQLITE_USER_AUTHENTICATION
3962   if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3963     if( nArg<2 ){
3964       fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3965       rc = 1;
3966       goto meta_command_exit;
3967     }
3968     open_db(p, 0);
3969     if( strcmp(azArg[1],"login")==0 ){
3970       if( nArg!=4 ){
3971         fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3972         rc = 1;
3973         goto meta_command_exit;
3974       }
3975       rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3976                                     (int)strlen(azArg[3]));
3977       if( rc ){
3978         fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3979         rc = 1;
3980       }
3981     }else if( strcmp(azArg[1],"add")==0 ){
3982       if( nArg!=5 ){
3983         fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
3984         rc = 1;
3985         goto meta_command_exit;
3986       }
3987       rc = sqlite3_user_add(p->db, azArg[2],
3988                             azArg[3], (int)strlen(azArg[3]),
3989                             booleanValue(azArg[4]));
3990       if( rc ){
3991         fprintf(stderr, "User-Add failed: %d\n", rc);
3992         rc = 1;
3993       }
3994     }else if( strcmp(azArg[1],"edit")==0 ){
3995       if( nArg!=5 ){
3996         fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
3997         rc = 1;
3998         goto meta_command_exit;
3999       }
4000       rc = sqlite3_user_change(p->db, azArg[2],
4001                               azArg[3], (int)strlen(azArg[3]),
4002                               booleanValue(azArg[4]));
4003       if( rc ){
4004         fprintf(stderr, "User-Edit failed: %d\n", rc);
4005         rc = 1;
4006       }
4007     }else if( strcmp(azArg[1],"delete")==0 ){
4008       if( nArg!=3 ){
4009         fprintf(stderr, "Usage: .user delete USER\n");
4010         rc = 1;
4011         goto meta_command_exit;
4012       }
4013       rc = sqlite3_user_delete(p->db, azArg[2]);
4014       if( rc ){
4015         fprintf(stderr, "User-Delete failed: %d\n", rc);
4016         rc = 1;
4017       }
4018     }else{
4019       fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
4020       rc = 1;
4021       goto meta_command_exit;
4022     }
4023   }else
4024 #endif /* SQLITE_USER_AUTHENTICATION */
4025 
4026   if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
4027     fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
4028         sqlite3_libversion(), sqlite3_sourceid());
4029   }else
4030 
4031   if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
4032     const char *zDbName = nArg==2 ? azArg[1] : "main";
4033     char *zVfsName = 0;
4034     if( p->db ){
4035       sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
4036       if( zVfsName ){
4037         fprintf(p->out, "%s\n", zVfsName);
4038         sqlite3_free(zVfsName);
4039       }
4040     }
4041   }else
4042 
4043 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
4044   if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
4045     extern int sqlite3WhereTrace;
4046     sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
4047   }else
4048 #endif
4049 
4050   if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
4051     int j;
4052     assert( nArg<=ArraySize(azArg) );
4053     for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
4054       p->colWidth[j-1] = (int)integerValue(azArg[j]);
4055     }
4056   }else
4057 
4058   {
4059     fprintf(stderr, "Error: unknown command or invalid arguments: "
4060       " \"%s\". Enter \".help\" for help\n", azArg[0]);
4061     rc = 1;
4062   }
4063 
4064 meta_command_exit:
4065   if( p->outCount ){
4066     p->outCount--;
4067     if( p->outCount==0 ) output_reset(p);
4068   }
4069   return rc;
4070 }
4071 
4072 /*
4073 ** Return TRUE if a semicolon occurs anywhere in the first N characters
4074 ** of string z[].
4075 */
line_contains_semicolon(const char * z,int N)4076 static int line_contains_semicolon(const char *z, int N){
4077   int i;
4078   for(i=0; i<N; i++){  if( z[i]==';' ) return 1; }
4079   return 0;
4080 }
4081 
4082 /*
4083 ** Test to see if a line consists entirely of whitespace.
4084 */
_all_whitespace(const char * z)4085 static int _all_whitespace(const char *z){
4086   for(; *z; z++){
4087     if( IsSpace(z[0]) ) continue;
4088     if( *z=='/' && z[1]=='*' ){
4089       z += 2;
4090       while( *z && (*z!='*' || z[1]!='/') ){ z++; }
4091       if( *z==0 ) return 0;
4092       z++;
4093       continue;
4094     }
4095     if( *z=='-' && z[1]=='-' ){
4096       z += 2;
4097       while( *z && *z!='\n' ){ z++; }
4098       if( *z==0 ) return 1;
4099       continue;
4100     }
4101     return 0;
4102   }
4103   return 1;
4104 }
4105 
4106 /*
4107 ** Return TRUE if the line typed in is an SQL command terminator other
4108 ** than a semi-colon.  The SQL Server style "go" command is understood
4109 ** as is the Oracle "/".
4110 */
line_is_command_terminator(const char * zLine)4111 static int line_is_command_terminator(const char *zLine){
4112   while( IsSpace(zLine[0]) ){ zLine++; };
4113   if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4114     return 1;  /* Oracle */
4115   }
4116   if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
4117          && _all_whitespace(&zLine[2]) ){
4118     return 1;  /* SQL Server */
4119   }
4120   return 0;
4121 }
4122 
4123 /*
4124 ** Return true if zSql is a complete SQL statement.  Return false if it
4125 ** ends in the middle of a string literal or C-style comment.
4126 */
line_is_complete(char * zSql,int nSql)4127 static int line_is_complete(char *zSql, int nSql){
4128   int rc;
4129   if( zSql==0 ) return 1;
4130   zSql[nSql] = ';';
4131   zSql[nSql+1] = 0;
4132   rc = sqlite3_complete(zSql);
4133   zSql[nSql] = 0;
4134   return rc;
4135 }
4136 
4137 /*
4138 ** Read input from *in and process it.  If *in==0 then input
4139 ** is interactive - the user is typing it it.  Otherwise, input
4140 ** is coming from a file or device.  A prompt is issued and history
4141 ** is saved only if input is interactive.  An interrupt signal will
4142 ** cause this routine to exit immediately, unless input is interactive.
4143 **
4144 ** Return the number of errors.
4145 */
process_input(ShellState * p,FILE * in)4146 static int process_input(ShellState *p, FILE *in){
4147   char *zLine = 0;          /* A single input line */
4148   char *zSql = 0;           /* Accumulated SQL text */
4149   int nLine;                /* Length of current line */
4150   int nSql = 0;             /* Bytes of zSql[] used */
4151   int nAlloc = 0;           /* Allocated zSql[] space */
4152   int nSqlPrior = 0;        /* Bytes of zSql[] used by prior line */
4153   char *zErrMsg;            /* Error message returned */
4154   int rc;                   /* Error code */
4155   int errCnt = 0;           /* Number of errors seen */
4156   int lineno = 0;           /* Current line number */
4157   int startline = 0;        /* Line number for start of current input */
4158 
4159   while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4160     fflush(p->out);
4161     zLine = one_input_line(in, zLine, nSql>0);
4162     if( zLine==0 ){
4163       /* End of input */
4164       if( stdin_is_interactive ) printf("\n");
4165       break;
4166     }
4167     if( seenInterrupt ){
4168       if( in!=0 ) break;
4169       seenInterrupt = 0;
4170     }
4171     lineno++;
4172     if( nSql==0 && _all_whitespace(zLine) ){
4173       if( p->echoOn ) printf("%s\n", zLine);
4174       continue;
4175     }
4176     if( zLine && zLine[0]=='.' && nSql==0 ){
4177       if( p->echoOn ) printf("%s\n", zLine);
4178       rc = do_meta_command(zLine, p);
4179       if( rc==2 ){ /* exit requested */
4180         break;
4181       }else if( rc ){
4182         errCnt++;
4183       }
4184       continue;
4185     }
4186     if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
4187       memcpy(zLine,";",2);
4188     }
4189     nLine = strlen30(zLine);
4190     if( nSql+nLine+2>=nAlloc ){
4191       nAlloc = nSql+nLine+100;
4192       zSql = realloc(zSql, nAlloc);
4193       if( zSql==0 ){
4194         fprintf(stderr, "Error: out of memory\n");
4195         exit(1);
4196       }
4197     }
4198     nSqlPrior = nSql;
4199     if( nSql==0 ){
4200       int i;
4201       for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
4202       assert( nAlloc>0 && zSql!=0 );
4203       memcpy(zSql, zLine+i, nLine+1-i);
4204       startline = lineno;
4205       nSql = nLine-i;
4206     }else{
4207       zSql[nSql++] = '\n';
4208       memcpy(zSql+nSql, zLine, nLine+1);
4209       nSql += nLine;
4210     }
4211     if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
4212                 && sqlite3_complete(zSql) ){
4213       p->cnt = 0;
4214       open_db(p, 0);
4215       if( p->backslashOn ) resolve_backslashes(zSql);
4216       BEGIN_TIMER;
4217       rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
4218       END_TIMER;
4219       if( rc || zErrMsg ){
4220         char zPrefix[100];
4221         if( in!=0 || !stdin_is_interactive ){
4222           sqlite3_snprintf(sizeof(zPrefix), zPrefix,
4223                            "Error: near line %d:", startline);
4224         }else{
4225           sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
4226         }
4227         if( zErrMsg!=0 ){
4228           fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
4229           sqlite3_free(zErrMsg);
4230           zErrMsg = 0;
4231         }else{
4232           fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
4233         }
4234         errCnt++;
4235       }
4236       nSql = 0;
4237       if( p->outCount ){
4238         output_reset(p);
4239         p->outCount = 0;
4240       }
4241     }else if( nSql && _all_whitespace(zSql) ){
4242       if( p->echoOn ) printf("%s\n", zSql);
4243       nSql = 0;
4244     }
4245   }
4246   if( nSql ){
4247     if( !_all_whitespace(zSql) ){
4248       fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
4249       errCnt++;
4250     }
4251     free(zSql);
4252   }
4253   free(zLine);
4254   return errCnt>0;
4255 }
4256 
4257 /*
4258 ** Return a pathname which is the user's home directory.  A
4259 ** 0 return indicates an error of some kind.
4260 */
find_home_dir(void)4261 static char *find_home_dir(void){
4262   static char *home_dir = NULL;
4263   if( home_dir ) return home_dir;
4264 
4265 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4266      && !defined(__RTP__) && !defined(_WRS_KERNEL)
4267   {
4268     struct passwd *pwent;
4269     uid_t uid = getuid();
4270     if( (pwent=getpwuid(uid)) != NULL) {
4271       home_dir = pwent->pw_dir;
4272     }
4273   }
4274 #endif
4275 
4276 #if defined(_WIN32_WCE)
4277   /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4278    */
4279   home_dir = "/";
4280 #else
4281 
4282 #if defined(_WIN32) || defined(WIN32)
4283   if (!home_dir) {
4284     home_dir = getenv("USERPROFILE");
4285   }
4286 #endif
4287 
4288   if (!home_dir) {
4289     home_dir = getenv("HOME");
4290   }
4291 
4292 #if defined(_WIN32) || defined(WIN32)
4293   if (!home_dir) {
4294     char *zDrive, *zPath;
4295     int n;
4296     zDrive = getenv("HOMEDRIVE");
4297     zPath = getenv("HOMEPATH");
4298     if( zDrive && zPath ){
4299       n = strlen30(zDrive) + strlen30(zPath) + 1;
4300       home_dir = malloc( n );
4301       if( home_dir==0 ) return 0;
4302       sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4303       return home_dir;
4304     }
4305     home_dir = "c:\\";
4306   }
4307 #endif
4308 
4309 #endif /* !_WIN32_WCE */
4310 
4311   if( home_dir ){
4312     int n = strlen30(home_dir) + 1;
4313     char *z = malloc( n );
4314     if( z ) memcpy(z, home_dir, n);
4315     home_dir = z;
4316   }
4317 
4318   return home_dir;
4319 }
4320 
4321 /*
4322 ** Read input from the file given by sqliterc_override.  Or if that
4323 ** parameter is NULL, take input from ~/.sqliterc
4324 **
4325 ** Returns the number of errors.
4326 */
process_sqliterc(ShellState * p,const char * sqliterc_override)4327 static void process_sqliterc(
4328   ShellState *p,                  /* Configuration data */
4329   const char *sqliterc_override   /* Name of config file. NULL to use default */
4330 ){
4331   char *home_dir = NULL;
4332   const char *sqliterc = sqliterc_override;
4333   char *zBuf = 0;
4334   FILE *in = NULL;
4335 
4336   if (sqliterc == NULL) {
4337     home_dir = find_home_dir();
4338     if( home_dir==0 ){
4339       fprintf(stderr, "-- warning: cannot find home directory;"
4340                       " cannot read ~/.sqliterc\n");
4341       return;
4342     }
4343     sqlite3_initialize();
4344     zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4345     sqliterc = zBuf;
4346   }
4347   in = fopen(sqliterc,"rb");
4348   if( in ){
4349     if( stdin_is_interactive ){
4350       fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
4351     }
4352     process_input(p,in);
4353     fclose(in);
4354   }
4355   sqlite3_free(zBuf);
4356 }
4357 
4358 /*
4359 ** Show available command line options
4360 */
4361 static const char zOptions[] =
4362   "   -ascii               set output mode to 'ascii'\n"
4363   "   -bail                stop after hitting an error\n"
4364   "   -batch               force batch I/O\n"
4365   "   -column              set output mode to 'column'\n"
4366   "   -cmd COMMAND         run \"COMMAND\" before reading stdin\n"
4367   "   -csv                 set output mode to 'csv'\n"
4368   "   -echo                print commands before execution\n"
4369   "   -init FILENAME       read/process named file\n"
4370   "   -[no]header          turn headers on or off\n"
4371 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4372   "   -heap SIZE           Size of heap for memsys3 or memsys5\n"
4373 #endif
4374   "   -help                show this message\n"
4375   "   -html                set output mode to HTML\n"
4376   "   -interactive         force interactive I/O\n"
4377   "   -line                set output mode to 'line'\n"
4378   "   -list                set output mode to 'list'\n"
4379   "   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory\n"
4380   "   -mmap N              default mmap size set to N\n"
4381 #ifdef SQLITE_ENABLE_MULTIPLEX
4382   "   -multiplex           enable the multiplexor VFS\n"
4383 #endif
4384   "   -newline SEP         set output row separator. Default: '\\n'\n"
4385   "   -nullvalue TEXT      set text string for NULL values. Default ''\n"
4386   "   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory\n"
4387   "   -scratch SIZE N      use N slots of SZ bytes each for scratch memory\n"
4388   "   -separator SEP       set output column separator. Default: '|'\n"
4389   "   -stats               print memory stats before each finalize\n"
4390   "   -version             show SQLite version\n"
4391   "   -vfs NAME            use NAME as the default VFS\n"
4392 #ifdef SQLITE_ENABLE_VFSTRACE
4393   "   -vfstrace            enable tracing of all VFS calls\n"
4394 #endif
4395 ;
usage(int showDetail)4396 static void usage(int showDetail){
4397   fprintf(stderr,
4398       "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4399       "FILENAME is the name of an SQLite database. A new database is created\n"
4400       "if the file does not previously exist.\n", Argv0);
4401   if( showDetail ){
4402     fprintf(stderr, "OPTIONS include:\n%s", zOptions);
4403   }else{
4404     fprintf(stderr, "Use the -help option for additional information\n");
4405   }
4406   exit(1);
4407 }
4408 
4409 /*
4410 ** Initialize the state information in data
4411 */
main_init(ShellState * data)4412 static void main_init(ShellState *data) {
4413   memset(data, 0, sizeof(*data));
4414   data->mode = MODE_List;
4415   memcpy(data->colSeparator,SEP_Column, 2);
4416   memcpy(data->rowSeparator,SEP_Row, 2);
4417   data->showHeader = 0;
4418   data->shellFlgs = SHFLG_Lookaside;
4419   sqlite3_config(SQLITE_CONFIG_URI, 1);
4420   sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
4421   sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
4422   sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4423   sqlite3_snprintf(sizeof(continuePrompt), continuePrompt,"   ...> ");
4424 }
4425 
4426 /*
4427 ** Output text to the console in a font that attracts extra attention.
4428 */
4429 #ifdef _WIN32
printBold(const char * zText)4430 static void printBold(const char *zText){
4431   HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4432   CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4433   GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4434   SetConsoleTextAttribute(out,
4435          FOREGROUND_RED|FOREGROUND_INTENSITY
4436   );
4437   printf("%s", zText);
4438   SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
4439 }
4440 #else
printBold(const char * zText)4441 static void printBold(const char *zText){
4442   printf("\033[1m%s\033[0m", zText);
4443 }
4444 #endif
4445 
4446 /*
4447 ** Get the argument to an --option.  Throw an error and die if no argument
4448 ** is available.
4449 */
cmdline_option_value(int argc,char ** argv,int i)4450 static char *cmdline_option_value(int argc, char **argv, int i){
4451   if( i==argc ){
4452     fprintf(stderr, "%s: Error: missing argument to %s\n",
4453             argv[0], argv[argc-1]);
4454     exit(1);
4455   }
4456   return argv[i];
4457 }
4458 
main(int argc,char ** argv)4459 int SQLITE_CDECL main(int argc, char **argv){
4460   char *zErrMsg = 0;
4461   ShellState data;
4462   const char *zInitFile = 0;
4463   int i;
4464   int rc = 0;
4465   int warnInmemoryDb = 0;
4466   int readStdin = 1;
4467   int nCmd = 0;
4468   char **azCmd = 0;
4469 
4470 #if USE_SYSTEM_SQLITE+0!=1
4471   if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4472     fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4473             sqlite3_sourceid(), SQLITE_SOURCE_ID);
4474     exit(1);
4475   }
4476 #endif
4477   setBinaryMode(stdin);
4478   setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
4479   Argv0 = argv[0];
4480   main_init(&data);
4481   stdin_is_interactive = isatty(0);
4482 
4483   /* Make sure we have a valid signal handler early, before anything
4484   ** else is done.
4485   */
4486 #ifdef SIGINT
4487   signal(SIGINT, interrupt_handler);
4488 #endif
4489 
4490 #ifdef SQLITE_SHELL_DBNAME_PROC
4491   {
4492     /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4493     ** of a C-function that will provide the name of the database file.  Use
4494     ** this compile-time option to embed this shell program in larger
4495     ** applications. */
4496     extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4497     SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4498     warnInmemoryDb = 0;
4499   }
4500 #endif
4501 
4502   /* Do an initial pass through the command-line argument to locate
4503   ** the name of the database file, the name of the initialization file,
4504   ** the size of the alternative malloc heap,
4505   ** and the first command to execute.
4506   */
4507   for(i=1; i<argc; i++){
4508     char *z;
4509     z = argv[i];
4510     if( z[0]!='-' ){
4511       if( data.zDbFilename==0 ){
4512         data.zDbFilename = z;
4513       }else{
4514         /* Excesss arguments are interpreted as SQL (or dot-commands) and
4515         ** mean that nothing is read from stdin */
4516         readStdin = 0;
4517         nCmd++;
4518         azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4519         if( azCmd==0 ){
4520           fprintf(stderr, "out of memory\n");
4521           exit(1);
4522         }
4523         azCmd[nCmd-1] = z;
4524       }
4525     }
4526     if( z[1]=='-' ) z++;
4527     if( strcmp(z,"-separator")==0
4528      || strcmp(z,"-nullvalue")==0
4529      || strcmp(z,"-newline")==0
4530      || strcmp(z,"-cmd")==0
4531     ){
4532       (void)cmdline_option_value(argc, argv, ++i);
4533     }else if( strcmp(z,"-init")==0 ){
4534       zInitFile = cmdline_option_value(argc, argv, ++i);
4535     }else if( strcmp(z,"-batch")==0 ){
4536       /* Need to check for batch mode here to so we can avoid printing
4537       ** informational messages (like from process_sqliterc) before
4538       ** we do the actual processing of arguments later in a second pass.
4539       */
4540       stdin_is_interactive = 0;
4541     }else if( strcmp(z,"-heap")==0 ){
4542 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4543       const char *zSize;
4544       sqlite3_int64 szHeap;
4545 
4546       zSize = cmdline_option_value(argc, argv, ++i);
4547       szHeap = integerValue(zSize);
4548       if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
4549       sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4550 #endif
4551     }else if( strcmp(z,"-scratch")==0 ){
4552       int n, sz;
4553       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4554       if( sz>400000 ) sz = 400000;
4555       if( sz<2500 ) sz = 2500;
4556       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4557       if( n>10 ) n = 10;
4558       if( n<1 ) n = 1;
4559       sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4560       data.shellFlgs |= SHFLG_Scratch;
4561     }else if( strcmp(z,"-pagecache")==0 ){
4562       int n, sz;
4563       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4564       if( sz>70000 ) sz = 70000;
4565       if( sz<800 ) sz = 800;
4566       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4567       if( n<10 ) n = 10;
4568       sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4569       data.shellFlgs |= SHFLG_Pagecache;
4570     }else if( strcmp(z,"-lookaside")==0 ){
4571       int n, sz;
4572       sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
4573       if( sz<0 ) sz = 0;
4574       n = (int)integerValue(cmdline_option_value(argc,argv,++i));
4575       if( n<0 ) n = 0;
4576       sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4577       if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
4578 #ifdef SQLITE_ENABLE_VFSTRACE
4579     }else if( strcmp(z,"-vfstrace")==0 ){
4580       extern int vfstrace_register(
4581          const char *zTraceName,
4582          const char *zOldVfsName,
4583          int (*xOut)(const char*,void*),
4584          void *pOutArg,
4585          int makeDefault
4586       );
4587       vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
4588 #endif
4589 #ifdef SQLITE_ENABLE_MULTIPLEX
4590     }else if( strcmp(z,"-multiplex")==0 ){
4591       extern int sqlite3_multiple_initialize(const char*,int);
4592       sqlite3_multiplex_initialize(0, 1);
4593 #endif
4594     }else if( strcmp(z,"-mmap")==0 ){
4595       sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4596       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
4597     }else if( strcmp(z,"-vfs")==0 ){
4598       sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
4599       if( pVfs ){
4600         sqlite3_vfs_register(pVfs, 1);
4601       }else{
4602         fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4603         exit(1);
4604       }
4605     }
4606   }
4607   if( data.zDbFilename==0 ){
4608 #ifndef SQLITE_OMIT_MEMORYDB
4609     data.zDbFilename = ":memory:";
4610     warnInmemoryDb = argc==1;
4611 #else
4612     fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4613     return 1;
4614 #endif
4615   }
4616   data.out = stdout;
4617 
4618   /* Go ahead and open the database file if it already exists.  If the
4619   ** file does not exist, delay opening it.  This prevents empty database
4620   ** files from being created if a user mistypes the database name argument
4621   ** to the sqlite command-line tool.
4622   */
4623   if( access(data.zDbFilename, 0)==0 ){
4624     open_db(&data, 0);
4625   }
4626 
4627   /* Process the initialization file if there is one.  If no -init option
4628   ** is given on the command line, look for a file named ~/.sqliterc and
4629   ** try to process it.
4630   */
4631   process_sqliterc(&data,zInitFile);
4632 
4633   /* Make a second pass through the command-line argument and set
4634   ** options.  This second pass is delayed until after the initialization
4635   ** file is processed so that the command-line arguments will override
4636   ** settings in the initialization file.
4637   */
4638   for(i=1; i<argc; i++){
4639     char *z = argv[i];
4640     if( z[0]!='-' ) continue;
4641     if( z[1]=='-' ){ z++; }
4642     if( strcmp(z,"-init")==0 ){
4643       i++;
4644     }else if( strcmp(z,"-html")==0 ){
4645       data.mode = MODE_Html;
4646     }else if( strcmp(z,"-list")==0 ){
4647       data.mode = MODE_List;
4648     }else if( strcmp(z,"-line")==0 ){
4649       data.mode = MODE_Line;
4650     }else if( strcmp(z,"-column")==0 ){
4651       data.mode = MODE_Column;
4652     }else if( strcmp(z,"-csv")==0 ){
4653       data.mode = MODE_Csv;
4654       memcpy(data.colSeparator,",",2);
4655     }else if( strcmp(z,"-ascii")==0 ){
4656       data.mode = MODE_Ascii;
4657       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4658                        SEP_Unit);
4659       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
4660                        SEP_Record);
4661     }else if( strcmp(z,"-separator")==0 ){
4662       sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4663                        "%s",cmdline_option_value(argc,argv,++i));
4664     }else if( strcmp(z,"-newline")==0 ){
4665       sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
4666                        "%s",cmdline_option_value(argc,argv,++i));
4667     }else if( strcmp(z,"-nullvalue")==0 ){
4668       sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
4669                        "%s",cmdline_option_value(argc,argv,++i));
4670     }else if( strcmp(z,"-header")==0 ){
4671       data.showHeader = 1;
4672     }else if( strcmp(z,"-noheader")==0 ){
4673       data.showHeader = 0;
4674     }else if( strcmp(z,"-echo")==0 ){
4675       data.echoOn = 1;
4676     }else if( strcmp(z,"-eqp")==0 ){
4677       data.autoEQP = 1;
4678     }else if( strcmp(z,"-stats")==0 ){
4679       data.statsOn = 1;
4680     }else if( strcmp(z,"-scanstats")==0 ){
4681       data.scanstatsOn = 1;
4682     }else if( strcmp(z,"-backslash")==0 ){
4683       /* Undocumented command-line option: -backslash
4684       ** Causes C-style backslash escapes to be evaluated in SQL statements
4685       ** prior to sending the SQL into SQLite.  Useful for injecting
4686       ** crazy bytes in the middle of SQL statements for testing and debugging.
4687       */
4688       data.backslashOn = 1;
4689     }else if( strcmp(z,"-bail")==0 ){
4690       bail_on_error = 1;
4691     }else if( strcmp(z,"-version")==0 ){
4692       printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
4693       return 0;
4694     }else if( strcmp(z,"-interactive")==0 ){
4695       stdin_is_interactive = 1;
4696     }else if( strcmp(z,"-batch")==0 ){
4697       stdin_is_interactive = 0;
4698     }else if( strcmp(z,"-heap")==0 ){
4699       i++;
4700     }else if( strcmp(z,"-scratch")==0 ){
4701       i+=2;
4702     }else if( strcmp(z,"-pagecache")==0 ){
4703       i+=2;
4704     }else if( strcmp(z,"-lookaside")==0 ){
4705       i+=2;
4706     }else if( strcmp(z,"-mmap")==0 ){
4707       i++;
4708     }else if( strcmp(z,"-vfs")==0 ){
4709       i++;
4710 #ifdef SQLITE_ENABLE_VFSTRACE
4711     }else if( strcmp(z,"-vfstrace")==0 ){
4712       i++;
4713 #endif
4714 #ifdef SQLITE_ENABLE_MULTIPLEX
4715     }else if( strcmp(z,"-multiplex")==0 ){
4716       i++;
4717 #endif
4718     }else if( strcmp(z,"-help")==0 ){
4719       usage(1);
4720     }else if( strcmp(z,"-cmd")==0 ){
4721       /* Run commands that follow -cmd first and separately from commands
4722       ** that simply appear on the command-line.  This seems goofy.  It would
4723       ** be better if all commands ran in the order that they appear.  But
4724       ** we retain the goofy behavior for historical compatibility. */
4725       if( i==argc-1 ) break;
4726       z = cmdline_option_value(argc,argv,++i);
4727       if( z[0]=='.' ){
4728         rc = do_meta_command(z, &data);
4729         if( rc && bail_on_error ) return rc==2 ? 0 : rc;
4730       }else{
4731         open_db(&data, 0);
4732         rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4733         if( zErrMsg!=0 ){
4734           fprintf(stderr,"Error: %s\n", zErrMsg);
4735           if( bail_on_error ) return rc!=0 ? rc : 1;
4736         }else if( rc!=0 ){
4737           fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4738           if( bail_on_error ) return rc;
4739         }
4740       }
4741     }else{
4742       fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
4743       fprintf(stderr,"Use -help for a list of options.\n");
4744       return 1;
4745     }
4746   }
4747 
4748   if( !readStdin ){
4749     /* Run all arguments that do not begin with '-' as if they were separate
4750     ** command-line inputs, except for the argToSkip argument which contains
4751     ** the database filename.
4752     */
4753     for(i=0; i<nCmd; i++){
4754       if( azCmd[i][0]=='.' ){
4755         rc = do_meta_command(azCmd[i], &data);
4756         if( rc ) return rc==2 ? 0 : rc;
4757       }else{
4758         open_db(&data, 0);
4759         rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4760         if( zErrMsg!=0 ){
4761           fprintf(stderr,"Error: %s\n", zErrMsg);
4762           return rc!=0 ? rc : 1;
4763         }else if( rc!=0 ){
4764           fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4765           return rc;
4766         }
4767       }
4768     }
4769     free(azCmd);
4770   }else{
4771     /* Run commands received from standard input
4772     */
4773     if( stdin_is_interactive ){
4774       char *zHome;
4775       char *zHistory = 0;
4776       int nHistory;
4777       printf(
4778         "SQLite version %s %.19s\n" /*extra-version-info*/
4779         "Enter \".help\" for usage hints.\n",
4780         sqlite3_libversion(), sqlite3_sourceid()
4781       );
4782       if( warnInmemoryDb ){
4783         printf("Connected to a ");
4784         printBold("transient in-memory database");
4785         printf(".\nUse \".open FILENAME\" to reopen on a "
4786                "persistent database.\n");
4787       }
4788       zHome = find_home_dir();
4789       if( zHome ){
4790         nHistory = strlen30(zHome) + 20;
4791         if( (zHistory = malloc(nHistory))!=0 ){
4792           sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4793         }
4794       }
4795       if( zHistory ) shell_read_history(zHistory);
4796       rc = process_input(&data, 0);
4797       if( zHistory ){
4798         shell_stifle_history(100);
4799         shell_write_history(zHistory);
4800         free(zHistory);
4801       }
4802     }else{
4803       rc = process_input(&data, stdin);
4804     }
4805   }
4806   set_table_name(&data, 0);
4807   if( data.db ){
4808     sqlite3_close(data.db);
4809   }
4810   sqlite3_free(data.zFreeOnClose);
4811   return rc;
4812 }
4813