In the CLI, return non-zero if there are errors on the command-line.
[sqlite.git] / src / shell.c.in
blob78fe0e1713128f36371fee42c03eed09854902c6
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.
11 *************************************************************************
12 ** This file contains code to implement the "sqlite" command line
13 ** utility for accessing SQLite databases.
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
21 ** Warning pragmas copied from msvc.h in the core.
23 #if defined(_MSC_VER)
24 #pragma warning(disable : 4054)
25 #pragma warning(disable : 4055)
26 #pragma warning(disable : 4100)
27 #pragma warning(disable : 4127)
28 #pragma warning(disable : 4130)
29 #pragma warning(disable : 4152)
30 #pragma warning(disable : 4189)
31 #pragma warning(disable : 4206)
32 #pragma warning(disable : 4210)
33 #pragma warning(disable : 4232)
34 #pragma warning(disable : 4244)
35 #pragma warning(disable : 4305)
36 #pragma warning(disable : 4306)
37 #pragma warning(disable : 4702)
38 #pragma warning(disable : 4706)
39 #endif /* defined(_MSC_VER) */
42 ** No support for loadable extensions in VxWorks.
44 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
45 # define SQLITE_OMIT_LOAD_EXTENSION 1
46 #endif
49 ** Enable large-file support for fopen() and friends on unix.
51 #ifndef SQLITE_DISABLE_LFS
52 # define _LARGE_FILE 1
53 # ifndef _FILE_OFFSET_BITS
54 # define _FILE_OFFSET_BITS 64
55 # endif
56 # define _LARGEFILE_SOURCE 1
57 #endif
59 #include <stdlib.h>
60 #include <string.h>
61 #include <stdio.h>
62 #include <assert.h>
63 #include "sqlite3.h"
64 typedef sqlite3_int64 i64;
65 typedef sqlite3_uint64 u64;
66 typedef unsigned char u8;
67 #if SQLITE_USER_AUTHENTICATION
68 # include "sqlite3userauth.h"
69 #endif
70 #include <ctype.h>
71 #include <stdarg.h>
73 #if !defined(_WIN32) && !defined(WIN32)
74 # include <signal.h>
75 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
76 # include <pwd.h>
77 # endif
78 #endif
79 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
80 # include <unistd.h>
81 # include <dirent.h>
82 # if defined(__MINGW32__)
83 # define DIRENT dirent
84 # ifndef S_ISLNK
85 # define S_ISLNK(mode) (0)
86 # endif
87 # endif
88 #endif
89 #include <sys/types.h>
90 #include <sys/stat.h>
92 #if HAVE_READLINE
93 # include <readline/readline.h>
94 # include <readline/history.h>
95 #endif
97 #if HAVE_EDITLINE
98 # include <editline/readline.h>
99 #endif
101 #if HAVE_EDITLINE || HAVE_READLINE
103 # define shell_add_history(X) add_history(X)
104 # define shell_read_history(X) read_history(X)
105 # define shell_write_history(X) write_history(X)
106 # define shell_stifle_history(X) stifle_history(X)
107 # define shell_readline(X) readline(X)
109 #elif HAVE_LINENOISE
111 # include "linenoise.h"
112 # define shell_add_history(X) linenoiseHistoryAdd(X)
113 # define shell_read_history(X) linenoiseHistoryLoad(X)
114 # define shell_write_history(X) linenoiseHistorySave(X)
115 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
116 # define shell_readline(X) linenoise(X)
118 #else
120 # define shell_read_history(X)
121 # define shell_write_history(X)
122 # define shell_stifle_history(X)
124 # define SHELL_USE_LOCAL_GETLINE 1
125 #endif
128 #if defined(_WIN32) || defined(WIN32)
129 # include <io.h>
130 # include <fcntl.h>
131 # define isatty(h) _isatty(h)
132 # ifndef access
133 # define access(f,m) _access((f),(m))
134 # endif
135 # ifndef unlink
136 # define unlink _unlink
137 # endif
138 # undef popen
139 # define popen _popen
140 # undef pclose
141 # define pclose _pclose
142 #else
143 /* Make sure isatty() has a prototype. */
144 extern int isatty(int);
146 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
147 /* popen and pclose are not C89 functions and so are
148 ** sometimes omitted from the <stdio.h> header */
149 extern FILE *popen(const char*,const char*);
150 extern int pclose(FILE*);
151 # else
152 # define SQLITE_OMIT_POPEN 1
153 # endif
154 #endif
156 #if defined(_WIN32_WCE)
157 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
158 * thus we always assume that we have a console. That can be
159 * overridden with the -batch command line option.
161 #define isatty(x) 1
162 #endif
164 /* ctype macros that work with signed characters */
165 #define IsSpace(X) isspace((unsigned char)X)
166 #define IsDigit(X) isdigit((unsigned char)X)
167 #define ToLower(X) (char)tolower((unsigned char)X)
169 #if defined(_WIN32) || defined(WIN32)
170 #include <windows.h>
172 /* string conversion routines only needed on Win32 */
173 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
174 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
175 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
176 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
177 #endif
179 /* On Windows, we normally run with output mode of TEXT so that \n characters
180 ** are automatically translated into \r\n. However, this behavior needs
181 ** to be disabled in some cases (ex: when generating CSV output and when
182 ** rendering quoted strings that contain \n characters). The following
183 ** routines take care of that.
185 #if defined(_WIN32) || defined(WIN32)
186 static void setBinaryMode(FILE *file, int isOutput){
187 if( isOutput ) fflush(file);
188 _setmode(_fileno(file), _O_BINARY);
190 static void setTextMode(FILE *file, int isOutput){
191 if( isOutput ) fflush(file);
192 _setmode(_fileno(file), _O_TEXT);
194 #else
195 # define setBinaryMode(X,Y)
196 # define setTextMode(X,Y)
197 #endif
200 /* True if the timer is enabled */
201 static int enableTimer = 0;
203 /* Return the current wall-clock time */
204 static sqlite3_int64 timeOfDay(void){
205 static sqlite3_vfs *clockVfs = 0;
206 sqlite3_int64 t;
207 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
208 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
209 clockVfs->xCurrentTimeInt64(clockVfs, &t);
210 }else{
211 double r;
212 clockVfs->xCurrentTime(clockVfs, &r);
213 t = (sqlite3_int64)(r*86400000.0);
215 return t;
218 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
219 #include <sys/time.h>
220 #include <sys/resource.h>
222 /* VxWorks does not support getrusage() as far as we can determine */
223 #if defined(_WRS_KERNEL) || defined(__RTP__)
224 struct rusage {
225 struct timeval ru_utime; /* user CPU time used */
226 struct timeval ru_stime; /* system CPU time used */
228 #define getrusage(A,B) memset(B,0,sizeof(*B))
229 #endif
231 /* Saved resource information for the beginning of an operation */
232 static struct rusage sBegin; /* CPU time at start */
233 static sqlite3_int64 iBegin; /* Wall-clock time at start */
236 ** Begin timing an operation
238 static void beginTimer(void){
239 if( enableTimer ){
240 getrusage(RUSAGE_SELF, &sBegin);
241 iBegin = timeOfDay();
245 /* Return the difference of two time_structs in seconds */
246 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
247 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
248 (double)(pEnd->tv_sec - pStart->tv_sec);
252 ** Print the timing results.
254 static void endTimer(void){
255 if( enableTimer ){
256 sqlite3_int64 iEnd = timeOfDay();
257 struct rusage sEnd;
258 getrusage(RUSAGE_SELF, &sEnd);
259 printf("Run Time: real %.3f user %f sys %f\n",
260 (iEnd - iBegin)*0.001,
261 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
262 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
266 #define BEGIN_TIMER beginTimer()
267 #define END_TIMER endTimer()
268 #define HAS_TIMER 1
270 #elif (defined(_WIN32) || defined(WIN32))
272 /* Saved resource information for the beginning of an operation */
273 static HANDLE hProcess;
274 static FILETIME ftKernelBegin;
275 static FILETIME ftUserBegin;
276 static sqlite3_int64 ftWallBegin;
277 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
278 LPFILETIME, LPFILETIME);
279 static GETPROCTIMES getProcessTimesAddr = NULL;
282 ** Check to see if we have timer support. Return 1 if necessary
283 ** support found (or found previously).
285 static int hasTimer(void){
286 if( getProcessTimesAddr ){
287 return 1;
288 } else {
289 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
290 ** versions. See if the version we are running on has it, and if it
291 ** does, save off a pointer to it and the current process handle.
293 hProcess = GetCurrentProcess();
294 if( hProcess ){
295 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
296 if( NULL != hinstLib ){
297 getProcessTimesAddr =
298 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
299 if( NULL != getProcessTimesAddr ){
300 return 1;
302 FreeLibrary(hinstLib);
306 return 0;
310 ** Begin timing an operation
312 static void beginTimer(void){
313 if( enableTimer && getProcessTimesAddr ){
314 FILETIME ftCreation, ftExit;
315 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
316 &ftKernelBegin,&ftUserBegin);
317 ftWallBegin = timeOfDay();
321 /* Return the difference of two FILETIME structs in seconds */
322 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
323 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
324 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
325 return (double) ((i64End - i64Start) / 10000000.0);
329 ** Print the timing results.
331 static void endTimer(void){
332 if( enableTimer && getProcessTimesAddr){
333 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
334 sqlite3_int64 ftWallEnd = timeOfDay();
335 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
336 printf("Run Time: real %.3f user %f sys %f\n",
337 (ftWallEnd - ftWallBegin)*0.001,
338 timeDiff(&ftUserBegin, &ftUserEnd),
339 timeDiff(&ftKernelBegin, &ftKernelEnd));
343 #define BEGIN_TIMER beginTimer()
344 #define END_TIMER endTimer()
345 #define HAS_TIMER hasTimer()
347 #else
348 #define BEGIN_TIMER
349 #define END_TIMER
350 #define HAS_TIMER 0
351 #endif
354 ** Used to prevent warnings about unused parameters
356 #define UNUSED_PARAMETER(x) (void)(x)
359 ** Number of elements in an array
361 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
364 ** If the following flag is set, then command execution stops
365 ** at an error if we are not interactive.
367 static int bail_on_error = 0;
370 ** Threat stdin as an interactive input if the following variable
371 ** is true. Otherwise, assume stdin is connected to a file or pipe.
373 static int stdin_is_interactive = 1;
376 ** On Windows systems we have to know if standard output is a console
377 ** in order to translate UTF-8 into MBCS. The following variable is
378 ** true if translation is required.
380 static int stdout_is_console = 1;
383 ** The following is the open SQLite database. We make a pointer
384 ** to this database a static variable so that it can be accessed
385 ** by the SIGINT handler to interrupt database processing.
387 static sqlite3 *globalDb = 0;
390 ** True if an interrupt (Control-C) has been received.
392 static volatile int seenInterrupt = 0;
395 ** This is the name of our program. It is set in main(), used
396 ** in a number of other places, mostly for error messages.
398 static char *Argv0;
401 ** Prompt strings. Initialized in main. Settable with
402 ** .prompt main continue
404 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
405 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
408 ** Render output like fprintf(). Except, if the output is going to the
409 ** console and if this is running on a Windows machine, translate the
410 ** output from UTF-8 into MBCS.
412 #if defined(_WIN32) || defined(WIN32)
413 void utf8_printf(FILE *out, const char *zFormat, ...){
414 va_list ap;
415 va_start(ap, zFormat);
416 if( stdout_is_console && (out==stdout || out==stderr) ){
417 char *z1 = sqlite3_vmprintf(zFormat, ap);
418 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
419 sqlite3_free(z1);
420 fputs(z2, out);
421 sqlite3_free(z2);
422 }else{
423 vfprintf(out, zFormat, ap);
425 va_end(ap);
427 #elif !defined(utf8_printf)
428 # define utf8_printf fprintf
429 #endif
432 ** Render output like fprintf(). This should not be used on anything that
433 ** includes string formatting (e.g. "%s").
435 #if !defined(raw_printf)
436 # define raw_printf fprintf
437 #endif
439 /* Indicate out-of-memory and exit. */
440 static void shell_out_of_memory(void){
441 raw_printf(stderr,"Error: out of memory\n");
442 exit(1);
446 ** Write I/O traces to the following stream.
448 #ifdef SQLITE_ENABLE_IOTRACE
449 static FILE *iotrace = 0;
450 #endif
453 ** This routine works like printf in that its first argument is a
454 ** format string and subsequent arguments are values to be substituted
455 ** in place of % fields. The result of formatting this string
456 ** is written to iotrace.
458 #ifdef SQLITE_ENABLE_IOTRACE
459 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
460 va_list ap;
461 char *z;
462 if( iotrace==0 ) return;
463 va_start(ap, zFormat);
464 z = sqlite3_vmprintf(zFormat, ap);
465 va_end(ap);
466 utf8_printf(iotrace, "%s", z);
467 sqlite3_free(z);
469 #endif
472 ** Output string zUtf to stream pOut as w characters. If w is negative,
473 ** then right-justify the text. W is the width in UTF-8 characters, not
474 ** in bytes. This is different from the %*.*s specification in printf
475 ** since with %*.*s the width is measured in bytes, not characters.
477 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
478 int i;
479 int n;
480 int aw = w<0 ? -w : w;
481 char zBuf[1000];
482 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
483 for(i=n=0; zUtf[i]; i++){
484 if( (zUtf[i]&0xc0)!=0x80 ){
485 n++;
486 if( n==aw ){
487 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
488 break;
492 if( n>=aw ){
493 utf8_printf(pOut, "%.*s", i, zUtf);
494 }else if( w<0 ){
495 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
496 }else{
497 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
503 ** Determines if a string is a number of not.
505 static int isNumber(const char *z, int *realnum){
506 if( *z=='-' || *z=='+' ) z++;
507 if( !IsDigit(*z) ){
508 return 0;
510 z++;
511 if( realnum ) *realnum = 0;
512 while( IsDigit(*z) ){ z++; }
513 if( *z=='.' ){
514 z++;
515 if( !IsDigit(*z) ) return 0;
516 while( IsDigit(*z) ){ z++; }
517 if( realnum ) *realnum = 1;
519 if( *z=='e' || *z=='E' ){
520 z++;
521 if( *z=='+' || *z=='-' ) z++;
522 if( !IsDigit(*z) ) return 0;
523 while( IsDigit(*z) ){ z++; }
524 if( realnum ) *realnum = 1;
526 return *z==0;
530 ** Compute a string length that is limited to what can be stored in
531 ** lower 30 bits of a 32-bit signed integer.
533 static int strlen30(const char *z){
534 const char *z2 = z;
535 while( *z2 ){ z2++; }
536 return 0x3fffffff & (int)(z2 - z);
540 ** Return the length of a string in characters. Multibyte UTF8 characters
541 ** count as a single character.
543 static int strlenChar(const char *z){
544 int n = 0;
545 while( *z ){
546 if( (0xc0&*(z++))!=0x80 ) n++;
548 return n;
552 ** This routine reads a line of text from FILE in, stores
553 ** the text in memory obtained from malloc() and returns a pointer
554 ** to the text. NULL is returned at end of file, or if malloc()
555 ** fails.
557 ** If zLine is not NULL then it is a malloced buffer returned from
558 ** a previous call to this routine that may be reused.
560 static char *local_getline(char *zLine, FILE *in){
561 int nLine = zLine==0 ? 0 : 100;
562 int n = 0;
564 while( 1 ){
565 if( n+100>nLine ){
566 nLine = nLine*2 + 100;
567 zLine = realloc(zLine, nLine);
568 if( zLine==0 ) return 0;
570 if( fgets(&zLine[n], nLine - n, in)==0 ){
571 if( n==0 ){
572 free(zLine);
573 return 0;
575 zLine[n] = 0;
576 break;
578 while( zLine[n] ) n++;
579 if( n>0 && zLine[n-1]=='\n' ){
580 n--;
581 if( n>0 && zLine[n-1]=='\r' ) n--;
582 zLine[n] = 0;
583 break;
586 #if defined(_WIN32) || defined(WIN32)
587 /* For interactive input on Windows systems, translate the
588 ** multi-byte characterset characters into UTF-8. */
589 if( stdin_is_interactive && in==stdin ){
590 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
591 if( zTrans ){
592 int nTrans = strlen30(zTrans)+1;
593 if( nTrans>nLine ){
594 zLine = realloc(zLine, nTrans);
595 if( zLine==0 ){
596 sqlite3_free(zTrans);
597 return 0;
600 memcpy(zLine, zTrans, nTrans);
601 sqlite3_free(zTrans);
604 #endif /* defined(_WIN32) || defined(WIN32) */
605 return zLine;
609 ** Retrieve a single line of input text.
611 ** If in==0 then read from standard input and prompt before each line.
612 ** If isContinuation is true, then a continuation prompt is appropriate.
613 ** If isContinuation is zero, then the main prompt should be used.
615 ** If zPrior is not NULL then it is a buffer from a prior call to this
616 ** routine that can be reused.
618 ** The result is stored in space obtained from malloc() and must either
619 ** be freed by the caller or else passed back into this routine via the
620 ** zPrior argument for reuse.
622 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
623 char *zPrompt;
624 char *zResult;
625 if( in!=0 ){
626 zResult = local_getline(zPrior, in);
627 }else{
628 zPrompt = isContinuation ? continuePrompt : mainPrompt;
629 #if SHELL_USE_LOCAL_GETLINE
630 printf("%s", zPrompt);
631 fflush(stdout);
632 zResult = local_getline(zPrior, stdin);
633 #else
634 free(zPrior);
635 zResult = shell_readline(zPrompt);
636 if( zResult && *zResult ) shell_add_history(zResult);
637 #endif
639 return zResult;
644 ** Return the value of a hexadecimal digit. Return -1 if the input
645 ** is not a hex digit.
647 static int hexDigitValue(char c){
648 if( c>='0' && c<='9' ) return c - '0';
649 if( c>='a' && c<='f' ) return c - 'a' + 10;
650 if( c>='A' && c<='F' ) return c - 'A' + 10;
651 return -1;
655 ** Interpret zArg as an integer value, possibly with suffixes.
657 static sqlite3_int64 integerValue(const char *zArg){
658 sqlite3_int64 v = 0;
659 static const struct { char *zSuffix; int iMult; } aMult[] = {
660 { "KiB", 1024 },
661 { "MiB", 1024*1024 },
662 { "GiB", 1024*1024*1024 },
663 { "KB", 1000 },
664 { "MB", 1000000 },
665 { "GB", 1000000000 },
666 { "K", 1000 },
667 { "M", 1000000 },
668 { "G", 1000000000 },
670 int i;
671 int isNeg = 0;
672 if( zArg[0]=='-' ){
673 isNeg = 1;
674 zArg++;
675 }else if( zArg[0]=='+' ){
676 zArg++;
678 if( zArg[0]=='0' && zArg[1]=='x' ){
679 int x;
680 zArg += 2;
681 while( (x = hexDigitValue(zArg[0]))>=0 ){
682 v = (v<<4) + x;
683 zArg++;
685 }else{
686 while( IsDigit(zArg[0]) ){
687 v = v*10 + zArg[0] - '0';
688 zArg++;
691 for(i=0; i<ArraySize(aMult); i++){
692 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
693 v *= aMult[i].iMult;
694 break;
697 return isNeg? -v : v;
701 ** A variable length string to which one can append text.
703 typedef struct ShellText ShellText;
704 struct ShellText {
705 char *z;
706 int n;
707 int nAlloc;
711 ** Initialize and destroy a ShellText object
713 static void initText(ShellText *p){
714 memset(p, 0, sizeof(*p));
716 static void freeText(ShellText *p){
717 free(p->z);
718 initText(p);
721 /* zIn is either a pointer to a NULL-terminated string in memory obtained
722 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
723 ** added to zIn, and the result returned in memory obtained from malloc().
724 ** zIn, if it was not NULL, is freed.
726 ** If the third argument, quote, is not '\0', then it is used as a
727 ** quote character for zAppend.
729 static void appendText(ShellText *p, char const *zAppend, char quote){
730 int len;
731 int i;
732 int nAppend = strlen30(zAppend);
734 len = nAppend+p->n+1;
735 if( quote ){
736 len += 2;
737 for(i=0; i<nAppend; i++){
738 if( zAppend[i]==quote ) len++;
742 if( p->n+len>=p->nAlloc ){
743 p->nAlloc = p->nAlloc*2 + len + 20;
744 p->z = realloc(p->z, p->nAlloc);
745 if( p->z==0 ){
746 memset(p, 0, sizeof(*p));
747 return;
751 if( quote ){
752 char *zCsr = p->z+p->n;
753 *zCsr++ = quote;
754 for(i=0; i<nAppend; i++){
755 *zCsr++ = zAppend[i];
756 if( zAppend[i]==quote ) *zCsr++ = quote;
758 *zCsr++ = quote;
759 p->n = (int)(zCsr - p->z);
760 *zCsr = '\0';
761 }else{
762 memcpy(p->z+p->n, zAppend, nAppend);
763 p->n += nAppend;
764 p->z[p->n] = '\0';
769 ** Attempt to determine if identifier zName needs to be quoted, either
770 ** because it contains non-alphanumeric characters, or because it is an
771 ** SQLite keyword. Be conservative in this estimate: When in doubt assume
772 ** that quoting is required.
774 ** Return '"' if quoting is required. Return 0 if no quoting is required.
776 static char quoteChar(const char *zName){
777 int i;
778 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
779 for(i=0; zName[i]; i++){
780 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
782 return sqlite3_keyword_check(zName, i) ? '"' : 0;
786 ** Construct a fake object name and column list to describe the structure
787 ** of the view, virtual table, or table valued function zSchema.zName.
789 static char *shellFakeSchema(
790 sqlite3 *db, /* The database connection containing the vtab */
791 const char *zSchema, /* Schema of the database holding the vtab */
792 const char *zName /* The name of the virtual table */
794 sqlite3_stmt *pStmt = 0;
795 char *zSql;
796 ShellText s;
797 char cQuote;
798 char *zDiv = "(";
799 int nRow = 0;
801 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
802 zSchema ? zSchema : "main", zName);
803 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
804 sqlite3_free(zSql);
805 initText(&s);
806 if( zSchema ){
807 cQuote = quoteChar(zSchema);
808 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
809 appendText(&s, zSchema, cQuote);
810 appendText(&s, ".", 0);
812 cQuote = quoteChar(zName);
813 appendText(&s, zName, cQuote);
814 while( sqlite3_step(pStmt)==SQLITE_ROW ){
815 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
816 nRow++;
817 appendText(&s, zDiv, 0);
818 zDiv = ",";
819 cQuote = quoteChar(zCol);
820 appendText(&s, zCol, cQuote);
822 appendText(&s, ")", 0);
823 sqlite3_finalize(pStmt);
824 if( nRow==0 ){
825 freeText(&s);
826 s.z = 0;
828 return s.z;
832 ** SQL function: shell_module_schema(X)
834 ** Return a fake schema for the table-valued function or eponymous virtual
835 ** table X.
837 static void shellModuleSchema(
838 sqlite3_context *pCtx,
839 int nVal,
840 sqlite3_value **apVal
842 const char *zName = (const char*)sqlite3_value_text(apVal[0]);
843 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
844 UNUSED_PARAMETER(nVal);
845 if( zFake ){
846 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
847 -1, sqlite3_free);
848 free(zFake);
853 ** SQL function: shell_add_schema(S,X)
855 ** Add the schema name X to the CREATE statement in S and return the result.
856 ** Examples:
858 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
860 ** Also works on
862 ** CREATE INDEX
863 ** CREATE UNIQUE INDEX
864 ** CREATE VIEW
865 ** CREATE TRIGGER
866 ** CREATE VIRTUAL TABLE
868 ** This UDF is used by the .schema command to insert the schema name of
869 ** attached databases into the middle of the sqlite_master.sql field.
871 static void shellAddSchemaName(
872 sqlite3_context *pCtx,
873 int nVal,
874 sqlite3_value **apVal
876 static const char *aPrefix[] = {
877 "TABLE",
878 "INDEX",
879 "UNIQUE INDEX",
880 "VIEW",
881 "TRIGGER",
882 "VIRTUAL TABLE"
884 int i = 0;
885 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
886 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
887 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
888 sqlite3 *db = sqlite3_context_db_handle(pCtx);
889 UNUSED_PARAMETER(nVal);
890 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
891 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
892 int n = strlen30(aPrefix[i]);
893 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
894 char *z = 0;
895 char *zFake = 0;
896 if( zSchema ){
897 char cQuote = quoteChar(zSchema);
898 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
899 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
900 }else{
901 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
904 if( zName
905 && aPrefix[i][0]=='V'
906 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
908 if( z==0 ){
909 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
910 }else{
911 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
913 free(zFake);
915 if( z ){
916 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
917 return;
922 sqlite3_result_value(pCtx, apVal[0]);
926 ** The source code for several run-time loadable extensions is inserted
927 ** below by the ../tool/mkshellc.tcl script. Before processing that included
928 ** code, we need to override some macros to make the included program code
929 ** work here in the middle of this regular program.
931 #define SQLITE_EXTENSION_INIT1
932 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
934 #if defined(_WIN32) && defined(_MSC_VER)
935 INCLUDE test_windirent.h
936 INCLUDE test_windirent.c
937 #define dirent DIRENT
938 #endif
939 INCLUDE ../ext/misc/shathree.c
940 INCLUDE ../ext/misc/fileio.c
941 INCLUDE ../ext/misc/completion.c
942 INCLUDE ../ext/misc/appendvfs.c
943 #ifdef SQLITE_HAVE_ZLIB
944 INCLUDE ../ext/misc/zipfile.c
945 INCLUDE ../ext/misc/sqlar.c
946 #endif
947 INCLUDE ../ext/expert/sqlite3expert.h
948 INCLUDE ../ext/expert/sqlite3expert.c
950 #if defined(SQLITE_ENABLE_SESSION)
952 ** State information for a single open session
954 typedef struct OpenSession OpenSession;
955 struct OpenSession {
956 char *zName; /* Symbolic name for this session */
957 int nFilter; /* Number of xFilter rejection GLOB patterns */
958 char **azFilter; /* Array of xFilter rejection GLOB patterns */
959 sqlite3_session *p; /* The open session */
961 #endif
964 ** Shell output mode information from before ".explain on",
965 ** saved so that it can be restored by ".explain off"
967 typedef struct SavedModeInfo SavedModeInfo;
968 struct SavedModeInfo {
969 int valid; /* Is there legit data in here? */
970 int mode; /* Mode prior to ".explain on" */
971 int showHeader; /* The ".header" setting prior to ".explain on" */
972 int colWidth[100]; /* Column widths prior to ".explain on" */
975 typedef struct ExpertInfo ExpertInfo;
976 struct ExpertInfo {
977 sqlite3expert *pExpert;
978 int bVerbose;
981 /* A single line in the EQP output */
982 typedef struct EQPGraphRow EQPGraphRow;
983 struct EQPGraphRow {
984 int iEqpId; /* ID for this row */
985 int iParentId; /* ID of the parent row */
986 EQPGraphRow *pNext; /* Next row in sequence */
987 char zText[1]; /* Text to display for this row */
990 /* All EQP output is collected into an instance of the following */
991 typedef struct EQPGraph EQPGraph;
992 struct EQPGraph {
993 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
994 EQPGraphRow *pLast; /* Last element of the pRow list */
995 char zPrefix[100]; /* Graph prefix */
999 ** State information about the database connection is contained in an
1000 ** instance of the following structure.
1002 typedef struct ShellState ShellState;
1003 struct ShellState {
1004 sqlite3 *db; /* The database */
1005 u8 autoExplain; /* Automatically turn on .explain mode */
1006 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1007 u8 autoEQPtest; /* autoEQP is in test mode */
1008 u8 statsOn; /* True to display memory stats before each finalize */
1009 u8 scanstatsOn; /* True to display scan stats before each finalize */
1010 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1011 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
1012 u8 nEqpLevel; /* Depth of the EQP output graph */
1013 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */
1014 int outCount; /* Revert to stdout when reaching zero */
1015 int cnt; /* Number of records displayed so far */
1016 FILE *out; /* Write results here */
1017 FILE *traceOut; /* Output for sqlite3_trace() */
1018 int nErr; /* Number of errors seen */
1019 int mode; /* An output mode setting */
1020 int modePrior; /* Saved mode */
1021 int cMode; /* temporary output mode for the current query */
1022 int normalMode; /* Output mode before ".explain on" */
1023 int writableSchema; /* True if PRAGMA writable_schema=ON */
1024 int showHeader; /* True to show column names in List or Column mode */
1025 int nCheck; /* Number of ".check" commands run */
1026 unsigned shellFlgs; /* Various flags */
1027 char *zDestTable; /* Name of destination table when MODE_Insert */
1028 char *zTempFile; /* Temporary file that might need deleting */
1029 char zTestcase[30]; /* Name of current test case */
1030 char colSeparator[20]; /* Column separator character for several modes */
1031 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1032 char colSepPrior[20]; /* Saved column separator */
1033 char rowSepPrior[20]; /* Saved row separator */
1034 int colWidth[100]; /* Requested width of each column when in column mode*/
1035 int actualWidth[100]; /* Actual width of each column */
1036 char nullValue[20]; /* The text to print when a NULL comes back from
1037 ** the database */
1038 char outfile[FILENAME_MAX]; /* Filename for *out */
1039 const char *zDbFilename; /* name of the database file */
1040 char *zFreeOnClose; /* Filename to free when closing */
1041 const char *zVfs; /* Name of VFS to use */
1042 sqlite3_stmt *pStmt; /* Current statement if any. */
1043 FILE *pLog; /* Write log output here */
1044 int *aiIndent; /* Array of indents used in MODE_Explain */
1045 int nIndent; /* Size of array aiIndent[] */
1046 int iIndent; /* Index of current op in aiIndent[] */
1047 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
1048 #if defined(SQLITE_ENABLE_SESSION)
1049 int nSession; /* Number of active sessions */
1050 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1051 #endif
1052 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
1056 /* Allowed values for ShellState.autoEQP
1058 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
1059 #define AUTOEQP_on 1 /* Automatic EQP is on */
1060 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */
1061 #define AUTOEQP_full 3 /* Show full EXPLAIN */
1063 /* Allowed values for ShellState.openMode
1065 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
1066 #define SHELL_OPEN_NORMAL 1 /* Normal database file */
1067 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
1068 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
1069 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
1072 ** These are the allowed shellFlgs values
1074 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
1075 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
1076 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
1077 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
1078 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
1079 #define SHFLG_CountChanges 0x00000020 /* .changes setting */
1080 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
1083 ** Macros for testing and setting shellFlgs
1085 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
1086 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
1087 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
1090 ** These are the allowed modes.
1092 #define MODE_Line 0 /* One column per line. Blank line between records */
1093 #define MODE_Column 1 /* One record per line in neat columns */
1094 #define MODE_List 2 /* One record per line with a separator */
1095 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1096 #define MODE_Html 4 /* Generate an XHTML table */
1097 #define MODE_Insert 5 /* Generate SQL "insert" statements */
1098 #define MODE_Quote 6 /* Quote values as for SQL */
1099 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1100 #define MODE_Csv 8 /* Quote strings, numbers are plain */
1101 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1102 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1103 #define MODE_Pretty 11 /* Pretty-print schemas */
1104 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
1106 static const char *modeDescr[] = {
1107 "line",
1108 "column",
1109 "list",
1110 "semi",
1111 "html",
1112 "insert",
1113 "quote",
1114 "tcl",
1115 "csv",
1116 "explain",
1117 "ascii",
1118 "prettyprint",
1119 "eqp"
1123 ** These are the column/row/line separators used by the various
1124 ** import/export modes.
1126 #define SEP_Column "|"
1127 #define SEP_Row "\n"
1128 #define SEP_Tab "\t"
1129 #define SEP_Space " "
1130 #define SEP_Comma ","
1131 #define SEP_CrLf "\r\n"
1132 #define SEP_Unit "\x1F"
1133 #define SEP_Record "\x1E"
1136 ** A callback for the sqlite3_log() interface.
1138 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1139 ShellState *p = (ShellState*)pArg;
1140 if( p->pLog==0 ) return;
1141 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1142 fflush(p->pLog);
1146 ** SQL function: shell_putsnl(X)
1148 ** Write the text X to the screen (or whatever output is being directed)
1149 ** adding a newline at the end, and then return X.
1151 static void shellPutsFunc(
1152 sqlite3_context *pCtx,
1153 int nVal,
1154 sqlite3_value **apVal
1156 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1157 (void)nVal;
1158 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1159 sqlite3_result_value(pCtx, apVal[0]);
1163 ** SQL function: edit(VALUE)
1164 ** edit(VALUE,EDITOR)
1166 ** These steps:
1168 ** (1) Write VALUE into a temporary file.
1169 ** (2) Run program EDITOR on that temporary file.
1170 ** (3) Read the temporary file back and return its content as the result.
1171 ** (4) Delete the temporary file
1173 ** If the EDITOR argument is omitted, use the value in the VISUAL
1174 ** environment variable. If still there is no EDITOR, through an error.
1176 ** Also throw an error if the EDITOR program returns a non-zero exit code.
1178 #ifndef SQLITE_NOHAVE_SYSTEM
1179 static void editFunc(
1180 sqlite3_context *context,
1181 int argc,
1182 sqlite3_value **argv
1184 const char *zEditor;
1185 char *zTempFile = 0;
1186 sqlite3 *db;
1187 char *zCmd = 0;
1188 int bBin;
1189 int rc;
1190 FILE *f = 0;
1191 sqlite3_int64 sz;
1192 sqlite3_int64 x;
1193 unsigned char *p = 0;
1195 if( argc==2 ){
1196 zEditor = (const char*)sqlite3_value_text(argv[1]);
1197 }else{
1198 zEditor = getenv("VISUAL");
1200 if( zEditor==0 ){
1201 sqlite3_result_error(context, "no editor for edit()", -1);
1202 return;
1204 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1205 sqlite3_result_error(context, "NULL input to edit()", -1);
1206 return;
1208 db = sqlite3_context_db_handle(context);
1209 zTempFile = 0;
1210 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1211 if( zTempFile==0 ){
1212 sqlite3_uint64 r = 0;
1213 sqlite3_randomness(sizeof(r), &r);
1214 zTempFile = sqlite3_mprintf("temp%llx", r);
1215 if( zTempFile==0 ){
1216 sqlite3_result_error_nomem(context);
1217 return;
1220 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1221 f = fopen(zTempFile, bBin ? "wb" : "w");
1222 if( f==0 ){
1223 sqlite3_result_error(context, "edit() cannot open temp file", -1);
1224 goto edit_func_end;
1226 sz = sqlite3_value_bytes(argv[0]);
1227 if( bBin ){
1228 x = fwrite(sqlite3_value_blob(argv[0]), 1, sz, f);
1229 }else{
1230 x = fwrite(sqlite3_value_text(argv[0]), 1, sz, f);
1232 fclose(f);
1233 f = 0;
1234 if( x!=sz ){
1235 sqlite3_result_error(context, "edit() could not write the whole file", -1);
1236 goto edit_func_end;
1238 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1239 if( zCmd==0 ){
1240 sqlite3_result_error_nomem(context);
1241 goto edit_func_end;
1243 rc = system(zCmd);
1244 sqlite3_free(zCmd);
1245 if( rc ){
1246 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1247 goto edit_func_end;
1249 f = fopen(zTempFile, bBin ? "rb" : "r");
1250 if( f==0 ){
1251 sqlite3_result_error(context,
1252 "edit() cannot reopen temp file after edit", -1);
1253 goto edit_func_end;
1255 fseek(f, 0, SEEK_END);
1256 sz = ftell(f);
1257 rewind(f);
1258 p = sqlite3_malloc64( sz+(bBin==0) );
1259 if( p==0 ){
1260 sqlite3_result_error_nomem(context);
1261 goto edit_func_end;
1263 if( bBin ){
1264 x = fread(p, 1, sz, f);
1265 }else{
1266 x = fread(p, 1, sz, f);
1267 p[sz] = 0;
1269 fclose(f);
1270 f = 0;
1271 if( x!=sz ){
1272 sqlite3_result_error(context, "could not read back the whole file", -1);
1273 goto edit_func_end;
1275 if( bBin ){
1276 sqlite3_result_blob64(context, p, sz, sqlite3_free);
1277 }else{
1278 sqlite3_result_text64(context, (const char*)p, sz,
1279 sqlite3_free, SQLITE_UTF8);
1281 p = 0;
1283 edit_func_end:
1284 if( f ) fclose(f);
1285 unlink(zTempFile);
1286 sqlite3_free(zTempFile);
1287 sqlite3_free(p);
1289 #endif /* SQLITE_NOHAVE_SYSTEM */
1292 ** Save or restore the current output mode
1294 static void outputModePush(ShellState *p){
1295 p->modePrior = p->mode;
1296 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1297 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1299 static void outputModePop(ShellState *p){
1300 p->mode = p->modePrior;
1301 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1302 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1306 ** Output the given string as a hex-encoded blob (eg. X'1234' )
1308 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1309 int i;
1310 char *zBlob = (char *)pBlob;
1311 raw_printf(out,"X'");
1312 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1313 raw_printf(out,"'");
1317 ** Find a string that is not found anywhere in z[]. Return a pointer
1318 ** to that string.
1320 ** Try to use zA and zB first. If both of those are already found in z[]
1321 ** then make up some string and store it in the buffer zBuf.
1323 static const char *unused_string(
1324 const char *z, /* Result must not appear anywhere in z */
1325 const char *zA, const char *zB, /* Try these first */
1326 char *zBuf /* Space to store a generated string */
1328 unsigned i = 0;
1329 if( strstr(z, zA)==0 ) return zA;
1330 if( strstr(z, zB)==0 ) return zB;
1332 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1333 }while( strstr(z,zBuf)!=0 );
1334 return zBuf;
1338 ** Output the given string as a quoted string using SQL quoting conventions.
1340 ** See also: output_quoted_escaped_string()
1342 static void output_quoted_string(FILE *out, const char *z){
1343 int i;
1344 char c;
1345 setBinaryMode(out, 1);
1346 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1347 if( c==0 ){
1348 utf8_printf(out,"'%s'",z);
1349 }else{
1350 raw_printf(out, "'");
1351 while( *z ){
1352 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1353 if( c=='\'' ) i++;
1354 if( i ){
1355 utf8_printf(out, "%.*s", i, z);
1356 z += i;
1358 if( c=='\'' ){
1359 raw_printf(out, "'");
1360 continue;
1362 if( c==0 ){
1363 break;
1365 z++;
1367 raw_printf(out, "'");
1369 setTextMode(out, 1);
1373 ** Output the given string as a quoted string using SQL quoting conventions.
1374 ** Additionallly , escape the "\n" and "\r" characters so that they do not
1375 ** get corrupted by end-of-line translation facilities in some operating
1376 ** systems.
1378 ** This is like output_quoted_string() but with the addition of the \r\n
1379 ** escape mechanism.
1381 static void output_quoted_escaped_string(FILE *out, const char *z){
1382 int i;
1383 char c;
1384 setBinaryMode(out, 1);
1385 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1386 if( c==0 ){
1387 utf8_printf(out,"'%s'",z);
1388 }else{
1389 const char *zNL = 0;
1390 const char *zCR = 0;
1391 int nNL = 0;
1392 int nCR = 0;
1393 char zBuf1[20], zBuf2[20];
1394 for(i=0; z[i]; i++){
1395 if( z[i]=='\n' ) nNL++;
1396 if( z[i]=='\r' ) nCR++;
1398 if( nNL ){
1399 raw_printf(out, "replace(");
1400 zNL = unused_string(z, "\\n", "\\012", zBuf1);
1402 if( nCR ){
1403 raw_printf(out, "replace(");
1404 zCR = unused_string(z, "\\r", "\\015", zBuf2);
1406 raw_printf(out, "'");
1407 while( *z ){
1408 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1409 if( c=='\'' ) i++;
1410 if( i ){
1411 utf8_printf(out, "%.*s", i, z);
1412 z += i;
1414 if( c=='\'' ){
1415 raw_printf(out, "'");
1416 continue;
1418 if( c==0 ){
1419 break;
1421 z++;
1422 if( c=='\n' ){
1423 raw_printf(out, "%s", zNL);
1424 continue;
1426 raw_printf(out, "%s", zCR);
1428 raw_printf(out, "'");
1429 if( nCR ){
1430 raw_printf(out, ",'%s',char(13))", zCR);
1432 if( nNL ){
1433 raw_printf(out, ",'%s',char(10))", zNL);
1436 setTextMode(out, 1);
1440 ** Output the given string as a quoted according to C or TCL quoting rules.
1442 static void output_c_string(FILE *out, const char *z){
1443 unsigned int c;
1444 fputc('"', out);
1445 while( (c = *(z++))!=0 ){
1446 if( c=='\\' ){
1447 fputc(c, out);
1448 fputc(c, out);
1449 }else if( c=='"' ){
1450 fputc('\\', out);
1451 fputc('"', out);
1452 }else if( c=='\t' ){
1453 fputc('\\', out);
1454 fputc('t', out);
1455 }else if( c=='\n' ){
1456 fputc('\\', out);
1457 fputc('n', out);
1458 }else if( c=='\r' ){
1459 fputc('\\', out);
1460 fputc('r', out);
1461 }else if( !isprint(c&0xff) ){
1462 raw_printf(out, "\\%03o", c&0xff);
1463 }else{
1464 fputc(c, out);
1467 fputc('"', out);
1471 ** Output the given string with characters that are special to
1472 ** HTML escaped.
1474 static void output_html_string(FILE *out, const char *z){
1475 int i;
1476 if( z==0 ) z = "";
1477 while( *z ){
1478 for(i=0; z[i]
1479 && z[i]!='<'
1480 && z[i]!='&'
1481 && z[i]!='>'
1482 && z[i]!='\"'
1483 && z[i]!='\'';
1484 i++){}
1485 if( i>0 ){
1486 utf8_printf(out,"%.*s",i,z);
1488 if( z[i]=='<' ){
1489 raw_printf(out,"&lt;");
1490 }else if( z[i]=='&' ){
1491 raw_printf(out,"&amp;");
1492 }else if( z[i]=='>' ){
1493 raw_printf(out,"&gt;");
1494 }else if( z[i]=='\"' ){
1495 raw_printf(out,"&quot;");
1496 }else if( z[i]=='\'' ){
1497 raw_printf(out,"&#39;");
1498 }else{
1499 break;
1501 z += i + 1;
1506 ** If a field contains any character identified by a 1 in the following
1507 ** array, then the string must be quoted for CSV.
1509 static const char needCsvQuote[] = {
1510 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1511 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1512 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1513 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1515 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1518 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1519 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1520 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1521 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1522 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1523 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1524 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1525 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1529 ** Output a single term of CSV. Actually, p->colSeparator is used for
1530 ** the separator, which may or may not be a comma. p->nullValue is
1531 ** the null value. Strings are quoted if necessary. The separator
1532 ** is only issued if bSep is true.
1534 static void output_csv(ShellState *p, const char *z, int bSep){
1535 FILE *out = p->out;
1536 if( z==0 ){
1537 utf8_printf(out,"%s",p->nullValue);
1538 }else{
1539 int i;
1540 int nSep = strlen30(p->colSeparator);
1541 for(i=0; z[i]; i++){
1542 if( needCsvQuote[((unsigned char*)z)[i]]
1543 || (z[i]==p->colSeparator[0] &&
1544 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
1545 i = 0;
1546 break;
1549 if( i==0 ){
1550 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1551 utf8_printf(out, "%s", zQuoted);
1552 sqlite3_free(zQuoted);
1553 }else{
1554 utf8_printf(out, "%s", z);
1557 if( bSep ){
1558 utf8_printf(p->out, "%s", p->colSeparator);
1563 ** This routine runs when the user presses Ctrl-C
1565 static void interrupt_handler(int NotUsed){
1566 UNUSED_PARAMETER(NotUsed);
1567 seenInterrupt++;
1568 if( seenInterrupt>2 ) exit(1);
1569 if( globalDb ) sqlite3_interrupt(globalDb);
1572 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1574 ** This routine runs for console events (e.g. Ctrl-C) on Win32
1576 static BOOL WINAPI ConsoleCtrlHandler(
1577 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1579 if( dwCtrlType==CTRL_C_EVENT ){
1580 interrupt_handler(0);
1581 return TRUE;
1583 return FALSE;
1585 #endif
1587 #ifndef SQLITE_OMIT_AUTHORIZATION
1589 ** When the ".auth ON" is set, the following authorizer callback is
1590 ** invoked. It always returns SQLITE_OK.
1592 static int shellAuth(
1593 void *pClientData,
1594 int op,
1595 const char *zA1,
1596 const char *zA2,
1597 const char *zA3,
1598 const char *zA4
1600 ShellState *p = (ShellState*)pClientData;
1601 static const char *azAction[] = { 0,
1602 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1603 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1604 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1605 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1606 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1607 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1608 "PRAGMA", "READ", "SELECT",
1609 "TRANSACTION", "UPDATE", "ATTACH",
1610 "DETACH", "ALTER_TABLE", "REINDEX",
1611 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1612 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1614 int i;
1615 const char *az[4];
1616 az[0] = zA1;
1617 az[1] = zA2;
1618 az[2] = zA3;
1619 az[3] = zA4;
1620 utf8_printf(p->out, "authorizer: %s", azAction[op]);
1621 for(i=0; i<4; i++){
1622 raw_printf(p->out, " ");
1623 if( az[i] ){
1624 output_c_string(p->out, az[i]);
1625 }else{
1626 raw_printf(p->out, "NULL");
1629 raw_printf(p->out, "\n");
1630 return SQLITE_OK;
1632 #endif
1635 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1637 ** This routine converts some CREATE TABLE statements for shadow tables
1638 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1640 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1641 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1642 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1643 }else{
1644 utf8_printf(out, "%s%s", z, zTail);
1647 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1648 char c = z[n];
1649 z[n] = 0;
1650 printSchemaLine(out, z, zTail);
1651 z[n] = c;
1655 ** Return true if string z[] has nothing but whitespace and comments to the
1656 ** end of the first line.
1658 static int wsToEol(const char *z){
1659 int i;
1660 for(i=0; z[i]; i++){
1661 if( z[i]=='\n' ) return 1;
1662 if( IsSpace(z[i]) ) continue;
1663 if( z[i]=='-' && z[i+1]=='-' ) return 1;
1664 return 0;
1666 return 1;
1670 ** Add a new entry to the EXPLAIN QUERY PLAN data
1672 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
1673 EQPGraphRow *pNew;
1674 int nText = strlen30(zText);
1675 if( p->autoEQPtest ){
1676 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1678 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1679 if( pNew==0 ) shell_out_of_memory();
1680 pNew->iEqpId = iEqpId;
1681 pNew->iParentId = p2;
1682 memcpy(pNew->zText, zText, nText+1);
1683 pNew->pNext = 0;
1684 if( p->sGraph.pLast ){
1685 p->sGraph.pLast->pNext = pNew;
1686 }else{
1687 p->sGraph.pRow = pNew;
1689 p->sGraph.pLast = pNew;
1693 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1694 ** in p->sGraph.
1696 static void eqp_reset(ShellState *p){
1697 EQPGraphRow *pRow, *pNext;
1698 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1699 pNext = pRow->pNext;
1700 sqlite3_free(pRow);
1702 memset(&p->sGraph, 0, sizeof(p->sGraph));
1705 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
1706 ** pOld, or return the first such line if pOld is NULL
1708 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
1709 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
1710 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
1711 return pRow;
1714 /* Render a single level of the graph that has iEqpId as its parent. Called
1715 ** recursively to render sublevels.
1717 static void eqp_render_level(ShellState *p, int iEqpId){
1718 EQPGraphRow *pRow, *pNext;
1719 int n = strlen30(p->sGraph.zPrefix);
1720 char *z;
1721 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1722 pNext = eqp_next_row(p, iEqpId, pRow);
1723 z = pRow->zText;
1724 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z);
1725 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
1726 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
1727 eqp_render_level(p, pRow->iEqpId);
1728 p->sGraph.zPrefix[n] = 0;
1734 ** Display and reset the EXPLAIN QUERY PLAN data
1736 static void eqp_render(ShellState *p){
1737 EQPGraphRow *pRow = p->sGraph.pRow;
1738 if( pRow ){
1739 if( pRow->zText[0]=='-' ){
1740 if( pRow->pNext==0 ){
1741 eqp_reset(p);
1742 return;
1744 utf8_printf(p->out, "%s\n", pRow->zText+3);
1745 p->sGraph.pRow = pRow->pNext;
1746 sqlite3_free(pRow);
1747 }else{
1748 utf8_printf(p->out, "QUERY PLAN\n");
1750 p->sGraph.zPrefix[0] = 0;
1751 eqp_render_level(p, 0);
1752 eqp_reset(p);
1757 ** This is the callback routine that the shell
1758 ** invokes for each row of a query result.
1760 static int shell_callback(
1761 void *pArg,
1762 int nArg, /* Number of result columns */
1763 char **azArg, /* Text of each result column */
1764 char **azCol, /* Column names */
1765 int *aiType /* Column types */
1767 int i;
1768 ShellState *p = (ShellState*)pArg;
1770 if( azArg==0 ) return 0;
1771 switch( p->cMode ){
1772 case MODE_Line: {
1773 int w = 5;
1774 if( azArg==0 ) break;
1775 for(i=0; i<nArg; i++){
1776 int len = strlen30(azCol[i] ? azCol[i] : "");
1777 if( len>w ) w = len;
1779 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
1780 for(i=0; i<nArg; i++){
1781 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
1782 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
1784 break;
1786 case MODE_Explain:
1787 case MODE_Column: {
1788 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1789 const int *colWidth;
1790 int showHdr;
1791 char *rowSep;
1792 if( p->cMode==MODE_Column ){
1793 colWidth = p->colWidth;
1794 showHdr = p->showHeader;
1795 rowSep = p->rowSeparator;
1796 }else{
1797 colWidth = aExplainWidths;
1798 showHdr = 1;
1799 rowSep = SEP_Row;
1801 if( p->cnt++==0 ){
1802 for(i=0; i<nArg; i++){
1803 int w, n;
1804 if( i<ArraySize(p->colWidth) ){
1805 w = colWidth[i];
1806 }else{
1807 w = 0;
1809 if( w==0 ){
1810 w = strlenChar(azCol[i] ? azCol[i] : "");
1811 if( w<10 ) w = 10;
1812 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
1813 if( w<n ) w = n;
1815 if( i<ArraySize(p->actualWidth) ){
1816 p->actualWidth[i] = w;
1818 if( showHdr ){
1819 utf8_width_print(p->out, w, azCol[i]);
1820 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1823 if( showHdr ){
1824 for(i=0; i<nArg; i++){
1825 int w;
1826 if( i<ArraySize(p->actualWidth) ){
1827 w = p->actualWidth[i];
1828 if( w<0 ) w = -w;
1829 }else{
1830 w = 10;
1832 utf8_printf(p->out,"%-*.*s%s",w,w,
1833 "----------------------------------------------------------"
1834 "----------------------------------------------------------",
1835 i==nArg-1 ? rowSep : " ");
1839 if( azArg==0 ) break;
1840 for(i=0; i<nArg; i++){
1841 int w;
1842 if( i<ArraySize(p->actualWidth) ){
1843 w = p->actualWidth[i];
1844 }else{
1845 w = 10;
1847 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
1848 w = strlenChar(azArg[i]);
1850 if( i==1 && p->aiIndent && p->pStmt ){
1851 if( p->iIndent<p->nIndent ){
1852 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
1854 p->iIndent++;
1856 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
1857 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1859 break;
1861 case MODE_Semi: { /* .schema and .fullschema output */
1862 printSchemaLine(p->out, azArg[0], ";\n");
1863 break;
1865 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1866 char *z;
1867 int j;
1868 int nParen = 0;
1869 char cEnd = 0;
1870 char c;
1871 int nLine = 0;
1872 assert( nArg==1 );
1873 if( azArg[0]==0 ) break;
1874 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1875 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1877 utf8_printf(p->out, "%s;\n", azArg[0]);
1878 break;
1880 z = sqlite3_mprintf("%s", azArg[0]);
1881 j = 0;
1882 for(i=0; IsSpace(z[i]); i++){}
1883 for(; (c = z[i])!=0; i++){
1884 if( IsSpace(c) ){
1885 if( z[j-1]=='\r' ) z[j-1] = '\n';
1886 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1887 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1888 j--;
1890 z[j++] = c;
1892 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1893 z[j] = 0;
1894 if( strlen30(z)>=79 ){
1895 for(i=j=0; (c = z[i])!=0; i++){ /* Copy changes from z[i] back to z[j] */
1896 if( c==cEnd ){
1897 cEnd = 0;
1898 }else if( c=='"' || c=='\'' || c=='`' ){
1899 cEnd = c;
1900 }else if( c=='[' ){
1901 cEnd = ']';
1902 }else if( c=='-' && z[i+1]=='-' ){
1903 cEnd = '\n';
1904 }else if( c=='(' ){
1905 nParen++;
1906 }else if( c==')' ){
1907 nParen--;
1908 if( nLine>0 && nParen==0 && j>0 ){
1909 printSchemaLineN(p->out, z, j, "\n");
1910 j = 0;
1913 z[j++] = c;
1914 if( nParen==1 && cEnd==0
1915 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
1917 if( c=='\n' ) j--;
1918 printSchemaLineN(p->out, z, j, "\n ");
1919 j = 0;
1920 nLine++;
1921 while( IsSpace(z[i+1]) ){ i++; }
1924 z[j] = 0;
1926 printSchemaLine(p->out, z, ";\n");
1927 sqlite3_free(z);
1928 break;
1930 case MODE_List: {
1931 if( p->cnt++==0 && p->showHeader ){
1932 for(i=0; i<nArg; i++){
1933 utf8_printf(p->out,"%s%s",azCol[i],
1934 i==nArg-1 ? p->rowSeparator : p->colSeparator);
1937 if( azArg==0 ) break;
1938 for(i=0; i<nArg; i++){
1939 char *z = azArg[i];
1940 if( z==0 ) z = p->nullValue;
1941 utf8_printf(p->out, "%s", z);
1942 if( i<nArg-1 ){
1943 utf8_printf(p->out, "%s", p->colSeparator);
1944 }else{
1945 utf8_printf(p->out, "%s", p->rowSeparator);
1948 break;
1950 case MODE_Html: {
1951 if( p->cnt++==0 && p->showHeader ){
1952 raw_printf(p->out,"<TR>");
1953 for(i=0; i<nArg; i++){
1954 raw_printf(p->out,"<TH>");
1955 output_html_string(p->out, azCol[i]);
1956 raw_printf(p->out,"</TH>\n");
1958 raw_printf(p->out,"</TR>\n");
1960 if( azArg==0 ) break;
1961 raw_printf(p->out,"<TR>");
1962 for(i=0; i<nArg; i++){
1963 raw_printf(p->out,"<TD>");
1964 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1965 raw_printf(p->out,"</TD>\n");
1967 raw_printf(p->out,"</TR>\n");
1968 break;
1970 case MODE_Tcl: {
1971 if( p->cnt++==0 && p->showHeader ){
1972 for(i=0; i<nArg; i++){
1973 output_c_string(p->out,azCol[i] ? azCol[i] : "");
1974 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1976 utf8_printf(p->out, "%s", p->rowSeparator);
1978 if( azArg==0 ) break;
1979 for(i=0; i<nArg; i++){
1980 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1981 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1983 utf8_printf(p->out, "%s", p->rowSeparator);
1984 break;
1986 case MODE_Csv: {
1987 setBinaryMode(p->out, 1);
1988 if( p->cnt++==0 && p->showHeader ){
1989 for(i=0; i<nArg; i++){
1990 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
1992 utf8_printf(p->out, "%s", p->rowSeparator);
1994 if( nArg>0 ){
1995 for(i=0; i<nArg; i++){
1996 output_csv(p, azArg[i], i<nArg-1);
1998 utf8_printf(p->out, "%s", p->rowSeparator);
2000 setTextMode(p->out, 1);
2001 break;
2003 case MODE_Insert: {
2004 if( azArg==0 ) break;
2005 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2006 if( p->showHeader ){
2007 raw_printf(p->out,"(");
2008 for(i=0; i<nArg; i++){
2009 if( i>0 ) raw_printf(p->out, ",");
2010 if( quoteChar(azCol[i]) ){
2011 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2012 utf8_printf(p->out, "%s", z);
2013 sqlite3_free(z);
2014 }else{
2015 raw_printf(p->out, "%s", azCol[i]);
2018 raw_printf(p->out,")");
2020 p->cnt++;
2021 for(i=0; i<nArg; i++){
2022 raw_printf(p->out, i>0 ? "," : " VALUES(");
2023 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2024 utf8_printf(p->out,"NULL");
2025 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2026 if( ShellHasFlag(p, SHFLG_Newlines) ){
2027 output_quoted_string(p->out, azArg[i]);
2028 }else{
2029 output_quoted_escaped_string(p->out, azArg[i]);
2031 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2032 utf8_printf(p->out,"%s", azArg[i]);
2033 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2034 char z[50];
2035 double r = sqlite3_column_double(p->pStmt, i);
2036 sqlite3_snprintf(50,z,"%!.20g", r);
2037 raw_printf(p->out, "%s", z);
2038 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2039 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2040 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2041 output_hex_blob(p->out, pBlob, nBlob);
2042 }else if( isNumber(azArg[i], 0) ){
2043 utf8_printf(p->out,"%s", azArg[i]);
2044 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2045 output_quoted_string(p->out, azArg[i]);
2046 }else{
2047 output_quoted_escaped_string(p->out, azArg[i]);
2050 raw_printf(p->out,");\n");
2051 break;
2053 case MODE_Quote: {
2054 if( azArg==0 ) break;
2055 if( p->cnt==0 && p->showHeader ){
2056 for(i=0; i<nArg; i++){
2057 if( i>0 ) raw_printf(p->out, ",");
2058 output_quoted_string(p->out, azCol[i]);
2060 raw_printf(p->out,"\n");
2062 p->cnt++;
2063 for(i=0; i<nArg; i++){
2064 if( i>0 ) raw_printf(p->out, ",");
2065 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2066 utf8_printf(p->out,"NULL");
2067 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2068 output_quoted_string(p->out, azArg[i]);
2069 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2070 utf8_printf(p->out,"%s", azArg[i]);
2071 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2072 char z[50];
2073 double r = sqlite3_column_double(p->pStmt, i);
2074 sqlite3_snprintf(50,z,"%!.20g", r);
2075 raw_printf(p->out, "%s", z);
2076 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2077 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2078 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2079 output_hex_blob(p->out, pBlob, nBlob);
2080 }else if( isNumber(azArg[i], 0) ){
2081 utf8_printf(p->out,"%s", azArg[i]);
2082 }else{
2083 output_quoted_string(p->out, azArg[i]);
2086 raw_printf(p->out,"\n");
2087 break;
2089 case MODE_Ascii: {
2090 if( p->cnt++==0 && p->showHeader ){
2091 for(i=0; i<nArg; i++){
2092 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2093 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2095 utf8_printf(p->out, "%s", p->rowSeparator);
2097 if( azArg==0 ) break;
2098 for(i=0; i<nArg; i++){
2099 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2100 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2102 utf8_printf(p->out, "%s", p->rowSeparator);
2103 break;
2105 case MODE_EQP: {
2106 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2107 break;
2110 return 0;
2114 ** This is the callback routine that the SQLite library
2115 ** invokes for each row of a query result.
2117 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2118 /* since we don't have type info, call the shell_callback with a NULL value */
2119 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2123 ** This is the callback routine from sqlite3_exec() that appends all
2124 ** output onto the end of a ShellText object.
2126 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2127 ShellText *p = (ShellText*)pArg;
2128 int i;
2129 UNUSED_PARAMETER(az);
2130 if( azArg==0 ) return 0;
2131 if( p->n ) appendText(p, "|", 0);
2132 for(i=0; i<nArg; i++){
2133 if( i ) appendText(p, ",", 0);
2134 if( azArg[i] ) appendText(p, azArg[i], 0);
2136 return 0;
2140 ** Generate an appropriate SELFTEST table in the main database.
2142 static void createSelftestTable(ShellState *p){
2143 char *zErrMsg = 0;
2144 sqlite3_exec(p->db,
2145 "SAVEPOINT selftest_init;\n"
2146 "CREATE TABLE IF NOT EXISTS selftest(\n"
2147 " tno INTEGER PRIMARY KEY,\n" /* Test number */
2148 " op TEXT,\n" /* Operator: memo run */
2149 " cmd TEXT,\n" /* Command text */
2150 " ans TEXT\n" /* Desired answer */
2151 ");"
2152 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2153 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2154 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2155 " 'memo','Tests generated by --init');\n"
2156 "INSERT INTO [_shell$self]\n"
2157 " SELECT 'run',\n"
2158 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2159 "FROM sqlite_master ORDER BY 2'',224))',\n"
2160 " hex(sha3_query('SELECT type,name,tbl_name,sql "
2161 "FROM sqlite_master ORDER BY 2',224));\n"
2162 "INSERT INTO [_shell$self]\n"
2163 " SELECT 'run',"
2164 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2165 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2166 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2167 " FROM (\n"
2168 " SELECT name FROM sqlite_master\n"
2169 " WHERE type='table'\n"
2170 " AND name<>'selftest'\n"
2171 " AND coalesce(rootpage,0)>0\n"
2172 " )\n"
2173 " ORDER BY name;\n"
2174 "INSERT INTO [_shell$self]\n"
2175 " VALUES('run','PRAGMA integrity_check','ok');\n"
2176 "INSERT INTO selftest(tno,op,cmd,ans)"
2177 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2178 "DROP TABLE [_shell$self];"
2179 ,0,0,&zErrMsg);
2180 if( zErrMsg ){
2181 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2182 sqlite3_free(zErrMsg);
2184 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2189 ** Set the destination table field of the ShellState structure to
2190 ** the name of the table given. Escape any quote characters in the
2191 ** table name.
2193 static void set_table_name(ShellState *p, const char *zName){
2194 int i, n;
2195 char cQuote;
2196 char *z;
2198 if( p->zDestTable ){
2199 free(p->zDestTable);
2200 p->zDestTable = 0;
2202 if( zName==0 ) return;
2203 cQuote = quoteChar(zName);
2204 n = strlen30(zName);
2205 if( cQuote ) n += n+2;
2206 z = p->zDestTable = malloc( n+1 );
2207 if( z==0 ) shell_out_of_memory();
2208 n = 0;
2209 if( cQuote ) z[n++] = cQuote;
2210 for(i=0; zName[i]; i++){
2211 z[n++] = zName[i];
2212 if( zName[i]==cQuote ) z[n++] = cQuote;
2214 if( cQuote ) z[n++] = cQuote;
2215 z[n] = 0;
2220 ** Execute a query statement that will generate SQL output. Print
2221 ** the result columns, comma-separated, on a line and then add a
2222 ** semicolon terminator to the end of that line.
2224 ** If the number of columns is 1 and that column contains text "--"
2225 ** then write the semicolon on a separate line. That way, if a
2226 ** "--" comment occurs at the end of the statement, the comment
2227 ** won't consume the semicolon terminator.
2229 static int run_table_dump_query(
2230 ShellState *p, /* Query context */
2231 const char *zSelect, /* SELECT statement to extract content */
2232 const char *zFirstRow /* Print before first row, if not NULL */
2234 sqlite3_stmt *pSelect;
2235 int rc;
2236 int nResult;
2237 int i;
2238 const char *z;
2239 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2240 if( rc!=SQLITE_OK || !pSelect ){
2241 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2242 sqlite3_errmsg(p->db));
2243 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2244 return rc;
2246 rc = sqlite3_step(pSelect);
2247 nResult = sqlite3_column_count(pSelect);
2248 while( rc==SQLITE_ROW ){
2249 if( zFirstRow ){
2250 utf8_printf(p->out, "%s", zFirstRow);
2251 zFirstRow = 0;
2253 z = (const char*)sqlite3_column_text(pSelect, 0);
2254 utf8_printf(p->out, "%s", z);
2255 for(i=1; i<nResult; i++){
2256 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2258 if( z==0 ) z = "";
2259 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2260 if( z[0] ){
2261 raw_printf(p->out, "\n;\n");
2262 }else{
2263 raw_printf(p->out, ";\n");
2265 rc = sqlite3_step(pSelect);
2267 rc = sqlite3_finalize(pSelect);
2268 if( rc!=SQLITE_OK ){
2269 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2270 sqlite3_errmsg(p->db));
2271 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2273 return rc;
2277 ** Allocate space and save off current error string.
2279 static char *save_err_msg(
2280 sqlite3 *db /* Database to query */
2282 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
2283 char *zErrMsg = sqlite3_malloc64(nErrMsg);
2284 if( zErrMsg ){
2285 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2287 return zErrMsg;
2290 #ifdef __linux__
2292 ** Attempt to display I/O stats on Linux using /proc/PID/io
2294 static void displayLinuxIoStats(FILE *out){
2295 FILE *in;
2296 char z[200];
2297 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2298 in = fopen(z, "rb");
2299 if( in==0 ) return;
2300 while( fgets(z, sizeof(z), in)!=0 ){
2301 static const struct {
2302 const char *zPattern;
2303 const char *zDesc;
2304 } aTrans[] = {
2305 { "rchar: ", "Bytes received by read():" },
2306 { "wchar: ", "Bytes sent to write():" },
2307 { "syscr: ", "Read() system calls:" },
2308 { "syscw: ", "Write() system calls:" },
2309 { "read_bytes: ", "Bytes read from storage:" },
2310 { "write_bytes: ", "Bytes written to storage:" },
2311 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
2313 int i;
2314 for(i=0; i<ArraySize(aTrans); i++){
2315 int n = strlen30(aTrans[i].zPattern);
2316 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2317 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2318 break;
2322 fclose(in);
2324 #endif
2327 ** Display a single line of status using 64-bit values.
2329 static void displayStatLine(
2330 ShellState *p, /* The shell context */
2331 char *zLabel, /* Label for this one line */
2332 char *zFormat, /* Format for the result */
2333 int iStatusCtrl, /* Which status to display */
2334 int bReset /* True to reset the stats */
2336 sqlite3_int64 iCur = -1;
2337 sqlite3_int64 iHiwtr = -1;
2338 int i, nPercent;
2339 char zLine[200];
2340 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2341 for(i=0, nPercent=0; zFormat[i]; i++){
2342 if( zFormat[i]=='%' ) nPercent++;
2344 if( nPercent>1 ){
2345 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2346 }else{
2347 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2349 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2353 ** Display memory stats.
2355 static int display_stats(
2356 sqlite3 *db, /* Database to query */
2357 ShellState *pArg, /* Pointer to ShellState */
2358 int bReset /* True to reset the stats */
2360 int iCur;
2361 int iHiwtr;
2362 FILE *out;
2363 if( pArg==0 || pArg->out==0 ) return 0;
2364 out = pArg->out;
2366 if( pArg->pStmt && (pArg->statsOn & 2) ){
2367 int nCol, i, x;
2368 sqlite3_stmt *pStmt = pArg->pStmt;
2369 char z[100];
2370 nCol = sqlite3_column_count(pStmt);
2371 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2372 for(i=0; i<nCol; i++){
2373 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2374 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2375 #ifndef SQLITE_OMIT_DECLTYPE
2376 sqlite3_snprintf(30, z+x, "declared type:");
2377 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2378 #endif
2379 #ifdef SQLITE_ENABLE_COLUMN_METADATA
2380 sqlite3_snprintf(30, z+x, "database name:");
2381 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2382 sqlite3_snprintf(30, z+x, "table name:");
2383 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2384 sqlite3_snprintf(30, z+x, "origin name:");
2385 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2386 #endif
2390 displayStatLine(pArg, "Memory Used:",
2391 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2392 displayStatLine(pArg, "Number of Outstanding Allocations:",
2393 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2394 if( pArg->shellFlgs & SHFLG_Pagecache ){
2395 displayStatLine(pArg, "Number of Pcache Pages Used:",
2396 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2398 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2399 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2400 displayStatLine(pArg, "Largest Allocation:",
2401 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2402 displayStatLine(pArg, "Largest Pcache Allocation:",
2403 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2404 #ifdef YYTRACKMAXSTACKDEPTH
2405 displayStatLine(pArg, "Deepest Parser Stack:",
2406 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2407 #endif
2409 if( db ){
2410 if( pArg->shellFlgs & SHFLG_Lookaside ){
2411 iHiwtr = iCur = -1;
2412 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2413 &iCur, &iHiwtr, bReset);
2414 raw_printf(pArg->out,
2415 "Lookaside Slots Used: %d (max %d)\n",
2416 iCur, iHiwtr);
2417 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2418 &iCur, &iHiwtr, bReset);
2419 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2420 iHiwtr);
2421 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2422 &iCur, &iHiwtr, bReset);
2423 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2424 iHiwtr);
2425 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2426 &iCur, &iHiwtr, bReset);
2427 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2428 iHiwtr);
2430 iHiwtr = iCur = -1;
2431 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2432 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2433 iCur);
2434 iHiwtr = iCur = -1;
2435 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2436 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
2437 iHiwtr = iCur = -1;
2438 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2439 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
2440 iHiwtr = iCur = -1;
2441 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2442 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
2443 iHiwtr = iCur = -1;
2444 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2445 raw_printf(pArg->out, "Page cache spills: %d\n", iCur);
2446 iHiwtr = iCur = -1;
2447 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2448 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
2449 iCur);
2450 iHiwtr = iCur = -1;
2451 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2452 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
2453 iCur);
2456 if( pArg->pStmt ){
2457 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2458 bReset);
2459 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
2460 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2461 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
2462 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2463 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
2464 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2465 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
2466 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE, bReset);
2467 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur);
2468 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2469 raw_printf(pArg->out, "Number of times run: %d\n", iCur);
2470 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2471 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur);
2474 #ifdef __linux__
2475 displayLinuxIoStats(pArg->out);
2476 #endif
2478 /* Do not remove this machine readable comment: extra-stats-output-here */
2480 return 0;
2484 ** Display scan stats.
2486 static void display_scanstats(
2487 sqlite3 *db, /* Database to query */
2488 ShellState *pArg /* Pointer to ShellState */
2490 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2491 UNUSED_PARAMETER(db);
2492 UNUSED_PARAMETER(pArg);
2493 #else
2494 int i, k, n, mx;
2495 raw_printf(pArg->out, "-------- scanstats --------\n");
2496 mx = 0;
2497 for(k=0; k<=mx; k++){
2498 double rEstLoop = 1.0;
2499 for(i=n=0; 1; i++){
2500 sqlite3_stmt *p = pArg->pStmt;
2501 sqlite3_int64 nLoop, nVisit;
2502 double rEst;
2503 int iSid;
2504 const char *zExplain;
2505 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2506 break;
2508 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2509 if( iSid>mx ) mx = iSid;
2510 if( iSid!=k ) continue;
2511 if( n==0 ){
2512 rEstLoop = (double)nLoop;
2513 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2515 n++;
2516 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2517 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2518 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2519 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2520 rEstLoop *= rEst;
2521 raw_printf(pArg->out,
2522 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2523 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2527 raw_printf(pArg->out, "---------------------------\n");
2528 #endif
2532 ** Parameter azArray points to a zero-terminated array of strings. zStr
2533 ** points to a single nul-terminated string. Return non-zero if zStr
2534 ** is equal, according to strcmp(), to any of the strings in the array.
2535 ** Otherwise, return zero.
2537 static int str_in_array(const char *zStr, const char **azArray){
2538 int i;
2539 for(i=0; azArray[i]; i++){
2540 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2542 return 0;
2546 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2547 ** and populate the ShellState.aiIndent[] array with the number of
2548 ** spaces each opcode should be indented before it is output.
2550 ** The indenting rules are:
2552 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2553 ** all opcodes that occur between the p2 jump destination and the opcode
2554 ** itself by 2 spaces.
2556 ** * For each "Goto", if the jump destination is earlier in the program
2557 ** and ends on one of:
2558 ** Yield SeekGt SeekLt RowSetRead Rewind
2559 ** or if the P1 parameter is one instead of zero,
2560 ** then indent all opcodes between the earlier instruction
2561 ** and "Goto" by 2 spaces.
2563 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2564 const char *zSql; /* The text of the SQL statement */
2565 const char *z; /* Used to check if this is an EXPLAIN */
2566 int *abYield = 0; /* True if op is an OP_Yield */
2567 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
2568 int iOp; /* Index of operation in p->aiIndent[] */
2570 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2571 "NextIfOpen", "PrevIfOpen", 0 };
2572 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2573 "Rewind", 0 };
2574 const char *azGoto[] = { "Goto", 0 };
2576 /* Try to figure out if this is really an EXPLAIN statement. If this
2577 ** cannot be verified, return early. */
2578 if( sqlite3_column_count(pSql)!=8 ){
2579 p->cMode = p->mode;
2580 return;
2582 zSql = sqlite3_sql(pSql);
2583 if( zSql==0 ) return;
2584 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2585 if( sqlite3_strnicmp(z, "explain", 7) ){
2586 p->cMode = p->mode;
2587 return;
2590 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2591 int i;
2592 int iAddr = sqlite3_column_int(pSql, 0);
2593 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2595 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2596 ** p2 is an instruction address, set variable p2op to the index of that
2597 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2598 ** the current instruction is part of a sub-program generated by an
2599 ** SQL trigger or foreign key. */
2600 int p2 = sqlite3_column_int(pSql, 3);
2601 int p2op = (p2 + (iOp-iAddr));
2603 /* Grow the p->aiIndent array as required */
2604 if( iOp>=nAlloc ){
2605 if( iOp==0 ){
2606 /* Do further verfication that this is explain output. Abort if
2607 ** it is not */
2608 static const char *explainCols[] = {
2609 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2610 int jj;
2611 for(jj=0; jj<ArraySize(explainCols); jj++){
2612 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2613 p->cMode = p->mode;
2614 sqlite3_reset(pSql);
2615 return;
2619 nAlloc += 100;
2620 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2621 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
2623 abYield[iOp] = str_in_array(zOp, azYield);
2624 p->aiIndent[iOp] = 0;
2625 p->nIndent = iOp+1;
2627 if( str_in_array(zOp, azNext) ){
2628 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2630 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2631 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2633 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2637 p->iIndent = 0;
2638 sqlite3_free(abYield);
2639 sqlite3_reset(pSql);
2643 ** Free the array allocated by explain_data_prepare().
2645 static void explain_data_delete(ShellState *p){
2646 sqlite3_free(p->aiIndent);
2647 p->aiIndent = 0;
2648 p->nIndent = 0;
2649 p->iIndent = 0;
2653 ** Disable and restore .wheretrace and .selecttrace settings.
2655 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2656 extern int sqlite3SelectTrace;
2657 static int savedSelectTrace;
2658 #endif
2659 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2660 extern int sqlite3WhereTrace;
2661 static int savedWhereTrace;
2662 #endif
2663 static void disable_debug_trace_modes(void){
2664 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2665 savedSelectTrace = sqlite3SelectTrace;
2666 sqlite3SelectTrace = 0;
2667 #endif
2668 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2669 savedWhereTrace = sqlite3WhereTrace;
2670 sqlite3WhereTrace = 0;
2671 #endif
2673 static void restore_debug_trace_modes(void){
2674 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2675 sqlite3SelectTrace = savedSelectTrace;
2676 #endif
2677 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2678 sqlite3WhereTrace = savedWhereTrace;
2679 #endif
2683 ** Run a prepared statement
2685 static void exec_prepared_stmt(
2686 ShellState *pArg, /* Pointer to ShellState */
2687 sqlite3_stmt *pStmt /* Statment to run */
2689 int rc;
2691 /* perform the first step. this will tell us if we
2692 ** have a result set or not and how wide it is.
2694 rc = sqlite3_step(pStmt);
2695 /* if we have a result set... */
2696 if( SQLITE_ROW == rc ){
2697 /* allocate space for col name ptr, value ptr, and type */
2698 int nCol = sqlite3_column_count(pStmt);
2699 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2700 if( !pData ){
2701 rc = SQLITE_NOMEM;
2702 }else{
2703 char **azCols = (char **)pData; /* Names of result columns */
2704 char **azVals = &azCols[nCol]; /* Results */
2705 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2706 int i, x;
2707 assert(sizeof(int) <= sizeof(char *));
2708 /* save off ptrs to column names */
2709 for(i=0; i<nCol; i++){
2710 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2713 /* extract the data and data types */
2714 for(i=0; i<nCol; i++){
2715 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2716 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2717 azVals[i] = "";
2718 }else{
2719 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2721 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2722 rc = SQLITE_NOMEM;
2723 break; /* from for */
2725 } /* end for */
2727 /* if data and types extracted successfully... */
2728 if( SQLITE_ROW == rc ){
2729 /* call the supplied callback with the result row data */
2730 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
2731 rc = SQLITE_ABORT;
2732 }else{
2733 rc = sqlite3_step(pStmt);
2736 } while( SQLITE_ROW == rc );
2737 sqlite3_free(pData);
2742 #ifndef SQLITE_OMIT_VIRTUALTABLE
2744 ** This function is called to process SQL if the previous shell command
2745 ** was ".expert". It passes the SQL in the second argument directly to
2746 ** the sqlite3expert object.
2748 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
2749 ** code. In this case, (*pzErr) may be set to point to a buffer containing
2750 ** an English language error message. It is the responsibility of the
2751 ** caller to eventually free this buffer using sqlite3_free().
2753 static int expertHandleSQL(
2754 ShellState *pState,
2755 const char *zSql,
2756 char **pzErr
2758 assert( pState->expert.pExpert );
2759 assert( pzErr==0 || *pzErr==0 );
2760 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
2764 ** This function is called either to silently clean up the object
2765 ** created by the ".expert" command (if bCancel==1), or to generate a
2766 ** report from it and then clean it up (if bCancel==0).
2768 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
2769 ** code. In this case, (*pzErr) may be set to point to a buffer containing
2770 ** an English language error message. It is the responsibility of the
2771 ** caller to eventually free this buffer using sqlite3_free().
2773 static int expertFinish(
2774 ShellState *pState,
2775 int bCancel,
2776 char **pzErr
2778 int rc = SQLITE_OK;
2779 sqlite3expert *p = pState->expert.pExpert;
2780 assert( p );
2781 assert( bCancel || pzErr==0 || *pzErr==0 );
2782 if( bCancel==0 ){
2783 FILE *out = pState->out;
2784 int bVerbose = pState->expert.bVerbose;
2786 rc = sqlite3_expert_analyze(p, pzErr);
2787 if( rc==SQLITE_OK ){
2788 int nQuery = sqlite3_expert_count(p);
2789 int i;
2791 if( bVerbose ){
2792 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
2793 raw_printf(out, "-- Candidates -----------------------------\n");
2794 raw_printf(out, "%s\n", zCand);
2796 for(i=0; i<nQuery; i++){
2797 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
2798 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
2799 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
2800 if( zIdx==0 ) zIdx = "(no new indexes)\n";
2801 if( bVerbose ){
2802 raw_printf(out, "-- Query %d --------------------------------\n",i+1);
2803 raw_printf(out, "%s\n\n", zSql);
2805 raw_printf(out, "%s\n", zIdx);
2806 raw_printf(out, "%s\n", zEQP);
2810 sqlite3_expert_destroy(p);
2811 pState->expert.pExpert = 0;
2812 return rc;
2816 ** Implementation of ".expert" dot command.
2818 static int expertDotCommand(
2819 ShellState *pState, /* Current shell tool state */
2820 char **azArg, /* Array of arguments passed to dot command */
2821 int nArg /* Number of entries in azArg[] */
2823 int rc = SQLITE_OK;
2824 char *zErr = 0;
2825 int i;
2826 int iSample = 0;
2828 assert( pState->expert.pExpert==0 );
2829 memset(&pState->expert, 0, sizeof(ExpertInfo));
2831 for(i=1; rc==SQLITE_OK && i<nArg; i++){
2832 char *z = azArg[i];
2833 int n;
2834 if( z[0]=='-' && z[1]=='-' ) z++;
2835 n = strlen30(z);
2836 if( n>=2 && 0==strncmp(z, "-verbose", n) ){
2837 pState->expert.bVerbose = 1;
2839 else if( n>=2 && 0==strncmp(z, "-sample", n) ){
2840 if( i==(nArg-1) ){
2841 raw_printf(stderr, "option requires an argument: %s\n", z);
2842 rc = SQLITE_ERROR;
2843 }else{
2844 iSample = (int)integerValue(azArg[++i]);
2845 if( iSample<0 || iSample>100 ){
2846 raw_printf(stderr, "value out of range: %s\n", azArg[i]);
2847 rc = SQLITE_ERROR;
2851 else{
2852 raw_printf(stderr, "unknown option: %s\n", z);
2853 rc = SQLITE_ERROR;
2857 if( rc==SQLITE_OK ){
2858 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
2859 if( pState->expert.pExpert==0 ){
2860 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
2861 rc = SQLITE_ERROR;
2862 }else{
2863 sqlite3_expert_config(
2864 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
2869 return rc;
2871 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
2874 ** Execute a statement or set of statements. Print
2875 ** any result rows/columns depending on the current mode
2876 ** set via the supplied callback.
2878 ** This is very similar to SQLite's built-in sqlite3_exec()
2879 ** function except it takes a slightly different callback
2880 ** and callback data argument.
2882 static int shell_exec(
2883 ShellState *pArg, /* Pointer to ShellState */
2884 const char *zSql, /* SQL to be evaluated */
2885 char **pzErrMsg /* Error msg written here */
2887 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2888 int rc = SQLITE_OK; /* Return Code */
2889 int rc2;
2890 const char *zLeftover; /* Tail of unprocessed SQL */
2891 sqlite3 *db = pArg->db;
2893 if( pzErrMsg ){
2894 *pzErrMsg = NULL;
2897 #ifndef SQLITE_OMIT_VIRTUALTABLE
2898 if( pArg->expert.pExpert ){
2899 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
2900 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
2902 #endif
2904 while( zSql[0] && (SQLITE_OK == rc) ){
2905 static const char *zStmtSql;
2906 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2907 if( SQLITE_OK != rc ){
2908 if( pzErrMsg ){
2909 *pzErrMsg = save_err_msg(db);
2911 }else{
2912 if( !pStmt ){
2913 /* this happens for a comment or white-space */
2914 zSql = zLeftover;
2915 while( IsSpace(zSql[0]) ) zSql++;
2916 continue;
2918 zStmtSql = sqlite3_sql(pStmt);
2919 if( zStmtSql==0 ) zStmtSql = "";
2920 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
2922 /* save off the prepared statment handle and reset row count */
2923 if( pArg ){
2924 pArg->pStmt = pStmt;
2925 pArg->cnt = 0;
2928 /* echo the sql statement if echo on */
2929 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
2930 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
2933 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
2934 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
2935 sqlite3_stmt *pExplain;
2936 char *zEQP;
2937 int triggerEQP = 0;
2938 disable_debug_trace_modes();
2939 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
2940 if( pArg->autoEQP>=AUTOEQP_trigger ){
2941 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
2943 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
2944 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2945 if( rc==SQLITE_OK ){
2946 while( sqlite3_step(pExplain)==SQLITE_ROW ){
2947 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
2948 int iEqpId = sqlite3_column_int(pExplain, 0);
2949 int iParentId = sqlite3_column_int(pExplain, 1);
2950 if( zEQPLine[0]=='-' ) eqp_render(pArg);
2951 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
2953 eqp_render(pArg);
2955 sqlite3_finalize(pExplain);
2956 sqlite3_free(zEQP);
2957 if( pArg->autoEQP>=AUTOEQP_full ){
2958 /* Also do an EXPLAIN for ".eqp full" mode */
2959 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2960 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2961 if( rc==SQLITE_OK ){
2962 pArg->cMode = MODE_Explain;
2963 explain_data_prepare(pArg, pExplain);
2964 exec_prepared_stmt(pArg, pExplain);
2965 explain_data_delete(pArg);
2967 sqlite3_finalize(pExplain);
2968 sqlite3_free(zEQP);
2970 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
2971 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
2972 /* Reprepare pStmt before reactiving trace modes */
2973 sqlite3_finalize(pStmt);
2974 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
2976 restore_debug_trace_modes();
2979 if( pArg ){
2980 pArg->cMode = pArg->mode;
2981 if( pArg->autoExplain ){
2982 if( sqlite3_column_count(pStmt)==8
2983 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
2985 pArg->cMode = MODE_Explain;
2987 if( sqlite3_column_count(pStmt)==4
2988 && sqlite3_strlike("EXPLAIN QUERY PLAN%", zStmtSql,0)==0 ){
2989 pArg->cMode = MODE_EQP;
2993 /* If the shell is currently in ".explain" mode, gather the extra
2994 ** data required to add indents to the output.*/
2995 if( pArg->cMode==MODE_Explain ){
2996 explain_data_prepare(pArg, pStmt);
3000 exec_prepared_stmt(pArg, pStmt);
3001 explain_data_delete(pArg);
3002 eqp_render(pArg);
3004 /* print usage stats if stats on */
3005 if( pArg && pArg->statsOn ){
3006 display_stats(db, pArg, 0);
3009 /* print loop-counters if required */
3010 if( pArg && pArg->scanstatsOn ){
3011 display_scanstats(db, pArg);
3014 /* Finalize the statement just executed. If this fails, save a
3015 ** copy of the error message. Otherwise, set zSql to point to the
3016 ** next statement to execute. */
3017 rc2 = sqlite3_finalize(pStmt);
3018 if( rc!=SQLITE_NOMEM ) rc = rc2;
3019 if( rc==SQLITE_OK ){
3020 zSql = zLeftover;
3021 while( IsSpace(zSql[0]) ) zSql++;
3022 }else if( pzErrMsg ){
3023 *pzErrMsg = save_err_msg(db);
3026 /* clear saved stmt handle */
3027 if( pArg ){
3028 pArg->pStmt = NULL;
3031 } /* end while */
3033 return rc;
3037 ** Release memory previously allocated by tableColumnList().
3039 static void freeColumnList(char **azCol){
3040 int i;
3041 for(i=1; azCol[i]; i++){
3042 sqlite3_free(azCol[i]);
3044 /* azCol[0] is a static string */
3045 sqlite3_free(azCol);
3049 ** Return a list of pointers to strings which are the names of all
3050 ** columns in table zTab. The memory to hold the names is dynamically
3051 ** allocated and must be released by the caller using a subsequent call
3052 ** to freeColumnList().
3054 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
3055 ** value that needs to be preserved, then azCol[0] is filled in with the
3056 ** name of the rowid column.
3058 ** The first regular column in the table is azCol[1]. The list is terminated
3059 ** by an entry with azCol[i]==0.
3061 static char **tableColumnList(ShellState *p, const char *zTab){
3062 char **azCol = 0;
3063 sqlite3_stmt *pStmt;
3064 char *zSql;
3065 int nCol = 0;
3066 int nAlloc = 0;
3067 int nPK = 0; /* Number of PRIMARY KEY columns seen */
3068 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
3069 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3070 int rc;
3072 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3073 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3074 sqlite3_free(zSql);
3075 if( rc ) return 0;
3076 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3077 if( nCol>=nAlloc-2 ){
3078 nAlloc = nAlloc*2 + nCol + 10;
3079 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3080 if( azCol==0 ) shell_out_of_memory();
3082 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3083 if( sqlite3_column_int(pStmt, 5) ){
3084 nPK++;
3085 if( nPK==1
3086 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3087 "INTEGER")==0
3089 isIPK = 1;
3090 }else{
3091 isIPK = 0;
3095 sqlite3_finalize(pStmt);
3096 if( azCol==0 ) return 0;
3097 azCol[0] = 0;
3098 azCol[nCol+1] = 0;
3100 /* The decision of whether or not a rowid really needs to be preserved
3101 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
3102 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
3103 ** rowids on tables where the rowid is inaccessible because there are other
3104 ** columns in the table named "rowid", "_rowid_", and "oid".
3106 if( preserveRowid && isIPK ){
3107 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3108 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
3109 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3110 ** ROWID aliases. To distinguish these cases, check to see if
3111 ** there is a "pk" entry in "PRAGMA index_list". There will be
3112 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3114 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3115 " WHERE origin='pk'", zTab);
3116 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3117 sqlite3_free(zSql);
3118 if( rc ){
3119 freeColumnList(azCol);
3120 return 0;
3122 rc = sqlite3_step(pStmt);
3123 sqlite3_finalize(pStmt);
3124 preserveRowid = rc==SQLITE_ROW;
3126 if( preserveRowid ){
3127 /* Only preserve the rowid if we can find a name to use for the
3128 ** rowid */
3129 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3130 int i, j;
3131 for(j=0; j<3; j++){
3132 for(i=1; i<=nCol; i++){
3133 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3135 if( i>nCol ){
3136 /* At this point, we know that azRowid[j] is not the name of any
3137 ** ordinary column in the table. Verify that azRowid[j] is a valid
3138 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
3139 ** tables will fail this last check */
3140 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3141 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3142 break;
3146 return azCol;
3150 ** Toggle the reverse_unordered_selects setting.
3152 static void toggleSelectOrder(sqlite3 *db){
3153 sqlite3_stmt *pStmt = 0;
3154 int iSetting = 0;
3155 char zStmt[100];
3156 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3157 if( sqlite3_step(pStmt)==SQLITE_ROW ){
3158 iSetting = sqlite3_column_int(pStmt, 0);
3160 sqlite3_finalize(pStmt);
3161 sqlite3_snprintf(sizeof(zStmt), zStmt,
3162 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3163 sqlite3_exec(db, zStmt, 0, 0, 0);
3167 ** This is a different callback routine used for dumping the database.
3168 ** Each row received by this callback consists of a table name,
3169 ** the table type ("index" or "table") and SQL to create the table.
3170 ** This routine should print text sufficient to recreate the table.
3172 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
3173 int rc;
3174 const char *zTable;
3175 const char *zType;
3176 const char *zSql;
3177 ShellState *p = (ShellState *)pArg;
3179 UNUSED_PARAMETER(azNotUsed);
3180 if( nArg!=3 || azArg==0 ) return 0;
3181 zTable = azArg[0];
3182 zType = azArg[1];
3183 zSql = azArg[2];
3185 if( strcmp(zTable, "sqlite_sequence")==0 ){
3186 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
3187 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
3188 raw_printf(p->out, "ANALYZE sqlite_master;\n");
3189 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3190 return 0;
3191 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3192 char *zIns;
3193 if( !p->writableSchema ){
3194 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
3195 p->writableSchema = 1;
3197 zIns = sqlite3_mprintf(
3198 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
3199 "VALUES('table','%q','%q',0,'%q');",
3200 zTable, zTable, zSql);
3201 utf8_printf(p->out, "%s\n", zIns);
3202 sqlite3_free(zIns);
3203 return 0;
3204 }else{
3205 printSchemaLine(p->out, zSql, ";\n");
3208 if( strcmp(zType, "table")==0 ){
3209 ShellText sSelect;
3210 ShellText sTable;
3211 char **azCol;
3212 int i;
3213 char *savedDestTable;
3214 int savedMode;
3216 azCol = tableColumnList(p, zTable);
3217 if( azCol==0 ){
3218 p->nErr++;
3219 return 0;
3222 /* Always quote the table name, even if it appears to be pure ascii,
3223 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
3224 initText(&sTable);
3225 appendText(&sTable, zTable, quoteChar(zTable));
3226 /* If preserving the rowid, add a column list after the table name.
3227 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3228 ** instead of the usual "INSERT INTO tab VALUES(...)".
3230 if( azCol[0] ){
3231 appendText(&sTable, "(", 0);
3232 appendText(&sTable, azCol[0], 0);
3233 for(i=1; azCol[i]; i++){
3234 appendText(&sTable, ",", 0);
3235 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
3237 appendText(&sTable, ")", 0);
3240 /* Build an appropriate SELECT statement */
3241 initText(&sSelect);
3242 appendText(&sSelect, "SELECT ", 0);
3243 if( azCol[0] ){
3244 appendText(&sSelect, azCol[0], 0);
3245 appendText(&sSelect, ",", 0);
3247 for(i=1; azCol[i]; i++){
3248 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
3249 if( azCol[i+1] ){
3250 appendText(&sSelect, ",", 0);
3253 freeColumnList(azCol);
3254 appendText(&sSelect, " FROM ", 0);
3255 appendText(&sSelect, zTable, quoteChar(zTable));
3257 savedDestTable = p->zDestTable;
3258 savedMode = p->mode;
3259 p->zDestTable = sTable.z;
3260 p->mode = p->cMode = MODE_Insert;
3261 rc = shell_exec(p, sSelect.z, 0);
3262 if( (rc&0xff)==SQLITE_CORRUPT ){
3263 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3264 toggleSelectOrder(p->db);
3265 shell_exec(p, sSelect.z, 0);
3266 toggleSelectOrder(p->db);
3268 p->zDestTable = savedDestTable;
3269 p->mode = savedMode;
3270 freeText(&sTable);
3271 freeText(&sSelect);
3272 if( rc ) p->nErr++;
3274 return 0;
3278 ** Run zQuery. Use dump_callback() as the callback routine so that
3279 ** the contents of the query are output as SQL statements.
3281 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
3282 ** "ORDER BY rowid DESC" to the end.
3284 static int run_schema_dump_query(
3285 ShellState *p,
3286 const char *zQuery
3288 int rc;
3289 char *zErr = 0;
3290 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
3291 if( rc==SQLITE_CORRUPT ){
3292 char *zQ2;
3293 int len = strlen30(zQuery);
3294 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3295 if( zErr ){
3296 utf8_printf(p->out, "/****** %s ******/\n", zErr);
3297 sqlite3_free(zErr);
3298 zErr = 0;
3300 zQ2 = malloc( len+100 );
3301 if( zQ2==0 ) return rc;
3302 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
3303 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3304 if( rc ){
3305 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
3306 }else{
3307 rc = SQLITE_CORRUPT;
3309 sqlite3_free(zErr);
3310 free(zQ2);
3312 return rc;
3316 ** Text of a help message
3318 static char zHelp[] =
3319 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
3320 ".archive ... Manage SQL archives: \".archive --help\" for details\n"
3321 #endif
3322 #ifndef SQLITE_OMIT_AUTHORIZATION
3323 ".auth ON|OFF Show authorizer callbacks\n"
3324 #endif
3325 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
3326 ".bail on|off Stop after hitting an error. Default OFF\n"
3327 ".binary on|off Turn binary output on or off. Default OFF\n"
3328 ".cd DIRECTORY Change the working directory to DIRECTORY\n"
3329 ".changes on|off Show number of rows changed by SQL\n"
3330 ".check GLOB Fail if output since .testcase does not match\n"
3331 ".clone NEWDB Clone data into NEWDB from the existing database\n"
3332 ".databases List names and files of attached databases\n"
3333 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options\n"
3334 ".dbinfo ?DB? Show status information about the database\n"
3335 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
3336 " If TABLE specified, only dump tables matching\n"
3337 " LIKE pattern TABLE.\n"
3338 ".echo on|off Turn command echo on or off\n"
3339 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
3340 ".excel Display the output of next command in a spreadsheet\n"
3341 ".exit Exit this program\n"
3342 ".expert EXPERIMENTAL. Suggest indexes for specified queries\n"
3343 /* Because explain mode comes on automatically now, the ".explain" mode
3344 ** is removed from the help screen. It is still supported for legacy, however */
3345 /*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/
3346 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
3347 ".headers on|off Turn display of headers on or off\n"
3348 ".help Show this message\n"
3349 ".import FILE TABLE Import data from FILE into TABLE\n"
3350 #ifndef SQLITE_OMIT_TEST_CONTROL
3351 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3352 #endif
3353 ".indexes ?TABLE? Show names of all indexes\n"
3354 " If TABLE specified, only show indexes for tables\n"
3355 " matching LIKE pattern TABLE.\n"
3356 #ifdef SQLITE_ENABLE_IOTRACE
3357 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3358 #endif
3359 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
3360 ".lint OPTIONS Report potential schema issues. Options:\n"
3361 " fkey-indexes Find missing foreign key indexes\n"
3362 #ifndef SQLITE_OMIT_LOAD_EXTENSION
3363 ".load FILE ?ENTRY? Load an extension library\n"
3364 #endif
3365 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
3366 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
3367 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
3368 " csv Comma-separated values\n"
3369 " column Left-aligned columns. (See .width)\n"
3370 " html HTML <table> code\n"
3371 " insert SQL insert statements for TABLE\n"
3372 " line One value per line\n"
3373 " list Values delimited by \"|\"\n"
3374 " quote Escape answers as for SQL\n"
3375 " tabs Tab-separated values\n"
3376 " tcl TCL list elements\n"
3377 ".nullvalue STRING Use STRING in place of NULL values\n"
3378 ".once (-e|-x|FILE) Output for the next SQL command only to FILE\n"
3379 " or invoke system text editor (-e) or spreadsheet (-x)\n"
3380 " on the output.\n"
3381 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n"
3382 " The --new option starts with an empty file\n"
3383 " Other options: --readonly --append --zip\n"
3384 ".output ?FILE? Send output to FILE or stdout\n"
3385 ".print STRING... Print literal STRING\n"
3386 ".prompt MAIN CONTINUE Replace the standard prompts\n"
3387 ".quit Exit this program\n"
3388 ".read FILENAME Execute SQL in FILENAME\n"
3389 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
3390 ".save FILE Write in-memory database into FILE\n"
3391 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
3392 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3393 " Add --indent for pretty-printing\n"
3394 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
3395 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3396 " separator for both the output mode and .import\n"
3397 #if defined(SQLITE_ENABLE_SESSION)
3398 ".session CMD ... Create or control sessions\n"
3399 #endif
3400 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
3401 #ifndef SQLITE_NOHAVE_SYSTEM
3402 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
3403 #endif
3404 ".show Show the current values for various settings\n"
3405 ".stats ?on|off? Show stats or turn stats on or off\n"
3406 #ifndef SQLITE_NOHAVE_SYSTEM
3407 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
3408 #endif
3409 ".tables ?TABLE? List names of tables\n"
3410 " If TABLE specified, only list tables matching\n"
3411 " LIKE pattern TABLE.\n"
3412 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
3413 ".timeout MS Try opening locked tables for MS milliseconds\n"
3414 ".timer on|off Turn SQL timer on or off\n"
3415 ".trace FILE|off Output each SQL statement as it is run\n"
3416 ".vfsinfo ?AUX? Information about the top-level VFS\n"
3417 ".vfslist List all available VFSes\n"
3418 ".vfsname ?AUX? Print the name of the VFS stack\n"
3419 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
3420 " Negative values right-justify\n"
3423 #if defined(SQLITE_ENABLE_SESSION)
3425 ** Print help information for the ".sessions" command
3427 void session_help(ShellState *p){
3428 raw_printf(p->out,
3429 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3430 "If ?NAME? is omitted, the first defined session is used.\n"
3431 "Subcommands:\n"
3432 " attach TABLE Attach TABLE\n"
3433 " changeset FILE Write a changeset into FILE\n"
3434 " close Close one session\n"
3435 " enable ?BOOLEAN? Set or query the enable bit\n"
3436 " filter GLOB... Reject tables matching GLOBs\n"
3437 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3438 " isempty Query whether the session is empty\n"
3439 " list List currently open session names\n"
3440 " open DB NAME Open a new session on DB\n"
3441 " patchset FILE Write a patchset into FILE\n"
3444 #endif
3447 /* Forward reference */
3448 static int process_input(ShellState *p, FILE *in);
3451 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
3452 ** and return a pointer to the buffer. The caller is responsible for freeing
3453 ** the memory.
3455 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3456 ** read.
3458 ** For convenience, a nul-terminator byte is always appended to the data read
3459 ** from the file before the buffer is returned. This byte is not included in
3460 ** the final value of (*pnByte), if applicable.
3462 ** NULL is returned if any error is encountered. The final value of *pnByte
3463 ** is undefined in this case.
3465 static char *readFile(const char *zName, int *pnByte){
3466 FILE *in = fopen(zName, "rb");
3467 long nIn;
3468 size_t nRead;
3469 char *pBuf;
3470 if( in==0 ) return 0;
3471 fseek(in, 0, SEEK_END);
3472 nIn = ftell(in);
3473 rewind(in);
3474 pBuf = sqlite3_malloc64( nIn+1 );
3475 if( pBuf==0 ) return 0;
3476 nRead = fread(pBuf, nIn, 1, in);
3477 fclose(in);
3478 if( nRead!=1 ){
3479 sqlite3_free(pBuf);
3480 return 0;
3482 pBuf[nIn] = 0;
3483 if( pnByte ) *pnByte = nIn;
3484 return pBuf;
3487 #if defined(SQLITE_ENABLE_SESSION)
3489 ** Close a single OpenSession object and release all of its associated
3490 ** resources.
3492 static void session_close(OpenSession *pSession){
3493 int i;
3494 sqlite3session_delete(pSession->p);
3495 sqlite3_free(pSession->zName);
3496 for(i=0; i<pSession->nFilter; i++){
3497 sqlite3_free(pSession->azFilter[i]);
3499 sqlite3_free(pSession->azFilter);
3500 memset(pSession, 0, sizeof(OpenSession));
3502 #endif
3505 ** Close all OpenSession objects and release all associated resources.
3507 #if defined(SQLITE_ENABLE_SESSION)
3508 static void session_close_all(ShellState *p){
3509 int i;
3510 for(i=0; i<p->nSession; i++){
3511 session_close(&p->aSession[i]);
3513 p->nSession = 0;
3515 #else
3516 # define session_close_all(X)
3517 #endif
3520 ** Implementation of the xFilter function for an open session. Omit
3521 ** any tables named by ".session filter" but let all other table through.
3523 #if defined(SQLITE_ENABLE_SESSION)
3524 static int session_filter(void *pCtx, const char *zTab){
3525 OpenSession *pSession = (OpenSession*)pCtx;
3526 int i;
3527 for(i=0; i<pSession->nFilter; i++){
3528 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3530 return 1;
3532 #endif
3535 ** Try to deduce the type of file for zName based on its content. Return
3536 ** one of the SHELL_OPEN_* constants.
3538 ** If the file does not exist or is empty but its name looks like a ZIP
3539 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
3540 ** Otherwise, assume an ordinary database regardless of the filename if
3541 ** the type cannot be determined from content.
3543 static int deduceDatabaseType(const char *zName, int dfltZip){
3544 FILE *f = fopen(zName, "rb");
3545 size_t n;
3546 int rc = SHELL_OPEN_UNSPEC;
3547 char zBuf[100];
3548 if( f==0 ){
3549 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ) return SHELL_OPEN_ZIPFILE;
3550 return SHELL_OPEN_NORMAL;
3552 fseek(f, -25, SEEK_END);
3553 n = fread(zBuf, 25, 1, f);
3554 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
3555 rc = SHELL_OPEN_APPENDVFS;
3556 }else{
3557 fseek(f, -22, SEEK_END);
3558 n = fread(zBuf, 22, 1, f);
3559 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
3560 && zBuf[3]==0x06 ){
3561 rc = SHELL_OPEN_ZIPFILE;
3562 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
3563 return SHELL_OPEN_ZIPFILE;
3566 fclose(f);
3567 return rc;
3571 ** Make sure the database is open. If it is not, then open it. If
3572 ** the database fails to open, print an error message and exit.
3574 static void open_db(ShellState *p, int keepAlive){
3575 if( p->db==0 ){
3576 if( p->openMode==SHELL_OPEN_UNSPEC ){
3577 if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
3578 p->openMode = SHELL_OPEN_NORMAL;
3579 }else if( access(p->zDbFilename,0)==0 ){
3580 p->openMode = (u8)deduceDatabaseType(p->zDbFilename, 0);
3583 switch( p->openMode ){
3584 case SHELL_OPEN_APPENDVFS: {
3585 sqlite3_open_v2(p->zDbFilename, &p->db,
3586 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs");
3587 break;
3589 case SHELL_OPEN_ZIPFILE: {
3590 sqlite3_open(":memory:", &p->db);
3591 break;
3593 case SHELL_OPEN_READONLY: {
3594 sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0);
3595 break;
3597 case SHELL_OPEN_UNSPEC:
3598 case SHELL_OPEN_NORMAL: {
3599 sqlite3_open(p->zDbFilename, &p->db);
3600 break;
3603 globalDb = p->db;
3604 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
3605 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
3606 p->zDbFilename, sqlite3_errmsg(p->db));
3607 if( keepAlive ) return;
3608 exit(1);
3610 #ifndef SQLITE_OMIT_LOAD_EXTENSION
3611 sqlite3_enable_load_extension(p->db, 1);
3612 #endif
3613 sqlite3_fileio_init(p->db, 0, 0);
3614 sqlite3_shathree_init(p->db, 0, 0);
3615 sqlite3_completion_init(p->db, 0, 0);
3616 #ifdef SQLITE_HAVE_ZLIB
3617 sqlite3_zipfile_init(p->db, 0, 0);
3618 sqlite3_sqlar_init(p->db, 0, 0);
3619 #endif
3620 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
3621 shellAddSchemaName, 0, 0);
3622 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
3623 shellModuleSchema, 0, 0);
3624 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
3625 shellPutsFunc, 0, 0);
3626 #ifndef SQLITE_NOHAVE_SYSTEM
3627 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
3628 editFunc, 0, 0);
3629 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
3630 editFunc, 0, 0);
3631 #endif
3632 if( p->openMode==SHELL_OPEN_ZIPFILE ){
3633 char *zSql = sqlite3_mprintf(
3634 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
3635 sqlite3_exec(p->db, zSql, 0, 0, 0);
3636 sqlite3_free(zSql);
3641 #if HAVE_READLINE || HAVE_EDITLINE
3643 ** Readline completion callbacks
3645 static char *readline_completion_generator(const char *text, int state){
3646 static sqlite3_stmt *pStmt = 0;
3647 char *zRet;
3648 if( state==0 ){
3649 char *zSql;
3650 sqlite3_finalize(pStmt);
3651 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
3652 " FROM completion(%Q) ORDER BY 1", text);
3653 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
3654 sqlite3_free(zSql);
3656 if( sqlite3_step(pStmt)==SQLITE_ROW ){
3657 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
3658 }else{
3659 sqlite3_finalize(pStmt);
3660 pStmt = 0;
3661 zRet = 0;
3663 return zRet;
3665 static char **readline_completion(const char *zText, int iStart, int iEnd){
3666 rl_attempted_completion_over = 1;
3667 return rl_completion_matches(zText, readline_completion_generator);
3670 #elif HAVE_LINENOISE
3672 ** Linenoise completion callback
3674 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
3675 int nLine = strlen30(zLine);
3676 int i, iStart;
3677 sqlite3_stmt *pStmt = 0;
3678 char *zSql;
3679 char zBuf[1000];
3681 if( nLine>sizeof(zBuf)-30 ) return;
3682 if( zLine[0]=='.' ) return;
3683 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
3684 if( i==nLine-1 ) return;
3685 iStart = i+1;
3686 memcpy(zBuf, zLine, iStart);
3687 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
3688 " FROM completion(%Q,%Q) ORDER BY 1",
3689 &zLine[iStart], zLine);
3690 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
3691 sqlite3_free(zSql);
3692 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
3693 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3694 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
3695 int nCompletion = sqlite3_column_bytes(pStmt, 0);
3696 if( iStart+nCompletion < sizeof(zBuf)-1 ){
3697 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
3698 linenoiseAddCompletion(lc, zBuf);
3701 sqlite3_finalize(pStmt);
3703 #endif
3706 ** Do C-language style dequoting.
3708 ** \a -> alarm
3709 ** \b -> backspace
3710 ** \t -> tab
3711 ** \n -> newline
3712 ** \v -> vertical tab
3713 ** \f -> form feed
3714 ** \r -> carriage return
3715 ** \s -> space
3716 ** \" -> "
3717 ** \' -> '
3718 ** \\ -> backslash
3719 ** \NNN -> ascii character NNN in octal
3721 static void resolve_backslashes(char *z){
3722 int i, j;
3723 char c;
3724 while( *z && *z!='\\' ) z++;
3725 for(i=j=0; (c = z[i])!=0; i++, j++){
3726 if( c=='\\' && z[i+1]!=0 ){
3727 c = z[++i];
3728 if( c=='a' ){
3729 c = '\a';
3730 }else if( c=='b' ){
3731 c = '\b';
3732 }else if( c=='t' ){
3733 c = '\t';
3734 }else if( c=='n' ){
3735 c = '\n';
3736 }else if( c=='v' ){
3737 c = '\v';
3738 }else if( c=='f' ){
3739 c = '\f';
3740 }else if( c=='r' ){
3741 c = '\r';
3742 }else if( c=='"' ){
3743 c = '"';
3744 }else if( c=='\'' ){
3745 c = '\'';
3746 }else if( c=='\\' ){
3747 c = '\\';
3748 }else if( c>='0' && c<='7' ){
3749 c -= '0';
3750 if( z[i+1]>='0' && z[i+1]<='7' ){
3751 i++;
3752 c = (c<<3) + z[i] - '0';
3753 if( z[i+1]>='0' && z[i+1]<='7' ){
3754 i++;
3755 c = (c<<3) + z[i] - '0';
3760 z[j] = c;
3762 if( j<i ) z[j] = 0;
3766 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3767 ** for TRUE and FALSE. Return the integer value if appropriate.
3769 static int booleanValue(const char *zArg){
3770 int i;
3771 if( zArg[0]=='0' && zArg[1]=='x' ){
3772 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3773 }else{
3774 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3776 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3777 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3778 return 1;
3780 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3781 return 0;
3783 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
3784 zArg);
3785 return 0;
3789 ** Set or clear a shell flag according to a boolean value.
3791 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
3792 if( booleanValue(zArg) ){
3793 ShellSetFlag(p, mFlag);
3794 }else{
3795 ShellClearFlag(p, mFlag);
3800 ** Close an output file, assuming it is not stderr or stdout
3802 static void output_file_close(FILE *f){
3803 if( f && f!=stdout && f!=stderr ) fclose(f);
3807 ** Try to open an output file. The names "stdout" and "stderr" are
3808 ** recognized and do the right thing. NULL is returned if the output
3809 ** filename is "off".
3811 static FILE *output_file_open(const char *zFile, int bTextMode){
3812 FILE *f;
3813 if( strcmp(zFile,"stdout")==0 ){
3814 f = stdout;
3815 }else if( strcmp(zFile, "stderr")==0 ){
3816 f = stderr;
3817 }else if( strcmp(zFile, "off")==0 ){
3818 f = 0;
3819 }else{
3820 f = fopen(zFile, bTextMode ? "w" : "wb");
3821 if( f==0 ){
3822 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
3825 return f;
3828 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3830 ** A routine for handling output from sqlite3_trace().
3832 static int sql_trace_callback(
3833 unsigned mType,
3834 void *pArg,
3835 void *pP,
3836 void *pX
3838 FILE *f = (FILE*)pArg;
3839 UNUSED_PARAMETER(mType);
3840 UNUSED_PARAMETER(pP);
3841 if( f ){
3842 const char *z = (const char*)pX;
3843 int i = strlen30(z);
3844 while( i>0 && z[i-1]==';' ){ i--; }
3845 utf8_printf(f, "%.*s;\n", i, z);
3847 return 0;
3849 #endif
3852 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
3853 ** a useful spot to set a debugger breakpoint.
3855 static void test_breakpoint(void){
3856 static int nCall = 0;
3857 nCall++;
3861 ** An object used to read a CSV and other files for import.
3863 typedef struct ImportCtx ImportCtx;
3864 struct ImportCtx {
3865 const char *zFile; /* Name of the input file */
3866 FILE *in; /* Read the CSV text from this input stream */
3867 char *z; /* Accumulated text for a field */
3868 int n; /* Number of bytes in z */
3869 int nAlloc; /* Space allocated for z[] */
3870 int nLine; /* Current line number */
3871 int bNotFirst; /* True if one or more bytes already read */
3872 int cTerm; /* Character that terminated the most recent field */
3873 int cColSep; /* The column separator character. (Usually ",") */
3874 int cRowSep; /* The row separator character. (Usually "\n") */
3877 /* Append a single byte to z[] */
3878 static void import_append_char(ImportCtx *p, int c){
3879 if( p->n+1>=p->nAlloc ){
3880 p->nAlloc += p->nAlloc + 100;
3881 p->z = sqlite3_realloc64(p->z, p->nAlloc);
3882 if( p->z==0 ) shell_out_of_memory();
3884 p->z[p->n++] = (char)c;
3887 /* Read a single field of CSV text. Compatible with rfc4180 and extended
3888 ** with the option of having a separator other than ",".
3890 ** + Input comes from p->in.
3891 ** + Store results in p->z of length p->n. Space to hold p->z comes
3892 ** from sqlite3_malloc64().
3893 ** + Use p->cSep as the column separator. The default is ",".
3894 ** + Use p->rSep as the row separator. The default is "\n".
3895 ** + Keep track of the line number in p->nLine.
3896 ** + Store the character that terminates the field in p->cTerm. Store
3897 ** EOF on end-of-file.
3898 ** + Report syntax errors on stderr
3900 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
3901 int c;
3902 int cSep = p->cColSep;
3903 int rSep = p->cRowSep;
3904 p->n = 0;
3905 c = fgetc(p->in);
3906 if( c==EOF || seenInterrupt ){
3907 p->cTerm = EOF;
3908 return 0;
3910 if( c=='"' ){
3911 int pc, ppc;
3912 int startLine = p->nLine;
3913 int cQuote = c;
3914 pc = ppc = 0;
3915 while( 1 ){
3916 c = fgetc(p->in);
3917 if( c==rSep ) p->nLine++;
3918 if( c==cQuote ){
3919 if( pc==cQuote ){
3920 pc = 0;
3921 continue;
3924 if( (c==cSep && pc==cQuote)
3925 || (c==rSep && pc==cQuote)
3926 || (c==rSep && pc=='\r' && ppc==cQuote)
3927 || (c==EOF && pc==cQuote)
3929 do{ p->n--; }while( p->z[p->n]!=cQuote );
3930 p->cTerm = c;
3931 break;
3933 if( pc==cQuote && c!='\r' ){
3934 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
3935 p->zFile, p->nLine, cQuote);
3937 if( c==EOF ){
3938 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
3939 p->zFile, startLine, cQuote);
3940 p->cTerm = c;
3941 break;
3943 import_append_char(p, c);
3944 ppc = pc;
3945 pc = c;
3947 }else{
3948 /* If this is the first field being parsed and it begins with the
3949 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
3950 if( (c&0xff)==0xef && p->bNotFirst==0 ){
3951 import_append_char(p, c);
3952 c = fgetc(p->in);
3953 if( (c&0xff)==0xbb ){
3954 import_append_char(p, c);
3955 c = fgetc(p->in);
3956 if( (c&0xff)==0xbf ){
3957 p->bNotFirst = 1;
3958 p->n = 0;
3959 return csv_read_one_field(p);
3963 while( c!=EOF && c!=cSep && c!=rSep ){
3964 import_append_char(p, c);
3965 c = fgetc(p->in);
3967 if( c==rSep ){
3968 p->nLine++;
3969 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
3971 p->cTerm = c;
3973 if( p->z ) p->z[p->n] = 0;
3974 p->bNotFirst = 1;
3975 return p->z;
3978 /* Read a single field of ASCII delimited text.
3980 ** + Input comes from p->in.
3981 ** + Store results in p->z of length p->n. Space to hold p->z comes
3982 ** from sqlite3_malloc64().
3983 ** + Use p->cSep as the column separator. The default is "\x1F".
3984 ** + Use p->rSep as the row separator. The default is "\x1E".
3985 ** + Keep track of the row number in p->nLine.
3986 ** + Store the character that terminates the field in p->cTerm. Store
3987 ** EOF on end-of-file.
3988 ** + Report syntax errors on stderr
3990 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
3991 int c;
3992 int cSep = p->cColSep;
3993 int rSep = p->cRowSep;
3994 p->n = 0;
3995 c = fgetc(p->in);
3996 if( c==EOF || seenInterrupt ){
3997 p->cTerm = EOF;
3998 return 0;
4000 while( c!=EOF && c!=cSep && c!=rSep ){
4001 import_append_char(p, c);
4002 c = fgetc(p->in);
4004 if( c==rSep ){
4005 p->nLine++;
4007 p->cTerm = c;
4008 if( p->z ) p->z[p->n] = 0;
4009 return p->z;
4013 ** Try to transfer data for table zTable. If an error is seen while
4014 ** moving forward, try to go backwards. The backwards movement won't
4015 ** work for WITHOUT ROWID tables.
4017 static void tryToCloneData(
4018 ShellState *p,
4019 sqlite3 *newDb,
4020 const char *zTable
4022 sqlite3_stmt *pQuery = 0;
4023 sqlite3_stmt *pInsert = 0;
4024 char *zQuery = 0;
4025 char *zInsert = 0;
4026 int rc;
4027 int i, j, n;
4028 int nTable = strlen30(zTable);
4029 int k = 0;
4030 int cnt = 0;
4031 const int spinRate = 10000;
4033 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
4034 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4035 if( rc ){
4036 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4037 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4038 zQuery);
4039 goto end_data_xfer;
4041 n = sqlite3_column_count(pQuery);
4042 zInsert = sqlite3_malloc64(200 + nTable + n*3);
4043 if( zInsert==0 ) shell_out_of_memory();
4044 sqlite3_snprintf(200+nTable,zInsert,
4045 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
4046 i = strlen30(zInsert);
4047 for(j=1; j<n; j++){
4048 memcpy(zInsert+i, ",?", 2);
4049 i += 2;
4051 memcpy(zInsert+i, ");", 3);
4052 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
4053 if( rc ){
4054 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4055 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
4056 zQuery);
4057 goto end_data_xfer;
4059 for(k=0; k<2; k++){
4060 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4061 for(i=0; i<n; i++){
4062 switch( sqlite3_column_type(pQuery, i) ){
4063 case SQLITE_NULL: {
4064 sqlite3_bind_null(pInsert, i+1);
4065 break;
4067 case SQLITE_INTEGER: {
4068 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
4069 break;
4071 case SQLITE_FLOAT: {
4072 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
4073 break;
4075 case SQLITE_TEXT: {
4076 sqlite3_bind_text(pInsert, i+1,
4077 (const char*)sqlite3_column_text(pQuery,i),
4078 -1, SQLITE_STATIC);
4079 break;
4081 case SQLITE_BLOB: {
4082 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
4083 sqlite3_column_bytes(pQuery,i),
4084 SQLITE_STATIC);
4085 break;
4088 } /* End for */
4089 rc = sqlite3_step(pInsert);
4090 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
4091 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
4092 sqlite3_errmsg(newDb));
4094 sqlite3_reset(pInsert);
4095 cnt++;
4096 if( (cnt%spinRate)==0 ){
4097 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
4098 fflush(stdout);
4100 } /* End while */
4101 if( rc==SQLITE_DONE ) break;
4102 sqlite3_finalize(pQuery);
4103 sqlite3_free(zQuery);
4104 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
4105 zTable);
4106 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4107 if( rc ){
4108 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
4109 break;
4111 } /* End for(k=0...) */
4113 end_data_xfer:
4114 sqlite3_finalize(pQuery);
4115 sqlite3_finalize(pInsert);
4116 sqlite3_free(zQuery);
4117 sqlite3_free(zInsert);
4122 ** Try to transfer all rows of the schema that match zWhere. For
4123 ** each row, invoke xForEach() on the object defined by that row.
4124 ** If an error is encountered while moving forward through the
4125 ** sqlite_master table, try again moving backwards.
4127 static void tryToCloneSchema(
4128 ShellState *p,
4129 sqlite3 *newDb,
4130 const char *zWhere,
4131 void (*xForEach)(ShellState*,sqlite3*,const char*)
4133 sqlite3_stmt *pQuery = 0;
4134 char *zQuery = 0;
4135 int rc;
4136 const unsigned char *zName;
4137 const unsigned char *zSql;
4138 char *zErrMsg = 0;
4140 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4141 " WHERE %s", zWhere);
4142 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4143 if( rc ){
4144 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4145 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4146 zQuery);
4147 goto end_schema_xfer;
4149 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4150 zName = sqlite3_column_text(pQuery, 0);
4151 zSql = sqlite3_column_text(pQuery, 1);
4152 printf("%s... ", zName); fflush(stdout);
4153 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4154 if( zErrMsg ){
4155 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4156 sqlite3_free(zErrMsg);
4157 zErrMsg = 0;
4159 if( xForEach ){
4160 xForEach(p, newDb, (const char*)zName);
4162 printf("done\n");
4164 if( rc!=SQLITE_DONE ){
4165 sqlite3_finalize(pQuery);
4166 sqlite3_free(zQuery);
4167 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4168 " WHERE %s ORDER BY rowid DESC", zWhere);
4169 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4170 if( rc ){
4171 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4172 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4173 zQuery);
4174 goto end_schema_xfer;
4176 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4177 zName = sqlite3_column_text(pQuery, 0);
4178 zSql = sqlite3_column_text(pQuery, 1);
4179 printf("%s... ", zName); fflush(stdout);
4180 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4181 if( zErrMsg ){
4182 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4183 sqlite3_free(zErrMsg);
4184 zErrMsg = 0;
4186 if( xForEach ){
4187 xForEach(p, newDb, (const char*)zName);
4189 printf("done\n");
4192 end_schema_xfer:
4193 sqlite3_finalize(pQuery);
4194 sqlite3_free(zQuery);
4198 ** Open a new database file named "zNewDb". Try to recover as much information
4199 ** as possible out of the main database (which might be corrupt) and write it
4200 ** into zNewDb.
4202 static void tryToClone(ShellState *p, const char *zNewDb){
4203 int rc;
4204 sqlite3 *newDb = 0;
4205 if( access(zNewDb,0)==0 ){
4206 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
4207 return;
4209 rc = sqlite3_open(zNewDb, &newDb);
4210 if( rc ){
4211 utf8_printf(stderr, "Cannot create output database: %s\n",
4212 sqlite3_errmsg(newDb));
4213 }else{
4214 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
4215 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
4216 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
4217 tryToCloneSchema(p, newDb, "type!='table'", 0);
4218 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
4219 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4221 sqlite3_close(newDb);
4225 ** Change the output file back to stdout.
4227 ** If the p->doXdgOpen flag is set, that means the output was being
4228 ** redirected to a temporary file named by p->zTempFile. In that case,
4229 ** launch start/open/xdg-open on that temporary file.
4231 static void output_reset(ShellState *p){
4232 if( p->outfile[0]=='|' ){
4233 #ifndef SQLITE_OMIT_POPEN
4234 pclose(p->out);
4235 #endif
4236 }else{
4237 output_file_close(p->out);
4238 #ifndef SQLITE_NOHAVE_SYSTEM
4239 if( p->doXdgOpen ){
4240 const char *zXdgOpenCmd =
4241 #if defined(_WIN32)
4242 "start";
4243 #elif defined(__APPLE__)
4244 "open";
4245 #else
4246 "xdg-open";
4247 #endif
4248 char *zCmd;
4249 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
4250 if( system(zCmd) ){
4251 utf8_printf(stderr, "Failed: [%s]\n", zCmd);
4253 sqlite3_free(zCmd);
4254 outputModePop(p);
4255 p->doXdgOpen = 0;
4257 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
4259 p->outfile[0] = 0;
4260 p->out = stdout;
4264 ** Run an SQL command and return the single integer result.
4266 static int db_int(ShellState *p, const char *zSql){
4267 sqlite3_stmt *pStmt;
4268 int res = 0;
4269 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4270 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
4271 res = sqlite3_column_int(pStmt,0);
4273 sqlite3_finalize(pStmt);
4274 return res;
4278 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
4280 static unsigned int get2byteInt(unsigned char *a){
4281 return (a[0]<<8) + a[1];
4283 static unsigned int get4byteInt(unsigned char *a){
4284 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
4288 ** Implementation of the ".info" command.
4290 ** Return 1 on error, 2 to exit, and 0 otherwise.
4292 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
4293 static const struct { const char *zName; int ofst; } aField[] = {
4294 { "file change counter:", 24 },
4295 { "database page count:", 28 },
4296 { "freelist page count:", 36 },
4297 { "schema cookie:", 40 },
4298 { "schema format:", 44 },
4299 { "default cache size:", 48 },
4300 { "autovacuum top root:", 52 },
4301 { "incremental vacuum:", 64 },
4302 { "text encoding:", 56 },
4303 { "user version:", 60 },
4304 { "application id:", 68 },
4305 { "software version:", 96 },
4307 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4308 { "number of tables:",
4309 "SELECT count(*) FROM %s WHERE type='table'" },
4310 { "number of indexes:",
4311 "SELECT count(*) FROM %s WHERE type='index'" },
4312 { "number of triggers:",
4313 "SELECT count(*) FROM %s WHERE type='trigger'" },
4314 { "number of views:",
4315 "SELECT count(*) FROM %s WHERE type='view'" },
4316 { "schema size:",
4317 "SELECT total(length(sql)) FROM %s" },
4319 int i;
4320 char *zSchemaTab;
4321 char *zDb = nArg>=2 ? azArg[1] : "main";
4322 sqlite3_stmt *pStmt = 0;
4323 unsigned char aHdr[100];
4324 open_db(p, 0);
4325 if( p->db==0 ) return 1;
4326 sqlite3_prepare_v2(p->db,"SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
4327 -1, &pStmt, 0);
4328 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
4329 if( sqlite3_step(pStmt)==SQLITE_ROW
4330 && sqlite3_column_bytes(pStmt,0)>100
4332 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
4333 sqlite3_finalize(pStmt);
4334 }else{
4335 raw_printf(stderr, "unable to read database header\n");
4336 sqlite3_finalize(pStmt);
4337 return 1;
4339 i = get2byteInt(aHdr+16);
4340 if( i==1 ) i = 65536;
4341 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4342 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4343 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
4344 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
4345 for(i=0; i<ArraySize(aField); i++){
4346 int ofst = aField[i].ofst;
4347 unsigned int val = get4byteInt(aHdr + ofst);
4348 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
4349 switch( ofst ){
4350 case 56: {
4351 if( val==1 ) raw_printf(p->out, " (utf8)");
4352 if( val==2 ) raw_printf(p->out, " (utf16le)");
4353 if( val==3 ) raw_printf(p->out, " (utf16be)");
4356 raw_printf(p->out, "\n");
4358 if( zDb==0 ){
4359 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
4360 }else if( strcmp(zDb,"temp")==0 ){
4361 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
4362 }else{
4363 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
4365 for(i=0; i<ArraySize(aQuery); i++){
4366 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
4367 int val = db_int(p, zSql);
4368 sqlite3_free(zSql);
4369 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
4371 sqlite3_free(zSchemaTab);
4372 return 0;
4376 ** Print the current sqlite3_errmsg() value to stderr and return 1.
4378 static int shellDatabaseError(sqlite3 *db){
4379 const char *zErr = sqlite3_errmsg(db);
4380 utf8_printf(stderr, "Error: %s\n", zErr);
4381 return 1;
4385 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
4386 ** if they match and FALSE (0) if they do not match.
4388 ** Globbing rules:
4390 ** '*' Matches any sequence of zero or more characters.
4392 ** '?' Matches exactly one character.
4394 ** [...] Matches one character from the enclosed list of
4395 ** characters.
4397 ** [^...] Matches one character not in the enclosed list.
4399 ** '#' Matches any sequence of one or more digits with an
4400 ** optional + or - sign in front
4402 ** ' ' Any span of whitespace matches any other span of
4403 ** whitespace.
4405 ** Extra whitespace at the end of z[] is ignored.
4407 static int testcase_glob(const char *zGlob, const char *z){
4408 int c, c2;
4409 int invert;
4410 int seen;
4412 while( (c = (*(zGlob++)))!=0 ){
4413 if( IsSpace(c) ){
4414 if( !IsSpace(*z) ) return 0;
4415 while( IsSpace(*zGlob) ) zGlob++;
4416 while( IsSpace(*z) ) z++;
4417 }else if( c=='*' ){
4418 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4419 if( c=='?' && (*(z++))==0 ) return 0;
4421 if( c==0 ){
4422 return 1;
4423 }else if( c=='[' ){
4424 while( *z && testcase_glob(zGlob-1,z)==0 ){
4425 z++;
4427 return (*z)!=0;
4429 while( (c2 = (*(z++)))!=0 ){
4430 while( c2!=c ){
4431 c2 = *(z++);
4432 if( c2==0 ) return 0;
4434 if( testcase_glob(zGlob,z) ) return 1;
4436 return 0;
4437 }else if( c=='?' ){
4438 if( (*(z++))==0 ) return 0;
4439 }else if( c=='[' ){
4440 int prior_c = 0;
4441 seen = 0;
4442 invert = 0;
4443 c = *(z++);
4444 if( c==0 ) return 0;
4445 c2 = *(zGlob++);
4446 if( c2=='^' ){
4447 invert = 1;
4448 c2 = *(zGlob++);
4450 if( c2==']' ){
4451 if( c==']' ) seen = 1;
4452 c2 = *(zGlob++);
4454 while( c2 && c2!=']' ){
4455 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4456 c2 = *(zGlob++);
4457 if( c>=prior_c && c<=c2 ) seen = 1;
4458 prior_c = 0;
4459 }else{
4460 if( c==c2 ){
4461 seen = 1;
4463 prior_c = c2;
4465 c2 = *(zGlob++);
4467 if( c2==0 || (seen ^ invert)==0 ) return 0;
4468 }else if( c=='#' ){
4469 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4470 if( !IsDigit(z[0]) ) return 0;
4471 z++;
4472 while( IsDigit(z[0]) ){ z++; }
4473 }else{
4474 if( c!=(*(z++)) ) return 0;
4477 while( IsSpace(*z) ){ z++; }
4478 return *z==0;
4483 ** Compare the string as a command-line option with either one or two
4484 ** initial "-" characters.
4486 static int optionMatch(const char *zStr, const char *zOpt){
4487 if( zStr[0]!='-' ) return 0;
4488 zStr++;
4489 if( zStr[0]=='-' ) zStr++;
4490 return strcmp(zStr, zOpt)==0;
4494 ** Delete a file.
4496 int shellDeleteFile(const char *zFilename){
4497 int rc;
4498 #ifdef _WIN32
4499 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
4500 rc = _wunlink(z);
4501 sqlite3_free(z);
4502 #else
4503 rc = unlink(zFilename);
4504 #endif
4505 return rc;
4509 ** Try to delete the temporary file (if there is one) and free the
4510 ** memory used to hold the name of the temp file.
4512 static void clearTempFile(ShellState *p){
4513 if( p->zTempFile==0 ) return;
4514 if( p->doXdgOpen ) return;
4515 if( shellDeleteFile(p->zTempFile) ) return;
4516 sqlite3_free(p->zTempFile);
4517 p->zTempFile = 0;
4521 ** Create a new temp file name with the given suffix.
4523 static void newTempFile(ShellState *p, const char *zSuffix){
4524 clearTempFile(p);
4525 sqlite3_free(p->zTempFile);
4526 p->zTempFile = 0;
4527 if( p->db ){
4528 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
4530 if( p->zTempFile==0 ){
4531 sqlite3_uint64 r;
4532 sqlite3_randomness(sizeof(r), &r);
4533 p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix);
4534 }else{
4535 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
4537 if( p->zTempFile==0 ){
4538 raw_printf(stderr, "out of memory\n");
4539 exit(1);
4545 ** The implementation of SQL scalar function fkey_collate_clause(), used
4546 ** by the ".lint fkey-indexes" command. This scalar function is always
4547 ** called with four arguments - the parent table name, the parent column name,
4548 ** the child table name and the child column name.
4550 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4552 ** If either of the named tables or columns do not exist, this function
4553 ** returns an empty string. An empty string is also returned if both tables
4554 ** and columns exist but have the same default collation sequence. Or,
4555 ** if both exist but the default collation sequences are different, this
4556 ** function returns the string " COLLATE <parent-collation>", where
4557 ** <parent-collation> is the default collation sequence of the parent column.
4559 static void shellFkeyCollateClause(
4560 sqlite3_context *pCtx,
4561 int nVal,
4562 sqlite3_value **apVal
4564 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4565 const char *zParent;
4566 const char *zParentCol;
4567 const char *zParentSeq;
4568 const char *zChild;
4569 const char *zChildCol;
4570 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
4571 int rc;
4573 assert( nVal==4 );
4574 zParent = (const char*)sqlite3_value_text(apVal[0]);
4575 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4576 zChild = (const char*)sqlite3_value_text(apVal[2]);
4577 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4579 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4580 rc = sqlite3_table_column_metadata(
4581 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4583 if( rc==SQLITE_OK ){
4584 rc = sqlite3_table_column_metadata(
4585 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4589 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4590 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4591 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4592 sqlite3_free(z);
4598 ** The implementation of dot-command ".lint fkey-indexes".
4600 static int lintFkeyIndexes(
4601 ShellState *pState, /* Current shell tool state */
4602 char **azArg, /* Array of arguments passed to dot command */
4603 int nArg /* Number of entries in azArg[] */
4605 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4606 FILE *out = pState->out; /* Stream to write non-error output to */
4607 int bVerbose = 0; /* If -verbose is present */
4608 int bGroupByParent = 0; /* If -groupbyparent is present */
4609 int i; /* To iterate through azArg[] */
4610 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4611 int rc; /* Return code */
4612 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
4615 ** This SELECT statement returns one row for each foreign key constraint
4616 ** in the schema of the main database. The column values are:
4618 ** 0. The text of an SQL statement similar to:
4620 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
4622 ** This SELECT is similar to the one that the foreign keys implementation
4623 ** needs to run internally on child tables. If there is an index that can
4624 ** be used to optimize this query, then it can also be used by the FK
4625 ** implementation to optimize DELETE or UPDATE statements on the parent
4626 ** table.
4628 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4629 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4630 ** contains an index that can be used to optimize the query.
4632 ** 2. Human readable text that describes the child table and columns. e.g.
4634 ** "child_table(child_key1, child_key2)"
4636 ** 3. Human readable text that describes the parent table and columns. e.g.
4638 ** "parent_table(parent_key1, parent_key2)"
4640 ** 4. A full CREATE INDEX statement for an index that could be used to
4641 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4643 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4645 ** 5. The name of the parent table.
4647 ** These six values are used by the C logic below to generate the report.
4649 const char *zSql =
4650 "SELECT "
4651 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
4652 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4653 " || fkey_collate_clause("
4654 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
4655 ", "
4656 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
4657 " || group_concat('*=?', ' AND ') || ')'"
4658 ", "
4659 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
4660 ", "
4661 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
4662 ", "
4663 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4664 " || ' ON ' || quote(s.name) || '('"
4665 " || group_concat(quote(f.[from]) ||"
4666 " fkey_collate_clause("
4667 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
4668 " || ');'"
4669 ", "
4670 " f.[table] "
4671 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4672 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
4673 "GROUP BY s.name, f.id "
4674 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
4676 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
4678 for(i=2; i<nArg; i++){
4679 int n = strlen30(azArg[i]);
4680 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4681 bVerbose = 1;
4683 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4684 bGroupByParent = 1;
4685 zIndent = " ";
4687 else{
4688 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4689 azArg[0], azArg[1]
4691 return SQLITE_ERROR;
4695 /* Register the fkey_collate_clause() SQL function */
4696 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4697 0, shellFkeyCollateClause, 0, 0
4701 if( rc==SQLITE_OK ){
4702 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4704 if( rc==SQLITE_OK ){
4705 sqlite3_bind_int(pSql, 1, bGroupByParent);
4708 if( rc==SQLITE_OK ){
4709 int rc2;
4710 char *zPrev = 0;
4711 while( SQLITE_ROW==sqlite3_step(pSql) ){
4712 int res = -1;
4713 sqlite3_stmt *pExplain = 0;
4714 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4715 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4716 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4717 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4718 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
4719 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
4721 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4722 if( rc!=SQLITE_OK ) break;
4723 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4724 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4725 res = (
4726 0==sqlite3_strglob(zGlob, zPlan)
4727 || 0==sqlite3_strglob(zGlobIPK, zPlan)
4730 rc = sqlite3_finalize(pExplain);
4731 if( rc!=SQLITE_OK ) break;
4733 if( res<0 ){
4734 raw_printf(stderr, "Error: internal error");
4735 break;
4736 }else{
4737 if( bGroupByParent
4738 && (bVerbose || res==0)
4739 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4741 raw_printf(out, "-- Parent table %s\n", zParent);
4742 sqlite3_free(zPrev);
4743 zPrev = sqlite3_mprintf("%s", zParent);
4746 if( res==0 ){
4747 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4748 }else if( bVerbose ){
4749 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4750 zIndent, zFrom, zTarget
4755 sqlite3_free(zPrev);
4757 if( rc!=SQLITE_OK ){
4758 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4761 rc2 = sqlite3_finalize(pSql);
4762 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4763 rc = rc2;
4764 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4766 }else{
4767 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4770 return rc;
4774 ** Implementation of ".lint" dot command.
4776 static int lintDotCommand(
4777 ShellState *pState, /* Current shell tool state */
4778 char **azArg, /* Array of arguments passed to dot command */
4779 int nArg /* Number of entries in azArg[] */
4781 int n;
4782 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
4783 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4784 return lintFkeyIndexes(pState, azArg, nArg);
4786 usage:
4787 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4788 raw_printf(stderr, "Where sub-commands are:\n");
4789 raw_printf(stderr, " fkey-indexes\n");
4790 return SQLITE_ERROR;
4793 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
4794 /*********************************************************************************
4795 ** The ".archive" or ".ar" command.
4797 static void shellPrepare(
4798 sqlite3 *db,
4799 int *pRc,
4800 const char *zSql,
4801 sqlite3_stmt **ppStmt
4803 *ppStmt = 0;
4804 if( *pRc==SQLITE_OK ){
4805 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
4806 if( rc!=SQLITE_OK ){
4807 raw_printf(stderr, "sql error: %s (%d)\n",
4808 sqlite3_errmsg(db), sqlite3_errcode(db)
4810 *pRc = rc;
4815 static void shellPreparePrintf(
4816 sqlite3 *db,
4817 int *pRc,
4818 sqlite3_stmt **ppStmt,
4819 const char *zFmt,
4822 *ppStmt = 0;
4823 if( *pRc==SQLITE_OK ){
4824 va_list ap;
4825 char *z;
4826 va_start(ap, zFmt);
4827 z = sqlite3_vmprintf(zFmt, ap);
4828 if( z==0 ){
4829 *pRc = SQLITE_NOMEM;
4830 }else{
4831 shellPrepare(db, pRc, z, ppStmt);
4832 sqlite3_free(z);
4837 static void shellFinalize(
4838 int *pRc,
4839 sqlite3_stmt *pStmt
4841 if( pStmt ){
4842 sqlite3 *db = sqlite3_db_handle(pStmt);
4843 int rc = sqlite3_finalize(pStmt);
4844 if( *pRc==SQLITE_OK ){
4845 if( rc!=SQLITE_OK ){
4846 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
4848 *pRc = rc;
4853 static void shellReset(
4854 int *pRc,
4855 sqlite3_stmt *pStmt
4857 int rc = sqlite3_reset(pStmt);
4858 if( *pRc==SQLITE_OK ){
4859 if( rc!=SQLITE_OK ){
4860 sqlite3 *db = sqlite3_db_handle(pStmt);
4861 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
4863 *pRc = rc;
4867 ** Structure representing a single ".ar" command.
4869 typedef struct ArCommand ArCommand;
4870 struct ArCommand {
4871 u8 eCmd; /* An AR_CMD_* value */
4872 u8 bVerbose; /* True if --verbose */
4873 u8 bZip; /* True if the archive is a ZIP */
4874 u8 bDryRun; /* True if --dry-run */
4875 u8 bAppend; /* True if --append */
4876 int nArg; /* Number of command arguments */
4877 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
4878 const char *zFile; /* --file argument, or NULL */
4879 const char *zDir; /* --directory argument, or NULL */
4880 char **azArg; /* Array of command arguments */
4881 ShellState *p; /* Shell state */
4882 sqlite3 *db; /* Database containing the archive */
4886 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
4888 static int arUsage(FILE *f){
4889 raw_printf(f,
4890 "\n"
4891 "Usage: .ar [OPTION...] [FILE...]\n"
4892 "The .ar command manages sqlar archives.\n"
4893 "\n"
4894 "Examples:\n"
4895 " .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar\n"
4896 " .ar -tf archive.sar # List members of archive.sar\n"
4897 " .ar -xvf archive.sar # Verbosely extract files from archive.sar\n"
4898 "\n"
4899 "Each command line must feature exactly one command option:\n"
4900 " -c, --create Create a new archive\n"
4901 " -u, --update Update or add files to an existing archive\n"
4902 " -t, --list List contents of archive\n"
4903 " -x, --extract Extract files from archive\n"
4904 "\n"
4905 "And zero or more optional options:\n"
4906 " -v, --verbose Print each filename as it is processed\n"
4907 " -f FILE, --file FILE Operate on archive FILE (default is current db)\n"
4908 " -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS\n"
4909 " -C DIR, --directory DIR Change to directory DIR to read/extract files\n"
4910 " -n, --dryrun Show the SQL that would have occurred\n"
4911 "\n"
4912 "See also: http://sqlite.org/cli.html#sqlar_archive_support\n"
4913 "\n"
4915 return SQLITE_ERROR;
4919 ** Print an error message for the .ar command to stderr and return
4920 ** SQLITE_ERROR.
4922 static int arErrorMsg(const char *zFmt, ...){
4923 va_list ap;
4924 char *z;
4925 va_start(ap, zFmt);
4926 z = sqlite3_vmprintf(zFmt, ap);
4927 va_end(ap);
4928 raw_printf(stderr, "Error: %s (try \".ar --help\")\n", z);
4929 sqlite3_free(z);
4930 return SQLITE_ERROR;
4934 ** Values for ArCommand.eCmd.
4936 #define AR_CMD_CREATE 1
4937 #define AR_CMD_EXTRACT 2
4938 #define AR_CMD_LIST 3
4939 #define AR_CMD_UPDATE 4
4940 #define AR_CMD_HELP 5
4943 ** Other (non-command) switches.
4945 #define AR_SWITCH_VERBOSE 6
4946 #define AR_SWITCH_FILE 7
4947 #define AR_SWITCH_DIRECTORY 8
4948 #define AR_SWITCH_APPEND 9
4949 #define AR_SWITCH_DRYRUN 10
4951 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
4952 switch( eSwitch ){
4953 case AR_CMD_CREATE:
4954 case AR_CMD_EXTRACT:
4955 case AR_CMD_LIST:
4956 case AR_CMD_UPDATE:
4957 case AR_CMD_HELP:
4958 if( pAr->eCmd ){
4959 return arErrorMsg("multiple command options");
4961 pAr->eCmd = eSwitch;
4962 break;
4964 case AR_SWITCH_DRYRUN:
4965 pAr->bDryRun = 1;
4966 break;
4967 case AR_SWITCH_VERBOSE:
4968 pAr->bVerbose = 1;
4969 break;
4970 case AR_SWITCH_APPEND:
4971 pAr->bAppend = 1;
4972 /* Fall thru into --file */
4973 case AR_SWITCH_FILE:
4974 pAr->zFile = zArg;
4975 break;
4976 case AR_SWITCH_DIRECTORY:
4977 pAr->zDir = zArg;
4978 break;
4981 return SQLITE_OK;
4985 ** Parse the command line for an ".ar" command. The results are written into
4986 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
4987 ** successfully, otherwise an error message is written to stderr and
4988 ** SQLITE_ERROR returned.
4990 static int arParseCommand(
4991 char **azArg, /* Array of arguments passed to dot command */
4992 int nArg, /* Number of entries in azArg[] */
4993 ArCommand *pAr /* Populate this object */
4995 struct ArSwitch {
4996 const char *zLong;
4997 char cShort;
4998 u8 eSwitch;
4999 u8 bArg;
5000 } aSwitch[] = {
5001 { "create", 'c', AR_CMD_CREATE, 0 },
5002 { "extract", 'x', AR_CMD_EXTRACT, 0 },
5003 { "list", 't', AR_CMD_LIST, 0 },
5004 { "update", 'u', AR_CMD_UPDATE, 0 },
5005 { "help", 'h', AR_CMD_HELP, 0 },
5006 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
5007 { "file", 'f', AR_SWITCH_FILE, 1 },
5008 { "append", 'a', AR_SWITCH_APPEND, 1 },
5009 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
5010 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
5012 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
5013 struct ArSwitch *pEnd = &aSwitch[nSwitch];
5015 if( nArg<=1 ){
5016 return arUsage(stderr);
5017 }else{
5018 char *z = azArg[1];
5019 memset(pAr, 0, sizeof(ArCommand));
5021 if( z[0]!='-' ){
5022 /* Traditional style [tar] invocation */
5023 int i;
5024 int iArg = 2;
5025 for(i=0; z[i]; i++){
5026 const char *zArg = 0;
5027 struct ArSwitch *pOpt;
5028 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5029 if( z[i]==pOpt->cShort ) break;
5031 if( pOpt==pEnd ){
5032 return arErrorMsg("unrecognized option: %c", z[i]);
5034 if( pOpt->bArg ){
5035 if( iArg>=nArg ){
5036 return arErrorMsg("option requires an argument: %c",z[i]);
5038 zArg = azArg[iArg++];
5040 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
5042 pAr->nArg = nArg-iArg;
5043 if( pAr->nArg>0 ){
5044 pAr->azArg = &azArg[iArg];
5046 }else{
5047 /* Non-traditional invocation */
5048 int iArg;
5049 for(iArg=1; iArg<nArg; iArg++){
5050 int n;
5051 z = azArg[iArg];
5052 if( z[0]!='-' ){
5053 /* All remaining command line words are command arguments. */
5054 pAr->azArg = &azArg[iArg];
5055 pAr->nArg = nArg-iArg;
5056 break;
5058 n = strlen30(z);
5060 if( z[1]!='-' ){
5061 int i;
5062 /* One or more short options */
5063 for(i=1; i<n; i++){
5064 const char *zArg = 0;
5065 struct ArSwitch *pOpt;
5066 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5067 if( z[i]==pOpt->cShort ) break;
5069 if( pOpt==pEnd ){
5070 return arErrorMsg("unrecognized option: %c\n", z[i]);
5072 if( pOpt->bArg ){
5073 if( i<(n-1) ){
5074 zArg = &z[i+1];
5075 i = n;
5076 }else{
5077 if( iArg>=(nArg-1) ){
5078 return arErrorMsg("option requires an argument: %c\n",z[i]);
5080 zArg = azArg[++iArg];
5083 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
5085 }else if( z[2]=='\0' ){
5086 /* A -- option, indicating that all remaining command line words
5087 ** are command arguments. */
5088 pAr->azArg = &azArg[iArg+1];
5089 pAr->nArg = nArg-iArg-1;
5090 break;
5091 }else{
5092 /* A long option */
5093 const char *zArg = 0; /* Argument for option, if any */
5094 struct ArSwitch *pMatch = 0; /* Matching option */
5095 struct ArSwitch *pOpt; /* Iterator */
5096 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5097 const char *zLong = pOpt->zLong;
5098 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
5099 if( pMatch ){
5100 return arErrorMsg("ambiguous option: %s",z);
5101 }else{
5102 pMatch = pOpt;
5107 if( pMatch==0 ){
5108 return arErrorMsg("unrecognized option: %s", z);
5110 if( pMatch->bArg ){
5111 if( iArg>=(nArg-1) ){
5112 return arErrorMsg("option requires an argument: %s", z);
5114 zArg = azArg[++iArg];
5116 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
5122 return SQLITE_OK;
5126 ** This function assumes that all arguments within the ArCommand.azArg[]
5127 ** array refer to archive members, as for the --extract or --list commands.
5128 ** It checks that each of them are present. If any specified file is not
5129 ** present in the archive, an error is printed to stderr and an error
5130 ** code returned. Otherwise, if all specified arguments are present in
5131 ** the archive, SQLITE_OK is returned.
5133 ** This function strips any trailing '/' characters from each argument.
5134 ** This is consistent with the way the [tar] command seems to work on
5135 ** Linux.
5137 static int arCheckEntries(ArCommand *pAr){
5138 int rc = SQLITE_OK;
5139 if( pAr->nArg ){
5140 int i, j;
5141 sqlite3_stmt *pTest = 0;
5143 shellPreparePrintf(pAr->db, &rc, &pTest,
5144 "SELECT name FROM %s WHERE name=$name",
5145 pAr->zSrcTable
5147 j = sqlite3_bind_parameter_index(pTest, "$name");
5148 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
5149 char *z = pAr->azArg[i];
5150 int n = strlen30(z);
5151 int bOk = 0;
5152 while( n>0 && z[n-1]=='/' ) n--;
5153 z[n] = '\0';
5154 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
5155 if( SQLITE_ROW==sqlite3_step(pTest) ){
5156 bOk = 1;
5158 shellReset(&rc, pTest);
5159 if( rc==SQLITE_OK && bOk==0 ){
5160 utf8_printf(stderr, "not found in archive: %s\n", z);
5161 rc = SQLITE_ERROR;
5164 shellFinalize(&rc, pTest);
5166 return rc;
5170 ** Format a WHERE clause that can be used against the "sqlar" table to
5171 ** identify all archive members that match the command arguments held
5172 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
5173 ** The caller is responsible for eventually calling sqlite3_free() on
5174 ** any non-NULL (*pzWhere) value.
5176 static void arWhereClause(
5177 int *pRc,
5178 ArCommand *pAr,
5179 char **pzWhere /* OUT: New WHERE clause */
5181 char *zWhere = 0;
5182 if( *pRc==SQLITE_OK ){
5183 if( pAr->nArg==0 ){
5184 zWhere = sqlite3_mprintf("1");
5185 }else{
5186 int i;
5187 const char *zSep = "";
5188 for(i=0; i<pAr->nArg; i++){
5189 const char *z = pAr->azArg[i];
5190 zWhere = sqlite3_mprintf(
5191 "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
5192 zWhere, zSep, z, strlen30(z)+1, z
5194 if( zWhere==0 ){
5195 *pRc = SQLITE_NOMEM;
5196 break;
5198 zSep = " OR ";
5202 *pzWhere = zWhere;
5206 ** Implementation of .ar "lisT" command.
5208 static int arListCommand(ArCommand *pAr){
5209 const char *zSql = "SELECT %s FROM %s WHERE %s";
5210 const char *azCols[] = {
5211 "name",
5212 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
5215 char *zWhere = 0;
5216 sqlite3_stmt *pSql = 0;
5217 int rc;
5219 rc = arCheckEntries(pAr);
5220 arWhereClause(&rc, pAr, &zWhere);
5222 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
5223 pAr->zSrcTable, zWhere);
5224 if( pAr->bDryRun ){
5225 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
5226 }else{
5227 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
5228 if( pAr->bVerbose ){
5229 utf8_printf(pAr->p->out, "%s % 10d %s %s\n",
5230 sqlite3_column_text(pSql, 0),
5231 sqlite3_column_int(pSql, 1),
5232 sqlite3_column_text(pSql, 2),
5233 sqlite3_column_text(pSql, 3)
5235 }else{
5236 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
5240 shellFinalize(&rc, pSql);
5241 return rc;
5246 ** Implementation of .ar "eXtract" command.
5248 static int arExtractCommand(ArCommand *pAr){
5249 const char *zSql1 =
5250 "SELECT "
5251 " ($dir || name),"
5252 " writefile(($dir || name), %s, mode, mtime) "
5253 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)";
5255 const char *azExtraArg[] = {
5256 "sqlar_uncompress(data, sz)",
5257 "data"
5260 sqlite3_stmt *pSql = 0;
5261 int rc = SQLITE_OK;
5262 char *zDir = 0;
5263 char *zWhere = 0;
5264 int i, j;
5266 /* If arguments are specified, check that they actually exist within
5267 ** the archive before proceeding. And formulate a WHERE clause to
5268 ** match them. */
5269 rc = arCheckEntries(pAr);
5270 arWhereClause(&rc, pAr, &zWhere);
5272 if( rc==SQLITE_OK ){
5273 if( pAr->zDir ){
5274 zDir = sqlite3_mprintf("%s/", pAr->zDir);
5275 }else{
5276 zDir = sqlite3_mprintf("");
5278 if( zDir==0 ) rc = SQLITE_NOMEM;
5281 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
5282 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
5285 if( rc==SQLITE_OK ){
5286 j = sqlite3_bind_parameter_index(pSql, "$dir");
5287 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
5289 /* Run the SELECT statement twice. The first time, writefile() is called
5290 ** for all archive members that should be extracted. The second time,
5291 ** only for the directories. This is because the timestamps for
5292 ** extracted directories must be reset after they are populated (as
5293 ** populating them changes the timestamp). */
5294 for(i=0; i<2; i++){
5295 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
5296 sqlite3_bind_int(pSql, j, i);
5297 if( pAr->bDryRun ){
5298 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
5299 }else{
5300 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
5301 if( i==0 && pAr->bVerbose ){
5302 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
5306 shellReset(&rc, pSql);
5308 shellFinalize(&rc, pSql);
5311 sqlite3_free(zDir);
5312 sqlite3_free(zWhere);
5313 return rc;
5317 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
5319 static int arExecSql(ArCommand *pAr, const char *zSql){
5320 int rc;
5321 if( pAr->bDryRun ){
5322 utf8_printf(pAr->p->out, "%s\n", zSql);
5323 rc = SQLITE_OK;
5324 }else{
5325 char *zErr = 0;
5326 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
5327 if( zErr ){
5328 utf8_printf(stdout, "ERROR: %s\n", zErr);
5329 sqlite3_free(zErr);
5332 return rc;
5337 ** Implementation of .ar "create" and "update" commands.
5339 ** Create the "sqlar" table in the database if it does not already exist.
5340 ** Then add each file in the azFile[] array to the archive. Directories
5341 ** are added recursively. If argument bVerbose is non-zero, a message is
5342 ** printed on stdout for each file archived.
5344 ** The create command is the same as update, except that it drops
5345 ** any existing "sqlar" table before beginning.
5347 static int arCreateOrUpdateCommand(
5348 ArCommand *pAr, /* Command arguments and options */
5349 int bUpdate /* true for a --create. false for --update */
5351 const char *zCreate =
5352 "CREATE TABLE IF NOT EXISTS sqlar(\n"
5353 " name TEXT PRIMARY KEY, -- name of the file\n"
5354 " mode INT, -- access permissions\n"
5355 " mtime INT, -- last modification time\n"
5356 " sz INT, -- original file size\n"
5357 " data BLOB -- compressed content\n"
5358 ")";
5359 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
5360 const char *zInsertFmt[2] = {
5361 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
5362 " SELECT\n"
5363 " %s,\n"
5364 " mode,\n"
5365 " mtime,\n"
5366 " CASE substr(lsmode(mode),1,1)\n"
5367 " WHEN '-' THEN length(data)\n"
5368 " WHEN 'd' THEN 0\n"
5369 " ELSE -1 END,\n"
5370 " sqlar_compress(data)\n"
5371 " FROM fsdir(%Q,%Q)\n"
5372 " WHERE lsmode(mode) NOT LIKE '?%%';",
5373 "REPLACE INTO %s(name,mode,mtime,data)\n"
5374 " SELECT\n"
5375 " %s,\n"
5376 " mode,\n"
5377 " mtime,\n"
5378 " data\n"
5379 " FROM fsdir(%Q,%Q)\n"
5380 " WHERE lsmode(mode) NOT LIKE '?%%';"
5382 int i; /* For iterating through azFile[] */
5383 int rc; /* Return code */
5384 const char *zTab = 0; /* SQL table into which to insert */
5385 char *zSql;
5386 char zTemp[50];
5388 arExecSql(pAr, "PRAGMA page_size=512");
5389 rc = arExecSql(pAr, "SAVEPOINT ar;");
5390 if( rc!=SQLITE_OK ) return rc;
5391 zTemp[0] = 0;
5392 if( pAr->bZip ){
5393 /* Initialize the zipfile virtual table, if necessary */
5394 if( pAr->zFile ){
5395 sqlite3_uint64 r;
5396 sqlite3_randomness(sizeof(r),&r);
5397 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
5398 zTab = zTemp;
5399 zSql = sqlite3_mprintf(
5400 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
5401 zTab, pAr->zFile
5403 rc = arExecSql(pAr, zSql);
5404 sqlite3_free(zSql);
5405 }else{
5406 zTab = "zip";
5408 }else{
5409 /* Initialize the table for an SQLAR */
5410 zTab = "sqlar";
5411 if( bUpdate==0 ){
5412 rc = arExecSql(pAr, zDrop);
5413 if( rc!=SQLITE_OK ) goto end_ar_transaction;
5415 rc = arExecSql(pAr, zCreate);
5417 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
5418 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
5419 pAr->bVerbose ? "shell_putsnl(name)" : "name",
5420 pAr->azArg[i], pAr->zDir);
5421 rc = arExecSql(pAr, zSql2);
5422 sqlite3_free(zSql2);
5424 end_ar_transaction:
5425 if( rc!=SQLITE_OK ){
5426 arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;");
5427 }else{
5428 rc = arExecSql(pAr, "RELEASE ar;");
5429 if( pAr->bZip && pAr->zFile ){
5430 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
5431 arExecSql(pAr, zSql);
5432 sqlite3_free(zSql);
5435 return rc;
5439 ** Implementation of ".ar" dot command.
5441 static int arDotCommand(
5442 ShellState *pState, /* Current shell tool state */
5443 char **azArg, /* Array of arguments passed to dot command */
5444 int nArg /* Number of entries in azArg[] */
5446 ArCommand cmd;
5447 int rc;
5448 memset(&cmd, 0, sizeof(cmd));
5449 rc = arParseCommand(azArg, nArg, &cmd);
5450 if( rc==SQLITE_OK ){
5451 int eDbType = SHELL_OPEN_UNSPEC;
5452 cmd.p = pState;
5453 cmd.db = pState->db;
5454 if( cmd.zFile ){
5455 eDbType = deduceDatabaseType(cmd.zFile, 1);
5456 }else{
5457 eDbType = pState->openMode;
5459 if( eDbType==SHELL_OPEN_ZIPFILE ){
5460 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
5461 if( cmd.zFile==0 ){
5462 cmd.zSrcTable = sqlite3_mprintf("zip");
5463 }else{
5464 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
5467 cmd.bZip = 1;
5468 }else if( cmd.zFile ){
5469 int flags;
5470 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
5471 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_UPDATE ){
5472 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
5473 }else{
5474 flags = SQLITE_OPEN_READONLY;
5476 cmd.db = 0;
5477 if( cmd.bDryRun ){
5478 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
5479 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
5481 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
5482 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
5483 if( rc!=SQLITE_OK ){
5484 utf8_printf(stderr, "cannot open file: %s (%s)\n",
5485 cmd.zFile, sqlite3_errmsg(cmd.db)
5487 goto end_ar_command;
5489 sqlite3_fileio_init(cmd.db, 0, 0);
5490 sqlite3_sqlar_init(cmd.db, 0, 0);
5491 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
5492 shellPutsFunc, 0, 0);
5495 if( cmd.zSrcTable==0 && cmd.bZip==0 ){
5496 if( cmd.eCmd!=AR_CMD_CREATE
5497 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
5499 utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
5500 rc = SQLITE_ERROR;
5501 goto end_ar_command;
5503 cmd.zSrcTable = sqlite3_mprintf("sqlar");
5506 switch( cmd.eCmd ){
5507 case AR_CMD_CREATE:
5508 rc = arCreateOrUpdateCommand(&cmd, 0);
5509 break;
5511 case AR_CMD_EXTRACT:
5512 rc = arExtractCommand(&cmd);
5513 break;
5515 case AR_CMD_LIST:
5516 rc = arListCommand(&cmd);
5517 break;
5519 case AR_CMD_HELP:
5520 arUsage(pState->out);
5521 break;
5523 default:
5524 assert( cmd.eCmd==AR_CMD_UPDATE );
5525 rc = arCreateOrUpdateCommand(&cmd, 1);
5526 break;
5529 end_ar_command:
5530 if( cmd.db!=pState->db ){
5531 sqlite3_close(cmd.db);
5533 sqlite3_free(cmd.zSrcTable);
5535 return rc;
5537 /* End of the ".archive" or ".ar" command logic
5538 **********************************************************************************/
5539 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
5543 ** If an input line begins with "." then invoke this routine to
5544 ** process that line.
5546 ** Return 1 on error, 2 to exit, and 0 otherwise.
5548 static int do_meta_command(char *zLine, ShellState *p){
5549 int h = 1;
5550 int nArg = 0;
5551 int n, c;
5552 int rc = 0;
5553 char *azArg[50];
5555 #ifndef SQLITE_OMIT_VIRTUALTABLE
5556 if( p->expert.pExpert ){
5557 expertFinish(p, 1, 0);
5559 #endif
5561 /* Parse the input line into tokens.
5563 while( zLine[h] && nArg<ArraySize(azArg) ){
5564 while( IsSpace(zLine[h]) ){ h++; }
5565 if( zLine[h]==0 ) break;
5566 if( zLine[h]=='\'' || zLine[h]=='"' ){
5567 int delim = zLine[h++];
5568 azArg[nArg++] = &zLine[h];
5569 while( zLine[h] && zLine[h]!=delim ){
5570 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
5571 h++;
5573 if( zLine[h]==delim ){
5574 zLine[h++] = 0;
5576 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
5577 }else{
5578 azArg[nArg++] = &zLine[h];
5579 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
5580 if( zLine[h] ) zLine[h++] = 0;
5581 resolve_backslashes(azArg[nArg-1]);
5585 /* Process the input line.
5587 if( nArg==0 ) return 0; /* no tokens, no error */
5588 n = strlen30(azArg[0]);
5589 c = azArg[0][0];
5590 clearTempFile(p);
5592 #ifndef SQLITE_OMIT_AUTHORIZATION
5593 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
5594 if( nArg!=2 ){
5595 raw_printf(stderr, "Usage: .auth ON|OFF\n");
5596 rc = 1;
5597 goto meta_command_exit;
5599 open_db(p, 0);
5600 if( booleanValue(azArg[1]) ){
5601 sqlite3_set_authorizer(p->db, shellAuth, p);
5602 }else{
5603 sqlite3_set_authorizer(p->db, 0, 0);
5605 }else
5606 #endif
5608 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
5609 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
5610 open_db(p, 0);
5611 rc = arDotCommand(p, azArg, nArg);
5612 }else
5613 #endif
5615 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
5616 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
5618 const char *zDestFile = 0;
5619 const char *zDb = 0;
5620 sqlite3 *pDest;
5621 sqlite3_backup *pBackup;
5622 int j;
5623 for(j=1; j<nArg; j++){
5624 const char *z = azArg[j];
5625 if( z[0]=='-' ){
5626 while( z[0]=='-' ) z++;
5627 /* No options to process at this time */
5629 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
5630 return 1;
5632 }else if( zDestFile==0 ){
5633 zDestFile = azArg[j];
5634 }else if( zDb==0 ){
5635 zDb = zDestFile;
5636 zDestFile = azArg[j];
5637 }else{
5638 raw_printf(stderr, "too many arguments to .backup\n");
5639 return 1;
5642 if( zDestFile==0 ){
5643 raw_printf(stderr, "missing FILENAME argument on .backup\n");
5644 return 1;
5646 if( zDb==0 ) zDb = "main";
5647 rc = sqlite3_open(zDestFile, &pDest);
5648 if( rc!=SQLITE_OK ){
5649 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
5650 sqlite3_close(pDest);
5651 return 1;
5653 open_db(p, 0);
5654 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
5655 if( pBackup==0 ){
5656 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
5657 sqlite3_close(pDest);
5658 return 1;
5660 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
5661 sqlite3_backup_finish(pBackup);
5662 if( rc==SQLITE_DONE ){
5663 rc = 0;
5664 }else{
5665 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
5666 rc = 1;
5668 sqlite3_close(pDest);
5669 }else
5671 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
5672 if( nArg==2 ){
5673 bail_on_error = booleanValue(azArg[1]);
5674 }else{
5675 raw_printf(stderr, "Usage: .bail on|off\n");
5676 rc = 1;
5678 }else
5680 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
5681 if( nArg==2 ){
5682 if( booleanValue(azArg[1]) ){
5683 setBinaryMode(p->out, 1);
5684 }else{
5685 setTextMode(p->out, 1);
5687 }else{
5688 raw_printf(stderr, "Usage: .binary on|off\n");
5689 rc = 1;
5691 }else
5693 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
5694 if( nArg==2 ){
5695 #if defined(_WIN32) || defined(WIN32)
5696 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
5697 rc = !SetCurrentDirectoryW(z);
5698 sqlite3_free(z);
5699 #else
5700 rc = chdir(azArg[1]);
5701 #endif
5702 if( rc ){
5703 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
5704 rc = 1;
5706 }else{
5707 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
5708 rc = 1;
5710 }else
5712 /* The undocumented ".breakpoint" command causes a call to the no-op
5713 ** routine named test_breakpoint().
5715 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
5716 test_breakpoint();
5717 }else
5719 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
5720 if( nArg==2 ){
5721 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
5722 }else{
5723 raw_printf(stderr, "Usage: .changes on|off\n");
5724 rc = 1;
5726 }else
5728 /* Cancel output redirection, if it is currently set (by .testcase)
5729 ** Then read the content of the testcase-out.txt file and compare against
5730 ** azArg[1]. If there are differences, report an error and exit.
5732 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
5733 char *zRes = 0;
5734 output_reset(p);
5735 if( nArg!=2 ){
5736 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
5737 rc = 2;
5738 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
5739 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
5740 rc = 2;
5741 }else if( testcase_glob(azArg[1],zRes)==0 ){
5742 utf8_printf(stderr,
5743 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
5744 p->zTestcase, azArg[1], zRes);
5745 rc = 1;
5746 }else{
5747 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
5748 p->nCheck++;
5750 sqlite3_free(zRes);
5751 }else
5753 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
5754 if( nArg==2 ){
5755 tryToClone(p, azArg[1]);
5756 }else{
5757 raw_printf(stderr, "Usage: .clone FILENAME\n");
5758 rc = 1;
5760 }else
5762 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
5763 ShellState data;
5764 char *zErrMsg = 0;
5765 open_db(p, 0);
5766 memcpy(&data, p, sizeof(data));
5767 data.showHeader = 0;
5768 data.cMode = data.mode = MODE_List;
5769 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
5770 data.cnt = 0;
5771 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
5772 callback, &data, &zErrMsg);
5773 if( zErrMsg ){
5774 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5775 sqlite3_free(zErrMsg);
5776 rc = 1;
5778 }else
5780 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
5781 static const struct DbConfigChoices {const char *zName; int op;} aDbConfig[] = {
5782 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
5783 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
5784 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
5785 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
5786 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
5787 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
5788 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
5789 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
5791 int ii, v;
5792 open_db(p, 0);
5793 for(ii=0; ii<ArraySize(aDbConfig); ii++){
5794 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
5795 if( nArg>=3 ){
5796 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
5798 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
5799 utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
5800 if( nArg>1 ) break;
5802 if( nArg>1 && ii==ArraySize(aDbConfig) ){
5803 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
5804 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
5806 }else
5808 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
5809 rc = shell_dbinfo_command(p, nArg, azArg);
5810 }else
5812 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
5813 const char *zLike = 0;
5814 int i;
5815 int savedShowHeader = p->showHeader;
5816 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
5817 for(i=1; i<nArg; i++){
5818 if( azArg[i][0]=='-' ){
5819 const char *z = azArg[i]+1;
5820 if( z[0]=='-' ) z++;
5821 if( strcmp(z,"preserve-rowids")==0 ){
5822 #ifdef SQLITE_OMIT_VIRTUALTABLE
5823 raw_printf(stderr, "The --preserve-rowids option is not compatible"
5824 " with SQLITE_OMIT_VIRTUALTABLE\n");
5825 rc = 1;
5826 goto meta_command_exit;
5827 #else
5828 ShellSetFlag(p, SHFLG_PreserveRowid);
5829 #endif
5830 }else
5831 if( strcmp(z,"newlines")==0 ){
5832 ShellSetFlag(p, SHFLG_Newlines);
5833 }else
5835 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
5836 rc = 1;
5837 goto meta_command_exit;
5839 }else if( zLike ){
5840 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
5841 "?--newlines? ?LIKE-PATTERN?\n");
5842 rc = 1;
5843 goto meta_command_exit;
5844 }else{
5845 zLike = azArg[i];
5848 open_db(p, 0);
5849 /* When playing back a "dump", the content might appear in an order
5850 ** which causes immediate foreign key constraints to be violated.
5851 ** So disable foreign-key constraint enforcement to prevent problems. */
5852 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
5853 raw_printf(p->out, "BEGIN TRANSACTION;\n");
5854 p->writableSchema = 0;
5855 p->showHeader = 0;
5856 /* Set writable_schema=ON since doing so forces SQLite to initialize
5857 ** as much of the schema as it can even if the sqlite_master table is
5858 ** corrupt. */
5859 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
5860 p->nErr = 0;
5861 if( zLike==0 ){
5862 run_schema_dump_query(p,
5863 "SELECT name, type, sql FROM sqlite_master "
5864 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
5866 run_schema_dump_query(p,
5867 "SELECT name, type, sql FROM sqlite_master "
5868 "WHERE name=='sqlite_sequence'"
5870 run_table_dump_query(p,
5871 "SELECT sql FROM sqlite_master "
5872 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
5874 }else{
5875 char *zSql;
5876 zSql = sqlite3_mprintf(
5877 "SELECT name, type, sql FROM sqlite_master "
5878 "WHERE tbl_name LIKE %Q AND type=='table'"
5879 " AND sql NOT NULL", zLike);
5880 run_schema_dump_query(p,zSql);
5881 sqlite3_free(zSql);
5882 zSql = sqlite3_mprintf(
5883 "SELECT sql FROM sqlite_master "
5884 "WHERE sql NOT NULL"
5885 " AND type IN ('index','trigger','view')"
5886 " AND tbl_name LIKE %Q", zLike);
5887 run_table_dump_query(p, zSql, 0);
5888 sqlite3_free(zSql);
5890 if( p->writableSchema ){
5891 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
5892 p->writableSchema = 0;
5894 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5895 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
5896 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
5897 p->showHeader = savedShowHeader;
5898 }else
5900 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
5901 if( nArg==2 ){
5902 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
5903 }else{
5904 raw_printf(stderr, "Usage: .echo on|off\n");
5905 rc = 1;
5907 }else
5909 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
5910 if( nArg==2 ){
5911 p->autoEQPtest = 0;
5912 if( strcmp(azArg[1],"full")==0 ){
5913 p->autoEQP = AUTOEQP_full;
5914 }else if( strcmp(azArg[1],"trigger")==0 ){
5915 p->autoEQP = AUTOEQP_trigger;
5916 }else if( strcmp(azArg[1],"test")==0 ){
5917 p->autoEQP = AUTOEQP_on;
5918 p->autoEQPtest = 1;
5919 }else{
5920 p->autoEQP = (u8)booleanValue(azArg[1]);
5922 }else{
5923 raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n");
5924 rc = 1;
5926 }else
5928 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
5929 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
5930 rc = 2;
5931 }else
5933 /* The ".explain" command is automatic now. It is largely pointless. It
5934 ** retained purely for backwards compatibility */
5935 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
5936 int val = 1;
5937 if( nArg>=2 ){
5938 if( strcmp(azArg[1],"auto")==0 ){
5939 val = 99;
5940 }else{
5941 val = booleanValue(azArg[1]);
5944 if( val==1 && p->mode!=MODE_Explain ){
5945 p->normalMode = p->mode;
5946 p->mode = MODE_Explain;
5947 p->autoExplain = 0;
5948 }else if( val==0 ){
5949 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5950 p->autoExplain = 0;
5951 }else if( val==99 ){
5952 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5953 p->autoExplain = 1;
5955 }else
5957 #ifndef SQLITE_OMIT_VIRTUALTABLE
5958 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
5959 open_db(p, 0);
5960 expertDotCommand(p, azArg, nArg);
5961 }else
5962 #endif
5964 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
5965 ShellState data;
5966 char *zErrMsg = 0;
5967 int doStats = 0;
5968 memcpy(&data, p, sizeof(data));
5969 data.showHeader = 0;
5970 data.cMode = data.mode = MODE_Semi;
5971 if( nArg==2 && optionMatch(azArg[1], "indent") ){
5972 data.cMode = data.mode = MODE_Pretty;
5973 nArg = 1;
5975 if( nArg!=1 ){
5976 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
5977 rc = 1;
5978 goto meta_command_exit;
5980 open_db(p, 0);
5981 rc = sqlite3_exec(p->db,
5982 "SELECT sql FROM"
5983 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
5984 " FROM sqlite_master UNION ALL"
5985 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
5986 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
5987 "ORDER BY rowid",
5988 callback, &data, &zErrMsg
5990 if( rc==SQLITE_OK ){
5991 sqlite3_stmt *pStmt;
5992 rc = sqlite3_prepare_v2(p->db,
5993 "SELECT rowid FROM sqlite_master"
5994 " WHERE name GLOB 'sqlite_stat[134]'",
5995 -1, &pStmt, 0);
5996 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
5997 sqlite3_finalize(pStmt);
5999 if( doStats==0 ){
6000 raw_printf(p->out, "/* No STAT tables available */\n");
6001 }else{
6002 raw_printf(p->out, "ANALYZE sqlite_master;\n");
6003 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
6004 callback, &data, &zErrMsg);
6005 data.cMode = data.mode = MODE_Insert;
6006 data.zDestTable = "sqlite_stat1";
6007 shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
6008 data.zDestTable = "sqlite_stat3";
6009 shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg);
6010 data.zDestTable = "sqlite_stat4";
6011 shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
6012 raw_printf(p->out, "ANALYZE sqlite_master;\n");
6014 }else
6016 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
6017 if( nArg==2 ){
6018 p->showHeader = booleanValue(azArg[1]);
6019 }else{
6020 raw_printf(stderr, "Usage: .headers on|off\n");
6021 rc = 1;
6023 }else
6025 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
6026 utf8_printf(p->out, "%s", zHelp);
6027 }else
6029 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
6030 char *zTable; /* Insert data into this table */
6031 char *zFile; /* Name of file to extra content from */
6032 sqlite3_stmt *pStmt = NULL; /* A statement */
6033 int nCol; /* Number of columns in the table */
6034 int nByte; /* Number of bytes in an SQL string */
6035 int i, j; /* Loop counters */
6036 int needCommit; /* True to COMMIT or ROLLBACK at end */
6037 int nSep; /* Number of bytes in p->colSeparator[] */
6038 char *zSql; /* An SQL statement */
6039 ImportCtx sCtx; /* Reader context */
6040 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
6041 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
6043 if( nArg!=3 ){
6044 raw_printf(stderr, "Usage: .import FILE TABLE\n");
6045 goto meta_command_exit;
6047 zFile = azArg[1];
6048 zTable = azArg[2];
6049 seenInterrupt = 0;
6050 memset(&sCtx, 0, sizeof(sCtx));
6051 open_db(p, 0);
6052 nSep = strlen30(p->colSeparator);
6053 if( nSep==0 ){
6054 raw_printf(stderr,
6055 "Error: non-null column separator required for import\n");
6056 return 1;
6058 if( nSep>1 ){
6059 raw_printf(stderr, "Error: multi-character column separators not allowed"
6060 " for import\n");
6061 return 1;
6063 nSep = strlen30(p->rowSeparator);
6064 if( nSep==0 ){
6065 raw_printf(stderr, "Error: non-null row separator required for import\n");
6066 return 1;
6068 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
6069 /* When importing CSV (only), if the row separator is set to the
6070 ** default output row separator, change it to the default input
6071 ** row separator. This avoids having to maintain different input
6072 ** and output row separators. */
6073 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6074 nSep = strlen30(p->rowSeparator);
6076 if( nSep>1 ){
6077 raw_printf(stderr, "Error: multi-character row separators not allowed"
6078 " for import\n");
6079 return 1;
6081 sCtx.zFile = zFile;
6082 sCtx.nLine = 1;
6083 if( sCtx.zFile[0]=='|' ){
6084 #ifdef SQLITE_OMIT_POPEN
6085 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
6086 return 1;
6087 #else
6088 sCtx.in = popen(sCtx.zFile+1, "r");
6089 sCtx.zFile = "<pipe>";
6090 xCloser = pclose;
6091 #endif
6092 }else{
6093 sCtx.in = fopen(sCtx.zFile, "rb");
6094 xCloser = fclose;
6096 if( p->mode==MODE_Ascii ){
6097 xRead = ascii_read_one_field;
6098 }else{
6099 xRead = csv_read_one_field;
6101 if( sCtx.in==0 ){
6102 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
6103 return 1;
6105 sCtx.cColSep = p->colSeparator[0];
6106 sCtx.cRowSep = p->rowSeparator[0];
6107 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
6108 if( zSql==0 ){
6109 xCloser(sCtx.in);
6110 shell_out_of_memory();
6112 nByte = strlen30(zSql);
6113 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6114 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
6115 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
6116 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
6117 char cSep = '(';
6118 while( xRead(&sCtx) ){
6119 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
6120 cSep = ',';
6121 if( sCtx.cTerm!=sCtx.cColSep ) break;
6123 if( cSep=='(' ){
6124 sqlite3_free(zCreate);
6125 sqlite3_free(sCtx.z);
6126 xCloser(sCtx.in);
6127 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
6128 return 1;
6130 zCreate = sqlite3_mprintf("%z\n)", zCreate);
6131 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
6132 sqlite3_free(zCreate);
6133 if( rc ){
6134 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
6135 sqlite3_errmsg(p->db));
6136 sqlite3_free(sCtx.z);
6137 xCloser(sCtx.in);
6138 return 1;
6140 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6142 sqlite3_free(zSql);
6143 if( rc ){
6144 if (pStmt) sqlite3_finalize(pStmt);
6145 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
6146 xCloser(sCtx.in);
6147 return 1;
6149 nCol = sqlite3_column_count(pStmt);
6150 sqlite3_finalize(pStmt);
6151 pStmt = 0;
6152 if( nCol==0 ) return 0; /* no columns, no error */
6153 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
6154 if( zSql==0 ){
6155 xCloser(sCtx.in);
6156 shell_out_of_memory();
6158 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
6159 j = strlen30(zSql);
6160 for(i=1; i<nCol; i++){
6161 zSql[j++] = ',';
6162 zSql[j++] = '?';
6164 zSql[j++] = ')';
6165 zSql[j] = 0;
6166 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6167 sqlite3_free(zSql);
6168 if( rc ){
6169 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6170 if (pStmt) sqlite3_finalize(pStmt);
6171 xCloser(sCtx.in);
6172 return 1;
6174 needCommit = sqlite3_get_autocommit(p->db);
6175 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
6177 int startLine = sCtx.nLine;
6178 for(i=0; i<nCol; i++){
6179 char *z = xRead(&sCtx);
6181 ** Did we reach end-of-file before finding any columns?
6182 ** If so, stop instead of NULL filling the remaining columns.
6184 if( z==0 && i==0 ) break;
6186 ** Did we reach end-of-file OR end-of-line before finding any
6187 ** columns in ASCII mode? If so, stop instead of NULL filling
6188 ** the remaining columns.
6190 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
6191 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
6192 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
6193 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6194 "filling the rest with NULL\n",
6195 sCtx.zFile, startLine, nCol, i+1);
6196 i += 2;
6197 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
6200 if( sCtx.cTerm==sCtx.cColSep ){
6202 xRead(&sCtx);
6203 i++;
6204 }while( sCtx.cTerm==sCtx.cColSep );
6205 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6206 "extras ignored\n",
6207 sCtx.zFile, startLine, nCol, i);
6209 if( i>=nCol ){
6210 sqlite3_step(pStmt);
6211 rc = sqlite3_reset(pStmt);
6212 if( rc!=SQLITE_OK ){
6213 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
6214 startLine, sqlite3_errmsg(p->db));
6217 }while( sCtx.cTerm!=EOF );
6219 xCloser(sCtx.in);
6220 sqlite3_free(sCtx.z);
6221 sqlite3_finalize(pStmt);
6222 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
6223 }else
6225 #ifndef SQLITE_UNTESTABLE
6226 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
6227 char *zSql;
6228 char *zCollist = 0;
6229 sqlite3_stmt *pStmt;
6230 int tnum = 0;
6231 int i;
6232 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
6233 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
6234 " .imposter off\n");
6235 rc = 1;
6236 goto meta_command_exit;
6238 open_db(p, 0);
6239 if( nArg==2 ){
6240 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
6241 goto meta_command_exit;
6243 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
6244 " WHERE name='%q' AND type='index'", azArg[1]);
6245 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6246 sqlite3_free(zSql);
6247 if( sqlite3_step(pStmt)==SQLITE_ROW ){
6248 tnum = sqlite3_column_int(pStmt, 0);
6250 sqlite3_finalize(pStmt);
6251 if( tnum==0 ){
6252 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
6253 rc = 1;
6254 goto meta_command_exit;
6256 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
6257 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6258 sqlite3_free(zSql);
6259 i = 0;
6260 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6261 char zLabel[20];
6262 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
6263 i++;
6264 if( zCol==0 ){
6265 if( sqlite3_column_int(pStmt,1)==-1 ){
6266 zCol = "_ROWID_";
6267 }else{
6268 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
6269 zCol = zLabel;
6272 if( zCollist==0 ){
6273 zCollist = sqlite3_mprintf("\"%w\"", zCol);
6274 }else{
6275 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
6278 sqlite3_finalize(pStmt);
6279 zSql = sqlite3_mprintf(
6280 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
6281 azArg[2], zCollist, zCollist);
6282 sqlite3_free(zCollist);
6283 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
6284 if( rc==SQLITE_OK ){
6285 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
6286 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
6287 if( rc ){
6288 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
6289 }else{
6290 utf8_printf(stdout, "%s;\n", zSql);
6291 raw_printf(stdout,
6292 "WARNING: writing to an imposter table will corrupt the index!\n"
6295 }else{
6296 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
6297 rc = 1;
6299 sqlite3_free(zSql);
6300 }else
6301 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
6303 #ifdef SQLITE_ENABLE_IOTRACE
6304 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
6305 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
6306 if( iotrace && iotrace!=stdout ) fclose(iotrace);
6307 iotrace = 0;
6308 if( nArg<2 ){
6309 sqlite3IoTrace = 0;
6310 }else if( strcmp(azArg[1], "-")==0 ){
6311 sqlite3IoTrace = iotracePrintf;
6312 iotrace = stdout;
6313 }else{
6314 iotrace = fopen(azArg[1], "w");
6315 if( iotrace==0 ){
6316 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
6317 sqlite3IoTrace = 0;
6318 rc = 1;
6319 }else{
6320 sqlite3IoTrace = iotracePrintf;
6323 }else
6324 #endif
6326 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
6327 static const struct {
6328 const char *zLimitName; /* Name of a limit */
6329 int limitCode; /* Integer code for that limit */
6330 } aLimit[] = {
6331 { "length", SQLITE_LIMIT_LENGTH },
6332 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
6333 { "column", SQLITE_LIMIT_COLUMN },
6334 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
6335 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
6336 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
6337 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
6338 { "attached", SQLITE_LIMIT_ATTACHED },
6339 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
6340 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
6341 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
6342 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
6344 int i, n2;
6345 open_db(p, 0);
6346 if( nArg==1 ){
6347 for(i=0; i<ArraySize(aLimit); i++){
6348 printf("%20s %d\n", aLimit[i].zLimitName,
6349 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
6351 }else if( nArg>3 ){
6352 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
6353 rc = 1;
6354 goto meta_command_exit;
6355 }else{
6356 int iLimit = -1;
6357 n2 = strlen30(azArg[1]);
6358 for(i=0; i<ArraySize(aLimit); i++){
6359 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
6360 if( iLimit<0 ){
6361 iLimit = i;
6362 }else{
6363 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
6364 rc = 1;
6365 goto meta_command_exit;
6369 if( iLimit<0 ){
6370 utf8_printf(stderr, "unknown limit: \"%s\"\n"
6371 "enter \".limits\" with no arguments for a list.\n",
6372 azArg[1]);
6373 rc = 1;
6374 goto meta_command_exit;
6376 if( nArg==3 ){
6377 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
6378 (int)integerValue(azArg[2]));
6380 printf("%20s %d\n", aLimit[iLimit].zLimitName,
6381 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
6383 }else
6385 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
6386 open_db(p, 0);
6387 lintDotCommand(p, azArg, nArg);
6388 }else
6390 #ifndef SQLITE_OMIT_LOAD_EXTENSION
6391 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
6392 const char *zFile, *zProc;
6393 char *zErrMsg = 0;
6394 if( nArg<2 ){
6395 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
6396 rc = 1;
6397 goto meta_command_exit;
6399 zFile = azArg[1];
6400 zProc = nArg>=3 ? azArg[2] : 0;
6401 open_db(p, 0);
6402 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
6403 if( rc!=SQLITE_OK ){
6404 utf8_printf(stderr, "Error: %s\n", zErrMsg);
6405 sqlite3_free(zErrMsg);
6406 rc = 1;
6408 }else
6409 #endif
6411 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
6412 if( nArg!=2 ){
6413 raw_printf(stderr, "Usage: .log FILENAME\n");
6414 rc = 1;
6415 }else{
6416 const char *zFile = azArg[1];
6417 output_file_close(p->pLog);
6418 p->pLog = output_file_open(zFile, 0);
6420 }else
6422 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
6423 const char *zMode = nArg>=2 ? azArg[1] : "";
6424 int n2 = strlen30(zMode);
6425 int c2 = zMode[0];
6426 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
6427 p->mode = MODE_Line;
6428 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6429 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
6430 p->mode = MODE_Column;
6431 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6432 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
6433 p->mode = MODE_List;
6434 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
6435 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6436 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
6437 p->mode = MODE_Html;
6438 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
6439 p->mode = MODE_Tcl;
6440 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
6441 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6442 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
6443 p->mode = MODE_Csv;
6444 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
6445 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
6446 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
6447 p->mode = MODE_List;
6448 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
6449 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
6450 p->mode = MODE_Insert;
6451 set_table_name(p, nArg>=3 ? azArg[2] : "table");
6452 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
6453 p->mode = MODE_Quote;
6454 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
6455 p->mode = MODE_Ascii;
6456 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
6457 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
6458 }else if( nArg==1 ){
6459 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
6460 }else{
6461 raw_printf(stderr, "Error: mode should be one of: "
6462 "ascii column csv html insert line list quote tabs tcl\n");
6463 rc = 1;
6465 p->cMode = p->mode;
6466 }else
6468 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
6469 if( nArg==2 ){
6470 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
6471 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
6472 }else{
6473 raw_printf(stderr, "Usage: .nullvalue STRING\n");
6474 rc = 1;
6476 }else
6478 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
6479 char *zNewFilename; /* Name of the database file to open */
6480 int iName = 1; /* Index in azArg[] of the filename */
6481 int newFlag = 0; /* True to delete file before opening */
6482 /* Close the existing database */
6483 session_close_all(p);
6484 sqlite3_close(p->db);
6485 p->db = 0;
6486 p->zDbFilename = 0;
6487 sqlite3_free(p->zFreeOnClose);
6488 p->zFreeOnClose = 0;
6489 p->openMode = SHELL_OPEN_UNSPEC;
6490 /* Check for command-line arguments */
6491 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
6492 const char *z = azArg[iName];
6493 if( optionMatch(z,"new") ){
6494 newFlag = 1;
6495 #ifdef SQLITE_HAVE_ZLIB
6496 }else if( optionMatch(z, "zip") ){
6497 p->openMode = SHELL_OPEN_ZIPFILE;
6498 #endif
6499 }else if( optionMatch(z, "append") ){
6500 p->openMode = SHELL_OPEN_APPENDVFS;
6501 }else if( optionMatch(z, "readonly") ){
6502 p->openMode = SHELL_OPEN_READONLY;
6503 }else if( z[0]=='-' ){
6504 utf8_printf(stderr, "unknown option: %s\n", z);
6505 rc = 1;
6506 goto meta_command_exit;
6509 /* If a filename is specified, try to open it first */
6510 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
6511 if( zNewFilename ){
6512 if( newFlag ) shellDeleteFile(zNewFilename);
6513 p->zDbFilename = zNewFilename;
6514 open_db(p, 1);
6515 if( p->db==0 ){
6516 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
6517 sqlite3_free(zNewFilename);
6518 }else{
6519 p->zFreeOnClose = zNewFilename;
6522 if( p->db==0 ){
6523 /* As a fall-back open a TEMP database */
6524 p->zDbFilename = 0;
6525 open_db(p, 0);
6527 }else
6529 if( (c=='o'
6530 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
6531 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
6533 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
6534 int bTxtMode = 0;
6535 if( azArg[0][0]=='e' ){
6536 /* Transform the ".excel" command into ".once -x" */
6537 nArg = 2;
6538 azArg[0] = "once";
6539 zFile = azArg[1] = "-x";
6540 n = 4;
6542 if( nArg>2 ){
6543 utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]);
6544 rc = 1;
6545 goto meta_command_exit;
6547 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
6548 if( nArg<2 ){
6549 raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n");
6550 rc = 1;
6551 goto meta_command_exit;
6553 p->outCount = 2;
6554 }else{
6555 p->outCount = 0;
6557 output_reset(p);
6558 if( zFile[0]=='-' && zFile[1]=='-' ) zFile++;
6559 #ifndef SQLITE_NOHAVE_SYSTEM
6560 if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){
6561 p->doXdgOpen = 1;
6562 outputModePush(p);
6563 if( zFile[1]=='x' ){
6564 newTempFile(p, "csv");
6565 p->mode = MODE_Csv;
6566 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
6567 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
6568 }else{
6569 newTempFile(p, "txt");
6570 bTxtMode = 1;
6572 zFile = p->zTempFile;
6574 #endif /* SQLITE_NOHAVE_SYSTEM */
6575 if( zFile[0]=='|' ){
6576 #ifdef SQLITE_OMIT_POPEN
6577 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
6578 rc = 1;
6579 p->out = stdout;
6580 #else
6581 p->out = popen(zFile + 1, "w");
6582 if( p->out==0 ){
6583 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
6584 p->out = stdout;
6585 rc = 1;
6586 }else{
6587 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6589 #endif
6590 }else{
6591 p->out = output_file_open(zFile, bTxtMode);
6592 if( p->out==0 ){
6593 if( strcmp(zFile,"off")!=0 ){
6594 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
6596 p->out = stdout;
6597 rc = 1;
6598 } else {
6599 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6602 }else
6604 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
6605 int i;
6606 for(i=1; i<nArg; i++){
6607 if( i>1 ) raw_printf(p->out, " ");
6608 utf8_printf(p->out, "%s", azArg[i]);
6610 raw_printf(p->out, "\n");
6611 }else
6613 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
6614 if( nArg >= 2) {
6615 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
6617 if( nArg >= 3) {
6618 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
6620 }else
6622 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
6623 rc = 2;
6624 }else
6626 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
6627 FILE *alt;
6628 if( nArg!=2 ){
6629 raw_printf(stderr, "Usage: .read FILE\n");
6630 rc = 1;
6631 goto meta_command_exit;
6633 alt = fopen(azArg[1], "rb");
6634 if( alt==0 ){
6635 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
6636 rc = 1;
6637 }else{
6638 rc = process_input(p, alt);
6639 fclose(alt);
6641 }else
6643 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
6644 const char *zSrcFile;
6645 const char *zDb;
6646 sqlite3 *pSrc;
6647 sqlite3_backup *pBackup;
6648 int nTimeout = 0;
6650 if( nArg==2 ){
6651 zSrcFile = azArg[1];
6652 zDb = "main";
6653 }else if( nArg==3 ){
6654 zSrcFile = azArg[2];
6655 zDb = azArg[1];
6656 }else{
6657 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
6658 rc = 1;
6659 goto meta_command_exit;
6661 rc = sqlite3_open(zSrcFile, &pSrc);
6662 if( rc!=SQLITE_OK ){
6663 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
6664 sqlite3_close(pSrc);
6665 return 1;
6667 open_db(p, 0);
6668 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
6669 if( pBackup==0 ){
6670 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6671 sqlite3_close(pSrc);
6672 return 1;
6674 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
6675 || rc==SQLITE_BUSY ){
6676 if( rc==SQLITE_BUSY ){
6677 if( nTimeout++ >= 3 ) break;
6678 sqlite3_sleep(100);
6681 sqlite3_backup_finish(pBackup);
6682 if( rc==SQLITE_DONE ){
6683 rc = 0;
6684 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
6685 raw_printf(stderr, "Error: source database is busy\n");
6686 rc = 1;
6687 }else{
6688 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6689 rc = 1;
6691 sqlite3_close(pSrc);
6692 }else
6694 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
6695 if( nArg==2 ){
6696 p->scanstatsOn = (u8)booleanValue(azArg[1]);
6697 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
6698 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
6699 #endif
6700 }else{
6701 raw_printf(stderr, "Usage: .scanstats on|off\n");
6702 rc = 1;
6704 }else
6706 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
6707 ShellText sSelect;
6708 ShellState data;
6709 char *zErrMsg = 0;
6710 const char *zDiv = "(";
6711 const char *zName = 0;
6712 int iSchema = 0;
6713 int bDebug = 0;
6714 int ii;
6716 open_db(p, 0);
6717 memcpy(&data, p, sizeof(data));
6718 data.showHeader = 0;
6719 data.cMode = data.mode = MODE_Semi;
6720 initText(&sSelect);
6721 for(ii=1; ii<nArg; ii++){
6722 if( optionMatch(azArg[ii],"indent") ){
6723 data.cMode = data.mode = MODE_Pretty;
6724 }else if( optionMatch(azArg[ii],"debug") ){
6725 bDebug = 1;
6726 }else if( zName==0 ){
6727 zName = azArg[ii];
6728 }else{
6729 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
6730 rc = 1;
6731 goto meta_command_exit;
6734 if( zName!=0 ){
6735 int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0;
6736 if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){
6737 char *new_argv[2], *new_colv[2];
6738 new_argv[0] = sqlite3_mprintf(
6739 "CREATE TABLE %s (\n"
6740 " type text,\n"
6741 " name text,\n"
6742 " tbl_name text,\n"
6743 " rootpage integer,\n"
6744 " sql text\n"
6745 ")", isMaster ? "sqlite_master" : "sqlite_temp_master");
6746 new_argv[1] = 0;
6747 new_colv[0] = "sql";
6748 new_colv[1] = 0;
6749 callback(&data, 1, new_argv, new_colv);
6750 sqlite3_free(new_argv[0]);
6753 if( zDiv ){
6754 sqlite3_stmt *pStmt = 0;
6755 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
6756 -1, &pStmt, 0);
6757 if( rc ){
6758 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6759 sqlite3_finalize(pStmt);
6760 rc = 1;
6761 goto meta_command_exit;
6763 appendText(&sSelect, "SELECT sql FROM", 0);
6764 iSchema = 0;
6765 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6766 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
6767 char zScNum[30];
6768 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
6769 appendText(&sSelect, zDiv, 0);
6770 zDiv = " UNION ALL ";
6771 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
6772 if( sqlite3_stricmp(zDb, "main")!=0 ){
6773 appendText(&sSelect, zDb, '"');
6774 }else{
6775 appendText(&sSelect, "NULL", 0);
6777 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
6778 appendText(&sSelect, zScNum, 0);
6779 appendText(&sSelect, " AS snum, ", 0);
6780 appendText(&sSelect, zDb, '\'');
6781 appendText(&sSelect, " AS sname FROM ", 0);
6782 appendText(&sSelect, zDb, '"');
6783 appendText(&sSelect, ".sqlite_master", 0);
6785 sqlite3_finalize(pStmt);
6786 #ifdef SQLITE_INTROSPECTION_PRAGMAS
6787 if( zName ){
6788 appendText(&sSelect,
6789 " UNION ALL SELECT shell_module_schema(name),"
6790 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 0);
6792 #endif
6793 appendText(&sSelect, ") WHERE ", 0);
6794 if( zName ){
6795 char *zQarg = sqlite3_mprintf("%Q", zName);
6796 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
6797 strchr(zName, '[') != 0;
6798 if( strchr(zName, '.') ){
6799 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
6800 }else{
6801 appendText(&sSelect, "lower(tbl_name)", 0);
6803 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
6804 appendText(&sSelect, zQarg, 0);
6805 if( !bGlob ){
6806 appendText(&sSelect, " ESCAPE '\\' ", 0);
6808 appendText(&sSelect, " AND ", 0);
6809 sqlite3_free(zQarg);
6811 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
6812 " ORDER BY snum, rowid", 0);
6813 if( bDebug ){
6814 utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
6815 }else{
6816 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
6818 freeText(&sSelect);
6820 if( zErrMsg ){
6821 utf8_printf(stderr,"Error: %s\n", zErrMsg);
6822 sqlite3_free(zErrMsg);
6823 rc = 1;
6824 }else if( rc != SQLITE_OK ){
6825 raw_printf(stderr,"Error: querying schema information\n");
6826 rc = 1;
6827 }else{
6828 rc = 0;
6830 }else
6832 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
6833 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
6834 sqlite3SelectTrace = (int)integerValue(azArg[1]);
6835 }else
6836 #endif
6838 #if defined(SQLITE_ENABLE_SESSION)
6839 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
6840 OpenSession *pSession = &p->aSession[0];
6841 char **azCmd = &azArg[1];
6842 int iSes = 0;
6843 int nCmd = nArg - 1;
6844 int i;
6845 if( nArg<=1 ) goto session_syntax_error;
6846 open_db(p, 0);
6847 if( nArg>=3 ){
6848 for(iSes=0; iSes<p->nSession; iSes++){
6849 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
6851 if( iSes<p->nSession ){
6852 pSession = &p->aSession[iSes];
6853 azCmd++;
6854 nCmd--;
6855 }else{
6856 pSession = &p->aSession[0];
6857 iSes = 0;
6861 /* .session attach TABLE
6862 ** Invoke the sqlite3session_attach() interface to attach a particular
6863 ** table so that it is never filtered.
6865 if( strcmp(azCmd[0],"attach")==0 ){
6866 if( nCmd!=2 ) goto session_syntax_error;
6867 if( pSession->p==0 ){
6868 session_not_open:
6869 raw_printf(stderr, "ERROR: No sessions are open\n");
6870 }else{
6871 rc = sqlite3session_attach(pSession->p, azCmd[1]);
6872 if( rc ){
6873 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
6874 rc = 0;
6877 }else
6879 /* .session changeset FILE
6880 ** .session patchset FILE
6881 ** Write a changeset or patchset into a file. The file is overwritten.
6883 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
6884 FILE *out = 0;
6885 if( nCmd!=2 ) goto session_syntax_error;
6886 if( pSession->p==0 ) goto session_not_open;
6887 out = fopen(azCmd[1], "wb");
6888 if( out==0 ){
6889 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
6890 }else{
6891 int szChng;
6892 void *pChng;
6893 if( azCmd[0][0]=='c' ){
6894 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
6895 }else{
6896 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
6898 if( rc ){
6899 printf("Error: error code %d\n", rc);
6900 rc = 0;
6902 if( pChng
6903 && fwrite(pChng, szChng, 1, out)!=1 ){
6904 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
6905 szChng);
6907 sqlite3_free(pChng);
6908 fclose(out);
6910 }else
6912 /* .session close
6913 ** Close the identified session
6915 if( strcmp(azCmd[0], "close")==0 ){
6916 if( nCmd!=1 ) goto session_syntax_error;
6917 if( p->nSession ){
6918 session_close(pSession);
6919 p->aSession[iSes] = p->aSession[--p->nSession];
6921 }else
6923 /* .session enable ?BOOLEAN?
6924 ** Query or set the enable flag
6926 if( strcmp(azCmd[0], "enable")==0 ){
6927 int ii;
6928 if( nCmd>2 ) goto session_syntax_error;
6929 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6930 if( p->nSession ){
6931 ii = sqlite3session_enable(pSession->p, ii);
6932 utf8_printf(p->out, "session %s enable flag = %d\n",
6933 pSession->zName, ii);
6935 }else
6937 /* .session filter GLOB ....
6938 ** Set a list of GLOB patterns of table names to be excluded.
6940 if( strcmp(azCmd[0], "filter")==0 ){
6941 int ii, nByte;
6942 if( nCmd<2 ) goto session_syntax_error;
6943 if( p->nSession ){
6944 for(ii=0; ii<pSession->nFilter; ii++){
6945 sqlite3_free(pSession->azFilter[ii]);
6947 sqlite3_free(pSession->azFilter);
6948 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
6949 pSession->azFilter = sqlite3_malloc( nByte );
6950 if( pSession->azFilter==0 ){
6951 raw_printf(stderr, "Error: out or memory\n");
6952 exit(1);
6954 for(ii=1; ii<nCmd; ii++){
6955 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
6957 pSession->nFilter = ii-1;
6959 }else
6961 /* .session indirect ?BOOLEAN?
6962 ** Query or set the indirect flag
6964 if( strcmp(azCmd[0], "indirect")==0 ){
6965 int ii;
6966 if( nCmd>2 ) goto session_syntax_error;
6967 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6968 if( p->nSession ){
6969 ii = sqlite3session_indirect(pSession->p, ii);
6970 utf8_printf(p->out, "session %s indirect flag = %d\n",
6971 pSession->zName, ii);
6973 }else
6975 /* .session isempty
6976 ** Determine if the session is empty
6978 if( strcmp(azCmd[0], "isempty")==0 ){
6979 int ii;
6980 if( nCmd!=1 ) goto session_syntax_error;
6981 if( p->nSession ){
6982 ii = sqlite3session_isempty(pSession->p);
6983 utf8_printf(p->out, "session %s isempty flag = %d\n",
6984 pSession->zName, ii);
6986 }else
6988 /* .session list
6989 ** List all currently open sessions
6991 if( strcmp(azCmd[0],"list")==0 ){
6992 for(i=0; i<p->nSession; i++){
6993 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
6995 }else
6997 /* .session open DB NAME
6998 ** Open a new session called NAME on the attached database DB.
6999 ** DB is normally "main".
7001 if( strcmp(azCmd[0],"open")==0 ){
7002 char *zName;
7003 if( nCmd!=3 ) goto session_syntax_error;
7004 zName = azCmd[2];
7005 if( zName[0]==0 ) goto session_syntax_error;
7006 for(i=0; i<p->nSession; i++){
7007 if( strcmp(p->aSession[i].zName,zName)==0 ){
7008 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
7009 goto meta_command_exit;
7012 if( p->nSession>=ArraySize(p->aSession) ){
7013 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
7014 goto meta_command_exit;
7016 pSession = &p->aSession[p->nSession];
7017 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
7018 if( rc ){
7019 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
7020 rc = 0;
7021 goto meta_command_exit;
7023 pSession->nFilter = 0;
7024 sqlite3session_table_filter(pSession->p, session_filter, pSession);
7025 p->nSession++;
7026 pSession->zName = sqlite3_mprintf("%s", zName);
7027 }else
7028 /* If no command name matches, show a syntax error */
7029 session_syntax_error:
7030 session_help(p);
7031 }else
7032 #endif
7034 #ifdef SQLITE_DEBUG
7035 /* Undocumented commands for internal testing. Subject to change
7036 ** without notice. */
7037 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
7038 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
7039 int i, v;
7040 for(i=1; i<nArg; i++){
7041 v = booleanValue(azArg[i]);
7042 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
7045 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
7046 int i; sqlite3_int64 v;
7047 for(i=1; i<nArg; i++){
7048 char zBuf[200];
7049 v = integerValue(azArg[i]);
7050 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
7051 utf8_printf(p->out, "%s", zBuf);
7054 }else
7055 #endif
7057 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
7058 int bIsInit = 0; /* True to initialize the SELFTEST table */
7059 int bVerbose = 0; /* Verbose output */
7060 int bSelftestExists; /* True if SELFTEST already exists */
7061 int i, k; /* Loop counters */
7062 int nTest = 0; /* Number of tests runs */
7063 int nErr = 0; /* Number of errors seen */
7064 ShellText str; /* Answer for a query */
7065 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
7067 open_db(p,0);
7068 for(i=1; i<nArg; i++){
7069 const char *z = azArg[i];
7070 if( z[0]=='-' && z[1]=='-' ) z++;
7071 if( strcmp(z,"-init")==0 ){
7072 bIsInit = 1;
7073 }else
7074 if( strcmp(z,"-v")==0 ){
7075 bVerbose++;
7076 }else
7078 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
7079 azArg[i], azArg[0]);
7080 raw_printf(stderr, "Should be one of: --init -v\n");
7081 rc = 1;
7082 goto meta_command_exit;
7085 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
7086 != SQLITE_OK ){
7087 bSelftestExists = 0;
7088 }else{
7089 bSelftestExists = 1;
7091 if( bIsInit ){
7092 createSelftestTable(p);
7093 bSelftestExists = 1;
7095 initText(&str);
7096 appendText(&str, "x", 0);
7097 for(k=bSelftestExists; k>=0; k--){
7098 if( k==1 ){
7099 rc = sqlite3_prepare_v2(p->db,
7100 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
7101 -1, &pStmt, 0);
7102 }else{
7103 rc = sqlite3_prepare_v2(p->db,
7104 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
7105 " (1,'run','PRAGMA integrity_check','ok')",
7106 -1, &pStmt, 0);
7108 if( rc ){
7109 raw_printf(stderr, "Error querying the selftest table\n");
7110 rc = 1;
7111 sqlite3_finalize(pStmt);
7112 goto meta_command_exit;
7114 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
7115 int tno = sqlite3_column_int(pStmt, 0);
7116 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
7117 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
7118 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
7120 k = 0;
7121 if( bVerbose>0 ){
7122 char *zQuote = sqlite3_mprintf("%q", zSql);
7123 printf("%d: %s %s\n", tno, zOp, zSql);
7124 sqlite3_free(zQuote);
7126 if( strcmp(zOp,"memo")==0 ){
7127 utf8_printf(p->out, "%s\n", zSql);
7128 }else
7129 if( strcmp(zOp,"run")==0 ){
7130 char *zErrMsg = 0;
7131 str.n = 0;
7132 str.z[0] = 0;
7133 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
7134 nTest++;
7135 if( bVerbose ){
7136 utf8_printf(p->out, "Result: %s\n", str.z);
7138 if( rc || zErrMsg ){
7139 nErr++;
7140 rc = 1;
7141 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
7142 sqlite3_free(zErrMsg);
7143 }else if( strcmp(zAns,str.z)!=0 ){
7144 nErr++;
7145 rc = 1;
7146 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
7147 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
7149 }else
7151 utf8_printf(stderr,
7152 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
7153 rc = 1;
7154 break;
7156 } /* End loop over rows of content from SELFTEST */
7157 sqlite3_finalize(pStmt);
7158 } /* End loop over k */
7159 freeText(&str);
7160 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
7161 }else
7163 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
7164 if( nArg<2 || nArg>3 ){
7165 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
7166 rc = 1;
7168 if( nArg>=2 ){
7169 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
7170 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
7172 if( nArg>=3 ){
7173 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
7174 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
7176 }else
7178 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
7179 const char *zLike = 0; /* Which table to checksum. 0 means everything */
7180 int i; /* Loop counter */
7181 int bSchema = 0; /* Also hash the schema */
7182 int bSeparate = 0; /* Hash each table separately */
7183 int iSize = 224; /* Hash algorithm to use */
7184 int bDebug = 0; /* Only show the query that would have run */
7185 sqlite3_stmt *pStmt; /* For querying tables names */
7186 char *zSql; /* SQL to be run */
7187 char *zSep; /* Separator */
7188 ShellText sSql; /* Complete SQL for the query to run the hash */
7189 ShellText sQuery; /* Set of queries used to read all content */
7190 open_db(p, 0);
7191 for(i=1; i<nArg; i++){
7192 const char *z = azArg[i];
7193 if( z[0]=='-' ){
7194 z++;
7195 if( z[0]=='-' ) z++;
7196 if( strcmp(z,"schema")==0 ){
7197 bSchema = 1;
7198 }else
7199 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
7200 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
7202 iSize = atoi(&z[5]);
7203 }else
7204 if( strcmp(z,"debug")==0 ){
7205 bDebug = 1;
7206 }else
7208 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
7209 azArg[i], azArg[0]);
7210 raw_printf(stderr, "Should be one of: --schema"
7211 " --sha3-224 --sha3-256 --sha3-384 --sha3-512\n");
7212 rc = 1;
7213 goto meta_command_exit;
7215 }else if( zLike ){
7216 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
7217 rc = 1;
7218 goto meta_command_exit;
7219 }else{
7220 zLike = z;
7221 bSeparate = 1;
7222 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
7225 if( bSchema ){
7226 zSql = "SELECT lower(name) FROM sqlite_master"
7227 " WHERE type='table' AND coalesce(rootpage,0)>1"
7228 " UNION ALL SELECT 'sqlite_master'"
7229 " ORDER BY 1 collate nocase";
7230 }else{
7231 zSql = "SELECT lower(name) FROM sqlite_master"
7232 " WHERE type='table' AND coalesce(rootpage,0)>1"
7233 " AND name NOT LIKE 'sqlite_%'"
7234 " ORDER BY 1 collate nocase";
7236 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
7237 initText(&sQuery);
7238 initText(&sSql);
7239 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
7240 zSep = "VALUES(";
7241 while( SQLITE_ROW==sqlite3_step(pStmt) ){
7242 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
7243 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
7244 if( strncmp(zTab, "sqlite_",7)!=0 ){
7245 appendText(&sQuery,"SELECT * FROM ", 0);
7246 appendText(&sQuery,zTab,'"');
7247 appendText(&sQuery," NOT INDEXED;", 0);
7248 }else if( strcmp(zTab, "sqlite_master")==0 ){
7249 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
7250 " ORDER BY name;", 0);
7251 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
7252 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
7253 " ORDER BY name;", 0);
7254 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
7255 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
7256 " ORDER BY tbl,idx;", 0);
7257 }else if( strcmp(zTab, "sqlite_stat3")==0
7258 || strcmp(zTab, "sqlite_stat4")==0 ){
7259 appendText(&sQuery, "SELECT * FROM ", 0);
7260 appendText(&sQuery, zTab, 0);
7261 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
7263 appendText(&sSql, zSep, 0);
7264 appendText(&sSql, sQuery.z, '\'');
7265 sQuery.n = 0;
7266 appendText(&sSql, ",", 0);
7267 appendText(&sSql, zTab, '\'');
7268 zSep = "),(";
7270 sqlite3_finalize(pStmt);
7271 if( bSeparate ){
7272 zSql = sqlite3_mprintf(
7273 "%s))"
7274 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
7275 " FROM [sha3sum$query]",
7276 sSql.z, iSize);
7277 }else{
7278 zSql = sqlite3_mprintf(
7279 "%s))"
7280 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
7281 " FROM [sha3sum$query]",
7282 sSql.z, iSize);
7284 freeText(&sQuery);
7285 freeText(&sSql);
7286 if( bDebug ){
7287 utf8_printf(p->out, "%s\n", zSql);
7288 }else{
7289 shell_exec(p, zSql, 0);
7291 sqlite3_free(zSql);
7292 }else
7294 #ifndef SQLITE_NOHAVE_SYSTEM
7295 if( c=='s'
7296 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
7298 char *zCmd;
7299 int i, x;
7300 if( nArg<2 ){
7301 raw_printf(stderr, "Usage: .system COMMAND\n");
7302 rc = 1;
7303 goto meta_command_exit;
7305 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
7306 for(i=2; i<nArg; i++){
7307 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
7308 zCmd, azArg[i]);
7310 x = system(zCmd);
7311 sqlite3_free(zCmd);
7312 if( x ) raw_printf(stderr, "System command returns %d\n", x);
7313 }else
7314 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
7316 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
7317 static const char *azBool[] = { "off", "on", "trigger", "full"};
7318 int i;
7319 if( nArg!=1 ){
7320 raw_printf(stderr, "Usage: .show\n");
7321 rc = 1;
7322 goto meta_command_exit;
7324 utf8_printf(p->out, "%12.12s: %s\n","echo",
7325 azBool[ShellHasFlag(p, SHFLG_Echo)]);
7326 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
7327 utf8_printf(p->out, "%12.12s: %s\n","explain",
7328 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
7329 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
7330 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
7331 utf8_printf(p->out, "%12.12s: ", "nullvalue");
7332 output_c_string(p->out, p->nullValue);
7333 raw_printf(p->out, "\n");
7334 utf8_printf(p->out,"%12.12s: %s\n","output",
7335 strlen30(p->outfile) ? p->outfile : "stdout");
7336 utf8_printf(p->out,"%12.12s: ", "colseparator");
7337 output_c_string(p->out, p->colSeparator);
7338 raw_printf(p->out, "\n");
7339 utf8_printf(p->out,"%12.12s: ", "rowseparator");
7340 output_c_string(p->out, p->rowSeparator);
7341 raw_printf(p->out, "\n");
7342 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
7343 utf8_printf(p->out, "%12.12s: ", "width");
7344 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
7345 raw_printf(p->out, "%d ", p->colWidth[i]);
7347 raw_printf(p->out, "\n");
7348 utf8_printf(p->out, "%12.12s: %s\n", "filename",
7349 p->zDbFilename ? p->zDbFilename : "");
7350 }else
7352 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
7353 if( nArg==2 ){
7354 p->statsOn = (u8)booleanValue(azArg[1]);
7355 }else if( nArg==1 ){
7356 display_stats(p->db, p, 0);
7357 }else{
7358 raw_printf(stderr, "Usage: .stats ?on|off?\n");
7359 rc = 1;
7361 }else
7363 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
7364 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
7365 || strncmp(azArg[0], "indexes", n)==0) )
7367 sqlite3_stmt *pStmt;
7368 char **azResult;
7369 int nRow, nAlloc;
7370 int ii;
7371 ShellText s;
7372 initText(&s);
7373 open_db(p, 0);
7374 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
7375 if( rc ) return shellDatabaseError(p->db);
7377 if( nArg>2 && c=='i' ){
7378 /* It is an historical accident that the .indexes command shows an error
7379 ** when called with the wrong number of arguments whereas the .tables
7380 ** command does not. */
7381 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
7382 rc = 1;
7383 goto meta_command_exit;
7385 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
7386 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
7387 if( zDbName==0 ) continue;
7388 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
7389 if( sqlite3_stricmp(zDbName, "main")==0 ){
7390 appendText(&s, "SELECT name FROM ", 0);
7391 }else{
7392 appendText(&s, "SELECT ", 0);
7393 appendText(&s, zDbName, '\'');
7394 appendText(&s, "||'.'||name FROM ", 0);
7396 appendText(&s, zDbName, '"');
7397 appendText(&s, ".sqlite_master ", 0);
7398 if( c=='t' ){
7399 appendText(&s," WHERE type IN ('table','view')"
7400 " AND name NOT LIKE 'sqlite_%'"
7401 " AND name LIKE ?1", 0);
7402 }else{
7403 appendText(&s," WHERE type='index'"
7404 " AND tbl_name LIKE ?1", 0);
7407 rc = sqlite3_finalize(pStmt);
7408 appendText(&s, " ORDER BY 1", 0);
7409 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
7410 freeText(&s);
7411 if( rc ) return shellDatabaseError(p->db);
7413 /* Run the SQL statement prepared by the above block. Store the results
7414 ** as an array of nul-terminated strings in azResult[]. */
7415 nRow = nAlloc = 0;
7416 azResult = 0;
7417 if( nArg>1 ){
7418 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
7419 }else{
7420 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
7422 while( sqlite3_step(pStmt)==SQLITE_ROW ){
7423 if( nRow>=nAlloc ){
7424 char **azNew;
7425 int n2 = nAlloc*2 + 10;
7426 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
7427 if( azNew==0 ) shell_out_of_memory();
7428 nAlloc = n2;
7429 azResult = azNew;
7431 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
7432 if( 0==azResult[nRow] ) shell_out_of_memory();
7433 nRow++;
7435 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
7436 rc = shellDatabaseError(p->db);
7439 /* Pretty-print the contents of array azResult[] to the output */
7440 if( rc==0 && nRow>0 ){
7441 int len, maxlen = 0;
7442 int i, j;
7443 int nPrintCol, nPrintRow;
7444 for(i=0; i<nRow; i++){
7445 len = strlen30(azResult[i]);
7446 if( len>maxlen ) maxlen = len;
7448 nPrintCol = 80/(maxlen+2);
7449 if( nPrintCol<1 ) nPrintCol = 1;
7450 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
7451 for(i=0; i<nPrintRow; i++){
7452 for(j=i; j<nRow; j+=nPrintRow){
7453 char *zSp = j<nPrintRow ? "" : " ";
7454 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
7455 azResult[j] ? azResult[j]:"");
7457 raw_printf(p->out, "\n");
7461 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
7462 sqlite3_free(azResult);
7463 }else
7465 /* Begin redirecting output to the file "testcase-out.txt" */
7466 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
7467 output_reset(p);
7468 p->out = output_file_open("testcase-out.txt", 0);
7469 if( p->out==0 ){
7470 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
7472 if( nArg>=2 ){
7473 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
7474 }else{
7475 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
7477 }else
7479 #ifndef SQLITE_UNTESTABLE
7480 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
7481 static const struct {
7482 const char *zCtrlName; /* Name of a test-control option */
7483 int ctrlCode; /* Integer code for that option */
7484 const char *zUsage; /* Usage notes */
7485 } aCtrl[] = {
7486 { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" },
7487 { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" },
7488 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/
7489 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/
7490 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" },
7491 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */
7492 { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
7493 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" },
7494 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" },
7495 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" },
7496 #ifdef YYCOVERAGE
7497 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" },
7498 #endif
7499 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " },
7500 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET, "" },
7501 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" },
7502 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" },
7503 { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" },
7505 int testctrl = -1;
7506 int iCtrl = -1;
7507 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
7508 int isOk = 0;
7509 int i, n2;
7510 const char *zCmd = 0;
7512 open_db(p, 0);
7513 zCmd = nArg>=2 ? azArg[1] : "help";
7515 /* The argument can optionally begin with "-" or "--" */
7516 if( zCmd[0]=='-' && zCmd[1] ){
7517 zCmd++;
7518 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
7521 /* --help lists all test-controls */
7522 if( strcmp(zCmd,"help")==0 ){
7523 utf8_printf(p->out, "Available test-controls:\n");
7524 for(i=0; i<ArraySize(aCtrl); i++){
7525 utf8_printf(p->out, " .testctrl %s %s\n",
7526 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
7528 rc = 1;
7529 goto meta_command_exit;
7532 /* convert testctrl text option to value. allow any unique prefix
7533 ** of the option name, or a numerical value. */
7534 n2 = strlen30(zCmd);
7535 for(i=0; i<ArraySize(aCtrl); i++){
7536 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
7537 if( testctrl<0 ){
7538 testctrl = aCtrl[i].ctrlCode;
7539 iCtrl = i;
7540 }else{
7541 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
7542 "Use \".testctrl --help\" for help\n", zCmd);
7543 rc = 1;
7544 goto meta_command_exit;
7548 if( testctrl<0 ){
7549 utf8_printf(stderr,"Error: unknown test-control: %s\n"
7550 "Use \".testctrl --help\" for help\n", zCmd);
7551 }else{
7552 switch(testctrl){
7554 /* sqlite3_test_control(int, db, int) */
7555 case SQLITE_TESTCTRL_OPTIMIZATIONS:
7556 case SQLITE_TESTCTRL_RESERVE:
7557 if( nArg==3 ){
7558 int opt = (int)strtol(azArg[2], 0, 0);
7559 rc2 = sqlite3_test_control(testctrl, p->db, opt);
7560 isOk = 3;
7562 break;
7564 /* sqlite3_test_control(int) */
7565 case SQLITE_TESTCTRL_PRNG_SAVE:
7566 case SQLITE_TESTCTRL_PRNG_RESTORE:
7567 case SQLITE_TESTCTRL_PRNG_RESET:
7568 case SQLITE_TESTCTRL_BYTEORDER:
7569 if( nArg==2 ){
7570 rc2 = sqlite3_test_control(testctrl);
7571 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
7573 break;
7575 /* sqlite3_test_control(int, uint) */
7576 case SQLITE_TESTCTRL_PENDING_BYTE:
7577 if( nArg==3 ){
7578 unsigned int opt = (unsigned int)integerValue(azArg[2]);
7579 rc2 = sqlite3_test_control(testctrl, opt);
7580 isOk = 3;
7582 break;
7584 /* sqlite3_test_control(int, int) */
7585 case SQLITE_TESTCTRL_ASSERT:
7586 case SQLITE_TESTCTRL_ALWAYS:
7587 if( nArg==3 ){
7588 int opt = booleanValue(azArg[2]);
7589 rc2 = sqlite3_test_control(testctrl, opt);
7590 isOk = 1;
7592 break;
7594 /* sqlite3_test_control(int, int) */
7595 case SQLITE_TESTCTRL_LOCALTIME_FAULT:
7596 case SQLITE_TESTCTRL_NEVER_CORRUPT:
7597 if( nArg==3 ){
7598 int opt = booleanValue(azArg[2]);
7599 rc2 = sqlite3_test_control(testctrl, opt);
7600 isOk = 3;
7602 break;
7604 case SQLITE_TESTCTRL_IMPOSTER:
7605 if( nArg==5 ){
7606 rc2 = sqlite3_test_control(testctrl, p->db,
7607 azArg[2],
7608 integerValue(azArg[3]),
7609 integerValue(azArg[4]));
7610 isOk = 3;
7612 break;
7614 #ifdef YYCOVERAGE
7615 case SQLITE_TESTCTRL_PARSER_COVERAGE:
7616 if( nArg==2 ){
7617 sqlite3_test_control(testctrl, p->out);
7618 isOk = 3;
7620 #endif
7623 if( isOk==0 && iCtrl>=0 ){
7624 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd, aCtrl[iCtrl].zUsage);
7625 rc = 1;
7626 }else if( isOk==1 ){
7627 raw_printf(p->out, "%d\n", rc2);
7628 }else if( isOk==2 ){
7629 raw_printf(p->out, "0x%08x\n", rc2);
7631 }else
7632 #endif /* !defined(SQLITE_UNTESTABLE) */
7634 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
7635 open_db(p, 0);
7636 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
7637 }else
7639 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
7640 if( nArg==2 ){
7641 enableTimer = booleanValue(azArg[1]);
7642 if( enableTimer && !HAS_TIMER ){
7643 raw_printf(stderr, "Error: timer not available on this system.\n");
7644 enableTimer = 0;
7646 }else{
7647 raw_printf(stderr, "Usage: .timer on|off\n");
7648 rc = 1;
7650 }else
7652 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
7653 open_db(p, 0);
7654 if( nArg!=2 ){
7655 raw_printf(stderr, "Usage: .trace FILE|off\n");
7656 rc = 1;
7657 goto meta_command_exit;
7659 output_file_close(p->traceOut);
7660 p->traceOut = output_file_open(azArg[1], 0);
7661 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
7662 if( p->traceOut==0 ){
7663 sqlite3_trace_v2(p->db, 0, 0, 0);
7664 }else{
7665 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
7667 #endif
7668 }else
7670 #if SQLITE_USER_AUTHENTICATION
7671 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
7672 if( nArg<2 ){
7673 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
7674 rc = 1;
7675 goto meta_command_exit;
7677 open_db(p, 0);
7678 if( strcmp(azArg[1],"login")==0 ){
7679 if( nArg!=4 ){
7680 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
7681 rc = 1;
7682 goto meta_command_exit;
7684 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], strlen30(azArg[3]));
7685 if( rc ){
7686 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
7687 rc = 1;
7689 }else if( strcmp(azArg[1],"add")==0 ){
7690 if( nArg!=5 ){
7691 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
7692 rc = 1;
7693 goto meta_command_exit;
7695 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
7696 booleanValue(azArg[4]));
7697 if( rc ){
7698 raw_printf(stderr, "User-Add failed: %d\n", rc);
7699 rc = 1;
7701 }else if( strcmp(azArg[1],"edit")==0 ){
7702 if( nArg!=5 ){
7703 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
7704 rc = 1;
7705 goto meta_command_exit;
7707 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
7708 booleanValue(azArg[4]));
7709 if( rc ){
7710 raw_printf(stderr, "User-Edit failed: %d\n", rc);
7711 rc = 1;
7713 }else if( strcmp(azArg[1],"delete")==0 ){
7714 if( nArg!=3 ){
7715 raw_printf(stderr, "Usage: .user delete USER\n");
7716 rc = 1;
7717 goto meta_command_exit;
7719 rc = sqlite3_user_delete(p->db, azArg[2]);
7720 if( rc ){
7721 raw_printf(stderr, "User-Delete failed: %d\n", rc);
7722 rc = 1;
7724 }else{
7725 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
7726 rc = 1;
7727 goto meta_command_exit;
7729 }else
7730 #endif /* SQLITE_USER_AUTHENTICATION */
7732 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
7733 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
7734 sqlite3_libversion(), sqlite3_sourceid());
7735 #if SQLITE_HAVE_ZLIB
7736 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
7737 #endif
7738 #define CTIMEOPT_VAL_(opt) #opt
7739 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
7740 #if defined(__clang__) && defined(__clang_major__)
7741 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
7742 CTIMEOPT_VAL(__clang_minor__) "."
7743 CTIMEOPT_VAL(__clang_patchlevel__) "\n");
7744 #elif defined(_MSC_VER)
7745 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
7746 #elif defined(__GNUC__) && defined(__VERSION__)
7747 utf8_printf(p->out, "gcc-" __VERSION__ "\n");
7748 #endif
7749 }else
7751 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
7752 const char *zDbName = nArg==2 ? azArg[1] : "main";
7753 sqlite3_vfs *pVfs = 0;
7754 if( p->db ){
7755 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
7756 if( pVfs ){
7757 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
7758 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7759 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7760 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7763 }else
7765 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
7766 sqlite3_vfs *pVfs;
7767 sqlite3_vfs *pCurrent = 0;
7768 if( p->db ){
7769 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
7771 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
7772 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
7773 pVfs==pCurrent ? " <--- CURRENT" : "");
7774 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7775 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7776 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7777 if( pVfs->pNext ){
7778 raw_printf(p->out, "-----------------------------------\n");
7781 }else
7783 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
7784 const char *zDbName = nArg==2 ? azArg[1] : "main";
7785 char *zVfsName = 0;
7786 if( p->db ){
7787 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
7788 if( zVfsName ){
7789 utf8_printf(p->out, "%s\n", zVfsName);
7790 sqlite3_free(zVfsName);
7793 }else
7795 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
7796 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
7797 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
7798 }else
7799 #endif
7801 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
7802 int j;
7803 assert( nArg<=ArraySize(azArg) );
7804 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
7805 p->colWidth[j-1] = (int)integerValue(azArg[j]);
7807 }else
7810 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
7811 " \"%s\". Enter \".help\" for help\n", azArg[0]);
7812 rc = 1;
7815 meta_command_exit:
7816 if( p->outCount ){
7817 p->outCount--;
7818 if( p->outCount==0 ) output_reset(p);
7820 return rc;
7824 ** Return TRUE if a semicolon occurs anywhere in the first N characters
7825 ** of string z[].
7827 static int line_contains_semicolon(const char *z, int N){
7828 int i;
7829 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
7830 return 0;
7834 ** Test to see if a line consists entirely of whitespace.
7836 static int _all_whitespace(const char *z){
7837 for(; *z; z++){
7838 if( IsSpace(z[0]) ) continue;
7839 if( *z=='/' && z[1]=='*' ){
7840 z += 2;
7841 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
7842 if( *z==0 ) return 0;
7843 z++;
7844 continue;
7846 if( *z=='-' && z[1]=='-' ){
7847 z += 2;
7848 while( *z && *z!='\n' ){ z++; }
7849 if( *z==0 ) return 1;
7850 continue;
7852 return 0;
7854 return 1;
7858 ** Return TRUE if the line typed in is an SQL command terminator other
7859 ** than a semi-colon. The SQL Server style "go" command is understood
7860 ** as is the Oracle "/".
7862 static int line_is_command_terminator(const char *zLine){
7863 while( IsSpace(zLine[0]) ){ zLine++; };
7864 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
7865 return 1; /* Oracle */
7867 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
7868 && _all_whitespace(&zLine[2]) ){
7869 return 1; /* SQL Server */
7871 return 0;
7875 ** We need a default sqlite3_complete() implementation to use in case
7876 ** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes
7877 ** any arbitrary text is a complete SQL statement. This is not very
7878 ** user-friendly, but it does seem to work.
7880 #ifdef SQLITE_OMIT_COMPLETE
7881 int sqlite3_complete(const char *zSql){ return 1; }
7882 #endif
7885 ** Return true if zSql is a complete SQL statement. Return false if it
7886 ** ends in the middle of a string literal or C-style comment.
7888 static int line_is_complete(char *zSql, int nSql){
7889 int rc;
7890 if( zSql==0 ) return 1;
7891 zSql[nSql] = ';';
7892 zSql[nSql+1] = 0;
7893 rc = sqlite3_complete(zSql);
7894 zSql[nSql] = 0;
7895 return rc;
7899 ** Run a single line of SQL. Return the number of errors.
7901 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
7902 int rc;
7903 char *zErrMsg = 0;
7905 open_db(p, 0);
7906 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
7907 BEGIN_TIMER;
7908 rc = shell_exec(p, zSql, &zErrMsg);
7909 END_TIMER;
7910 if( rc || zErrMsg ){
7911 char zPrefix[100];
7912 if( in!=0 || !stdin_is_interactive ){
7913 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
7914 "Error: near line %d:", startline);
7915 }else{
7916 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
7918 if( zErrMsg!=0 ){
7919 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
7920 sqlite3_free(zErrMsg);
7921 zErrMsg = 0;
7922 }else{
7923 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
7925 return 1;
7926 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
7927 raw_printf(p->out, "changes: %3d total_changes: %d\n",
7928 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
7930 return 0;
7935 ** Read input from *in and process it. If *in==0 then input
7936 ** is interactive - the user is typing it it. Otherwise, input
7937 ** is coming from a file or device. A prompt is issued and history
7938 ** is saved only if input is interactive. An interrupt signal will
7939 ** cause this routine to exit immediately, unless input is interactive.
7941 ** Return the number of errors.
7943 static int process_input(ShellState *p, FILE *in){
7944 char *zLine = 0; /* A single input line */
7945 char *zSql = 0; /* Accumulated SQL text */
7946 int nLine; /* Length of current line */
7947 int nSql = 0; /* Bytes of zSql[] used */
7948 int nAlloc = 0; /* Allocated zSql[] space */
7949 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
7950 int rc; /* Error code */
7951 int errCnt = 0; /* Number of errors seen */
7952 int lineno = 0; /* Current line number */
7953 int startline = 0; /* Line number for start of current input */
7955 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
7956 fflush(p->out);
7957 zLine = one_input_line(in, zLine, nSql>0);
7958 if( zLine==0 ){
7959 /* End of input */
7960 if( in==0 && stdin_is_interactive ) printf("\n");
7961 break;
7963 if( seenInterrupt ){
7964 if( in!=0 ) break;
7965 seenInterrupt = 0;
7967 lineno++;
7968 if( nSql==0 && _all_whitespace(zLine) ){
7969 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
7970 continue;
7972 if( zLine && zLine[0]=='.' && nSql==0 ){
7973 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
7974 rc = do_meta_command(zLine, p);
7975 if( rc==2 ){ /* exit requested */
7976 break;
7977 }else if( rc ){
7978 errCnt++;
7980 continue;
7982 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
7983 memcpy(zLine,";",2);
7985 nLine = strlen30(zLine);
7986 if( nSql+nLine+2>=nAlloc ){
7987 nAlloc = nSql+nLine+100;
7988 zSql = realloc(zSql, nAlloc);
7989 if( zSql==0 ) shell_out_of_memory();
7991 nSqlPrior = nSql;
7992 if( nSql==0 ){
7993 int i;
7994 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
7995 assert( nAlloc>0 && zSql!=0 );
7996 memcpy(zSql, zLine+i, nLine+1-i);
7997 startline = lineno;
7998 nSql = nLine-i;
7999 }else{
8000 zSql[nSql++] = '\n';
8001 memcpy(zSql+nSql, zLine, nLine+1);
8002 nSql += nLine;
8004 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
8005 && sqlite3_complete(zSql) ){
8006 errCnt += runOneSqlLine(p, zSql, in, startline);
8007 nSql = 0;
8008 if( p->outCount ){
8009 output_reset(p);
8010 p->outCount = 0;
8011 }else{
8012 clearTempFile(p);
8014 }else if( nSql && _all_whitespace(zSql) ){
8015 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
8016 nSql = 0;
8019 if( nSql && !_all_whitespace(zSql) ){
8020 errCnt += runOneSqlLine(p, zSql, in, startline);
8022 free(zSql);
8023 free(zLine);
8024 return errCnt>0;
8028 ** Return a pathname which is the user's home directory. A
8029 ** 0 return indicates an error of some kind.
8031 static char *find_home_dir(int clearFlag){
8032 static char *home_dir = NULL;
8033 if( clearFlag ){
8034 free(home_dir);
8035 home_dir = 0;
8036 return 0;
8038 if( home_dir ) return home_dir;
8040 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
8041 && !defined(__RTP__) && !defined(_WRS_KERNEL)
8043 struct passwd *pwent;
8044 uid_t uid = getuid();
8045 if( (pwent=getpwuid(uid)) != NULL) {
8046 home_dir = pwent->pw_dir;
8049 #endif
8051 #if defined(_WIN32_WCE)
8052 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
8054 home_dir = "/";
8055 #else
8057 #if defined(_WIN32) || defined(WIN32)
8058 if (!home_dir) {
8059 home_dir = getenv("USERPROFILE");
8061 #endif
8063 if (!home_dir) {
8064 home_dir = getenv("HOME");
8067 #if defined(_WIN32) || defined(WIN32)
8068 if (!home_dir) {
8069 char *zDrive, *zPath;
8070 int n;
8071 zDrive = getenv("HOMEDRIVE");
8072 zPath = getenv("HOMEPATH");
8073 if( zDrive && zPath ){
8074 n = strlen30(zDrive) + strlen30(zPath) + 1;
8075 home_dir = malloc( n );
8076 if( home_dir==0 ) return 0;
8077 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
8078 return home_dir;
8080 home_dir = "c:\\";
8082 #endif
8084 #endif /* !_WIN32_WCE */
8086 if( home_dir ){
8087 int n = strlen30(home_dir) + 1;
8088 char *z = malloc( n );
8089 if( z ) memcpy(z, home_dir, n);
8090 home_dir = z;
8093 return home_dir;
8097 ** Read input from the file given by sqliterc_override. Or if that
8098 ** parameter is NULL, take input from ~/.sqliterc
8100 ** Returns the number of errors.
8102 static void process_sqliterc(
8103 ShellState *p, /* Configuration data */
8104 const char *sqliterc_override /* Name of config file. NULL to use default */
8106 char *home_dir = NULL;
8107 const char *sqliterc = sqliterc_override;
8108 char *zBuf = 0;
8109 FILE *in = NULL;
8111 if (sqliterc == NULL) {
8112 home_dir = find_home_dir(0);
8113 if( home_dir==0 ){
8114 raw_printf(stderr, "-- warning: cannot find home directory;"
8115 " cannot read ~/.sqliterc\n");
8116 return;
8118 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
8119 sqliterc = zBuf;
8121 in = fopen(sqliterc,"rb");
8122 if( in ){
8123 if( stdin_is_interactive ){
8124 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
8126 process_input(p,in);
8127 fclose(in);
8129 sqlite3_free(zBuf);
8133 ** Show available command line options
8135 static const char zOptions[] =
8136 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
8137 " -A ARGS... run \".archive ARGS\" and exit\n"
8138 #endif
8139 " -append append the database to the end of the file\n"
8140 " -ascii set output mode to 'ascii'\n"
8141 " -bail stop after hitting an error\n"
8142 " -batch force batch I/O\n"
8143 " -column set output mode to 'column'\n"
8144 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
8145 " -csv set output mode to 'csv'\n"
8146 " -echo print commands before execution\n"
8147 " -init FILENAME read/process named file\n"
8148 " -[no]header turn headers on or off\n"
8149 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
8150 " -heap SIZE Size of heap for memsys3 or memsys5\n"
8151 #endif
8152 " -help show this message\n"
8153 " -html set output mode to HTML\n"
8154 " -interactive force interactive I/O\n"
8155 " -line set output mode to 'line'\n"
8156 " -list set output mode to 'list'\n"
8157 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
8158 " -mmap N default mmap size set to N\n"
8159 #ifdef SQLITE_ENABLE_MULTIPLEX
8160 " -multiplex enable the multiplexor VFS\n"
8161 #endif
8162 " -newline SEP set output row separator. Default: '\\n'\n"
8163 " -nullvalue TEXT set text string for NULL values. Default ''\n"
8164 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
8165 " -quote set output mode to 'quote'\n"
8166 " -readonly open the database read-only\n"
8167 " -separator SEP set output column separator. Default: '|'\n"
8168 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
8169 " -sorterref SIZE sorter references threshold size\n"
8170 #endif
8171 " -stats print memory stats before each finalize\n"
8172 " -version show SQLite version\n"
8173 " -vfs NAME use NAME as the default VFS\n"
8174 #ifdef SQLITE_ENABLE_VFSTRACE
8175 " -vfstrace enable tracing of all VFS calls\n"
8176 #endif
8177 #ifdef SQLITE_HAVE_ZLIB
8178 " -zip open the file as a ZIP Archive\n"
8179 #endif
8181 static void usage(int showDetail){
8182 utf8_printf(stderr,
8183 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
8184 "FILENAME is the name of an SQLite database. A new database is created\n"
8185 "if the file does not previously exist.\n", Argv0);
8186 if( showDetail ){
8187 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
8188 }else{
8189 raw_printf(stderr, "Use the -help option for additional information\n");
8191 exit(1);
8195 ** Internal check: Verify that the SQLite is uninitialized. Print a
8196 ** error message if it is initialized.
8198 static void verify_uninitialized(void){
8199 if( sqlite3_config(-1)==SQLITE_MISUSE ){
8200 utf8_printf(stdout, "WARNING: attempt to configuration SQLite after"
8201 " initialization.\n");
8206 ** Initialize the state information in data
8208 static void main_init(ShellState *data) {
8209 memset(data, 0, sizeof(*data));
8210 data->normalMode = data->cMode = data->mode = MODE_List;
8211 data->autoExplain = 1;
8212 memcpy(data->colSeparator,SEP_Column, 2);
8213 memcpy(data->rowSeparator,SEP_Row, 2);
8214 data->showHeader = 0;
8215 data->shellFlgs = SHFLG_Lookaside;
8216 verify_uninitialized();
8217 sqlite3_config(SQLITE_CONFIG_URI, 1);
8218 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
8219 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
8220 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
8221 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
8225 ** Output text to the console in a font that attracts extra attention.
8227 #ifdef _WIN32
8228 static void printBold(const char *zText){
8229 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
8230 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
8231 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
8232 SetConsoleTextAttribute(out,
8233 FOREGROUND_RED|FOREGROUND_INTENSITY
8235 printf("%s", zText);
8236 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
8238 #else
8239 static void printBold(const char *zText){
8240 printf("\033[1m%s\033[0m", zText);
8242 #endif
8245 ** Get the argument to an --option. Throw an error and die if no argument
8246 ** is available.
8248 static char *cmdline_option_value(int argc, char **argv, int i){
8249 if( i==argc ){
8250 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
8251 argv[0], argv[argc-1]);
8252 exit(1);
8254 return argv[i];
8257 #ifndef SQLITE_SHELL_IS_UTF8
8258 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
8259 # define SQLITE_SHELL_IS_UTF8 (0)
8260 # else
8261 # define SQLITE_SHELL_IS_UTF8 (1)
8262 # endif
8263 #endif
8265 #if SQLITE_SHELL_IS_UTF8
8266 int SQLITE_CDECL main(int argc, char **argv){
8267 #else
8268 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
8269 char **argv;
8270 #endif
8271 char *zErrMsg = 0;
8272 ShellState data;
8273 const char *zInitFile = 0;
8274 int i;
8275 int rc = 0;
8276 int warnInmemoryDb = 0;
8277 int readStdin = 1;
8278 int nCmd = 0;
8279 char **azCmd = 0;
8280 const char *zVfs = 0; /* Value of -vfs command-line option */
8282 setBinaryMode(stdin, 0);
8283 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
8284 stdin_is_interactive = isatty(0);
8285 stdout_is_console = isatty(1);
8287 #if USE_SYSTEM_SQLITE+0!=1
8288 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
8289 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
8290 sqlite3_sourceid(), SQLITE_SOURCE_ID);
8291 exit(1);
8293 #endif
8294 main_init(&data);
8296 /* On Windows, we must translate command-line arguments into UTF-8.
8297 ** The SQLite memory allocator subsystem has to be enabled in order to
8298 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
8299 ** subsequent sqlite3_config() calls will work. So copy all results into
8300 ** memory that does not come from the SQLite memory allocator.
8302 #if !SQLITE_SHELL_IS_UTF8
8303 sqlite3_initialize();
8304 argv = malloc(sizeof(argv[0])*argc);
8305 if( argv==0 ) shell_out_of_memory();
8306 for(i=0; i<argc; i++){
8307 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
8308 int n;
8309 if( z==0 ) shell_out_of_memory();
8310 n = (int)strlen(z);
8311 argv[i] = malloc( n+1 );
8312 if( argv[i]==0 ) shell_out_of_memory();
8313 memcpy(argv[i], z, n+1);
8314 sqlite3_free(z);
8316 sqlite3_shutdown();
8317 #endif
8319 assert( argc>=1 && argv && argv[0] );
8320 Argv0 = argv[0];
8322 /* Make sure we have a valid signal handler early, before anything
8323 ** else is done.
8325 #ifdef SIGINT
8326 signal(SIGINT, interrupt_handler);
8327 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
8328 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
8329 #endif
8331 #ifdef SQLITE_SHELL_DBNAME_PROC
8333 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
8334 ** of a C-function that will provide the name of the database file. Use
8335 ** this compile-time option to embed this shell program in larger
8336 ** applications. */
8337 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
8338 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
8339 warnInmemoryDb = 0;
8341 #endif
8343 /* Do an initial pass through the command-line argument to locate
8344 ** the name of the database file, the name of the initialization file,
8345 ** the size of the alternative malloc heap,
8346 ** and the first command to execute.
8348 verify_uninitialized();
8349 for(i=1; i<argc; i++){
8350 char *z;
8351 z = argv[i];
8352 if( z[0]!='-' ){
8353 if( data.zDbFilename==0 ){
8354 data.zDbFilename = z;
8355 }else{
8356 /* Excesss arguments are interpreted as SQL (or dot-commands) and
8357 ** mean that nothing is read from stdin */
8358 readStdin = 0;
8359 nCmd++;
8360 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
8361 if( azCmd==0 ) shell_out_of_memory();
8362 azCmd[nCmd-1] = z;
8365 if( z[1]=='-' ) z++;
8366 if( strcmp(z,"-separator")==0
8367 || strcmp(z,"-nullvalue")==0
8368 || strcmp(z,"-newline")==0
8369 || strcmp(z,"-cmd")==0
8371 (void)cmdline_option_value(argc, argv, ++i);
8372 }else if( strcmp(z,"-init")==0 ){
8373 zInitFile = cmdline_option_value(argc, argv, ++i);
8374 }else if( strcmp(z,"-batch")==0 ){
8375 /* Need to check for batch mode here to so we can avoid printing
8376 ** informational messages (like from process_sqliterc) before
8377 ** we do the actual processing of arguments later in a second pass.
8379 stdin_is_interactive = 0;
8380 }else if( strcmp(z,"-heap")==0 ){
8381 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
8382 const char *zSize;
8383 sqlite3_int64 szHeap;
8385 zSize = cmdline_option_value(argc, argv, ++i);
8386 szHeap = integerValue(zSize);
8387 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
8388 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
8389 #else
8390 (void)cmdline_option_value(argc, argv, ++i);
8391 #endif
8392 }else if( strcmp(z,"-pagecache")==0 ){
8393 int n, sz;
8394 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8395 if( sz>70000 ) sz = 70000;
8396 if( sz<0 ) sz = 0;
8397 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8398 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
8399 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
8400 data.shellFlgs |= SHFLG_Pagecache;
8401 }else if( strcmp(z,"-lookaside")==0 ){
8402 int n, sz;
8403 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8404 if( sz<0 ) sz = 0;
8405 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8406 if( n<0 ) n = 0;
8407 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
8408 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
8409 #ifdef SQLITE_ENABLE_VFSTRACE
8410 }else if( strcmp(z,"-vfstrace")==0 ){
8411 extern int vfstrace_register(
8412 const char *zTraceName,
8413 const char *zOldVfsName,
8414 int (*xOut)(const char*,void*),
8415 void *pOutArg,
8416 int makeDefault
8418 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
8419 #endif
8420 #ifdef SQLITE_ENABLE_MULTIPLEX
8421 }else if( strcmp(z,"-multiplex")==0 ){
8422 extern int sqlite3_multiple_initialize(const char*,int);
8423 sqlite3_multiplex_initialize(0, 1);
8424 #endif
8425 }else if( strcmp(z,"-mmap")==0 ){
8426 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8427 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
8428 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
8429 }else if( strcmp(z,"-sorterref")==0 ){
8430 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8431 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
8432 #endif
8433 }else if( strcmp(z,"-vfs")==0 ){
8434 zVfs = cmdline_option_value(argc, argv, ++i);
8435 #ifdef SQLITE_HAVE_ZLIB
8436 }else if( strcmp(z,"-zip")==0 ){
8437 data.openMode = SHELL_OPEN_ZIPFILE;
8438 #endif
8439 }else if( strcmp(z,"-append")==0 ){
8440 data.openMode = SHELL_OPEN_APPENDVFS;
8441 }else if( strcmp(z,"-readonly")==0 ){
8442 data.openMode = SHELL_OPEN_READONLY;
8443 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8444 }else if( strncmp(z, "-A",2)==0 ){
8445 /* All remaining command-line arguments are passed to the ".archive"
8446 ** command, so ignore them */
8447 break;
8448 #endif
8451 verify_uninitialized();
8454 #ifdef SQLITE_SHELL_INIT_PROC
8456 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
8457 ** of a C-function that will perform initialization actions on SQLite that
8458 ** occur just before or after sqlite3_initialize(). Use this compile-time
8459 ** option to embed this shell program in larger applications. */
8460 extern void SQLITE_SHELL_INIT_PROC(void);
8461 SQLITE_SHELL_INIT_PROC();
8463 #else
8464 /* All the sqlite3_config() calls have now been made. So it is safe
8465 ** to call sqlite3_initialize() and process any command line -vfs option. */
8466 sqlite3_initialize();
8467 #endif
8469 if( zVfs ){
8470 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
8471 if( pVfs ){
8472 sqlite3_vfs_register(pVfs, 1);
8473 }else{
8474 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
8475 exit(1);
8479 if( data.zDbFilename==0 ){
8480 #ifndef SQLITE_OMIT_MEMORYDB
8481 data.zDbFilename = ":memory:";
8482 warnInmemoryDb = argc==1;
8483 #else
8484 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
8485 return 1;
8486 #endif
8488 data.out = stdout;
8489 sqlite3_appendvfs_init(0,0,0);
8491 /* Go ahead and open the database file if it already exists. If the
8492 ** file does not exist, delay opening it. This prevents empty database
8493 ** files from being created if a user mistypes the database name argument
8494 ** to the sqlite command-line tool.
8496 if( access(data.zDbFilename, 0)==0 ){
8497 open_db(&data, 0);
8500 /* Process the initialization file if there is one. If no -init option
8501 ** is given on the command line, look for a file named ~/.sqliterc and
8502 ** try to process it.
8504 process_sqliterc(&data,zInitFile);
8506 /* Make a second pass through the command-line argument and set
8507 ** options. This second pass is delayed until after the initialization
8508 ** file is processed so that the command-line arguments will override
8509 ** settings in the initialization file.
8511 for(i=1; i<argc; i++){
8512 char *z = argv[i];
8513 if( z[0]!='-' ) continue;
8514 if( z[1]=='-' ){ z++; }
8515 if( strcmp(z,"-init")==0 ){
8516 i++;
8517 }else if( strcmp(z,"-html")==0 ){
8518 data.mode = MODE_Html;
8519 }else if( strcmp(z,"-list")==0 ){
8520 data.mode = MODE_List;
8521 }else if( strcmp(z,"-quote")==0 ){
8522 data.mode = MODE_Quote;
8523 }else if( strcmp(z,"-line")==0 ){
8524 data.mode = MODE_Line;
8525 }else if( strcmp(z,"-column")==0 ){
8526 data.mode = MODE_Column;
8527 }else if( strcmp(z,"-csv")==0 ){
8528 data.mode = MODE_Csv;
8529 memcpy(data.colSeparator,",",2);
8530 #ifdef SQLITE_HAVE_ZLIB
8531 }else if( strcmp(z,"-zip")==0 ){
8532 data.openMode = SHELL_OPEN_ZIPFILE;
8533 #endif
8534 }else if( strcmp(z,"-append")==0 ){
8535 data.openMode = SHELL_OPEN_APPENDVFS;
8536 }else if( strcmp(z,"-readonly")==0 ){
8537 data.openMode = SHELL_OPEN_READONLY;
8538 }else if( strcmp(z,"-ascii")==0 ){
8539 data.mode = MODE_Ascii;
8540 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8541 SEP_Unit);
8542 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8543 SEP_Record);
8544 }else if( strcmp(z,"-separator")==0 ){
8545 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8546 "%s",cmdline_option_value(argc,argv,++i));
8547 }else if( strcmp(z,"-newline")==0 ){
8548 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8549 "%s",cmdline_option_value(argc,argv,++i));
8550 }else if( strcmp(z,"-nullvalue")==0 ){
8551 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
8552 "%s",cmdline_option_value(argc,argv,++i));
8553 }else if( strcmp(z,"-header")==0 ){
8554 data.showHeader = 1;
8555 }else if( strcmp(z,"-noheader")==0 ){
8556 data.showHeader = 0;
8557 }else if( strcmp(z,"-echo")==0 ){
8558 ShellSetFlag(&data, SHFLG_Echo);
8559 }else if( strcmp(z,"-eqp")==0 ){
8560 data.autoEQP = AUTOEQP_on;
8561 }else if( strcmp(z,"-eqpfull")==0 ){
8562 data.autoEQP = AUTOEQP_full;
8563 }else if( strcmp(z,"-stats")==0 ){
8564 data.statsOn = 1;
8565 }else if( strcmp(z,"-scanstats")==0 ){
8566 data.scanstatsOn = 1;
8567 }else if( strcmp(z,"-backslash")==0 ){
8568 /* Undocumented command-line option: -backslash
8569 ** Causes C-style backslash escapes to be evaluated in SQL statements
8570 ** prior to sending the SQL into SQLite. Useful for injecting
8571 ** crazy bytes in the middle of SQL statements for testing and debugging.
8573 ShellSetFlag(&data, SHFLG_Backslash);
8574 }else if( strcmp(z,"-bail")==0 ){
8575 bail_on_error = 1;
8576 }else if( strcmp(z,"-version")==0 ){
8577 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
8578 return 0;
8579 }else if( strcmp(z,"-interactive")==0 ){
8580 stdin_is_interactive = 1;
8581 }else if( strcmp(z,"-batch")==0 ){
8582 stdin_is_interactive = 0;
8583 }else if( strcmp(z,"-heap")==0 ){
8584 i++;
8585 }else if( strcmp(z,"-pagecache")==0 ){
8586 i+=2;
8587 }else if( strcmp(z,"-lookaside")==0 ){
8588 i+=2;
8589 }else if( strcmp(z,"-mmap")==0 ){
8590 i++;
8591 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
8592 }else if( strcmp(z,"-sorterref")==0 ){
8593 i++;
8594 #endif
8595 }else if( strcmp(z,"-vfs")==0 ){
8596 i++;
8597 #ifdef SQLITE_ENABLE_VFSTRACE
8598 }else if( strcmp(z,"-vfstrace")==0 ){
8599 i++;
8600 #endif
8601 #ifdef SQLITE_ENABLE_MULTIPLEX
8602 }else if( strcmp(z,"-multiplex")==0 ){
8603 i++;
8604 #endif
8605 }else if( strcmp(z,"-help")==0 ){
8606 usage(1);
8607 }else if( strcmp(z,"-cmd")==0 ){
8608 /* Run commands that follow -cmd first and separately from commands
8609 ** that simply appear on the command-line. This seems goofy. It would
8610 ** be better if all commands ran in the order that they appear. But
8611 ** we retain the goofy behavior for historical compatibility. */
8612 if( i==argc-1 ) break;
8613 z = cmdline_option_value(argc,argv,++i);
8614 if( z[0]=='.' ){
8615 rc = do_meta_command(z, &data);
8616 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
8617 }else{
8618 open_db(&data, 0);
8619 rc = shell_exec(&data, z, &zErrMsg);
8620 if( zErrMsg!=0 ){
8621 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8622 if( bail_on_error ) return rc!=0 ? rc : 1;
8623 }else if( rc!=0 ){
8624 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
8625 if( bail_on_error ) return rc;
8628 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8629 }else if( strncmp(z, "-A", 2)==0 ){
8630 if( nCmd>0 ){
8631 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
8632 " with \"%s\"\n", z);
8633 return 1;
8635 open_db(&data, 0);
8636 if( z[2] ){
8637 argv[i] = &z[2];
8638 arDotCommand(&data, argv+(i-1), argc-(i-1));
8639 }else{
8640 arDotCommand(&data, argv+i, argc-i);
8642 readStdin = 0;
8643 break;
8644 #endif
8645 }else{
8646 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
8647 raw_printf(stderr,"Use -help for a list of options.\n");
8648 return 1;
8650 data.cMode = data.mode;
8653 if( !readStdin ){
8654 /* Run all arguments that do not begin with '-' as if they were separate
8655 ** command-line inputs, except for the argToSkip argument which contains
8656 ** the database filename.
8658 for(i=0; i<nCmd; i++){
8659 if( azCmd[i][0]=='.' ){
8660 rc = do_meta_command(azCmd[i], &data);
8661 if( rc ) return rc==2 ? 0 : rc;
8662 }else{
8663 open_db(&data, 0);
8664 rc = shell_exec(&data, azCmd[i], &zErrMsg);
8665 if( zErrMsg!=0 ){
8666 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8667 return rc!=0 ? rc : 1;
8668 }else if( rc!=0 ){
8669 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
8670 return rc;
8674 free(azCmd);
8675 }else{
8676 /* Run commands received from standard input
8678 if( stdin_is_interactive ){
8679 char *zHome;
8680 char *zHistory = 0;
8681 int nHistory;
8682 printf(
8683 "SQLite version %s %.19s\n" /*extra-version-info*/
8684 "Enter \".help\" for usage hints.\n",
8685 sqlite3_libversion(), sqlite3_sourceid()
8687 if( warnInmemoryDb ){
8688 printf("Connected to a ");
8689 printBold("transient in-memory database");
8690 printf(".\nUse \".open FILENAME\" to reopen on a "
8691 "persistent database.\n");
8693 zHome = find_home_dir(0);
8694 if( zHome ){
8695 nHistory = strlen30(zHome) + 20;
8696 if( (zHistory = malloc(nHistory))!=0 ){
8697 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
8700 if( zHistory ){ shell_read_history(zHistory); }
8701 #if HAVE_READLINE || HAVE_EDITLINE
8702 rl_attempted_completion_function = readline_completion;
8703 #elif HAVE_LINENOISE
8704 linenoiseSetCompletionCallback(linenoise_completion);
8705 #endif
8706 rc = process_input(&data, 0);
8707 if( zHistory ){
8708 shell_stifle_history(2000);
8709 shell_write_history(zHistory);
8710 free(zHistory);
8712 }else{
8713 rc = process_input(&data, stdin);
8716 set_table_name(&data, 0);
8717 if( data.db ){
8718 session_close_all(&data);
8719 sqlite3_close(data.db);
8721 sqlite3_free(data.zFreeOnClose);
8722 find_home_dir(1);
8723 output_reset(&data);
8724 data.doXdgOpen = 0;
8725 clearTempFile(&data);
8726 #if !SQLITE_SHELL_IS_UTF8
8727 for(i=0; i<argc; i++) free(argv[i]);
8728 free(argv);
8729 #endif
8730 return rc;