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