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