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