Snapshot of upstream SQLite 3.38.2
[sqlcipher.git] / src / shell.c.in
blob45cbb436e0c683048bcfd63725cd442f23f88681
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 ** Optionally #include a user-defined header, whereby compilation options
22 ** may be set prior to where they take effect, but after platform setup.
23 ** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include
24 ** file. Note that this macro has a like effect on sqlite3.c compilation.
26 # define SHELL_STRINGIFY_(f) #f
27 # define SHELL_STRINGIFY(f) SHELL_STRINGIFY_(f)
28 #ifdef SQLITE_CUSTOM_INCLUDE
29 # include SHELL_STRINGIFY(SQLITE_CUSTOM_INCLUDE)
30 #endif
33 ** Determine if we are dealing with WinRT, which provides only a subset of
34 ** the full Win32 API.
36 #if !defined(SQLITE_OS_WINRT)
37 # define SQLITE_OS_WINRT 0
38 #endif
41 ** Warning pragmas copied from msvc.h in the core.
43 #if defined(_MSC_VER)
44 #pragma warning(disable : 4054)
45 #pragma warning(disable : 4055)
46 #pragma warning(disable : 4100)
47 #pragma warning(disable : 4127)
48 #pragma warning(disable : 4130)
49 #pragma warning(disable : 4152)
50 #pragma warning(disable : 4189)
51 #pragma warning(disable : 4206)
52 #pragma warning(disable : 4210)
53 #pragma warning(disable : 4232)
54 #pragma warning(disable : 4244)
55 #pragma warning(disable : 4305)
56 #pragma warning(disable : 4306)
57 #pragma warning(disable : 4702)
58 #pragma warning(disable : 4706)
59 #endif /* defined(_MSC_VER) */
62 ** No support for loadable extensions in VxWorks.
64 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
65 # define SQLITE_OMIT_LOAD_EXTENSION 1
66 #endif
69 ** Enable large-file support for fopen() and friends on unix.
71 #ifndef SQLITE_DISABLE_LFS
72 # define _LARGE_FILE 1
73 # ifndef _FILE_OFFSET_BITS
74 # define _FILE_OFFSET_BITS 64
75 # endif
76 # define _LARGEFILE_SOURCE 1
77 #endif
79 #include <stdlib.h>
80 #include <string.h>
81 #include <stdio.h>
82 #include <assert.h>
83 #include "sqlite3.h"
84 typedef sqlite3_int64 i64;
85 typedef sqlite3_uint64 u64;
86 typedef unsigned char u8;
87 #if SQLITE_USER_AUTHENTICATION
88 # include "sqlite3userauth.h"
89 #endif
90 #include <ctype.h>
91 #include <stdarg.h>
93 #if !defined(_WIN32) && !defined(WIN32)
94 # include <signal.h>
95 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
96 # include <pwd.h>
97 # endif
98 #endif
99 #if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
100 # include <unistd.h>
101 # include <dirent.h>
102 # define GETPID getpid
103 # if defined(__MINGW32__)
104 # define DIRENT dirent
105 # ifndef S_ISLNK
106 # define S_ISLNK(mode) (0)
107 # endif
108 # endif
109 #else
110 # define GETPID (int)GetCurrentProcessId
111 #endif
112 #include <sys/types.h>
113 #include <sys/stat.h>
115 #if HAVE_READLINE
116 # include <readline/readline.h>
117 # include <readline/history.h>
118 #endif
120 #if HAVE_EDITLINE
121 # include <editline/readline.h>
122 #endif
124 #if HAVE_EDITLINE || HAVE_READLINE
126 # define shell_add_history(X) add_history(X)
127 # define shell_read_history(X) read_history(X)
128 # define shell_write_history(X) write_history(X)
129 # define shell_stifle_history(X) stifle_history(X)
130 # define shell_readline(X) readline(X)
132 #elif HAVE_LINENOISE
134 # include "linenoise.h"
135 # define shell_add_history(X) linenoiseHistoryAdd(X)
136 # define shell_read_history(X) linenoiseHistoryLoad(X)
137 # define shell_write_history(X) linenoiseHistorySave(X)
138 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
139 # define shell_readline(X) linenoise(X)
141 #else
143 # define shell_read_history(X)
144 # define shell_write_history(X)
145 # define shell_stifle_history(X)
147 # define SHELL_USE_LOCAL_GETLINE 1
148 #endif
151 #if defined(_WIN32) || defined(WIN32)
152 # if SQLITE_OS_WINRT
153 # define SQLITE_OMIT_POPEN 1
154 # else
155 # include <io.h>
156 # include <fcntl.h>
157 # define isatty(h) _isatty(h)
158 # ifndef access
159 # define access(f,m) _access((f),(m))
160 # endif
161 # ifndef unlink
162 # define unlink _unlink
163 # endif
164 # ifndef strdup
165 # define strdup _strdup
166 # endif
167 # undef popen
168 # define popen _popen
169 # undef pclose
170 # define pclose _pclose
171 # endif
172 #else
173 /* Make sure isatty() has a prototype. */
174 extern int isatty(int);
176 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
177 /* popen and pclose are not C89 functions and so are
178 ** sometimes omitted from the <stdio.h> header */
179 extern FILE *popen(const char*,const char*);
180 extern int pclose(FILE*);
181 # else
182 # define SQLITE_OMIT_POPEN 1
183 # endif
184 #endif
186 #if defined(_WIN32_WCE)
187 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
188 * thus we always assume that we have a console. That can be
189 * overridden with the -batch command line option.
191 #define isatty(x) 1
192 #endif
194 /* ctype macros that work with signed characters */
195 #define IsSpace(X) isspace((unsigned char)X)
196 #define IsDigit(X) isdigit((unsigned char)X)
197 #define ToLower(X) (char)tolower((unsigned char)X)
199 #if defined(_WIN32) || defined(WIN32)
200 #if SQLITE_OS_WINRT
201 #include <intrin.h>
202 #endif
203 #include <windows.h>
205 /* string conversion routines only needed on Win32 */
206 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
207 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
208 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
209 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
210 #endif
212 /* On Windows, we normally run with output mode of TEXT so that \n characters
213 ** are automatically translated into \r\n. However, this behavior needs
214 ** to be disabled in some cases (ex: when generating CSV output and when
215 ** rendering quoted strings that contain \n characters). The following
216 ** routines take care of that.
218 #if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
219 static void setBinaryMode(FILE *file, int isOutput){
220 if( isOutput ) fflush(file);
221 _setmode(_fileno(file), _O_BINARY);
223 static void setTextMode(FILE *file, int isOutput){
224 if( isOutput ) fflush(file);
225 _setmode(_fileno(file), _O_TEXT);
227 #else
228 # define setBinaryMode(X,Y)
229 # define setTextMode(X,Y)
230 #endif
233 /* True if the timer is enabled */
234 static int enableTimer = 0;
236 /* Return the current wall-clock time */
237 static sqlite3_int64 timeOfDay(void){
238 static sqlite3_vfs *clockVfs = 0;
239 sqlite3_int64 t;
240 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
241 if( clockVfs==0 ) return 0; /* Never actually happens */
242 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
243 clockVfs->xCurrentTimeInt64(clockVfs, &t);
244 }else{
245 double r;
246 clockVfs->xCurrentTime(clockVfs, &r);
247 t = (sqlite3_int64)(r*86400000.0);
249 return t;
252 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
253 #include <sys/time.h>
254 #include <sys/resource.h>
256 /* VxWorks does not support getrusage() as far as we can determine */
257 #if defined(_WRS_KERNEL) || defined(__RTP__)
258 struct rusage {
259 struct timeval ru_utime; /* user CPU time used */
260 struct timeval ru_stime; /* system CPU time used */
262 #define getrusage(A,B) memset(B,0,sizeof(*B))
263 #endif
265 /* Saved resource information for the beginning of an operation */
266 static struct rusage sBegin; /* CPU time at start */
267 static sqlite3_int64 iBegin; /* Wall-clock time at start */
270 ** Begin timing an operation
272 static void beginTimer(void){
273 if( enableTimer ){
274 getrusage(RUSAGE_SELF, &sBegin);
275 iBegin = timeOfDay();
279 /* Return the difference of two time_structs in seconds */
280 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
281 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
282 (double)(pEnd->tv_sec - pStart->tv_sec);
286 ** Print the timing results.
288 static void endTimer(void){
289 if( enableTimer ){
290 sqlite3_int64 iEnd = timeOfDay();
291 struct rusage sEnd;
292 getrusage(RUSAGE_SELF, &sEnd);
293 printf("Run Time: real %.3f user %f sys %f\n",
294 (iEnd - iBegin)*0.001,
295 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
296 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
300 #define BEGIN_TIMER beginTimer()
301 #define END_TIMER endTimer()
302 #define HAS_TIMER 1
304 #elif (defined(_WIN32) || defined(WIN32))
306 /* Saved resource information for the beginning of an operation */
307 static HANDLE hProcess;
308 static FILETIME ftKernelBegin;
309 static FILETIME ftUserBegin;
310 static sqlite3_int64 ftWallBegin;
311 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
312 LPFILETIME, LPFILETIME);
313 static GETPROCTIMES getProcessTimesAddr = NULL;
316 ** Check to see if we have timer support. Return 1 if necessary
317 ** support found (or found previously).
319 static int hasTimer(void){
320 if( getProcessTimesAddr ){
321 return 1;
322 } else {
323 #if !SQLITE_OS_WINRT
324 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
325 ** versions. See if the version we are running on has it, and if it
326 ** does, save off a pointer to it and the current process handle.
328 hProcess = GetCurrentProcess();
329 if( hProcess ){
330 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
331 if( NULL != hinstLib ){
332 getProcessTimesAddr =
333 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
334 if( NULL != getProcessTimesAddr ){
335 return 1;
337 FreeLibrary(hinstLib);
340 #endif
342 return 0;
346 ** Begin timing an operation
348 static void beginTimer(void){
349 if( enableTimer && getProcessTimesAddr ){
350 FILETIME ftCreation, ftExit;
351 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
352 &ftKernelBegin,&ftUserBegin);
353 ftWallBegin = timeOfDay();
357 /* Return the difference of two FILETIME structs in seconds */
358 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
359 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
360 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
361 return (double) ((i64End - i64Start) / 10000000.0);
365 ** Print the timing results.
367 static void endTimer(void){
368 if( enableTimer && getProcessTimesAddr){
369 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
370 sqlite3_int64 ftWallEnd = timeOfDay();
371 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
372 printf("Run Time: real %.3f user %f sys %f\n",
373 (ftWallEnd - ftWallBegin)*0.001,
374 timeDiff(&ftUserBegin, &ftUserEnd),
375 timeDiff(&ftKernelBegin, &ftKernelEnd));
379 #define BEGIN_TIMER beginTimer()
380 #define END_TIMER endTimer()
381 #define HAS_TIMER hasTimer()
383 #else
384 #define BEGIN_TIMER
385 #define END_TIMER
386 #define HAS_TIMER 0
387 #endif
390 ** Used to prevent warnings about unused parameters
392 #define UNUSED_PARAMETER(x) (void)(x)
395 ** Number of elements in an array
397 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
400 ** If the following flag is set, then command execution stops
401 ** at an error if we are not interactive.
403 static int bail_on_error = 0;
406 ** Threat stdin as an interactive input if the following variable
407 ** is true. Otherwise, assume stdin is connected to a file or pipe.
409 static int stdin_is_interactive = 1;
412 ** On Windows systems we have to know if standard output is a console
413 ** in order to translate UTF-8 into MBCS. The following variable is
414 ** true if translation is required.
416 static int stdout_is_console = 1;
419 ** The following is the open SQLite database. We make a pointer
420 ** to this database a static variable so that it can be accessed
421 ** by the SIGINT handler to interrupt database processing.
423 static sqlite3 *globalDb = 0;
426 ** True if an interrupt (Control-C) has been received.
428 static volatile int seenInterrupt = 0;
431 ** This is the name of our program. It is set in main(), used
432 ** in a number of other places, mostly for error messages.
434 static char *Argv0;
437 ** Prompt strings. Initialized in main. Settable with
438 ** .prompt main continue
440 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
441 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
444 ** Render output like fprintf(). Except, if the output is going to the
445 ** console and if this is running on a Windows machine, translate the
446 ** output from UTF-8 into MBCS.
448 #if defined(_WIN32) || defined(WIN32)
449 void utf8_printf(FILE *out, const char *zFormat, ...){
450 va_list ap;
451 va_start(ap, zFormat);
452 if( stdout_is_console && (out==stdout || out==stderr) ){
453 char *z1 = sqlite3_vmprintf(zFormat, ap);
454 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
455 sqlite3_free(z1);
456 fputs(z2, out);
457 sqlite3_free(z2);
458 }else{
459 vfprintf(out, zFormat, ap);
461 va_end(ap);
463 #elif !defined(utf8_printf)
464 # define utf8_printf fprintf
465 #endif
468 ** Render output like fprintf(). This should not be used on anything that
469 ** includes string formatting (e.g. "%s").
471 #if !defined(raw_printf)
472 # define raw_printf fprintf
473 #endif
475 /* Indicate out-of-memory and exit. */
476 static void shell_out_of_memory(void){
477 raw_printf(stderr,"Error: out of memory\n");
478 exit(1);
481 /* Check a pointer to see if it is NULL. If it is NULL, exit with an
482 ** out-of-memory error.
484 static void shell_check_oom(void *p){
485 if( p==0 ) shell_out_of_memory();
489 ** Write I/O traces to the following stream.
491 #ifdef SQLITE_ENABLE_IOTRACE
492 static FILE *iotrace = 0;
493 #endif
496 ** This routine works like printf in that its first argument is a
497 ** format string and subsequent arguments are values to be substituted
498 ** in place of % fields. The result of formatting this string
499 ** is written to iotrace.
501 #ifdef SQLITE_ENABLE_IOTRACE
502 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
503 va_list ap;
504 char *z;
505 if( iotrace==0 ) return;
506 va_start(ap, zFormat);
507 z = sqlite3_vmprintf(zFormat, ap);
508 va_end(ap);
509 utf8_printf(iotrace, "%s", z);
510 sqlite3_free(z);
512 #endif
515 ** Output string zUtf to stream pOut as w characters. If w is negative,
516 ** then right-justify the text. W is the width in UTF-8 characters, not
517 ** in bytes. This is different from the %*.*s specification in printf
518 ** since with %*.*s the width is measured in bytes, not characters.
520 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
521 int i;
522 int n;
523 int aw = w<0 ? -w : w;
524 for(i=n=0; zUtf[i]; i++){
525 if( (zUtf[i]&0xc0)!=0x80 ){
526 n++;
527 if( n==aw ){
528 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
529 break;
533 if( n>=aw ){
534 utf8_printf(pOut, "%.*s", i, zUtf);
535 }else if( w<0 ){
536 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
537 }else{
538 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
544 ** Determines if a string is a number of not.
546 static int isNumber(const char *z, int *realnum){
547 if( *z=='-' || *z=='+' ) z++;
548 if( !IsDigit(*z) ){
549 return 0;
551 z++;
552 if( realnum ) *realnum = 0;
553 while( IsDigit(*z) ){ z++; }
554 if( *z=='.' ){
555 z++;
556 if( !IsDigit(*z) ) return 0;
557 while( IsDigit(*z) ){ z++; }
558 if( realnum ) *realnum = 1;
560 if( *z=='e' || *z=='E' ){
561 z++;
562 if( *z=='+' || *z=='-' ) z++;
563 if( !IsDigit(*z) ) return 0;
564 while( IsDigit(*z) ){ z++; }
565 if( realnum ) *realnum = 1;
567 return *z==0;
571 ** Compute a string length that is limited to what can be stored in
572 ** lower 30 bits of a 32-bit signed integer.
574 static int strlen30(const char *z){
575 const char *z2 = z;
576 while( *z2 ){ z2++; }
577 return 0x3fffffff & (int)(z2 - z);
581 ** Return the length of a string in characters. Multibyte UTF8 characters
582 ** count as a single character.
584 static int strlenChar(const char *z){
585 int n = 0;
586 while( *z ){
587 if( (0xc0&*(z++))!=0x80 ) n++;
589 return n;
593 ** Return open FILE * if zFile exists, can be opened for read
594 ** and is an ordinary file or a character stream source.
595 ** Otherwise return 0.
597 static FILE * openChrSource(const char *zFile){
598 #ifdef _WIN32
599 struct _stat x = {0};
600 # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
601 /* On Windows, open first, then check the stream nature. This order
602 ** is necessary because _stat() and sibs, when checking a named pipe,
603 ** effectively break the pipe as its supplier sees it. */
604 FILE *rv = fopen(zFile, "rb");
605 if( rv==0 ) return 0;
606 if( _fstat(_fileno(rv), &x) != 0
607 || !STAT_CHR_SRC(x.st_mode)){
608 fclose(rv);
609 rv = 0;
611 return rv;
612 #else
613 struct stat x = {0};
614 int rc = stat(zFile, &x);
615 # define STAT_CHR_SRC(mode) (S_ISREG(mode)||S_ISFIFO(mode)||S_ISCHR(mode))
616 if( rc!=0 ) return 0;
617 if( STAT_CHR_SRC(x.st_mode) ){
618 return fopen(zFile, "rb");
619 }else{
620 return 0;
622 #endif
623 #undef STAT_CHR_SRC
627 ** This routine reads a line of text from FILE in, stores
628 ** the text in memory obtained from malloc() and returns a pointer
629 ** to the text. NULL is returned at end of file, or if malloc()
630 ** fails.
632 ** If zLine is not NULL then it is a malloced buffer returned from
633 ** a previous call to this routine that may be reused.
635 static char *local_getline(char *zLine, FILE *in){
636 int nLine = zLine==0 ? 0 : 100;
637 int n = 0;
639 while( 1 ){
640 if( n+100>nLine ){
641 nLine = nLine*2 + 100;
642 zLine = realloc(zLine, nLine);
643 shell_check_oom(zLine);
645 if( fgets(&zLine[n], nLine - n, in)==0 ){
646 if( n==0 ){
647 free(zLine);
648 return 0;
650 zLine[n] = 0;
651 break;
653 while( zLine[n] ) n++;
654 if( n>0 && zLine[n-1]=='\n' ){
655 n--;
656 if( n>0 && zLine[n-1]=='\r' ) n--;
657 zLine[n] = 0;
658 break;
661 #if defined(_WIN32) || defined(WIN32)
662 /* For interactive input on Windows systems, translate the
663 ** multi-byte characterset characters into UTF-8. */
664 if( stdin_is_interactive && in==stdin ){
665 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
666 if( zTrans ){
667 int nTrans = strlen30(zTrans)+1;
668 if( nTrans>nLine ){
669 zLine = realloc(zLine, nTrans);
670 shell_check_oom(zLine);
672 memcpy(zLine, zTrans, nTrans);
673 sqlite3_free(zTrans);
676 #endif /* defined(_WIN32) || defined(WIN32) */
677 return zLine;
681 ** Retrieve a single line of input text.
683 ** If in==0 then read from standard input and prompt before each line.
684 ** If isContinuation is true, then a continuation prompt is appropriate.
685 ** If isContinuation is zero, then the main prompt should be used.
687 ** If zPrior is not NULL then it is a buffer from a prior call to this
688 ** routine that can be reused.
690 ** The result is stored in space obtained from malloc() and must either
691 ** be freed by the caller or else passed back into this routine via the
692 ** zPrior argument for reuse.
694 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
695 char *zPrompt;
696 char *zResult;
697 if( in!=0 ){
698 zResult = local_getline(zPrior, in);
699 }else{
700 zPrompt = isContinuation ? continuePrompt : mainPrompt;
701 #if SHELL_USE_LOCAL_GETLINE
702 printf("%s", zPrompt);
703 fflush(stdout);
704 zResult = local_getline(zPrior, stdin);
705 #else
706 free(zPrior);
707 zResult = shell_readline(zPrompt);
708 if( zResult && *zResult ) shell_add_history(zResult);
709 #endif
711 return zResult;
716 ** Return the value of a hexadecimal digit. Return -1 if the input
717 ** is not a hex digit.
719 static int hexDigitValue(char c){
720 if( c>='0' && c<='9' ) return c - '0';
721 if( c>='a' && c<='f' ) return c - 'a' + 10;
722 if( c>='A' && c<='F' ) return c - 'A' + 10;
723 return -1;
727 ** Interpret zArg as an integer value, possibly with suffixes.
729 static sqlite3_int64 integerValue(const char *zArg){
730 sqlite3_int64 v = 0;
731 static const struct { char *zSuffix; int iMult; } aMult[] = {
732 { "KiB", 1024 },
733 { "MiB", 1024*1024 },
734 { "GiB", 1024*1024*1024 },
735 { "KB", 1000 },
736 { "MB", 1000000 },
737 { "GB", 1000000000 },
738 { "K", 1000 },
739 { "M", 1000000 },
740 { "G", 1000000000 },
742 int i;
743 int isNeg = 0;
744 if( zArg[0]=='-' ){
745 isNeg = 1;
746 zArg++;
747 }else if( zArg[0]=='+' ){
748 zArg++;
750 if( zArg[0]=='0' && zArg[1]=='x' ){
751 int x;
752 zArg += 2;
753 while( (x = hexDigitValue(zArg[0]))>=0 ){
754 v = (v<<4) + x;
755 zArg++;
757 }else{
758 while( IsDigit(zArg[0]) ){
759 v = v*10 + zArg[0] - '0';
760 zArg++;
763 for(i=0; i<ArraySize(aMult); i++){
764 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
765 v *= aMult[i].iMult;
766 break;
769 return isNeg? -v : v;
773 ** A variable length string to which one can append text.
775 typedef struct ShellText ShellText;
776 struct ShellText {
777 char *z;
778 int n;
779 int nAlloc;
783 ** Initialize and destroy a ShellText object
785 static void initText(ShellText *p){
786 memset(p, 0, sizeof(*p));
788 static void freeText(ShellText *p){
789 free(p->z);
790 initText(p);
793 /* zIn is either a pointer to a NULL-terminated string in memory obtained
794 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
795 ** added to zIn, and the result returned in memory obtained from malloc().
796 ** zIn, if it was not NULL, is freed.
798 ** If the third argument, quote, is not '\0', then it is used as a
799 ** quote character for zAppend.
801 static void appendText(ShellText *p, char const *zAppend, char quote){
802 int len;
803 int i;
804 int nAppend = strlen30(zAppend);
806 len = nAppend+p->n+1;
807 if( quote ){
808 len += 2;
809 for(i=0; i<nAppend; i++){
810 if( zAppend[i]==quote ) len++;
814 if( p->z==0 || p->n+len>=p->nAlloc ){
815 p->nAlloc = p->nAlloc*2 + len + 20;
816 p->z = realloc(p->z, p->nAlloc);
817 shell_check_oom(p->z);
820 if( quote ){
821 char *zCsr = p->z+p->n;
822 *zCsr++ = quote;
823 for(i=0; i<nAppend; i++){
824 *zCsr++ = zAppend[i];
825 if( zAppend[i]==quote ) *zCsr++ = quote;
827 *zCsr++ = quote;
828 p->n = (int)(zCsr - p->z);
829 *zCsr = '\0';
830 }else{
831 memcpy(p->z+p->n, zAppend, nAppend);
832 p->n += nAppend;
833 p->z[p->n] = '\0';
838 ** Attempt to determine if identifier zName needs to be quoted, either
839 ** because it contains non-alphanumeric characters, or because it is an
840 ** SQLite keyword. Be conservative in this estimate: When in doubt assume
841 ** that quoting is required.
843 ** Return '"' if quoting is required. Return 0 if no quoting is required.
845 static char quoteChar(const char *zName){
846 int i;
847 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
848 for(i=0; zName[i]; i++){
849 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
851 return sqlite3_keyword_check(zName, i) ? '"' : 0;
855 ** Construct a fake object name and column list to describe the structure
856 ** of the view, virtual table, or table valued function zSchema.zName.
858 static char *shellFakeSchema(
859 sqlite3 *db, /* The database connection containing the vtab */
860 const char *zSchema, /* Schema of the database holding the vtab */
861 const char *zName /* The name of the virtual table */
863 sqlite3_stmt *pStmt = 0;
864 char *zSql;
865 ShellText s;
866 char cQuote;
867 char *zDiv = "(";
868 int nRow = 0;
870 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
871 zSchema ? zSchema : "main", zName);
872 shell_check_oom(zSql);
873 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
874 sqlite3_free(zSql);
875 initText(&s);
876 if( zSchema ){
877 cQuote = quoteChar(zSchema);
878 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
879 appendText(&s, zSchema, cQuote);
880 appendText(&s, ".", 0);
882 cQuote = quoteChar(zName);
883 appendText(&s, zName, cQuote);
884 while( sqlite3_step(pStmt)==SQLITE_ROW ){
885 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
886 nRow++;
887 appendText(&s, zDiv, 0);
888 zDiv = ",";
889 if( zCol==0 ) zCol = "";
890 cQuote = quoteChar(zCol);
891 appendText(&s, zCol, cQuote);
893 appendText(&s, ")", 0);
894 sqlite3_finalize(pStmt);
895 if( nRow==0 ){
896 freeText(&s);
897 s.z = 0;
899 return s.z;
903 ** SQL function: shell_module_schema(X)
905 ** Return a fake schema for the table-valued function or eponymous virtual
906 ** table X.
908 static void shellModuleSchema(
909 sqlite3_context *pCtx,
910 int nVal,
911 sqlite3_value **apVal
913 const char *zName;
914 char *zFake;
915 UNUSED_PARAMETER(nVal);
916 zName = (const char*)sqlite3_value_text(apVal[0]);
917 zFake = zName ? shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName) : 0;
918 if( zFake ){
919 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
920 -1, sqlite3_free);
921 free(zFake);
926 ** SQL function: shell_add_schema(S,X)
928 ** Add the schema name X to the CREATE statement in S and return the result.
929 ** Examples:
931 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
933 ** Also works on
935 ** CREATE INDEX
936 ** CREATE UNIQUE INDEX
937 ** CREATE VIEW
938 ** CREATE TRIGGER
939 ** CREATE VIRTUAL TABLE
941 ** This UDF is used by the .schema command to insert the schema name of
942 ** attached databases into the middle of the sqlite_schema.sql field.
944 static void shellAddSchemaName(
945 sqlite3_context *pCtx,
946 int nVal,
947 sqlite3_value **apVal
949 static const char *aPrefix[] = {
950 "TABLE",
951 "INDEX",
952 "UNIQUE INDEX",
953 "VIEW",
954 "TRIGGER",
955 "VIRTUAL TABLE"
957 int i = 0;
958 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
959 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
960 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
961 sqlite3 *db = sqlite3_context_db_handle(pCtx);
962 UNUSED_PARAMETER(nVal);
963 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
964 for(i=0; i<ArraySize(aPrefix); i++){
965 int n = strlen30(aPrefix[i]);
966 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
967 char *z = 0;
968 char *zFake = 0;
969 if( zSchema ){
970 char cQuote = quoteChar(zSchema);
971 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
972 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
973 }else{
974 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
977 if( zName
978 && aPrefix[i][0]=='V'
979 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
981 if( z==0 ){
982 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
983 }else{
984 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
986 free(zFake);
988 if( z ){
989 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
990 return;
995 sqlite3_result_value(pCtx, apVal[0]);
999 ** The source code for several run-time loadable extensions is inserted
1000 ** below by the ../tool/mkshellc.tcl script. Before processing that included
1001 ** code, we need to override some macros to make the included program code
1002 ** work here in the middle of this regular program.
1004 #define SQLITE_EXTENSION_INIT1
1005 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
1007 #if defined(_WIN32) && defined(_MSC_VER)
1008 INCLUDE test_windirent.h
1009 INCLUDE test_windirent.c
1010 #define dirent DIRENT
1011 #endif
1012 INCLUDE ../ext/misc/shathree.c
1013 INCLUDE ../ext/misc/fileio.c
1014 INCLUDE ../ext/misc/completion.c
1015 INCLUDE ../ext/misc/appendvfs.c
1016 INCLUDE ../ext/misc/memtrace.c
1017 INCLUDE ../ext/misc/uint.c
1018 INCLUDE ../ext/misc/decimal.c
1019 INCLUDE ../ext/misc/ieee754.c
1020 INCLUDE ../ext/misc/series.c
1021 INCLUDE ../ext/misc/regexp.c
1022 #ifdef SQLITE_HAVE_ZLIB
1023 INCLUDE ../ext/misc/zipfile.c
1024 INCLUDE ../ext/misc/sqlar.c
1025 #endif
1026 INCLUDE ../ext/expert/sqlite3expert.h
1027 INCLUDE ../ext/expert/sqlite3expert.c
1029 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
1030 INCLUDE ../ext/misc/dbdata.c
1031 #endif
1033 #if defined(SQLITE_ENABLE_SESSION)
1035 ** State information for a single open session
1037 typedef struct OpenSession OpenSession;
1038 struct OpenSession {
1039 char *zName; /* Symbolic name for this session */
1040 int nFilter; /* Number of xFilter rejection GLOB patterns */
1041 char **azFilter; /* Array of xFilter rejection GLOB patterns */
1042 sqlite3_session *p; /* The open session */
1044 #endif
1046 typedef struct ExpertInfo ExpertInfo;
1047 struct ExpertInfo {
1048 sqlite3expert *pExpert;
1049 int bVerbose;
1052 /* A single line in the EQP output */
1053 typedef struct EQPGraphRow EQPGraphRow;
1054 struct EQPGraphRow {
1055 int iEqpId; /* ID for this row */
1056 int iParentId; /* ID of the parent row */
1057 EQPGraphRow *pNext; /* Next row in sequence */
1058 char zText[1]; /* Text to display for this row */
1061 /* All EQP output is collected into an instance of the following */
1062 typedef struct EQPGraph EQPGraph;
1063 struct EQPGraph {
1064 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
1065 EQPGraphRow *pLast; /* Last element of the pRow list */
1066 char zPrefix[100]; /* Graph prefix */
1069 /* Parameters affecting columnar mode result display (defaulting together) */
1070 typedef struct ColModeOpts {
1071 int iWrap; /* In columnar modes, wrap lines reaching this limit */
1072 u8 bQuote; /* Quote results for .mode box and table */
1073 u8 bWordWrap; /* In columnar modes, wrap at word boundaries */
1074 } ColModeOpts;
1075 #define ColModeOpts_default { 60, 0, 0 }
1076 #define ColModeOpts_default_qbox { 60, 1, 0 }
1079 ** State information about the database connection is contained in an
1080 ** instance of the following structure.
1082 typedef struct ShellState ShellState;
1083 struct ShellState {
1084 sqlite3 *db; /* The database */
1085 u8 autoExplain; /* Automatically turn on .explain mode */
1086 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
1087 u8 autoEQPtest; /* autoEQP is in test mode */
1088 u8 autoEQPtrace; /* autoEQP is in trace mode */
1089 u8 scanstatsOn; /* True to display scan stats before each finalize */
1090 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
1091 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
1092 u8 nEqpLevel; /* Depth of the EQP output graph */
1093 u8 eTraceType; /* SHELL_TRACE_* value for type of trace */
1094 u8 bSafeMode; /* True to prohibit unsafe operations */
1095 u8 bSafeModePersist; /* The long-term value of bSafeMode */
1096 ColModeOpts cmOpts; /* Option values affecting columnar mode output */
1097 unsigned statsOn; /* True to display memory stats before each finalize */
1098 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */
1099 int inputNesting; /* Track nesting level of .read and other redirects */
1100 int outCount; /* Revert to stdout when reaching zero */
1101 int cnt; /* Number of records displayed so far */
1102 int lineno; /* Line number of last line read from in */
1103 int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */
1104 FILE *in; /* Read commands from this stream */
1105 FILE *out; /* Write results here */
1106 FILE *traceOut; /* Output for sqlite3_trace() */
1107 int nErr; /* Number of errors seen */
1108 int mode; /* An output mode setting */
1109 int modePrior; /* Saved mode */
1110 int cMode; /* temporary output mode for the current query */
1111 int normalMode; /* Output mode before ".explain on" */
1112 int writableSchema; /* True if PRAGMA writable_schema=ON */
1113 int showHeader; /* True to show column names in List or Column mode */
1114 int nCheck; /* Number of ".check" commands run */
1115 unsigned nProgress; /* Number of progress callbacks encountered */
1116 unsigned mxProgress; /* Maximum progress callbacks before failing */
1117 unsigned flgProgress; /* Flags for the progress callback */
1118 unsigned shellFlgs; /* Various flags */
1119 unsigned priorShFlgs; /* Saved copy of flags */
1120 sqlite3_int64 szMax; /* --maxsize argument to .open */
1121 char *zDestTable; /* Name of destination table when MODE_Insert */
1122 char *zTempFile; /* Temporary file that might need deleting */
1123 char zTestcase[30]; /* Name of current test case */
1124 char colSeparator[20]; /* Column separator character for several modes */
1125 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
1126 char colSepPrior[20]; /* Saved column separator */
1127 char rowSepPrior[20]; /* Saved row separator */
1128 int *colWidth; /* Requested width of each column in columnar modes */
1129 int *actualWidth; /* Actual width of each column */
1130 int nWidth; /* Number of slots in colWidth[] and actualWidth[] */
1131 char nullValue[20]; /* The text to print when a NULL comes back from
1132 ** the database */
1133 char outfile[FILENAME_MAX]; /* Filename for *out */
1134 sqlite3_stmt *pStmt; /* Current statement if any. */
1135 FILE *pLog; /* Write log output here */
1136 struct AuxDb { /* Storage space for auxiliary database connections */
1137 sqlite3 *db; /* Connection pointer */
1138 const char *zDbFilename; /* Filename used to open the connection */
1139 char *zFreeOnClose; /* Free this memory allocation on close */
1140 #if defined(SQLITE_ENABLE_SESSION)
1141 int nSession; /* Number of active sessions */
1142 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1143 #endif
1144 } aAuxDb[5], /* Array of all database connections */
1145 *pAuxDb; /* Currently active database connection */
1146 int *aiIndent; /* Array of indents used in MODE_Explain */
1147 int nIndent; /* Size of array aiIndent[] */
1148 int iIndent; /* Index of current op in aiIndent[] */
1149 char *zNonce; /* Nonce for temporary safe-mode excapes */
1150 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
1151 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
1155 /* Allowed values for ShellState.autoEQP
1157 #define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
1158 #define AUTOEQP_on 1 /* Automatic EQP is on */
1159 #define AUTOEQP_trigger 2 /* On and also show plans for triggers */
1160 #define AUTOEQP_full 3 /* Show full EXPLAIN */
1162 /* Allowed values for ShellState.openMode
1164 #define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
1165 #define SHELL_OPEN_NORMAL 1 /* Normal database file */
1166 #define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
1167 #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
1168 #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
1169 #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */
1170 #define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */
1172 /* Allowed values for ShellState.eTraceType
1174 #define SHELL_TRACE_PLAIN 0 /* Show input SQL text */
1175 #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */
1176 #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */
1178 /* Bits in the ShellState.flgProgress variable */
1179 #define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */
1180 #define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres
1181 ** callback limit is reached, and for each
1182 ** top-level SQL statement */
1183 #define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */
1186 ** These are the allowed shellFlgs values
1188 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
1189 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
1190 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
1191 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
1192 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
1193 #define SHFLG_CountChanges 0x00000020 /* .changes setting */
1194 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
1195 #define SHFLG_HeaderSet 0x00000080 /* showHeader has been specified */
1196 #define SHFLG_DumpDataOnly 0x00000100 /* .dump show data only */
1197 #define SHFLG_DumpNoSys 0x00000200 /* .dump omits system tables */
1200 ** Macros for testing and setting shellFlgs
1202 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
1203 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
1204 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
1207 ** These are the allowed modes.
1209 #define MODE_Line 0 /* One column per line. Blank line between records */
1210 #define MODE_Column 1 /* One record per line in neat columns */
1211 #define MODE_List 2 /* One record per line with a separator */
1212 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1213 #define MODE_Html 4 /* Generate an XHTML table */
1214 #define MODE_Insert 5 /* Generate SQL "insert" statements */
1215 #define MODE_Quote 6 /* Quote values as for SQL */
1216 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1217 #define MODE_Csv 8 /* Quote strings, numbers are plain */
1218 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1219 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1220 #define MODE_Pretty 11 /* Pretty-print schemas */
1221 #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
1222 #define MODE_Json 13 /* Output JSON */
1223 #define MODE_Markdown 14 /* Markdown formatting */
1224 #define MODE_Table 15 /* MySQL-style table formatting */
1225 #define MODE_Box 16 /* Unicode box-drawing characters */
1226 #define MODE_Count 17 /* Output only a count of the rows of output */
1227 #define MODE_Off 18 /* No query output shown */
1229 static const char *modeDescr[] = {
1230 "line",
1231 "column",
1232 "list",
1233 "semi",
1234 "html",
1235 "insert",
1236 "quote",
1237 "tcl",
1238 "csv",
1239 "explain",
1240 "ascii",
1241 "prettyprint",
1242 "eqp",
1243 "json",
1244 "markdown",
1245 "table",
1246 "box",
1247 "count",
1248 "off"
1252 ** These are the column/row/line separators used by the various
1253 ** import/export modes.
1255 #define SEP_Column "|"
1256 #define SEP_Row "\n"
1257 #define SEP_Tab "\t"
1258 #define SEP_Space " "
1259 #define SEP_Comma ","
1260 #define SEP_CrLf "\r\n"
1261 #define SEP_Unit "\x1F"
1262 #define SEP_Record "\x1E"
1265 ** Limit input nesting via .read or any other input redirect.
1266 ** It's not too expensive, so a generous allowance can be made.
1268 #define MAX_INPUT_NESTING 25
1271 ** A callback for the sqlite3_log() interface.
1273 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1274 ShellState *p = (ShellState*)pArg;
1275 if( p->pLog==0 ) return;
1276 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1277 fflush(p->pLog);
1281 ** SQL function: shell_putsnl(X)
1283 ** Write the text X to the screen (or whatever output is being directed)
1284 ** adding a newline at the end, and then return X.
1286 static void shellPutsFunc(
1287 sqlite3_context *pCtx,
1288 int nVal,
1289 sqlite3_value **apVal
1291 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
1292 (void)nVal;
1293 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1294 sqlite3_result_value(pCtx, apVal[0]);
1298 ** If in safe mode, print an error message described by the arguments
1299 ** and exit immediately.
1301 static void failIfSafeMode(
1302 ShellState *p,
1303 const char *zErrMsg,
1306 if( p->bSafeMode ){
1307 va_list ap;
1308 char *zMsg;
1309 va_start(ap, zErrMsg);
1310 zMsg = sqlite3_vmprintf(zErrMsg, ap);
1311 va_end(ap);
1312 raw_printf(stderr, "line %d: ", p->lineno);
1313 utf8_printf(stderr, "%s\n", zMsg);
1314 exit(1);
1319 ** SQL function: edit(VALUE)
1320 ** edit(VALUE,EDITOR)
1322 ** These steps:
1324 ** (1) Write VALUE into a temporary file.
1325 ** (2) Run program EDITOR on that temporary file.
1326 ** (3) Read the temporary file back and return its content as the result.
1327 ** (4) Delete the temporary file
1329 ** If the EDITOR argument is omitted, use the value in the VISUAL
1330 ** environment variable. If still there is no EDITOR, through an error.
1332 ** Also throw an error if the EDITOR program returns a non-zero exit code.
1334 #ifndef SQLITE_NOHAVE_SYSTEM
1335 static void editFunc(
1336 sqlite3_context *context,
1337 int argc,
1338 sqlite3_value **argv
1340 const char *zEditor;
1341 char *zTempFile = 0;
1342 sqlite3 *db;
1343 char *zCmd = 0;
1344 int bBin;
1345 int rc;
1346 int hasCRNL = 0;
1347 FILE *f = 0;
1348 sqlite3_int64 sz;
1349 sqlite3_int64 x;
1350 unsigned char *p = 0;
1352 if( argc==2 ){
1353 zEditor = (const char*)sqlite3_value_text(argv[1]);
1354 }else{
1355 zEditor = getenv("VISUAL");
1357 if( zEditor==0 ){
1358 sqlite3_result_error(context, "no editor for edit()", -1);
1359 return;
1361 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1362 sqlite3_result_error(context, "NULL input to edit()", -1);
1363 return;
1365 db = sqlite3_context_db_handle(context);
1366 zTempFile = 0;
1367 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1368 if( zTempFile==0 ){
1369 sqlite3_uint64 r = 0;
1370 sqlite3_randomness(sizeof(r), &r);
1371 zTempFile = sqlite3_mprintf("temp%llx", r);
1372 if( zTempFile==0 ){
1373 sqlite3_result_error_nomem(context);
1374 return;
1377 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1378 /* When writing the file to be edited, do \n to \r\n conversions on systems
1379 ** that want \r\n line endings */
1380 f = fopen(zTempFile, bBin ? "wb" : "w");
1381 if( f==0 ){
1382 sqlite3_result_error(context, "edit() cannot open temp file", -1);
1383 goto edit_func_end;
1385 sz = sqlite3_value_bytes(argv[0]);
1386 if( bBin ){
1387 x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f);
1388 }else{
1389 const char *z = (const char*)sqlite3_value_text(argv[0]);
1390 /* Remember whether or not the value originally contained \r\n */
1391 if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1;
1392 x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f);
1394 fclose(f);
1395 f = 0;
1396 if( x!=sz ){
1397 sqlite3_result_error(context, "edit() could not write the whole file", -1);
1398 goto edit_func_end;
1400 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1401 if( zCmd==0 ){
1402 sqlite3_result_error_nomem(context);
1403 goto edit_func_end;
1405 rc = system(zCmd);
1406 sqlite3_free(zCmd);
1407 if( rc ){
1408 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1409 goto edit_func_end;
1411 f = fopen(zTempFile, "rb");
1412 if( f==0 ){
1413 sqlite3_result_error(context,
1414 "edit() cannot reopen temp file after edit", -1);
1415 goto edit_func_end;
1417 fseek(f, 0, SEEK_END);
1418 sz = ftell(f);
1419 rewind(f);
1420 p = sqlite3_malloc64( sz+1 );
1421 if( p==0 ){
1422 sqlite3_result_error_nomem(context);
1423 goto edit_func_end;
1425 x = fread(p, 1, (size_t)sz, f);
1426 fclose(f);
1427 f = 0;
1428 if( x!=sz ){
1429 sqlite3_result_error(context, "could not read back the whole file", -1);
1430 goto edit_func_end;
1432 if( bBin ){
1433 sqlite3_result_blob64(context, p, sz, sqlite3_free);
1434 }else{
1435 sqlite3_int64 i, j;
1436 if( hasCRNL ){
1437 /* If the original contains \r\n then do no conversions back to \n */
1438 }else{
1439 /* If the file did not originally contain \r\n then convert any new
1440 ** \r\n back into \n */
1441 for(i=j=0; i<sz; i++){
1442 if( p[i]=='\r' && p[i+1]=='\n' ) i++;
1443 p[j++] = p[i];
1445 sz = j;
1446 p[sz] = 0;
1448 sqlite3_result_text64(context, (const char*)p, sz,
1449 sqlite3_free, SQLITE_UTF8);
1451 p = 0;
1453 edit_func_end:
1454 if( f ) fclose(f);
1455 unlink(zTempFile);
1456 sqlite3_free(zTempFile);
1457 sqlite3_free(p);
1459 #endif /* SQLITE_NOHAVE_SYSTEM */
1462 ** Save or restore the current output mode
1464 static void outputModePush(ShellState *p){
1465 p->modePrior = p->mode;
1466 p->priorShFlgs = p->shellFlgs;
1467 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1468 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1470 static void outputModePop(ShellState *p){
1471 p->mode = p->modePrior;
1472 p->shellFlgs = p->priorShFlgs;
1473 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1474 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1478 ** Output the given string as a hex-encoded blob (eg. X'1234' )
1480 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1481 int i;
1482 char *zBlob = (char *)pBlob;
1483 raw_printf(out,"X'");
1484 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1485 raw_printf(out,"'");
1489 ** Find a string that is not found anywhere in z[]. Return a pointer
1490 ** to that string.
1492 ** Try to use zA and zB first. If both of those are already found in z[]
1493 ** then make up some string and store it in the buffer zBuf.
1495 static const char *unused_string(
1496 const char *z, /* Result must not appear anywhere in z */
1497 const char *zA, const char *zB, /* Try these first */
1498 char *zBuf /* Space to store a generated string */
1500 unsigned i = 0;
1501 if( strstr(z, zA)==0 ) return zA;
1502 if( strstr(z, zB)==0 ) return zB;
1504 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1505 }while( strstr(z,zBuf)!=0 );
1506 return zBuf;
1510 ** Output the given string as a quoted string using SQL quoting conventions.
1512 ** See also: output_quoted_escaped_string()
1514 static void output_quoted_string(FILE *out, const char *z){
1515 int i;
1516 char c;
1517 setBinaryMode(out, 1);
1518 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1519 if( c==0 ){
1520 utf8_printf(out,"'%s'",z);
1521 }else{
1522 raw_printf(out, "'");
1523 while( *z ){
1524 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1525 if( c=='\'' ) i++;
1526 if( i ){
1527 utf8_printf(out, "%.*s", i, z);
1528 z += i;
1530 if( c=='\'' ){
1531 raw_printf(out, "'");
1532 continue;
1534 if( c==0 ){
1535 break;
1537 z++;
1539 raw_printf(out, "'");
1541 setTextMode(out, 1);
1545 ** Output the given string as a quoted string using SQL quoting conventions.
1546 ** Additionallly , escape the "\n" and "\r" characters so that they do not
1547 ** get corrupted by end-of-line translation facilities in some operating
1548 ** systems.
1550 ** This is like output_quoted_string() but with the addition of the \r\n
1551 ** escape mechanism.
1553 static void output_quoted_escaped_string(FILE *out, const char *z){
1554 int i;
1555 char c;
1556 setBinaryMode(out, 1);
1557 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1558 if( c==0 ){
1559 utf8_printf(out,"'%s'",z);
1560 }else{
1561 const char *zNL = 0;
1562 const char *zCR = 0;
1563 int nNL = 0;
1564 int nCR = 0;
1565 char zBuf1[20], zBuf2[20];
1566 for(i=0; z[i]; i++){
1567 if( z[i]=='\n' ) nNL++;
1568 if( z[i]=='\r' ) nCR++;
1570 if( nNL ){
1571 raw_printf(out, "replace(");
1572 zNL = unused_string(z, "\\n", "\\012", zBuf1);
1574 if( nCR ){
1575 raw_printf(out, "replace(");
1576 zCR = unused_string(z, "\\r", "\\015", zBuf2);
1578 raw_printf(out, "'");
1579 while( *z ){
1580 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1581 if( c=='\'' ) i++;
1582 if( i ){
1583 utf8_printf(out, "%.*s", i, z);
1584 z += i;
1586 if( c=='\'' ){
1587 raw_printf(out, "'");
1588 continue;
1590 if( c==0 ){
1591 break;
1593 z++;
1594 if( c=='\n' ){
1595 raw_printf(out, "%s", zNL);
1596 continue;
1598 raw_printf(out, "%s", zCR);
1600 raw_printf(out, "'");
1601 if( nCR ){
1602 raw_printf(out, ",'%s',char(13))", zCR);
1604 if( nNL ){
1605 raw_printf(out, ",'%s',char(10))", zNL);
1608 setTextMode(out, 1);
1612 ** Output the given string as a quoted according to C or TCL quoting rules.
1614 static void output_c_string(FILE *out, const char *z){
1615 unsigned int c;
1616 fputc('"', out);
1617 while( (c = *(z++))!=0 ){
1618 if( c=='\\' ){
1619 fputc(c, out);
1620 fputc(c, out);
1621 }else if( c=='"' ){
1622 fputc('\\', out);
1623 fputc('"', out);
1624 }else if( c=='\t' ){
1625 fputc('\\', out);
1626 fputc('t', out);
1627 }else if( c=='\n' ){
1628 fputc('\\', out);
1629 fputc('n', out);
1630 }else if( c=='\r' ){
1631 fputc('\\', out);
1632 fputc('r', out);
1633 }else if( !isprint(c&0xff) ){
1634 raw_printf(out, "\\%03o", c&0xff);
1635 }else{
1636 fputc(c, out);
1639 fputc('"', out);
1643 ** Output the given string as a quoted according to JSON quoting rules.
1645 static void output_json_string(FILE *out, const char *z, int n){
1646 unsigned int c;
1647 if( n<0 ) n = (int)strlen(z);
1648 fputc('"', out);
1649 while( n-- ){
1650 c = *(z++);
1651 if( c=='\\' || c=='"' ){
1652 fputc('\\', out);
1653 fputc(c, out);
1654 }else if( c<=0x1f ){
1655 fputc('\\', out);
1656 if( c=='\b' ){
1657 fputc('b', out);
1658 }else if( c=='\f' ){
1659 fputc('f', out);
1660 }else if( c=='\n' ){
1661 fputc('n', out);
1662 }else if( c=='\r' ){
1663 fputc('r', out);
1664 }else if( c=='\t' ){
1665 fputc('t', out);
1666 }else{
1667 raw_printf(out, "u%04x",c);
1669 }else{
1670 fputc(c, out);
1673 fputc('"', out);
1677 ** Output the given string with characters that are special to
1678 ** HTML escaped.
1680 static void output_html_string(FILE *out, const char *z){
1681 int i;
1682 if( z==0 ) z = "";
1683 while( *z ){
1684 for(i=0; z[i]
1685 && z[i]!='<'
1686 && z[i]!='&'
1687 && z[i]!='>'
1688 && z[i]!='\"'
1689 && z[i]!='\'';
1690 i++){}
1691 if( i>0 ){
1692 utf8_printf(out,"%.*s",i,z);
1694 if( z[i]=='<' ){
1695 raw_printf(out,"&lt;");
1696 }else if( z[i]=='&' ){
1697 raw_printf(out,"&amp;");
1698 }else if( z[i]=='>' ){
1699 raw_printf(out,"&gt;");
1700 }else if( z[i]=='\"' ){
1701 raw_printf(out,"&quot;");
1702 }else if( z[i]=='\'' ){
1703 raw_printf(out,"&#39;");
1704 }else{
1705 break;
1707 z += i + 1;
1712 ** If a field contains any character identified by a 1 in the following
1713 ** array, then the string must be quoted for CSV.
1715 static const char needCsvQuote[] = {
1716 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1717 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1718 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1719 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1720 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1722 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1724 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1725 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1726 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1727 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1728 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1729 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1730 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1731 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1735 ** Output a single term of CSV. Actually, p->colSeparator is used for
1736 ** the separator, which may or may not be a comma. p->nullValue is
1737 ** the null value. Strings are quoted if necessary. The separator
1738 ** is only issued if bSep is true.
1740 static void output_csv(ShellState *p, const char *z, int bSep){
1741 FILE *out = p->out;
1742 if( z==0 ){
1743 utf8_printf(out,"%s",p->nullValue);
1744 }else{
1745 unsigned i;
1746 for(i=0; z[i]; i++){
1747 if( needCsvQuote[((unsigned char*)z)[i]] ){
1748 i = 0;
1749 break;
1752 if( i==0 || strstr(z, p->colSeparator)!=0 ){
1753 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1754 shell_check_oom(zQuoted);
1755 utf8_printf(out, "%s", zQuoted);
1756 sqlite3_free(zQuoted);
1757 }else{
1758 utf8_printf(out, "%s", z);
1761 if( bSep ){
1762 utf8_printf(p->out, "%s", p->colSeparator);
1767 ** This routine runs when the user presses Ctrl-C
1769 static void interrupt_handler(int NotUsed){
1770 UNUSED_PARAMETER(NotUsed);
1771 seenInterrupt++;
1772 if( seenInterrupt>2 ) exit(1);
1773 if( globalDb ) sqlite3_interrupt(globalDb);
1776 #if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1778 ** This routine runs for console events (e.g. Ctrl-C) on Win32
1780 static BOOL WINAPI ConsoleCtrlHandler(
1781 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1783 if( dwCtrlType==CTRL_C_EVENT ){
1784 interrupt_handler(0);
1785 return TRUE;
1787 return FALSE;
1789 #endif
1791 #ifndef SQLITE_OMIT_AUTHORIZATION
1793 ** This authorizer runs in safe mode.
1795 static int safeModeAuth(
1796 void *pClientData,
1797 int op,
1798 const char *zA1,
1799 const char *zA2,
1800 const char *zA3,
1801 const char *zA4
1803 ShellState *p = (ShellState*)pClientData;
1804 static const char *azProhibitedFunctions[] = {
1805 "edit",
1806 "fts3_tokenizer",
1807 "load_extension",
1808 "readfile",
1809 "writefile",
1810 "zipfile",
1811 "zipfile_cds",
1813 UNUSED_PARAMETER(zA2);
1814 UNUSED_PARAMETER(zA3);
1815 UNUSED_PARAMETER(zA4);
1816 switch( op ){
1817 case SQLITE_ATTACH: {
1818 failIfSafeMode(p, "cannot run ATTACH in safe mode");
1819 break;
1821 case SQLITE_FUNCTION: {
1822 int i;
1823 for(i=0; i<ArraySize(azProhibitedFunctions); i++){
1824 if( sqlite3_stricmp(zA1, azProhibitedFunctions[i])==0 ){
1825 failIfSafeMode(p, "cannot use the %s() function in safe mode",
1826 azProhibitedFunctions[i]);
1829 break;
1832 return SQLITE_OK;
1836 ** When the ".auth ON" is set, the following authorizer callback is
1837 ** invoked. It always returns SQLITE_OK.
1839 static int shellAuth(
1840 void *pClientData,
1841 int op,
1842 const char *zA1,
1843 const char *zA2,
1844 const char *zA3,
1845 const char *zA4
1847 ShellState *p = (ShellState*)pClientData;
1848 static const char *azAction[] = { 0,
1849 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1850 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1851 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1852 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1853 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1854 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1855 "PRAGMA", "READ", "SELECT",
1856 "TRANSACTION", "UPDATE", "ATTACH",
1857 "DETACH", "ALTER_TABLE", "REINDEX",
1858 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1859 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1861 int i;
1862 const char *az[4];
1863 az[0] = zA1;
1864 az[1] = zA2;
1865 az[2] = zA3;
1866 az[3] = zA4;
1867 utf8_printf(p->out, "authorizer: %s", azAction[op]);
1868 for(i=0; i<4; i++){
1869 raw_printf(p->out, " ");
1870 if( az[i] ){
1871 output_c_string(p->out, az[i]);
1872 }else{
1873 raw_printf(p->out, "NULL");
1876 raw_printf(p->out, "\n");
1877 if( p->bSafeMode ) (void)safeModeAuth(pClientData, op, zA1, zA2, zA3, zA4);
1878 return SQLITE_OK;
1880 #endif
1883 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1885 ** This routine converts some CREATE TABLE statements for shadow tables
1886 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1888 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1889 if( z==0 ) return;
1890 if( zTail==0 ) return;
1891 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1892 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1893 }else{
1894 utf8_printf(out, "%s%s", z, zTail);
1897 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1898 char c = z[n];
1899 z[n] = 0;
1900 printSchemaLine(out, z, zTail);
1901 z[n] = c;
1905 ** Return true if string z[] has nothing but whitespace and comments to the
1906 ** end of the first line.
1908 static int wsToEol(const char *z){
1909 int i;
1910 for(i=0; z[i]; i++){
1911 if( z[i]=='\n' ) return 1;
1912 if( IsSpace(z[i]) ) continue;
1913 if( z[i]=='-' && z[i+1]=='-' ) return 1;
1914 return 0;
1916 return 1;
1920 ** Add a new entry to the EXPLAIN QUERY PLAN data
1922 static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
1923 EQPGraphRow *pNew;
1924 int nText = strlen30(zText);
1925 if( p->autoEQPtest ){
1926 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1928 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1929 shell_check_oom(pNew);
1930 pNew->iEqpId = iEqpId;
1931 pNew->iParentId = p2;
1932 memcpy(pNew->zText, zText, nText+1);
1933 pNew->pNext = 0;
1934 if( p->sGraph.pLast ){
1935 p->sGraph.pLast->pNext = pNew;
1936 }else{
1937 p->sGraph.pRow = pNew;
1939 p->sGraph.pLast = pNew;
1943 ** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1944 ** in p->sGraph.
1946 static void eqp_reset(ShellState *p){
1947 EQPGraphRow *pRow, *pNext;
1948 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1949 pNext = pRow->pNext;
1950 sqlite3_free(pRow);
1952 memset(&p->sGraph, 0, sizeof(p->sGraph));
1955 /* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
1956 ** pOld, or return the first such line if pOld is NULL
1958 static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
1959 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
1960 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
1961 return pRow;
1964 /* Render a single level of the graph that has iEqpId as its parent. Called
1965 ** recursively to render sublevels.
1967 static void eqp_render_level(ShellState *p, int iEqpId){
1968 EQPGraphRow *pRow, *pNext;
1969 int n = strlen30(p->sGraph.zPrefix);
1970 char *z;
1971 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1972 pNext = eqp_next_row(p, iEqpId, pRow);
1973 z = pRow->zText;
1974 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix,
1975 pNext ? "|--" : "`--", z);
1976 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
1977 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
1978 eqp_render_level(p, pRow->iEqpId);
1979 p->sGraph.zPrefix[n] = 0;
1985 ** Display and reset the EXPLAIN QUERY PLAN data
1987 static void eqp_render(ShellState *p){
1988 EQPGraphRow *pRow = p->sGraph.pRow;
1989 if( pRow ){
1990 if( pRow->zText[0]=='-' ){
1991 if( pRow->pNext==0 ){
1992 eqp_reset(p);
1993 return;
1995 utf8_printf(p->out, "%s\n", pRow->zText+3);
1996 p->sGraph.pRow = pRow->pNext;
1997 sqlite3_free(pRow);
1998 }else{
1999 utf8_printf(p->out, "QUERY PLAN\n");
2001 p->sGraph.zPrefix[0] = 0;
2002 eqp_render_level(p, 0);
2003 eqp_reset(p);
2007 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
2009 ** Progress handler callback.
2011 static int progress_handler(void *pClientData) {
2012 ShellState *p = (ShellState*)pClientData;
2013 p->nProgress++;
2014 if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){
2015 raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress);
2016 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
2017 if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0;
2018 return 1;
2020 if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){
2021 raw_printf(p->out, "Progress %u\n", p->nProgress);
2023 return 0;
2025 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
2028 ** Print N dashes
2030 static void print_dashes(FILE *out, int N){
2031 const char zDash[] = "--------------------------------------------------";
2032 const int nDash = sizeof(zDash) - 1;
2033 while( N>nDash ){
2034 fputs(zDash, out);
2035 N -= nDash;
2037 raw_printf(out, "%.*s", N, zDash);
2041 ** Print a markdown or table-style row separator using ascii-art
2043 static void print_row_separator(
2044 ShellState *p,
2045 int nArg,
2046 const char *zSep
2048 int i;
2049 if( nArg>0 ){
2050 fputs(zSep, p->out);
2051 print_dashes(p->out, p->actualWidth[0]+2);
2052 for(i=1; i<nArg; i++){
2053 fputs(zSep, p->out);
2054 print_dashes(p->out, p->actualWidth[i]+2);
2056 fputs(zSep, p->out);
2058 fputs("\n", p->out);
2062 ** This is the callback routine that the shell
2063 ** invokes for each row of a query result.
2065 static int shell_callback(
2066 void *pArg,
2067 int nArg, /* Number of result columns */
2068 char **azArg, /* Text of each result column */
2069 char **azCol, /* Column names */
2070 int *aiType /* Column types. Might be NULL */
2072 int i;
2073 ShellState *p = (ShellState*)pArg;
2075 if( azArg==0 ) return 0;
2076 switch( p->cMode ){
2077 case MODE_Count:
2078 case MODE_Off: {
2079 break;
2081 case MODE_Line: {
2082 int w = 5;
2083 if( azArg==0 ) break;
2084 for(i=0; i<nArg; i++){
2085 int len = strlen30(azCol[i] ? azCol[i] : "");
2086 if( len>w ) w = len;
2088 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2089 for(i=0; i<nArg; i++){
2090 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2091 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2093 break;
2095 case MODE_Explain: {
2096 static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13};
2097 if( nArg>ArraySize(aExplainWidth) ){
2098 nArg = ArraySize(aExplainWidth);
2100 if( p->cnt++==0 ){
2101 for(i=0; i<nArg; i++){
2102 int w = aExplainWidth[i];
2103 utf8_width_print(p->out, w, azCol[i]);
2104 fputs(i==nArg-1 ? "\n" : " ", p->out);
2106 for(i=0; i<nArg; i++){
2107 int w = aExplainWidth[i];
2108 print_dashes(p->out, w);
2109 fputs(i==nArg-1 ? "\n" : " ", p->out);
2112 if( azArg==0 ) break;
2113 for(i=0; i<nArg; i++){
2114 int w = aExplainWidth[i];
2115 if( i==nArg-1 ) w = 0;
2116 if( azArg[i] && strlenChar(azArg[i])>w ){
2117 w = strlenChar(azArg[i]);
2119 if( i==1 && p->aiIndent && p->pStmt ){
2120 if( p->iIndent<p->nIndent ){
2121 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2123 p->iIndent++;
2125 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2126 fputs(i==nArg-1 ? "\n" : " ", p->out);
2128 break;
2130 case MODE_Semi: { /* .schema and .fullschema output */
2131 printSchemaLine(p->out, azArg[0], ";\n");
2132 break;
2134 case MODE_Pretty: { /* .schema and .fullschema with --indent */
2135 char *z;
2136 int j;
2137 int nParen = 0;
2138 char cEnd = 0;
2139 char c;
2140 int nLine = 0;
2141 assert( nArg==1 );
2142 if( azArg[0]==0 ) break;
2143 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2144 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2146 utf8_printf(p->out, "%s;\n", azArg[0]);
2147 break;
2149 z = sqlite3_mprintf("%s", azArg[0]);
2150 shell_check_oom(z);
2151 j = 0;
2152 for(i=0; IsSpace(z[i]); i++){}
2153 for(; (c = z[i])!=0; i++){
2154 if( IsSpace(c) ){
2155 if( z[j-1]=='\r' ) z[j-1] = '\n';
2156 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2157 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2158 j--;
2160 z[j++] = c;
2162 while( j>0 && IsSpace(z[j-1]) ){ j--; }
2163 z[j] = 0;
2164 if( strlen30(z)>=79 ){
2165 for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */
2166 if( c==cEnd ){
2167 cEnd = 0;
2168 }else if( c=='"' || c=='\'' || c=='`' ){
2169 cEnd = c;
2170 }else if( c=='[' ){
2171 cEnd = ']';
2172 }else if( c=='-' && z[i+1]=='-' ){
2173 cEnd = '\n';
2174 }else if( c=='(' ){
2175 nParen++;
2176 }else if( c==')' ){
2177 nParen--;
2178 if( nLine>0 && nParen==0 && j>0 ){
2179 printSchemaLineN(p->out, z, j, "\n");
2180 j = 0;
2183 z[j++] = c;
2184 if( nParen==1 && cEnd==0
2185 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
2187 if( c=='\n' ) j--;
2188 printSchemaLineN(p->out, z, j, "\n ");
2189 j = 0;
2190 nLine++;
2191 while( IsSpace(z[i+1]) ){ i++; }
2194 z[j] = 0;
2196 printSchemaLine(p->out, z, ";\n");
2197 sqlite3_free(z);
2198 break;
2200 case MODE_List: {
2201 if( p->cnt++==0 && p->showHeader ){
2202 for(i=0; i<nArg; i++){
2203 utf8_printf(p->out,"%s%s",azCol[i],
2204 i==nArg-1 ? p->rowSeparator : p->colSeparator);
2207 if( azArg==0 ) break;
2208 for(i=0; i<nArg; i++){
2209 char *z = azArg[i];
2210 if( z==0 ) z = p->nullValue;
2211 utf8_printf(p->out, "%s", z);
2212 if( i<nArg-1 ){
2213 utf8_printf(p->out, "%s", p->colSeparator);
2214 }else{
2215 utf8_printf(p->out, "%s", p->rowSeparator);
2218 break;
2220 case MODE_Html: {
2221 if( p->cnt++==0 && p->showHeader ){
2222 raw_printf(p->out,"<TR>");
2223 for(i=0; i<nArg; i++){
2224 raw_printf(p->out,"<TH>");
2225 output_html_string(p->out, azCol[i]);
2226 raw_printf(p->out,"</TH>\n");
2228 raw_printf(p->out,"</TR>\n");
2230 if( azArg==0 ) break;
2231 raw_printf(p->out,"<TR>");
2232 for(i=0; i<nArg; i++){
2233 raw_printf(p->out,"<TD>");
2234 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2235 raw_printf(p->out,"</TD>\n");
2237 raw_printf(p->out,"</TR>\n");
2238 break;
2240 case MODE_Tcl: {
2241 if( p->cnt++==0 && p->showHeader ){
2242 for(i=0; i<nArg; i++){
2243 output_c_string(p->out,azCol[i] ? azCol[i] : "");
2244 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2246 utf8_printf(p->out, "%s", p->rowSeparator);
2248 if( azArg==0 ) break;
2249 for(i=0; i<nArg; i++){
2250 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2251 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2253 utf8_printf(p->out, "%s", p->rowSeparator);
2254 break;
2256 case MODE_Csv: {
2257 setBinaryMode(p->out, 1);
2258 if( p->cnt++==0 && p->showHeader ){
2259 for(i=0; i<nArg; i++){
2260 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2262 utf8_printf(p->out, "%s", p->rowSeparator);
2264 if( nArg>0 ){
2265 for(i=0; i<nArg; i++){
2266 output_csv(p, azArg[i], i<nArg-1);
2268 utf8_printf(p->out, "%s", p->rowSeparator);
2270 setTextMode(p->out, 1);
2271 break;
2273 case MODE_Insert: {
2274 if( azArg==0 ) break;
2275 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2276 if( p->showHeader ){
2277 raw_printf(p->out,"(");
2278 for(i=0; i<nArg; i++){
2279 if( i>0 ) raw_printf(p->out, ",");
2280 if( quoteChar(azCol[i]) ){
2281 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2282 shell_check_oom(z);
2283 utf8_printf(p->out, "%s", z);
2284 sqlite3_free(z);
2285 }else{
2286 raw_printf(p->out, "%s", azCol[i]);
2289 raw_printf(p->out,")");
2291 p->cnt++;
2292 for(i=0; i<nArg; i++){
2293 raw_printf(p->out, i>0 ? "," : " VALUES(");
2294 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2295 utf8_printf(p->out,"NULL");
2296 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2297 if( ShellHasFlag(p, SHFLG_Newlines) ){
2298 output_quoted_string(p->out, azArg[i]);
2299 }else{
2300 output_quoted_escaped_string(p->out, azArg[i]);
2302 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2303 utf8_printf(p->out,"%s", azArg[i]);
2304 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2305 char z[50];
2306 double r = sqlite3_column_double(p->pStmt, i);
2307 sqlite3_uint64 ur;
2308 memcpy(&ur,&r,sizeof(r));
2309 if( ur==0x7ff0000000000000LL ){
2310 raw_printf(p->out, "1e999");
2311 }else if( ur==0xfff0000000000000LL ){
2312 raw_printf(p->out, "-1e999");
2313 }else{
2314 sqlite3_int64 ir = (sqlite3_int64)r;
2315 if( r==(double)ir ){
2316 sqlite3_snprintf(50,z,"%lld.0", ir);
2317 }else{
2318 sqlite3_snprintf(50,z,"%!.20g", r);
2320 raw_printf(p->out, "%s", z);
2322 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2323 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2324 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2325 output_hex_blob(p->out, pBlob, nBlob);
2326 }else if( isNumber(azArg[i], 0) ){
2327 utf8_printf(p->out,"%s", azArg[i]);
2328 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2329 output_quoted_string(p->out, azArg[i]);
2330 }else{
2331 output_quoted_escaped_string(p->out, azArg[i]);
2334 raw_printf(p->out,");\n");
2335 break;
2337 case MODE_Json: {
2338 if( azArg==0 ) break;
2339 if( p->cnt==0 ){
2340 fputs("[{", p->out);
2341 }else{
2342 fputs(",\n{", p->out);
2344 p->cnt++;
2345 for(i=0; i<nArg; i++){
2346 output_json_string(p->out, azCol[i], -1);
2347 putc(':', p->out);
2348 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2349 fputs("null",p->out);
2350 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2351 char z[50];
2352 double r = sqlite3_column_double(p->pStmt, i);
2353 sqlite3_uint64 ur;
2354 memcpy(&ur,&r,sizeof(r));
2355 if( ur==0x7ff0000000000000LL ){
2356 raw_printf(p->out, "1e999");
2357 }else if( ur==0xfff0000000000000LL ){
2358 raw_printf(p->out, "-1e999");
2359 }else{
2360 sqlite3_snprintf(50,z,"%!.20g", r);
2361 raw_printf(p->out, "%s", z);
2363 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2364 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2365 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2366 output_json_string(p->out, pBlob, nBlob);
2367 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2368 output_json_string(p->out, azArg[i], -1);
2369 }else{
2370 utf8_printf(p->out,"%s", azArg[i]);
2372 if( i<nArg-1 ){
2373 putc(',', p->out);
2376 putc('}', p->out);
2377 break;
2379 case MODE_Quote: {
2380 if( azArg==0 ) break;
2381 if( p->cnt==0 && p->showHeader ){
2382 for(i=0; i<nArg; i++){
2383 if( i>0 ) fputs(p->colSeparator, p->out);
2384 output_quoted_string(p->out, azCol[i]);
2386 fputs(p->rowSeparator, p->out);
2388 p->cnt++;
2389 for(i=0; i<nArg; i++){
2390 if( i>0 ) fputs(p->colSeparator, p->out);
2391 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2392 utf8_printf(p->out,"NULL");
2393 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2394 output_quoted_string(p->out, azArg[i]);
2395 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2396 utf8_printf(p->out,"%s", azArg[i]);
2397 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2398 char z[50];
2399 double r = sqlite3_column_double(p->pStmt, i);
2400 sqlite3_snprintf(50,z,"%!.20g", r);
2401 raw_printf(p->out, "%s", z);
2402 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2403 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2404 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2405 output_hex_blob(p->out, pBlob, nBlob);
2406 }else if( isNumber(azArg[i], 0) ){
2407 utf8_printf(p->out,"%s", azArg[i]);
2408 }else{
2409 output_quoted_string(p->out, azArg[i]);
2412 fputs(p->rowSeparator, p->out);
2413 break;
2415 case MODE_Ascii: {
2416 if( p->cnt++==0 && p->showHeader ){
2417 for(i=0; i<nArg; i++){
2418 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2419 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2421 utf8_printf(p->out, "%s", p->rowSeparator);
2423 if( azArg==0 ) break;
2424 for(i=0; i<nArg; i++){
2425 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2426 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2428 utf8_printf(p->out, "%s", p->rowSeparator);
2429 break;
2431 case MODE_EQP: {
2432 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
2433 break;
2436 return 0;
2440 ** This is the callback routine that the SQLite library
2441 ** invokes for each row of a query result.
2443 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2444 /* since we don't have type info, call the shell_callback with a NULL value */
2445 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2449 ** This is the callback routine from sqlite3_exec() that appends all
2450 ** output onto the end of a ShellText object.
2452 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2453 ShellText *p = (ShellText*)pArg;
2454 int i;
2455 UNUSED_PARAMETER(az);
2456 if( azArg==0 ) return 0;
2457 if( p->n ) appendText(p, "|", 0);
2458 for(i=0; i<nArg; i++){
2459 if( i ) appendText(p, ",", 0);
2460 if( azArg[i] ) appendText(p, azArg[i], 0);
2462 return 0;
2466 ** Generate an appropriate SELFTEST table in the main database.
2468 static void createSelftestTable(ShellState *p){
2469 char *zErrMsg = 0;
2470 sqlite3_exec(p->db,
2471 "SAVEPOINT selftest_init;\n"
2472 "CREATE TABLE IF NOT EXISTS selftest(\n"
2473 " tno INTEGER PRIMARY KEY,\n" /* Test number */
2474 " op TEXT,\n" /* Operator: memo run */
2475 " cmd TEXT,\n" /* Command text */
2476 " ans TEXT\n" /* Desired answer */
2477 ");"
2478 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2479 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2480 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2481 " 'memo','Tests generated by --init');\n"
2482 "INSERT INTO [_shell$self]\n"
2483 " SELECT 'run',\n"
2484 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2485 "FROM sqlite_schema ORDER BY 2'',224))',\n"
2486 " hex(sha3_query('SELECT type,name,tbl_name,sql "
2487 "FROM sqlite_schema ORDER BY 2',224));\n"
2488 "INSERT INTO [_shell$self]\n"
2489 " SELECT 'run',"
2490 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2491 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2492 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2493 " FROM (\n"
2494 " SELECT name FROM sqlite_schema\n"
2495 " WHERE type='table'\n"
2496 " AND name<>'selftest'\n"
2497 " AND coalesce(rootpage,0)>0\n"
2498 " )\n"
2499 " ORDER BY name;\n"
2500 "INSERT INTO [_shell$self]\n"
2501 " VALUES('run','PRAGMA integrity_check','ok');\n"
2502 "INSERT INTO selftest(tno,op,cmd,ans)"
2503 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2504 "DROP TABLE [_shell$self];"
2505 ,0,0,&zErrMsg);
2506 if( zErrMsg ){
2507 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2508 sqlite3_free(zErrMsg);
2510 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2515 ** Set the destination table field of the ShellState structure to
2516 ** the name of the table given. Escape any quote characters in the
2517 ** table name.
2519 static void set_table_name(ShellState *p, const char *zName){
2520 int i, n;
2521 char cQuote;
2522 char *z;
2524 if( p->zDestTable ){
2525 free(p->zDestTable);
2526 p->zDestTable = 0;
2528 if( zName==0 ) return;
2529 cQuote = quoteChar(zName);
2530 n = strlen30(zName);
2531 if( cQuote ) n += n+2;
2532 z = p->zDestTable = malloc( n+1 );
2533 shell_check_oom(z);
2534 n = 0;
2535 if( cQuote ) z[n++] = cQuote;
2536 for(i=0; zName[i]; i++){
2537 z[n++] = zName[i];
2538 if( zName[i]==cQuote ) z[n++] = cQuote;
2540 if( cQuote ) z[n++] = cQuote;
2541 z[n] = 0;
2545 ** Maybe construct two lines of text that point out the position of a
2546 ** syntax error. Return a pointer to the text, in memory obtained from
2547 ** sqlite3_malloc(). Or, if the most recent error does not involve a
2548 ** specific token that we can point to, return an empty string.
2550 ** In all cases, the memory returned is obtained from sqlite3_malloc64()
2551 ** and should be released by the caller invoking sqlite3_free().
2553 static char *shell_error_context(const char *zSql, sqlite3 *db){
2554 int iOffset;
2555 size_t len;
2556 char *zCode;
2557 char *zMsg;
2558 int i;
2559 if( db==0
2560 || zSql==0
2561 || (iOffset = sqlite3_error_offset(db))<0
2563 return sqlite3_mprintf("");
2565 while( iOffset>50 ){
2566 iOffset--;
2567 zSql++;
2568 while( (zSql[0]&0xc0)==0x80 ){ zSql++; iOffset--; }
2570 len = strlen(zSql);
2571 if( len>78 ){
2572 len = 78;
2573 while( (zSql[len]&0xc0)==0x80 ) len--;
2575 zCode = sqlite3_mprintf("%.*s", len, zSql);
2576 for(i=0; zCode[i]; i++){ if( IsSpace(zSql[i]) ) zCode[i] = ' '; }
2577 if( iOffset<25 ){
2578 zMsg = sqlite3_mprintf("\n %z\n %*s^--- error here", zCode, iOffset, "");
2579 }else{
2580 zMsg = sqlite3_mprintf("\n %z\n %*serror here ---^", zCode, iOffset-14, "");
2582 return zMsg;
2587 ** Execute a query statement that will generate SQL output. Print
2588 ** the result columns, comma-separated, on a line and then add a
2589 ** semicolon terminator to the end of that line.
2591 ** If the number of columns is 1 and that column contains text "--"
2592 ** then write the semicolon on a separate line. That way, if a
2593 ** "--" comment occurs at the end of the statement, the comment
2594 ** won't consume the semicolon terminator.
2596 static int run_table_dump_query(
2597 ShellState *p, /* Query context */
2598 const char *zSelect /* SELECT statement to extract content */
2600 sqlite3_stmt *pSelect;
2601 int rc;
2602 int nResult;
2603 int i;
2604 const char *z;
2605 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2606 if( rc!=SQLITE_OK || !pSelect ){
2607 char *zContext = shell_error_context(zSelect, p->db);
2608 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n%s", rc,
2609 sqlite3_errmsg(p->db), zContext);
2610 sqlite3_free(zContext);
2611 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2612 return rc;
2614 rc = sqlite3_step(pSelect);
2615 nResult = sqlite3_column_count(pSelect);
2616 while( rc==SQLITE_ROW ){
2617 z = (const char*)sqlite3_column_text(pSelect, 0);
2618 utf8_printf(p->out, "%s", z);
2619 for(i=1; i<nResult; i++){
2620 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2622 if( z==0 ) z = "";
2623 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2624 if( z[0] ){
2625 raw_printf(p->out, "\n;\n");
2626 }else{
2627 raw_printf(p->out, ";\n");
2629 rc = sqlite3_step(pSelect);
2631 rc = sqlite3_finalize(pSelect);
2632 if( rc!=SQLITE_OK ){
2633 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2634 sqlite3_errmsg(p->db));
2635 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2637 return rc;
2641 ** Allocate space and save off string indicating current error.
2643 static char *save_err_msg(
2644 sqlite3 *db, /* Database to query */
2645 const char *zPhase, /* When the error occcurs */
2646 int rc, /* Error code returned from API */
2647 const char *zSql /* SQL string, or NULL */
2649 char *zErr;
2650 char *zContext;
2651 sqlite3_str *pStr = sqlite3_str_new(0);
2652 sqlite3_str_appendf(pStr, "%s, %s", zPhase, sqlite3_errmsg(db));
2653 if( rc>1 ){
2654 sqlite3_str_appendf(pStr, " (%d)", rc);
2656 zContext = shell_error_context(zSql, db);
2657 if( zContext ){
2658 sqlite3_str_appendall(pStr, zContext);
2659 sqlite3_free(zContext);
2661 zErr = sqlite3_str_finish(pStr);
2662 shell_check_oom(zErr);
2663 return zErr;
2666 #ifdef __linux__
2668 ** Attempt to display I/O stats on Linux using /proc/PID/io
2670 static void displayLinuxIoStats(FILE *out){
2671 FILE *in;
2672 char z[200];
2673 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2674 in = fopen(z, "rb");
2675 if( in==0 ) return;
2676 while( fgets(z, sizeof(z), in)!=0 ){
2677 static const struct {
2678 const char *zPattern;
2679 const char *zDesc;
2680 } aTrans[] = {
2681 { "rchar: ", "Bytes received by read():" },
2682 { "wchar: ", "Bytes sent to write():" },
2683 { "syscr: ", "Read() system calls:" },
2684 { "syscw: ", "Write() system calls:" },
2685 { "read_bytes: ", "Bytes read from storage:" },
2686 { "write_bytes: ", "Bytes written to storage:" },
2687 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
2689 int i;
2690 for(i=0; i<ArraySize(aTrans); i++){
2691 int n = strlen30(aTrans[i].zPattern);
2692 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2693 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2694 break;
2698 fclose(in);
2700 #endif
2703 ** Display a single line of status using 64-bit values.
2705 static void displayStatLine(
2706 ShellState *p, /* The shell context */
2707 char *zLabel, /* Label for this one line */
2708 char *zFormat, /* Format for the result */
2709 int iStatusCtrl, /* Which status to display */
2710 int bReset /* True to reset the stats */
2712 sqlite3_int64 iCur = -1;
2713 sqlite3_int64 iHiwtr = -1;
2714 int i, nPercent;
2715 char zLine[200];
2716 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2717 for(i=0, nPercent=0; zFormat[i]; i++){
2718 if( zFormat[i]=='%' ) nPercent++;
2720 if( nPercent>1 ){
2721 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2722 }else{
2723 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2725 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2729 ** Display memory stats.
2731 static int display_stats(
2732 sqlite3 *db, /* Database to query */
2733 ShellState *pArg, /* Pointer to ShellState */
2734 int bReset /* True to reset the stats */
2736 int iCur;
2737 int iHiwtr;
2738 FILE *out;
2739 if( pArg==0 || pArg->out==0 ) return 0;
2740 out = pArg->out;
2742 if( pArg->pStmt && pArg->statsOn==2 ){
2743 int nCol, i, x;
2744 sqlite3_stmt *pStmt = pArg->pStmt;
2745 char z[100];
2746 nCol = sqlite3_column_count(pStmt);
2747 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2748 for(i=0; i<nCol; i++){
2749 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2750 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
2751 #ifndef SQLITE_OMIT_DECLTYPE
2752 sqlite3_snprintf(30, z+x, "declared type:");
2753 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
2754 #endif
2755 #ifdef SQLITE_ENABLE_COLUMN_METADATA
2756 sqlite3_snprintf(30, z+x, "database name:");
2757 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2758 sqlite3_snprintf(30, z+x, "table name:");
2759 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2760 sqlite3_snprintf(30, z+x, "origin name:");
2761 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
2762 #endif
2766 if( pArg->statsOn==3 ){
2767 if( pArg->pStmt ){
2768 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2769 raw_printf(pArg->out, "VM-steps: %d\n", iCur);
2771 return 0;
2774 displayStatLine(pArg, "Memory Used:",
2775 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2776 displayStatLine(pArg, "Number of Outstanding Allocations:",
2777 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2778 if( pArg->shellFlgs & SHFLG_Pagecache ){
2779 displayStatLine(pArg, "Number of Pcache Pages Used:",
2780 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2782 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2783 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2784 displayStatLine(pArg, "Largest Allocation:",
2785 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2786 displayStatLine(pArg, "Largest Pcache Allocation:",
2787 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2788 #ifdef YYTRACKMAXSTACKDEPTH
2789 displayStatLine(pArg, "Deepest Parser Stack:",
2790 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2791 #endif
2793 if( db ){
2794 if( pArg->shellFlgs & SHFLG_Lookaside ){
2795 iHiwtr = iCur = -1;
2796 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2797 &iCur, &iHiwtr, bReset);
2798 raw_printf(pArg->out,
2799 "Lookaside Slots Used: %d (max %d)\n",
2800 iCur, iHiwtr);
2801 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2802 &iCur, &iHiwtr, bReset);
2803 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2804 iHiwtr);
2805 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2806 &iCur, &iHiwtr, bReset);
2807 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2808 iHiwtr);
2809 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2810 &iCur, &iHiwtr, bReset);
2811 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2812 iHiwtr);
2814 iHiwtr = iCur = -1;
2815 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2816 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2817 iCur);
2818 iHiwtr = iCur = -1;
2819 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2820 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
2821 iHiwtr = iCur = -1;
2822 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2823 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
2824 iHiwtr = iCur = -1;
2825 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2826 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
2827 iHiwtr = iCur = -1;
2828 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2829 raw_printf(pArg->out, "Page cache spills: %d\n", iCur);
2830 iHiwtr = iCur = -1;
2831 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2832 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
2833 iCur);
2834 iHiwtr = iCur = -1;
2835 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2836 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
2837 iCur);
2840 if( pArg->pStmt ){
2841 int iHit, iMiss;
2842 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2843 bReset);
2844 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
2845 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2846 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
2847 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2848 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
2849 iHit = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_HIT, bReset);
2850 iMiss = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FILTER_MISS, bReset);
2851 if( iHit || iMiss ){
2852 raw_printf(pArg->out, "Bloom filter bypass taken: %d/%d\n",
2853 iHit, iHit+iMiss);
2855 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2856 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
2857 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset);
2858 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur);
2859 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2860 raw_printf(pArg->out, "Number of times run: %d\n", iCur);
2861 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2862 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur);
2865 #ifdef __linux__
2866 displayLinuxIoStats(pArg->out);
2867 #endif
2869 /* Do not remove this machine readable comment: extra-stats-output-here */
2871 return 0;
2875 ** Display scan stats.
2877 static void display_scanstats(
2878 sqlite3 *db, /* Database to query */
2879 ShellState *pArg /* Pointer to ShellState */
2881 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2882 UNUSED_PARAMETER(db);
2883 UNUSED_PARAMETER(pArg);
2884 #else
2885 int i, k, n, mx;
2886 raw_printf(pArg->out, "-------- scanstats --------\n");
2887 mx = 0;
2888 for(k=0; k<=mx; k++){
2889 double rEstLoop = 1.0;
2890 for(i=n=0; 1; i++){
2891 sqlite3_stmt *p = pArg->pStmt;
2892 sqlite3_int64 nLoop, nVisit;
2893 double rEst;
2894 int iSid;
2895 const char *zExplain;
2896 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2897 break;
2899 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2900 if( iSid>mx ) mx = iSid;
2901 if( iSid!=k ) continue;
2902 if( n==0 ){
2903 rEstLoop = (double)nLoop;
2904 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2906 n++;
2907 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2908 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2909 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2910 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2911 rEstLoop *= rEst;
2912 raw_printf(pArg->out,
2913 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2914 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2918 raw_printf(pArg->out, "---------------------------\n");
2919 #endif
2923 ** Parameter azArray points to a zero-terminated array of strings. zStr
2924 ** points to a single nul-terminated string. Return non-zero if zStr
2925 ** is equal, according to strcmp(), to any of the strings in the array.
2926 ** Otherwise, return zero.
2928 static int str_in_array(const char *zStr, const char **azArray){
2929 int i;
2930 for(i=0; azArray[i]; i++){
2931 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2933 return 0;
2937 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2938 ** and populate the ShellState.aiIndent[] array with the number of
2939 ** spaces each opcode should be indented before it is output.
2941 ** The indenting rules are:
2943 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2944 ** all opcodes that occur between the p2 jump destination and the opcode
2945 ** itself by 2 spaces.
2947 ** * For each "Goto", if the jump destination is earlier in the program
2948 ** and ends on one of:
2949 ** Yield SeekGt SeekLt RowSetRead Rewind
2950 ** or if the P1 parameter is one instead of zero,
2951 ** then indent all opcodes between the earlier instruction
2952 ** and "Goto" by 2 spaces.
2954 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2955 const char *zSql; /* The text of the SQL statement */
2956 const char *z; /* Used to check if this is an EXPLAIN */
2957 int *abYield = 0; /* True if op is an OP_Yield */
2958 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
2959 int iOp; /* Index of operation in p->aiIndent[] */
2961 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext", 0 };
2962 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2963 "Rewind", 0 };
2964 const char *azGoto[] = { "Goto", 0 };
2966 /* Try to figure out if this is really an EXPLAIN statement. If this
2967 ** cannot be verified, return early. */
2968 if( sqlite3_column_count(pSql)!=8 ){
2969 p->cMode = p->mode;
2970 return;
2972 zSql = sqlite3_sql(pSql);
2973 if( zSql==0 ) return;
2974 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2975 if( sqlite3_strnicmp(z, "explain", 7) ){
2976 p->cMode = p->mode;
2977 return;
2980 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2981 int i;
2982 int iAddr = sqlite3_column_int(pSql, 0);
2983 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2985 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2986 ** p2 is an instruction address, set variable p2op to the index of that
2987 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2988 ** the current instruction is part of a sub-program generated by an
2989 ** SQL trigger or foreign key. */
2990 int p2 = sqlite3_column_int(pSql, 3);
2991 int p2op = (p2 + (iOp-iAddr));
2993 /* Grow the p->aiIndent array as required */
2994 if( iOp>=nAlloc ){
2995 if( iOp==0 ){
2996 /* Do further verfication that this is explain output. Abort if
2997 ** it is not */
2998 static const char *explainCols[] = {
2999 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3000 int jj;
3001 for(jj=0; jj<ArraySize(explainCols); jj++){
3002 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3003 p->cMode = p->mode;
3004 sqlite3_reset(pSql);
3005 return;
3009 nAlloc += 100;
3010 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3011 shell_check_oom(p->aiIndent);
3012 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
3013 shell_check_oom(abYield);
3015 abYield[iOp] = str_in_array(zOp, azYield);
3016 p->aiIndent[iOp] = 0;
3017 p->nIndent = iOp+1;
3019 if( str_in_array(zOp, azNext) ){
3020 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3022 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3023 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3025 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3029 p->iIndent = 0;
3030 sqlite3_free(abYield);
3031 sqlite3_reset(pSql);
3035 ** Free the array allocated by explain_data_prepare().
3037 static void explain_data_delete(ShellState *p){
3038 sqlite3_free(p->aiIndent);
3039 p->aiIndent = 0;
3040 p->nIndent = 0;
3041 p->iIndent = 0;
3045 ** Disable and restore .wheretrace and .selecttrace settings.
3047 static unsigned int savedSelectTrace;
3048 static unsigned int savedWhereTrace;
3049 static void disable_debug_trace_modes(void){
3050 unsigned int zero = 0;
3051 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 0, &savedSelectTrace);
3052 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &zero);
3053 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 2, &savedWhereTrace);
3054 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &zero);
3056 static void restore_debug_trace_modes(void){
3057 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &savedSelectTrace);
3058 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &savedWhereTrace);
3061 /* Create the TEMP table used to store parameter bindings */
3062 static void bind_table_init(ShellState *p){
3063 int wrSchema = 0;
3064 int defensiveMode = 0;
3065 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
3066 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
3067 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
3068 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
3069 sqlite3_exec(p->db,
3070 "CREATE TABLE IF NOT EXISTS temp.sqlite_parameters(\n"
3071 " key TEXT PRIMARY KEY,\n"
3072 " value\n"
3073 ") WITHOUT ROWID;",
3074 0, 0, 0);
3075 sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
3076 sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
3080 ** Bind parameters on a prepared statement.
3082 ** Parameter bindings are taken from a TEMP table of the form:
3084 ** CREATE TEMP TABLE sqlite_parameters(key TEXT PRIMARY KEY, value)
3085 ** WITHOUT ROWID;
3087 ** No bindings occur if this table does not exist. The name of the table
3088 ** begins with "sqlite_" so that it will not collide with ordinary application
3089 ** tables. The table must be in the TEMP schema.
3091 static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
3092 int nVar;
3093 int i;
3094 int rc;
3095 sqlite3_stmt *pQ = 0;
3097 nVar = sqlite3_bind_parameter_count(pStmt);
3098 if( nVar==0 ) return; /* Nothing to do */
3099 if( sqlite3_table_column_metadata(pArg->db, "TEMP", "sqlite_parameters",
3100 "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){
3101 return; /* Parameter table does not exist */
3103 rc = sqlite3_prepare_v2(pArg->db,
3104 "SELECT value FROM temp.sqlite_parameters"
3105 " WHERE key=?1", -1, &pQ, 0);
3106 if( rc || pQ==0 ) return;
3107 for(i=1; i<=nVar; i++){
3108 char zNum[30];
3109 const char *zVar = sqlite3_bind_parameter_name(pStmt, i);
3110 if( zVar==0 ){
3111 sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i);
3112 zVar = zNum;
3114 sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
3115 if( sqlite3_step(pQ)==SQLITE_ROW ){
3116 sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
3117 }else{
3118 sqlite3_bind_null(pStmt, i);
3120 sqlite3_reset(pQ);
3122 sqlite3_finalize(pQ);
3126 ** UTF8 box-drawing characters. Imagine box lines like this:
3128 ** 1
3129 ** |
3130 ** 4 --+-- 2
3131 ** |
3132 ** 3
3134 ** Each box characters has between 2 and 4 of the lines leading from
3135 ** the center. The characters are here identified by the numbers of
3136 ** their corresponding lines.
3138 #define BOX_24 "\342\224\200" /* U+2500 --- */
3139 #define BOX_13 "\342\224\202" /* U+2502 | */
3140 #define BOX_23 "\342\224\214" /* U+250c ,- */
3141 #define BOX_34 "\342\224\220" /* U+2510 -, */
3142 #define BOX_12 "\342\224\224" /* U+2514 '- */
3143 #define BOX_14 "\342\224\230" /* U+2518 -' */
3144 #define BOX_123 "\342\224\234" /* U+251c |- */
3145 #define BOX_134 "\342\224\244" /* U+2524 -| */
3146 #define BOX_234 "\342\224\254" /* U+252c -,- */
3147 #define BOX_124 "\342\224\264" /* U+2534 -'- */
3148 #define BOX_1234 "\342\224\274" /* U+253c -|- */
3150 /* Draw horizontal line N characters long using unicode box
3151 ** characters
3153 static void print_box_line(FILE *out, int N){
3154 const char zDash[] =
3155 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24
3156 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24;
3157 const int nDash = sizeof(zDash) - 1;
3158 N *= 3;
3159 while( N>nDash ){
3160 utf8_printf(out, zDash);
3161 N -= nDash;
3163 utf8_printf(out, "%.*s", N, zDash);
3167 ** Draw a horizontal separator for a MODE_Box table.
3169 static void print_box_row_separator(
3170 ShellState *p,
3171 int nArg,
3172 const char *zSep1,
3173 const char *zSep2,
3174 const char *zSep3
3176 int i;
3177 if( nArg>0 ){
3178 utf8_printf(p->out, "%s", zSep1);
3179 print_box_line(p->out, p->actualWidth[0]+2);
3180 for(i=1; i<nArg; i++){
3181 utf8_printf(p->out, "%s", zSep2);
3182 print_box_line(p->out, p->actualWidth[i]+2);
3184 utf8_printf(p->out, "%s", zSep3);
3186 fputs("\n", p->out);
3190 ** z[] is a line of text that is to be displayed the .mode box or table or
3191 ** similar tabular formats. z[] might contain control characters such
3192 ** as \n, \t, \f, or \r.
3194 ** Compute characters to display on the first line of z[]. Stop at the
3195 ** first \r, \n, or \f. Expand \t into spaces. Return a copy (obtained
3196 ** from malloc()) of that first line, which caller should free sometime.
3197 ** Write anything to display on the next line into *pzTail. If this is
3198 ** the last line, write a NULL into *pzTail. (*pzTail is not allocated.)
3200 static char *translateForDisplayAndDup(
3201 const unsigned char *z, /* Input text to be transformed */
3202 const unsigned char **pzTail, /* OUT: Tail of the input for next line */
3203 int mxWidth, /* Max width. 0 means no limit */
3204 u8 bWordWrap /* If true, avoid breaking mid-word */
3206 int i; /* Input bytes consumed */
3207 int j; /* Output bytes generated */
3208 int k; /* Input bytes to be displayed */
3209 int n; /* Output column number */
3210 unsigned char *zOut; /* Output text */
3212 if( z==0 ){
3213 *pzTail = 0;
3214 return 0;
3216 if( mxWidth<0 ) mxWidth = -mxWidth;
3217 if( mxWidth==0 ) mxWidth = 1000000;
3218 i = j = n = 0;
3219 while( n<mxWidth ){
3220 if( z[i]>=' ' ){
3221 n++;
3222 do{ i++; j++; }while( (z[i]&0xc0)==0x80 );
3223 continue;
3225 if( z[i]=='\t' ){
3227 n++;
3228 j++;
3229 }while( (n&7)!=0 && n<mxWidth );
3230 i++;
3231 continue;
3233 break;
3235 if( n>=mxWidth && bWordWrap ){
3236 /* Perhaps try to back up to a better place to break the line */
3237 for(k=i; k>i/2; k--){
3238 if( isspace(z[k-1]) ) break;
3240 if( k<=i/2 ){
3241 for(k=i; k>i/2; k--){
3242 if( isalnum(z[k-1])!=isalnum(z[k]) && (z[k]&0xc0)!=0x80 ) break;
3245 if( k<=i/2 ){
3246 k = i;
3247 }else{
3248 i = k;
3249 while( z[i]==' ' ) i++;
3251 }else{
3252 k = i;
3254 if( n>=mxWidth && z[i]>=' ' ){
3255 *pzTail = &z[i];
3256 }else if( z[i]=='\r' && z[i+1]=='\n' ){
3257 *pzTail = z[i+2] ? &z[i+2] : 0;
3258 }else if( z[i]==0 || z[i+1]==0 ){
3259 *pzTail = 0;
3260 }else{
3261 *pzTail = &z[i+1];
3263 zOut = malloc( j+1 );
3264 shell_check_oom(zOut);
3265 i = j = n = 0;
3266 while( i<k ){
3267 if( z[i]>=' ' ){
3268 n++;
3269 do{ zOut[j++] = z[i++]; }while( (z[i]&0xc0)==0x80 );
3270 continue;
3272 if( z[i]=='\t' ){
3274 n++;
3275 zOut[j++] = ' ';
3276 }while( (n&7)!=0 && n<mxWidth );
3277 i++;
3278 continue;
3280 break;
3282 zOut[j] = 0;
3283 return (char*)zOut;
3286 /* Extract the value of the i-th current column for pStmt as an SQL literal
3287 ** value. Memory is obtained from sqlite3_malloc64() and must be freed by
3288 ** the caller.
3290 static char *quoted_column(sqlite3_stmt *pStmt, int i){
3291 switch( sqlite3_column_type(pStmt, i) ){
3292 case SQLITE_NULL: {
3293 return sqlite3_mprintf("NULL");
3295 case SQLITE_INTEGER:
3296 case SQLITE_FLOAT: {
3297 return sqlite3_mprintf("%s",sqlite3_column_text(pStmt,i));
3299 case SQLITE_TEXT: {
3300 return sqlite3_mprintf("%Q",sqlite3_column_text(pStmt,i));
3302 case SQLITE_BLOB: {
3303 int j;
3304 sqlite3_str *pStr = sqlite3_str_new(0);
3305 const unsigned char *a = sqlite3_column_blob(pStmt,i);
3306 int n = sqlite3_column_bytes(pStmt,i);
3307 sqlite3_str_append(pStr, "x'", 2);
3308 for(j=0; j<n; j++){
3309 sqlite3_str_appendf(pStr, "%02x", a[j]);
3311 sqlite3_str_append(pStr, "'", 1);
3312 return sqlite3_str_finish(pStr);
3315 return 0; /* Not reached */
3319 ** Run a prepared statement and output the result in one of the
3320 ** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table,
3321 ** or MODE_Box.
3323 ** This is different from ordinary exec_prepared_stmt() in that
3324 ** it has to run the entire query and gather the results into memory
3325 ** first, in order to determine column widths, before providing
3326 ** any output.
3328 static void exec_prepared_stmt_columnar(
3329 ShellState *p, /* Pointer to ShellState */
3330 sqlite3_stmt *pStmt /* Statment to run */
3332 sqlite3_int64 nRow = 0;
3333 int nColumn = 0;
3334 char **azData = 0;
3335 sqlite3_int64 nAlloc = 0;
3336 char *abRowDiv = 0;
3337 const unsigned char *uz;
3338 const char *z;
3339 char **azQuoted = 0;
3340 int rc;
3341 sqlite3_int64 i, nData;
3342 int j, nTotal, w, n;
3343 const char *colSep = 0;
3344 const char *rowSep = 0;
3345 const unsigned char **azNextLine = 0;
3346 int bNextLine = 0;
3347 int bMultiLineRowExists = 0;
3348 int bw = p->cmOpts.bWordWrap;
3350 rc = sqlite3_step(pStmt);
3351 if( rc!=SQLITE_ROW ) return;
3352 nColumn = sqlite3_column_count(pStmt);
3353 nAlloc = nColumn*4;
3354 if( nAlloc<=0 ) nAlloc = 1;
3355 azData = sqlite3_malloc64( nAlloc*sizeof(char*) );
3356 shell_check_oom(azData);
3357 azNextLine = sqlite3_malloc64( nColumn*sizeof(char*) );
3358 shell_check_oom((void*)azNextLine);
3359 memset((void*)azNextLine, 0, nColumn*sizeof(char*) );
3360 if( p->cmOpts.bQuote ){
3361 azQuoted = sqlite3_malloc64( nColumn*sizeof(char*) );
3362 shell_check_oom(azQuoted);
3363 memset(azQuoted, 0, nColumn*sizeof(char*) );
3365 abRowDiv = sqlite3_malloc64( nAlloc/nColumn );
3366 shell_check_oom(abRowDiv);
3367 if( nColumn>p->nWidth ){
3368 p->colWidth = realloc(p->colWidth, (nColumn+1)*2*sizeof(int));
3369 shell_check_oom(p->colWidth);
3370 for(i=p->nWidth; i<nColumn; i++) p->colWidth[i] = 0;
3371 p->nWidth = nColumn;
3372 p->actualWidth = &p->colWidth[nColumn];
3374 memset(p->actualWidth, 0, nColumn*sizeof(int));
3375 for(i=0; i<nColumn; i++){
3376 w = p->colWidth[i];
3377 if( w<0 ) w = -w;
3378 p->actualWidth[i] = w;
3380 for(i=0; i<nColumn; i++){
3381 const unsigned char *zNotUsed;
3382 int wx = p->colWidth[i];
3383 if( wx==0 ){
3384 wx = p->cmOpts.iWrap;
3386 if( wx<0 ) wx = -wx;
3387 uz = (const unsigned char*)sqlite3_column_name(pStmt,i);
3388 azData[i] = translateForDisplayAndDup(uz, &zNotUsed, wx, bw);
3391 int useNextLine = bNextLine;
3392 bNextLine = 0;
3393 if( (nRow+2)*nColumn >= nAlloc ){
3394 nAlloc *= 2;
3395 azData = sqlite3_realloc64(azData, nAlloc*sizeof(char*));
3396 shell_check_oom(azData);
3397 abRowDiv = sqlite3_realloc64(abRowDiv, nAlloc/nColumn);
3398 shell_check_oom(abRowDiv);
3400 abRowDiv[nRow] = 1;
3401 nRow++;
3402 for(i=0; i<nColumn; i++){
3403 int wx = p->colWidth[i];
3404 if( wx==0 ){
3405 wx = p->cmOpts.iWrap;
3407 if( wx<0 ) wx = -wx;
3408 if( useNextLine ){
3409 uz = azNextLine[i];
3410 }else if( p->cmOpts.bQuote ){
3411 sqlite3_free(azQuoted[i]);
3412 azQuoted[i] = quoted_column(pStmt,i);
3413 uz = (const unsigned char*)azQuoted[i];
3414 }else{
3415 uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
3417 azData[nRow*nColumn + i]
3418 = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
3419 if( azNextLine[i] ){
3420 bNextLine = 1;
3421 abRowDiv[nRow-1] = 0;
3422 bMultiLineRowExists = 1;
3425 }while( bNextLine || sqlite3_step(pStmt)==SQLITE_ROW );
3426 nTotal = nColumn*(nRow+1);
3427 for(i=0; i<nTotal; i++){
3428 z = azData[i];
3429 if( z==0 ) z = p->nullValue;
3430 n = strlenChar(z);
3431 j = i%nColumn;
3432 if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
3434 if( seenInterrupt ) goto columnar_end;
3435 if( nColumn==0 ) goto columnar_end;
3436 switch( p->cMode ){
3437 case MODE_Column: {
3438 colSep = " ";
3439 rowSep = "\n";
3440 if( p->showHeader ){
3441 for(i=0; i<nColumn; i++){
3442 w = p->actualWidth[i];
3443 if( p->colWidth[i]<0 ) w = -w;
3444 utf8_width_print(p->out, w, azData[i]);
3445 fputs(i==nColumn-1?"\n":" ", p->out);
3447 for(i=0; i<nColumn; i++){
3448 print_dashes(p->out, p->actualWidth[i]);
3449 fputs(i==nColumn-1?"\n":" ", p->out);
3452 break;
3454 case MODE_Table: {
3455 colSep = " | ";
3456 rowSep = " |\n";
3457 print_row_separator(p, nColumn, "+");
3458 fputs("| ", p->out);
3459 for(i=0; i<nColumn; i++){
3460 w = p->actualWidth[i];
3461 n = strlenChar(azData[i]);
3462 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3463 fputs(i==nColumn-1?" |\n":" | ", p->out);
3465 print_row_separator(p, nColumn, "+");
3466 break;
3468 case MODE_Markdown: {
3469 colSep = " | ";
3470 rowSep = " |\n";
3471 fputs("| ", p->out);
3472 for(i=0; i<nColumn; i++){
3473 w = p->actualWidth[i];
3474 n = strlenChar(azData[i]);
3475 utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, "");
3476 fputs(i==nColumn-1?" |\n":" | ", p->out);
3478 print_row_separator(p, nColumn, "|");
3479 break;
3481 case MODE_Box: {
3482 colSep = " " BOX_13 " ";
3483 rowSep = " " BOX_13 "\n";
3484 print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34);
3485 utf8_printf(p->out, BOX_13 " ");
3486 for(i=0; i<nColumn; i++){
3487 w = p->actualWidth[i];
3488 n = strlenChar(azData[i]);
3489 utf8_printf(p->out, "%*s%s%*s%s",
3490 (w-n)/2, "", azData[i], (w-n+1)/2, "",
3491 i==nColumn-1?" "BOX_13"\n":" "BOX_13" ");
3493 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3494 break;
3497 for(i=nColumn, j=0; i<nTotal; i++, j++){
3498 if( j==0 && p->cMode!=MODE_Column ){
3499 utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| ");
3501 z = azData[i];
3502 if( z==0 ) z = p->nullValue;
3503 w = p->actualWidth[j];
3504 if( p->colWidth[j]<0 ) w = -w;
3505 utf8_width_print(p->out, w, z);
3506 if( j==nColumn-1 ){
3507 utf8_printf(p->out, "%s", rowSep);
3508 if( bMultiLineRowExists && abRowDiv[i/nColumn-1] && i+1<nTotal ){
3509 if( p->cMode==MODE_Table ){
3510 print_row_separator(p, nColumn, "+");
3511 }else if( p->cMode==MODE_Box ){
3512 print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134);
3513 }else if( p->cMode==MODE_Column ){
3514 raw_printf(p->out, "\n");
3517 j = -1;
3518 if( seenInterrupt ) goto columnar_end;
3519 }else{
3520 utf8_printf(p->out, "%s", colSep);
3523 if( p->cMode==MODE_Table ){
3524 print_row_separator(p, nColumn, "+");
3525 }else if( p->cMode==MODE_Box ){
3526 print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14);
3528 columnar_end:
3529 if( seenInterrupt ){
3530 utf8_printf(p->out, "Interrupt\n");
3532 nData = (nRow+1)*nColumn;
3533 for(i=0; i<nData; i++) free(azData[i]);
3534 sqlite3_free(azData);
3535 sqlite3_free((void*)azNextLine);
3536 sqlite3_free(abRowDiv);
3537 if( azQuoted ){
3538 for(i=0; i<nColumn; i++) sqlite3_free(azQuoted[i]);
3539 sqlite3_free(azQuoted);
3544 ** Run a prepared statement
3546 static void exec_prepared_stmt(
3547 ShellState *pArg, /* Pointer to ShellState */
3548 sqlite3_stmt *pStmt /* Statment to run */
3550 int rc;
3551 sqlite3_uint64 nRow = 0;
3553 if( pArg->cMode==MODE_Column
3554 || pArg->cMode==MODE_Table
3555 || pArg->cMode==MODE_Box
3556 || pArg->cMode==MODE_Markdown
3558 exec_prepared_stmt_columnar(pArg, pStmt);
3559 return;
3562 /* perform the first step. this will tell us if we
3563 ** have a result set or not and how wide it is.
3565 rc = sqlite3_step(pStmt);
3566 /* if we have a result set... */
3567 if( SQLITE_ROW == rc ){
3568 /* allocate space for col name ptr, value ptr, and type */
3569 int nCol = sqlite3_column_count(pStmt);
3570 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3571 if( !pData ){
3572 shell_out_of_memory();
3573 }else{
3574 char **azCols = (char **)pData; /* Names of result columns */
3575 char **azVals = &azCols[nCol]; /* Results */
3576 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3577 int i, x;
3578 assert(sizeof(int) <= sizeof(char *));
3579 /* save off ptrs to column names */
3580 for(i=0; i<nCol; i++){
3581 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3584 nRow++;
3585 /* extract the data and data types */
3586 for(i=0; i<nCol; i++){
3587 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3588 if( x==SQLITE_BLOB
3589 && pArg
3590 && (pArg->cMode==MODE_Insert || pArg->cMode==MODE_Quote)
3592 azVals[i] = "";
3593 }else{
3594 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3596 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3597 rc = SQLITE_NOMEM;
3598 break; /* from for */
3600 } /* end for */
3602 /* if data and types extracted successfully... */
3603 if( SQLITE_ROW == rc ){
3604 /* call the supplied callback with the result row data */
3605 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
3606 rc = SQLITE_ABORT;
3607 }else{
3608 rc = sqlite3_step(pStmt);
3611 } while( SQLITE_ROW == rc );
3612 sqlite3_free(pData);
3613 if( pArg->cMode==MODE_Json ){
3614 fputs("]\n", pArg->out);
3615 }else if( pArg->cMode==MODE_Count ){
3616 char zBuf[200];
3617 sqlite3_snprintf(sizeof(zBuf), zBuf, "%llu row%s\n",
3618 nRow, nRow!=1 ? "s" : "");
3619 printf("%s", zBuf);
3625 #ifndef SQLITE_OMIT_VIRTUALTABLE
3627 ** This function is called to process SQL if the previous shell command
3628 ** was ".expert". It passes the SQL in the second argument directly to
3629 ** the sqlite3expert object.
3631 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3632 ** code. In this case, (*pzErr) may be set to point to a buffer containing
3633 ** an English language error message. It is the responsibility of the
3634 ** caller to eventually free this buffer using sqlite3_free().
3636 static int expertHandleSQL(
3637 ShellState *pState,
3638 const char *zSql,
3639 char **pzErr
3641 assert( pState->expert.pExpert );
3642 assert( pzErr==0 || *pzErr==0 );
3643 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
3647 ** This function is called either to silently clean up the object
3648 ** created by the ".expert" command (if bCancel==1), or to generate a
3649 ** report from it and then clean it up (if bCancel==0).
3651 ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
3652 ** code. In this case, (*pzErr) may be set to point to a buffer containing
3653 ** an English language error message. It is the responsibility of the
3654 ** caller to eventually free this buffer using sqlite3_free().
3656 static int expertFinish(
3657 ShellState *pState,
3658 int bCancel,
3659 char **pzErr
3661 int rc = SQLITE_OK;
3662 sqlite3expert *p = pState->expert.pExpert;
3663 assert( p );
3664 assert( bCancel || pzErr==0 || *pzErr==0 );
3665 if( bCancel==0 ){
3666 FILE *out = pState->out;
3667 int bVerbose = pState->expert.bVerbose;
3669 rc = sqlite3_expert_analyze(p, pzErr);
3670 if( rc==SQLITE_OK ){
3671 int nQuery = sqlite3_expert_count(p);
3672 int i;
3674 if( bVerbose ){
3675 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
3676 raw_printf(out, "-- Candidates -----------------------------\n");
3677 raw_printf(out, "%s\n", zCand);
3679 for(i=0; i<nQuery; i++){
3680 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
3681 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
3682 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
3683 if( zIdx==0 ) zIdx = "(no new indexes)\n";
3684 if( bVerbose ){
3685 raw_printf(out, "-- Query %d --------------------------------\n",i+1);
3686 raw_printf(out, "%s\n\n", zSql);
3688 raw_printf(out, "%s\n", zIdx);
3689 raw_printf(out, "%s\n", zEQP);
3693 sqlite3_expert_destroy(p);
3694 pState->expert.pExpert = 0;
3695 return rc;
3699 ** Implementation of ".expert" dot command.
3701 static int expertDotCommand(
3702 ShellState *pState, /* Current shell tool state */
3703 char **azArg, /* Array of arguments passed to dot command */
3704 int nArg /* Number of entries in azArg[] */
3706 int rc = SQLITE_OK;
3707 char *zErr = 0;
3708 int i;
3709 int iSample = 0;
3711 assert( pState->expert.pExpert==0 );
3712 memset(&pState->expert, 0, sizeof(ExpertInfo));
3714 for(i=1; rc==SQLITE_OK && i<nArg; i++){
3715 char *z = azArg[i];
3716 int n;
3717 if( z[0]=='-' && z[1]=='-' ) z++;
3718 n = strlen30(z);
3719 if( n>=2 && 0==strncmp(z, "-verbose", n) ){
3720 pState->expert.bVerbose = 1;
3722 else if( n>=2 && 0==strncmp(z, "-sample", n) ){
3723 if( i==(nArg-1) ){
3724 raw_printf(stderr, "option requires an argument: %s\n", z);
3725 rc = SQLITE_ERROR;
3726 }else{
3727 iSample = (int)integerValue(azArg[++i]);
3728 if( iSample<0 || iSample>100 ){
3729 raw_printf(stderr, "value out of range: %s\n", azArg[i]);
3730 rc = SQLITE_ERROR;
3734 else{
3735 raw_printf(stderr, "unknown option: %s\n", z);
3736 rc = SQLITE_ERROR;
3740 if( rc==SQLITE_OK ){
3741 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
3742 if( pState->expert.pExpert==0 ){
3743 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr ? zErr : "out of memory");
3744 rc = SQLITE_ERROR;
3745 }else{
3746 sqlite3_expert_config(
3747 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
3751 sqlite3_free(zErr);
3753 return rc;
3755 #endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
3758 ** Execute a statement or set of statements. Print
3759 ** any result rows/columns depending on the current mode
3760 ** set via the supplied callback.
3762 ** This is very similar to SQLite's built-in sqlite3_exec()
3763 ** function except it takes a slightly different callback
3764 ** and callback data argument.
3766 static int shell_exec(
3767 ShellState *pArg, /* Pointer to ShellState */
3768 const char *zSql, /* SQL to be evaluated */
3769 char **pzErrMsg /* Error msg written here */
3771 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
3772 int rc = SQLITE_OK; /* Return Code */
3773 int rc2;
3774 const char *zLeftover; /* Tail of unprocessed SQL */
3775 sqlite3 *db = pArg->db;
3777 if( pzErrMsg ){
3778 *pzErrMsg = NULL;
3781 #ifndef SQLITE_OMIT_VIRTUALTABLE
3782 if( pArg->expert.pExpert ){
3783 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
3784 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
3786 #endif
3788 while( zSql[0] && (SQLITE_OK == rc) ){
3789 static const char *zStmtSql;
3790 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3791 if( SQLITE_OK != rc ){
3792 if( pzErrMsg ){
3793 *pzErrMsg = save_err_msg(db, "in prepare", rc, zSql);
3795 }else{
3796 if( !pStmt ){
3797 /* this happens for a comment or white-space */
3798 zSql = zLeftover;
3799 while( IsSpace(zSql[0]) ) zSql++;
3800 continue;
3802 zStmtSql = sqlite3_sql(pStmt);
3803 if( zStmtSql==0 ) zStmtSql = "";
3804 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3806 /* save off the prepared statment handle and reset row count */
3807 if( pArg ){
3808 pArg->pStmt = pStmt;
3809 pArg->cnt = 0;
3812 /* echo the sql statement if echo on */
3813 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3814 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3817 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3818 if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){
3819 sqlite3_stmt *pExplain;
3820 char *zEQP;
3821 int triggerEQP = 0;
3822 disable_debug_trace_modes();
3823 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
3824 if( pArg->autoEQP>=AUTOEQP_trigger ){
3825 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
3827 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3828 shell_check_oom(zEQP);
3829 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3830 if( rc==SQLITE_OK ){
3831 while( sqlite3_step(pExplain)==SQLITE_ROW ){
3832 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
3833 int iEqpId = sqlite3_column_int(pExplain, 0);
3834 int iParentId = sqlite3_column_int(pExplain, 1);
3835 if( zEQPLine==0 ) zEQPLine = "";
3836 if( zEQPLine[0]=='-' ) eqp_render(pArg);
3837 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
3839 eqp_render(pArg);
3841 sqlite3_finalize(pExplain);
3842 sqlite3_free(zEQP);
3843 if( pArg->autoEQP>=AUTOEQP_full ){
3844 /* Also do an EXPLAIN for ".eqp full" mode */
3845 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3846 shell_check_oom(zEQP);
3847 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3848 if( rc==SQLITE_OK ){
3849 pArg->cMode = MODE_Explain;
3850 explain_data_prepare(pArg, pExplain);
3851 exec_prepared_stmt(pArg, pExplain);
3852 explain_data_delete(pArg);
3854 sqlite3_finalize(pExplain);
3855 sqlite3_free(zEQP);
3857 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
3858 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
3859 /* Reprepare pStmt before reactiving trace modes */
3860 sqlite3_finalize(pStmt);
3861 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
3862 if( pArg ) pArg->pStmt = pStmt;
3864 restore_debug_trace_modes();
3867 if( pArg ){
3868 pArg->cMode = pArg->mode;
3869 if( pArg->autoExplain ){
3870 if( sqlite3_stmt_isexplain(pStmt)==1 ){
3871 pArg->cMode = MODE_Explain;
3873 if( sqlite3_stmt_isexplain(pStmt)==2 ){
3874 pArg->cMode = MODE_EQP;
3878 /* If the shell is currently in ".explain" mode, gather the extra
3879 ** data required to add indents to the output.*/
3880 if( pArg->cMode==MODE_Explain ){
3881 explain_data_prepare(pArg, pStmt);
3885 bind_prepared_stmt(pArg, pStmt);
3886 exec_prepared_stmt(pArg, pStmt);
3887 explain_data_delete(pArg);
3888 eqp_render(pArg);
3890 /* print usage stats if stats on */
3891 if( pArg && pArg->statsOn ){
3892 display_stats(db, pArg, 0);
3895 /* print loop-counters if required */
3896 if( pArg && pArg->scanstatsOn ){
3897 display_scanstats(db, pArg);
3900 /* Finalize the statement just executed. If this fails, save a
3901 ** copy of the error message. Otherwise, set zSql to point to the
3902 ** next statement to execute. */
3903 rc2 = sqlite3_finalize(pStmt);
3904 if( rc!=SQLITE_NOMEM ) rc = rc2;
3905 if( rc==SQLITE_OK ){
3906 zSql = zLeftover;
3907 while( IsSpace(zSql[0]) ) zSql++;
3908 }else if( pzErrMsg ){
3909 *pzErrMsg = save_err_msg(db, "stepping", rc, 0);
3912 /* clear saved stmt handle */
3913 if( pArg ){
3914 pArg->pStmt = NULL;
3917 } /* end while */
3919 return rc;
3923 ** Release memory previously allocated by tableColumnList().
3925 static void freeColumnList(char **azCol){
3926 int i;
3927 for(i=1; azCol[i]; i++){
3928 sqlite3_free(azCol[i]);
3930 /* azCol[0] is a static string */
3931 sqlite3_free(azCol);
3935 ** Return a list of pointers to strings which are the names of all
3936 ** columns in table zTab. The memory to hold the names is dynamically
3937 ** allocated and must be released by the caller using a subsequent call
3938 ** to freeColumnList().
3940 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
3941 ** value that needs to be preserved, then azCol[0] is filled in with the
3942 ** name of the rowid column.
3944 ** The first regular column in the table is azCol[1]. The list is terminated
3945 ** by an entry with azCol[i]==0.
3947 static char **tableColumnList(ShellState *p, const char *zTab){
3948 char **azCol = 0;
3949 sqlite3_stmt *pStmt;
3950 char *zSql;
3951 int nCol = 0;
3952 int nAlloc = 0;
3953 int nPK = 0; /* Number of PRIMARY KEY columns seen */
3954 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
3955 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3956 int rc;
3958 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3959 shell_check_oom(zSql);
3960 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3961 sqlite3_free(zSql);
3962 if( rc ) return 0;
3963 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3964 if( nCol>=nAlloc-2 ){
3965 nAlloc = nAlloc*2 + nCol + 10;
3966 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3967 shell_check_oom(azCol);
3969 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3970 shell_check_oom(azCol[nCol]);
3971 if( sqlite3_column_int(pStmt, 5) ){
3972 nPK++;
3973 if( nPK==1
3974 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3975 "INTEGER")==0
3977 isIPK = 1;
3978 }else{
3979 isIPK = 0;
3983 sqlite3_finalize(pStmt);
3984 if( azCol==0 ) return 0;
3985 azCol[0] = 0;
3986 azCol[nCol+1] = 0;
3988 /* The decision of whether or not a rowid really needs to be preserved
3989 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
3990 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
3991 ** rowids on tables where the rowid is inaccessible because there are other
3992 ** columns in the table named "rowid", "_rowid_", and "oid".
3994 if( preserveRowid && isIPK ){
3995 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3996 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
3997 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3998 ** ROWID aliases. To distinguish these cases, check to see if
3999 ** there is a "pk" entry in "PRAGMA index_list". There will be
4000 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
4002 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
4003 " WHERE origin='pk'", zTab);
4004 shell_check_oom(zSql);
4005 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4006 sqlite3_free(zSql);
4007 if( rc ){
4008 freeColumnList(azCol);
4009 return 0;
4011 rc = sqlite3_step(pStmt);
4012 sqlite3_finalize(pStmt);
4013 preserveRowid = rc==SQLITE_ROW;
4015 if( preserveRowid ){
4016 /* Only preserve the rowid if we can find a name to use for the
4017 ** rowid */
4018 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
4019 int i, j;
4020 for(j=0; j<3; j++){
4021 for(i=1; i<=nCol; i++){
4022 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
4024 if( i>nCol ){
4025 /* At this point, we know that azRowid[j] is not the name of any
4026 ** ordinary column in the table. Verify that azRowid[j] is a valid
4027 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
4028 ** tables will fail this last check */
4029 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
4030 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
4031 break;
4035 return azCol;
4039 ** Toggle the reverse_unordered_selects setting.
4041 static void toggleSelectOrder(sqlite3 *db){
4042 sqlite3_stmt *pStmt = 0;
4043 int iSetting = 0;
4044 char zStmt[100];
4045 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
4046 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4047 iSetting = sqlite3_column_int(pStmt, 0);
4049 sqlite3_finalize(pStmt);
4050 sqlite3_snprintf(sizeof(zStmt), zStmt,
4051 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
4052 sqlite3_exec(db, zStmt, 0, 0, 0);
4056 ** This is a different callback routine used for dumping the database.
4057 ** Each row received by this callback consists of a table name,
4058 ** the table type ("index" or "table") and SQL to create the table.
4059 ** This routine should print text sufficient to recreate the table.
4061 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
4062 int rc;
4063 const char *zTable;
4064 const char *zType;
4065 const char *zSql;
4066 ShellState *p = (ShellState *)pArg;
4067 int dataOnly;
4068 int noSys;
4070 UNUSED_PARAMETER(azNotUsed);
4071 if( nArg!=3 || azArg==0 ) return 0;
4072 zTable = azArg[0];
4073 zType = azArg[1];
4074 zSql = azArg[2];
4075 dataOnly = (p->shellFlgs & SHFLG_DumpDataOnly)!=0;
4076 noSys = (p->shellFlgs & SHFLG_DumpNoSys)!=0;
4078 if( strcmp(zTable, "sqlite_sequence")==0 && !noSys ){
4079 if( !dataOnly ) raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
4080 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 && !noSys ){
4081 if( !dataOnly ) raw_printf(p->out, "ANALYZE sqlite_schema;\n");
4082 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
4083 return 0;
4084 }else if( dataOnly ){
4085 /* no-op */
4086 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
4087 char *zIns;
4088 if( !p->writableSchema ){
4089 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
4090 p->writableSchema = 1;
4092 zIns = sqlite3_mprintf(
4093 "INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)"
4094 "VALUES('table','%q','%q',0,'%q');",
4095 zTable, zTable, zSql);
4096 shell_check_oom(zIns);
4097 utf8_printf(p->out, "%s\n", zIns);
4098 sqlite3_free(zIns);
4099 return 0;
4100 }else{
4101 printSchemaLine(p->out, zSql, ";\n");
4104 if( strcmp(zType, "table")==0 ){
4105 ShellText sSelect;
4106 ShellText sTable;
4107 char **azCol;
4108 int i;
4109 char *savedDestTable;
4110 int savedMode;
4112 azCol = tableColumnList(p, zTable);
4113 if( azCol==0 ){
4114 p->nErr++;
4115 return 0;
4118 /* Always quote the table name, even if it appears to be pure ascii,
4119 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
4120 initText(&sTable);
4121 appendText(&sTable, zTable, quoteChar(zTable));
4122 /* If preserving the rowid, add a column list after the table name.
4123 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
4124 ** instead of the usual "INSERT INTO tab VALUES(...)".
4126 if( azCol[0] ){
4127 appendText(&sTable, "(", 0);
4128 appendText(&sTable, azCol[0], 0);
4129 for(i=1; azCol[i]; i++){
4130 appendText(&sTable, ",", 0);
4131 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
4133 appendText(&sTable, ")", 0);
4136 /* Build an appropriate SELECT statement */
4137 initText(&sSelect);
4138 appendText(&sSelect, "SELECT ", 0);
4139 if( azCol[0] ){
4140 appendText(&sSelect, azCol[0], 0);
4141 appendText(&sSelect, ",", 0);
4143 for(i=1; azCol[i]; i++){
4144 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
4145 if( azCol[i+1] ){
4146 appendText(&sSelect, ",", 0);
4149 freeColumnList(azCol);
4150 appendText(&sSelect, " FROM ", 0);
4151 appendText(&sSelect, zTable, quoteChar(zTable));
4153 savedDestTable = p->zDestTable;
4154 savedMode = p->mode;
4155 p->zDestTable = sTable.z;
4156 p->mode = p->cMode = MODE_Insert;
4157 rc = shell_exec(p, sSelect.z, 0);
4158 if( (rc&0xff)==SQLITE_CORRUPT ){
4159 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4160 toggleSelectOrder(p->db);
4161 shell_exec(p, sSelect.z, 0);
4162 toggleSelectOrder(p->db);
4164 p->zDestTable = savedDestTable;
4165 p->mode = savedMode;
4166 freeText(&sTable);
4167 freeText(&sSelect);
4168 if( rc ) p->nErr++;
4170 return 0;
4174 ** Run zQuery. Use dump_callback() as the callback routine so that
4175 ** the contents of the query are output as SQL statements.
4177 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
4178 ** "ORDER BY rowid DESC" to the end.
4180 static int run_schema_dump_query(
4181 ShellState *p,
4182 const char *zQuery
4184 int rc;
4185 char *zErr = 0;
4186 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
4187 if( rc==SQLITE_CORRUPT ){
4188 char *zQ2;
4189 int len = strlen30(zQuery);
4190 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4191 if( zErr ){
4192 utf8_printf(p->out, "/****** %s ******/\n", zErr);
4193 sqlite3_free(zErr);
4194 zErr = 0;
4196 zQ2 = malloc( len+100 );
4197 if( zQ2==0 ) return rc;
4198 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
4199 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4200 if( rc ){
4201 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
4202 }else{
4203 rc = SQLITE_CORRUPT;
4205 sqlite3_free(zErr);
4206 free(zQ2);
4208 return rc;
4212 ** Text of help messages.
4214 ** The help text for each individual command begins with a line that starts
4215 ** with ".". Subsequent lines are supplimental information.
4217 ** There must be two or more spaces between the end of the command and the
4218 ** start of the description of what that command does.
4220 static const char *(azHelp[]) = {
4221 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
4222 ".archive ... Manage SQL archives",
4223 " Each command must have exactly one of the following options:",
4224 " -c, --create Create a new archive",
4225 " -u, --update Add or update files with changed mtime",
4226 " -i, --insert Like -u but always add even if unchanged",
4227 " -r, --remove Remove files from archive",
4228 " -t, --list List contents of archive",
4229 " -x, --extract Extract files from archive",
4230 " Optional arguments:",
4231 " -v, --verbose Print each filename as it is processed",
4232 " -f FILE, --file FILE Use archive FILE (default is current db)",
4233 " -a FILE, --append FILE Open FILE using the apndvfs VFS",
4234 " -C DIR, --directory DIR Read/extract files from directory DIR",
4235 " -g, --glob Use glob matching for names in archive",
4236 " -n, --dryrun Show the SQL that would have occurred",
4237 " Examples:",
4238 " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar",
4239 " .ar -tf ARCHIVE # List members of ARCHIVE",
4240 " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE",
4241 " See also:",
4242 " http://sqlite.org/cli.html#sqlite_archive_support",
4243 #endif
4244 #ifndef SQLITE_OMIT_AUTHORIZATION
4245 ".auth ON|OFF Show authorizer callbacks",
4246 #endif
4247 ".backup ?DB? FILE Backup DB (default \"main\") to FILE",
4248 " Options:",
4249 " --append Use the appendvfs",
4250 " --async Write to FILE without journal and fsync()",
4251 ".bail on|off Stop after hitting an error. Default OFF",
4252 ".binary on|off Turn binary output on or off. Default OFF",
4253 ".cd DIRECTORY Change the working directory to DIRECTORY",
4254 ".changes on|off Show number of rows changed by SQL",
4255 ".check GLOB Fail if output since .testcase does not match",
4256 ".clone NEWDB Clone data into NEWDB from the existing database",
4257 ".connection [close] [#] Open or close an auxiliary database connection",
4258 ".databases List names and files of attached databases",
4259 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
4260 ".dbinfo ?DB? Show status information about the database",
4261 ".dump ?OBJECTS? Render database content as SQL",
4262 " Options:",
4263 " --data-only Output only INSERT statements",
4264 " --newlines Allow unescaped newline characters in output",
4265 " --nosys Omit system tables (ex: \"sqlite_stat1\")",
4266 " --preserve-rowids Include ROWID values in the output",
4267 " OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump",
4268 " Additional LIKE patterns can be given in subsequent arguments",
4269 ".echo on|off Turn command echo on or off",
4270 ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN",
4271 " Other Modes:",
4272 #ifdef SQLITE_DEBUG
4273 " test Show raw EXPLAIN QUERY PLAN output",
4274 " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"",
4275 #endif
4276 " trigger Like \"full\" but also show trigger bytecode",
4277 ".excel Display the output of next command in spreadsheet",
4278 " --bom Put a UTF8 byte-order mark on intermediate file",
4279 ".exit ?CODE? Exit this program with return-code CODE",
4280 ".expert EXPERIMENTAL. Suggest indexes for queries",
4281 ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto",
4282 ".filectrl CMD ... Run various sqlite3_file_control() operations",
4283 " --schema SCHEMA Use SCHEMA instead of \"main\"",
4284 " --help Show CMD details",
4285 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables",
4286 ".headers on|off Turn display of headers on or off",
4287 ".help ?-all? ?PATTERN? Show help text for PATTERN",
4288 ".import FILE TABLE Import data from FILE into TABLE",
4289 " Options:",
4290 " --ascii Use \\037 and \\036 as column and row separators",
4291 " --csv Use , and \\n as column and row separators",
4292 " --skip N Skip the first N rows of input",
4293 " --schema S Target table to be S.TABLE",
4294 " -v \"Verbose\" - increase auxiliary output",
4295 " Notes:",
4296 " * If TABLE does not exist, it is created. The first row of input",
4297 " determines the column names.",
4298 " * If neither --csv or --ascii are used, the input mode is derived",
4299 " from the \".mode\" output mode",
4300 " * If FILE begins with \"|\" then it is a command that generates the",
4301 " input text.",
4302 #ifndef SQLITE_OMIT_TEST_CONTROL
4303 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX",
4304 #endif
4305 ".indexes ?TABLE? Show names of indexes",
4306 " If TABLE is specified, only show indexes for",
4307 " tables matching TABLE using the LIKE operator.",
4308 #ifdef SQLITE_ENABLE_IOTRACE
4309 ".iotrace FILE Enable I/O diagnostic logging to FILE",
4310 #endif
4311 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT",
4312 ".lint OPTIONS Report potential schema issues.",
4313 " Options:",
4314 " fkey-indexes Find missing foreign key indexes",
4315 #ifndef SQLITE_OMIT_LOAD_EXTENSION
4316 ".load FILE ?ENTRY? Load an extension library",
4317 #endif
4318 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout",
4319 ".mode MODE ?OPTIONS? Set output mode",
4320 " MODE is one of:",
4321 " ascii Columns/rows delimited by 0x1F and 0x1E",
4322 " box Tables using unicode box-drawing characters",
4323 " csv Comma-separated values",
4324 " column Output in columns. (See .width)",
4325 " html HTML <table> code",
4326 " insert SQL insert statements for TABLE",
4327 " json Results in a JSON array",
4328 " line One value per line",
4329 " list Values delimited by \"|\"",
4330 " markdown Markdown table format",
4331 " qbox Shorthand for \"box --width 60 --quote\"",
4332 " quote Escape answers as for SQL",
4333 " table ASCII-art table",
4334 " tabs Tab-separated values",
4335 " tcl TCL list elements",
4336 " OPTIONS: (for columnar modes or insert mode):",
4337 " --wrap N Wrap output lines to no longer than N characters",
4338 " --wordwrap B Wrap or not at word boundaries per B (on/off)",
4339 " --ww Shorthand for \"--wordwrap 1\"",
4340 " --quote Quote output text as SQL literals",
4341 " --noquote Do not quote output text",
4342 " TABLE The name of SQL table used for \"insert\" mode",
4343 ".nonce STRING Suspend safe mode for one command if nonce matches",
4344 ".nullvalue STRING Use STRING in place of NULL values",
4345 ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE",
4346 " If FILE begins with '|' then open as a pipe",
4347 " --bom Put a UTF8 byte-order mark at the beginning",
4348 " -e Send output to the system text editor",
4349 " -x Send output as CSV to a spreadsheet (same as \".excel\")",
4350 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE",
4351 " Options:",
4352 " --append Use appendvfs to append database to the end of FILE",
4353 #ifndef SQLITE_OMIT_DESERIALIZE
4354 " --deserialize Load into memory using sqlite3_deserialize()",
4355 " --hexdb Load the output of \"dbtotxt\" as an in-memory db",
4356 " --maxsize N Maximum size for --hexdb or --deserialized database",
4357 #endif
4358 " --new Initialize FILE to an empty database",
4359 " --nofollow Do not follow symbolic links",
4360 " --readonly Open FILE readonly",
4361 " --zip FILE is a ZIP archive",
4362 ".output ?FILE? Send output to FILE or stdout if FILE is omitted",
4363 " If FILE begins with '|' then open it as a pipe.",
4364 " Options:",
4365 " --bom Prefix output with a UTF8 byte-order mark",
4366 " -e Send output to the system text editor",
4367 " -x Send output as CSV to a spreadsheet",
4368 ".parameter CMD ... Manage SQL parameter bindings",
4369 " clear Erase all bindings",
4370 " init Initialize the TEMP table that holds bindings",
4371 " list List the current parameter bindings",
4372 " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE",
4373 " PARAMETER should start with one of: $ : @ ?",
4374 " unset PARAMETER Remove PARAMETER from the binding table",
4375 ".print STRING... Print literal STRING",
4376 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
4377 ".progress N Invoke progress handler after every N opcodes",
4378 " --limit N Interrupt after N progress callbacks",
4379 " --once Do no more than one progress interrupt",
4380 " --quiet|-q No output except at interrupts",
4381 " --reset Reset the count for each input and interrupt",
4382 #endif
4383 ".prompt MAIN CONTINUE Replace the standard prompts",
4384 ".quit Exit this program",
4385 ".read FILE Read input from FILE or command output",
4386 " If FILE begins with \"|\", it is a command that generates the input.",
4387 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4388 ".recover Recover as much data as possible from corrupt db.",
4389 " --freelist-corrupt Assume the freelist is corrupt",
4390 " --recovery-db NAME Store recovery metadata in database file NAME",
4391 " --lost-and-found TABLE Alternative name for the lost-and-found table",
4392 " --no-rowids Do not attempt to recover rowid values",
4393 " that are not also INTEGER PRIMARY KEYs",
4394 #endif
4395 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE",
4396 ".save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)",
4397 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off",
4398 ".schema ?PATTERN? Show the CREATE statements matching PATTERN",
4399 " Options:",
4400 " --indent Try to pretty-print the schema",
4401 " --nosys Omit objects whose names start with \"sqlite_\"",
4402 ".selftest ?OPTIONS? Run tests defined in the SELFTEST table",
4403 " Options:",
4404 " --init Create a new SELFTEST table",
4405 " -v Verbose output",
4406 ".separator COL ?ROW? Change the column and row separators",
4407 #if defined(SQLITE_ENABLE_SESSION)
4408 ".session ?NAME? CMD ... Create or control sessions",
4409 " Subcommands:",
4410 " attach TABLE Attach TABLE",
4411 " changeset FILE Write a changeset into FILE",
4412 " close Close one session",
4413 " enable ?BOOLEAN? Set or query the enable bit",
4414 " filter GLOB... Reject tables matching GLOBs",
4415 " indirect ?BOOLEAN? Mark or query the indirect status",
4416 " isempty Query whether the session is empty",
4417 " list List currently open session names",
4418 " open DB NAME Open a new session on DB",
4419 " patchset FILE Write a patchset into FILE",
4420 " If ?NAME? is omitted, the first defined session is used.",
4421 #endif
4422 ".sha3sum ... Compute a SHA3 hash of database content",
4423 " Options:",
4424 " --schema Also hash the sqlite_schema table",
4425 " --sha3-224 Use the sha3-224 algorithm",
4426 " --sha3-256 Use the sha3-256 algorithm (default)",
4427 " --sha3-384 Use the sha3-384 algorithm",
4428 " --sha3-512 Use the sha3-512 algorithm",
4429 " Any other argument is a LIKE pattern for tables to hash",
4430 #ifndef SQLITE_NOHAVE_SYSTEM
4431 ".shell CMD ARGS... Run CMD ARGS... in a system shell",
4432 #endif
4433 ".show Show the current values for various settings",
4434 ".stats ?ARG? Show stats or turn stats on or off",
4435 " off Turn off automatic stat display",
4436 " on Turn on automatic stat display",
4437 " stmt Show statement stats",
4438 " vmstep Show the virtual machine step count only",
4439 #ifndef SQLITE_NOHAVE_SYSTEM
4440 ".system CMD ARGS... Run CMD ARGS... in a system shell",
4441 #endif
4442 ".tables ?TABLE? List names of tables matching LIKE pattern TABLE",
4443 ".testcase NAME Begin redirecting output to 'testcase-out.txt'",
4444 ".testctrl CMD ... Run various sqlite3_test_control() operations",
4445 " Run \".testctrl\" with no arguments for details",
4446 ".timeout MS Try opening locked tables for MS milliseconds",
4447 ".timer on|off Turn SQL timer on or off",
4448 #ifndef SQLITE_OMIT_TRACE
4449 ".trace ?OPTIONS? Output each SQL statement as it is run",
4450 " FILE Send output to FILE",
4451 " stdout Send output to stdout",
4452 " stderr Send output to stderr",
4453 " off Disable tracing",
4454 " --expanded Expand query parameters",
4455 #ifdef SQLITE_ENABLE_NORMALIZE
4456 " --normalized Normal the SQL statements",
4457 #endif
4458 " --plain Show SQL as it is input",
4459 " --stmt Trace statement execution (SQLITE_TRACE_STMT)",
4460 " --profile Profile statements (SQLITE_TRACE_PROFILE)",
4461 " --row Trace each row (SQLITE_TRACE_ROW)",
4462 " --close Trace connection close (SQLITE_TRACE_CLOSE)",
4463 #endif /* SQLITE_OMIT_TRACE */
4464 #ifdef SQLITE_DEBUG
4465 ".unmodule NAME ... Unregister virtual table modules",
4466 " --allexcept Unregister everything except those named",
4467 #endif
4468 ".vfsinfo ?AUX? Information about the top-level VFS",
4469 ".vfslist List all available VFSes",
4470 ".vfsname ?AUX? Print the name of the VFS stack",
4471 ".width NUM1 NUM2 ... Set minimum column widths for columnar output",
4472 " Negative values right-justify",
4476 ** Output help text.
4478 ** zPattern describes the set of commands for which help text is provided.
4479 ** If zPattern is NULL, then show all commands, but only give a one-line
4480 ** description of each.
4482 ** Return the number of matches.
4484 static int showHelp(FILE *out, const char *zPattern){
4485 int i = 0;
4486 int j = 0;
4487 int n = 0;
4488 char *zPat;
4489 if( zPattern==0
4490 || zPattern[0]=='0'
4491 || strcmp(zPattern,"-a")==0
4492 || strcmp(zPattern,"-all")==0
4493 || strcmp(zPattern,"--all")==0
4495 /* Show all commands, but only one line per command */
4496 if( zPattern==0 ) zPattern = "";
4497 for(i=0; i<ArraySize(azHelp); i++){
4498 if( azHelp[i][0]=='.' || zPattern[0] ){
4499 utf8_printf(out, "%s\n", azHelp[i]);
4500 n++;
4503 }else{
4504 /* Look for commands that for which zPattern is an exact prefix */
4505 zPat = sqlite3_mprintf(".%s*", zPattern);
4506 shell_check_oom(zPat);
4507 for(i=0; i<ArraySize(azHelp); i++){
4508 if( sqlite3_strglob(zPat, azHelp[i])==0 ){
4509 utf8_printf(out, "%s\n", azHelp[i]);
4510 j = i+1;
4511 n++;
4514 sqlite3_free(zPat);
4515 if( n ){
4516 if( n==1 ){
4517 /* when zPattern is a prefix of exactly one command, then include the
4518 ** details of that command, which should begin at offset j */
4519 while( j<ArraySize(azHelp)-1 && azHelp[j][0]!='.' ){
4520 utf8_printf(out, "%s\n", azHelp[j]);
4521 j++;
4524 return n;
4526 /* Look for commands that contain zPattern anywhere. Show the complete
4527 ** text of all commands that match. */
4528 zPat = sqlite3_mprintf("%%%s%%", zPattern);
4529 shell_check_oom(zPat);
4530 for(i=0; i<ArraySize(azHelp); i++){
4531 if( azHelp[i][0]=='.' ) j = i;
4532 if( sqlite3_strlike(zPat, azHelp[i], 0)==0 ){
4533 utf8_printf(out, "%s\n", azHelp[j]);
4534 while( j<ArraySize(azHelp)-1 && azHelp[j+1][0]!='.' ){
4535 j++;
4536 utf8_printf(out, "%s\n", azHelp[j]);
4538 i = j;
4539 n++;
4542 sqlite3_free(zPat);
4544 return n;
4547 /* Forward reference */
4548 static int process_input(ShellState *p);
4551 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
4552 ** and return a pointer to the buffer. The caller is responsible for freeing
4553 ** the memory.
4555 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4556 ** read.
4558 ** For convenience, a nul-terminator byte is always appended to the data read
4559 ** from the file before the buffer is returned. This byte is not included in
4560 ** the final value of (*pnByte), if applicable.
4562 ** NULL is returned if any error is encountered. The final value of *pnByte
4563 ** is undefined in this case.
4565 static char *readFile(const char *zName, int *pnByte){
4566 FILE *in = fopen(zName, "rb");
4567 long nIn;
4568 size_t nRead;
4569 char *pBuf;
4570 if( in==0 ) return 0;
4571 fseek(in, 0, SEEK_END);
4572 nIn = ftell(in);
4573 rewind(in);
4574 pBuf = sqlite3_malloc64( nIn+1 );
4575 if( pBuf==0 ){ fclose(in); return 0; }
4576 nRead = fread(pBuf, nIn, 1, in);
4577 fclose(in);
4578 if( nRead!=1 ){
4579 sqlite3_free(pBuf);
4580 return 0;
4582 pBuf[nIn] = 0;
4583 if( pnByte ) *pnByte = nIn;
4584 return pBuf;
4587 #if defined(SQLITE_ENABLE_SESSION)
4589 ** Close a single OpenSession object and release all of its associated
4590 ** resources.
4592 static void session_close(OpenSession *pSession){
4593 int i;
4594 sqlite3session_delete(pSession->p);
4595 sqlite3_free(pSession->zName);
4596 for(i=0; i<pSession->nFilter; i++){
4597 sqlite3_free(pSession->azFilter[i]);
4599 sqlite3_free(pSession->azFilter);
4600 memset(pSession, 0, sizeof(OpenSession));
4602 #endif
4605 ** Close all OpenSession objects and release all associated resources.
4607 #if defined(SQLITE_ENABLE_SESSION)
4608 static void session_close_all(ShellState *p, int i){
4609 int j;
4610 struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i];
4611 for(j=0; j<pAuxDb->nSession; j++){
4612 session_close(&pAuxDb->aSession[j]);
4614 pAuxDb->nSession = 0;
4616 #else
4617 # define session_close_all(X,Y)
4618 #endif
4621 ** Implementation of the xFilter function for an open session. Omit
4622 ** any tables named by ".session filter" but let all other table through.
4624 #if defined(SQLITE_ENABLE_SESSION)
4625 static int session_filter(void *pCtx, const char *zTab){
4626 OpenSession *pSession = (OpenSession*)pCtx;
4627 int i;
4628 for(i=0; i<pSession->nFilter; i++){
4629 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4631 return 1;
4633 #endif
4636 ** Try to deduce the type of file for zName based on its content. Return
4637 ** one of the SHELL_OPEN_* constants.
4639 ** If the file does not exist or is empty but its name looks like a ZIP
4640 ** archive and the dfltZip flag is true, then assume it is a ZIP archive.
4641 ** Otherwise, assume an ordinary database regardless of the filename if
4642 ** the type cannot be determined from content.
4644 int deduceDatabaseType(const char *zName, int dfltZip){
4645 FILE *f = fopen(zName, "rb");
4646 size_t n;
4647 int rc = SHELL_OPEN_UNSPEC;
4648 char zBuf[100];
4649 if( f==0 ){
4650 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4651 return SHELL_OPEN_ZIPFILE;
4652 }else{
4653 return SHELL_OPEN_NORMAL;
4656 n = fread(zBuf, 16, 1, f);
4657 if( n==1 && memcmp(zBuf, "SQLite format 3", 16)==0 ){
4658 fclose(f);
4659 return SHELL_OPEN_NORMAL;
4661 fseek(f, -25, SEEK_END);
4662 n = fread(zBuf, 25, 1, f);
4663 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
4664 rc = SHELL_OPEN_APPENDVFS;
4665 }else{
4666 fseek(f, -22, SEEK_END);
4667 n = fread(zBuf, 22, 1, f);
4668 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
4669 && zBuf[3]==0x06 ){
4670 rc = SHELL_OPEN_ZIPFILE;
4671 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
4672 rc = SHELL_OPEN_ZIPFILE;
4675 fclose(f);
4676 return rc;
4679 #ifndef SQLITE_OMIT_DESERIALIZE
4681 ** Reconstruct an in-memory database using the output from the "dbtotxt"
4682 ** program. Read content from the file in p->aAuxDb[].zDbFilename.
4683 ** If p->aAuxDb[].zDbFilename is 0, then read from standard input.
4685 static unsigned char *readHexDb(ShellState *p, int *pnData){
4686 unsigned char *a = 0;
4687 int nLine;
4688 int n = 0;
4689 int pgsz = 0;
4690 int iOffset = 0;
4691 int j, k;
4692 int rc;
4693 FILE *in;
4694 const char *zDbFilename = p->pAuxDb->zDbFilename;
4695 unsigned int x[16];
4696 char zLine[1000];
4697 if( zDbFilename ){
4698 in = fopen(zDbFilename, "r");
4699 if( in==0 ){
4700 utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename);
4701 return 0;
4703 nLine = 0;
4704 }else{
4705 in = p->in;
4706 nLine = p->lineno;
4707 if( in==0 ) in = stdin;
4709 *pnData = 0;
4710 nLine++;
4711 if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error;
4712 rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz);
4713 if( rc!=2 ) goto readHexDb_error;
4714 if( n<0 ) goto readHexDb_error;
4715 if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error;
4716 n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */
4717 a = sqlite3_malloc( n ? n : 1 );
4718 shell_check_oom(a);
4719 memset(a, 0, n);
4720 if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){
4721 utf8_printf(stderr, "invalid pagesize\n");
4722 goto readHexDb_error;
4724 for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){
4725 rc = sscanf(zLine, "| page %d offset %d", &j, &k);
4726 if( rc==2 ){
4727 iOffset = k;
4728 continue;
4730 if( strncmp(zLine, "| end ", 6)==0 ){
4731 break;
4733 rc = sscanf(zLine,"| %d: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
4734 &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7],
4735 &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]);
4736 if( rc==17 ){
4737 k = iOffset+j;
4738 if( k+16<=n && k>=0 ){
4739 int ii;
4740 for(ii=0; ii<16; ii++) a[k+ii] = x[ii]&0xff;
4744 *pnData = n;
4745 if( in!=p->in ){
4746 fclose(in);
4747 }else{
4748 p->lineno = nLine;
4750 return a;
4752 readHexDb_error:
4753 if( in!=p->in ){
4754 fclose(in);
4755 }else{
4756 while( fgets(zLine, sizeof(zLine), p->in)!=0 ){
4757 nLine++;
4758 if(strncmp(zLine, "| end ", 6)==0 ) break;
4760 p->lineno = nLine;
4762 sqlite3_free(a);
4763 utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine);
4764 return 0;
4766 #endif /* SQLITE_OMIT_DESERIALIZE */
4769 ** Scalar function "shell_int32". The first argument to this function
4770 ** must be a blob. The second a non-negative integer. This function
4771 ** reads and returns a 32-bit big-endian integer from byte
4772 ** offset (4*<arg2>) of the blob.
4774 static void shellInt32(
4775 sqlite3_context *context,
4776 int argc,
4777 sqlite3_value **argv
4779 const unsigned char *pBlob;
4780 int nBlob;
4781 int iInt;
4783 UNUSED_PARAMETER(argc);
4784 nBlob = sqlite3_value_bytes(argv[0]);
4785 pBlob = (const unsigned char*)sqlite3_value_blob(argv[0]);
4786 iInt = sqlite3_value_int(argv[1]);
4788 if( iInt>=0 && (iInt+1)*4<=nBlob ){
4789 const unsigned char *a = &pBlob[iInt*4];
4790 sqlite3_int64 iVal = ((sqlite3_int64)a[0]<<24)
4791 + ((sqlite3_int64)a[1]<<16)
4792 + ((sqlite3_int64)a[2]<< 8)
4793 + ((sqlite3_int64)a[3]<< 0);
4794 sqlite3_result_int64(context, iVal);
4799 ** Scalar function "shell_idquote(X)" returns string X quoted as an identifier,
4800 ** using "..." with internal double-quote characters doubled.
4802 static void shellIdQuote(
4803 sqlite3_context *context,
4804 int argc,
4805 sqlite3_value **argv
4807 const char *zName = (const char*)sqlite3_value_text(argv[0]);
4808 UNUSED_PARAMETER(argc);
4809 if( zName ){
4810 char *z = sqlite3_mprintf("\"%w\"", zName);
4811 sqlite3_result_text(context, z, -1, sqlite3_free);
4816 ** Scalar function "usleep(X)" invokes sqlite3_sleep(X) and returns X.
4818 static void shellUSleepFunc(
4819 sqlite3_context *context,
4820 int argcUnused,
4821 sqlite3_value **argv
4823 int sleep = sqlite3_value_int(argv[0]);
4824 (void)argcUnused;
4825 sqlite3_sleep(sleep/1000);
4826 sqlite3_result_int(context, sleep);
4830 ** Scalar function "shell_escape_crnl" used by the .recover command.
4831 ** The argument passed to this function is the output of built-in
4832 ** function quote(). If the first character of the input is "'",
4833 ** indicating that the value passed to quote() was a text value,
4834 ** then this function searches the input for "\n" and "\r" characters
4835 ** and adds a wrapper similar to the following:
4837 ** replace(replace(<input>, '\n', char(10), '\r', char(13));
4839 ** Or, if the first character of the input is not "'", then a copy
4840 ** of the input is returned.
4842 static void shellEscapeCrnl(
4843 sqlite3_context *context,
4844 int argc,
4845 sqlite3_value **argv
4847 const char *zText = (const char*)sqlite3_value_text(argv[0]);
4848 UNUSED_PARAMETER(argc);
4849 if( zText && zText[0]=='\'' ){
4850 int nText = sqlite3_value_bytes(argv[0]);
4851 int i;
4852 char zBuf1[20];
4853 char zBuf2[20];
4854 const char *zNL = 0;
4855 const char *zCR = 0;
4856 int nCR = 0;
4857 int nNL = 0;
4859 for(i=0; zText[i]; i++){
4860 if( zNL==0 && zText[i]=='\n' ){
4861 zNL = unused_string(zText, "\\n", "\\012", zBuf1);
4862 nNL = (int)strlen(zNL);
4864 if( zCR==0 && zText[i]=='\r' ){
4865 zCR = unused_string(zText, "\\r", "\\015", zBuf2);
4866 nCR = (int)strlen(zCR);
4870 if( zNL || zCR ){
4871 int iOut = 0;
4872 i64 nMax = (nNL > nCR) ? nNL : nCR;
4873 i64 nAlloc = nMax * nText + (nMax+64)*2;
4874 char *zOut = (char*)sqlite3_malloc64(nAlloc);
4875 if( zOut==0 ){
4876 sqlite3_result_error_nomem(context);
4877 return;
4880 if( zNL && zCR ){
4881 memcpy(&zOut[iOut], "replace(replace(", 16);
4882 iOut += 16;
4883 }else{
4884 memcpy(&zOut[iOut], "replace(", 8);
4885 iOut += 8;
4887 for(i=0; zText[i]; i++){
4888 if( zText[i]=='\n' ){
4889 memcpy(&zOut[iOut], zNL, nNL);
4890 iOut += nNL;
4891 }else if( zText[i]=='\r' ){
4892 memcpy(&zOut[iOut], zCR, nCR);
4893 iOut += nCR;
4894 }else{
4895 zOut[iOut] = zText[i];
4896 iOut++;
4900 if( zNL ){
4901 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4902 memcpy(&zOut[iOut], zNL, nNL); iOut += nNL;
4903 memcpy(&zOut[iOut], "', char(10))", 12); iOut += 12;
4905 if( zCR ){
4906 memcpy(&zOut[iOut], ",'", 2); iOut += 2;
4907 memcpy(&zOut[iOut], zCR, nCR); iOut += nCR;
4908 memcpy(&zOut[iOut], "', char(13))", 12); iOut += 12;
4911 sqlite3_result_text(context, zOut, iOut, SQLITE_TRANSIENT);
4912 sqlite3_free(zOut);
4913 return;
4917 sqlite3_result_value(context, argv[0]);
4920 /* Flags for open_db().
4922 ** The default behavior of open_db() is to exit(1) if the database fails to
4923 ** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
4924 ** but still returns without calling exit.
4926 ** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
4927 ** ZIP archive if the file does not exist or is empty and its name matches
4928 ** the *.zip pattern.
4930 #define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */
4931 #define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */
4934 ** Make sure the database is open. If it is not, then open it. If
4935 ** the database fails to open, print an error message and exit.
4937 static void open_db(ShellState *p, int openFlags){
4938 if( p->db==0 ){
4939 const char *zDbFilename = p->pAuxDb->zDbFilename;
4940 if( p->openMode==SHELL_OPEN_UNSPEC ){
4941 if( zDbFilename==0 || zDbFilename[0]==0 ){
4942 p->openMode = SHELL_OPEN_NORMAL;
4943 }else{
4944 p->openMode = (u8)deduceDatabaseType(zDbFilename,
4945 (openFlags & OPEN_DB_ZIPFILE)!=0);
4948 switch( p->openMode ){
4949 case SHELL_OPEN_APPENDVFS: {
4950 sqlite3_open_v2(zDbFilename, &p->db,
4951 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
4952 break;
4954 case SHELL_OPEN_HEXDB:
4955 case SHELL_OPEN_DESERIALIZE: {
4956 sqlite3_open(0, &p->db);
4957 break;
4959 case SHELL_OPEN_ZIPFILE: {
4960 sqlite3_open(":memory:", &p->db);
4961 break;
4963 case SHELL_OPEN_READONLY: {
4964 sqlite3_open_v2(zDbFilename, &p->db,
4965 SQLITE_OPEN_READONLY|p->openFlags, 0);
4966 break;
4968 case SHELL_OPEN_UNSPEC:
4969 case SHELL_OPEN_NORMAL: {
4970 sqlite3_open_v2(zDbFilename, &p->db,
4971 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
4972 break;
4975 globalDb = p->db;
4976 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4977 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4978 zDbFilename, sqlite3_errmsg(p->db));
4979 if( openFlags & OPEN_DB_KEEPALIVE ){
4980 sqlite3_open(":memory:", &p->db);
4981 return;
4983 exit(1);
4985 #ifndef SQLITE_OMIT_LOAD_EXTENSION
4986 sqlite3_enable_load_extension(p->db, 1);
4987 #endif
4988 sqlite3_fileio_init(p->db, 0, 0);
4989 sqlite3_shathree_init(p->db, 0, 0);
4990 sqlite3_completion_init(p->db, 0, 0);
4991 sqlite3_uint_init(p->db, 0, 0);
4992 sqlite3_decimal_init(p->db, 0, 0);
4993 sqlite3_regexp_init(p->db, 0, 0);
4994 sqlite3_ieee_init(p->db, 0, 0);
4995 sqlite3_series_init(p->db, 0, 0);
4996 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
4997 sqlite3_dbdata_init(p->db, 0, 0);
4998 #endif
4999 #ifdef SQLITE_HAVE_ZLIB
5000 sqlite3_zipfile_init(p->db, 0, 0);
5001 sqlite3_sqlar_init(p->db, 0, 0);
5002 #endif
5003 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
5004 shellAddSchemaName, 0, 0);
5005 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
5006 shellModuleSchema, 0, 0);
5007 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
5008 shellPutsFunc, 0, 0);
5009 sqlite3_create_function(p->db, "shell_escape_crnl", 1, SQLITE_UTF8, 0,
5010 shellEscapeCrnl, 0, 0);
5011 sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0,
5012 shellInt32, 0, 0);
5013 sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0,
5014 shellIdQuote, 0, 0);
5015 sqlite3_create_function(p->db, "usleep",1,SQLITE_UTF8,0,
5016 shellUSleepFunc, 0, 0);
5017 #ifndef SQLITE_NOHAVE_SYSTEM
5018 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
5019 editFunc, 0, 0);
5020 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
5021 editFunc, 0, 0);
5022 #endif
5023 if( p->openMode==SHELL_OPEN_ZIPFILE ){
5024 char *zSql = sqlite3_mprintf(
5025 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename);
5026 shell_check_oom(zSql);
5027 sqlite3_exec(p->db, zSql, 0, 0, 0);
5028 sqlite3_free(zSql);
5030 #ifndef SQLITE_OMIT_DESERIALIZE
5031 else
5032 if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){
5033 int rc;
5034 int nData = 0;
5035 unsigned char *aData;
5036 if( p->openMode==SHELL_OPEN_DESERIALIZE ){
5037 aData = (unsigned char*)readFile(zDbFilename, &nData);
5038 }else{
5039 aData = readHexDb(p, &nData);
5040 if( aData==0 ){
5041 return;
5044 rc = sqlite3_deserialize(p->db, "main", aData, nData, nData,
5045 SQLITE_DESERIALIZE_RESIZEABLE |
5046 SQLITE_DESERIALIZE_FREEONCLOSE);
5047 if( rc ){
5048 utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc);
5050 if( p->szMax>0 ){
5051 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax);
5054 #endif
5056 if( p->bSafeModePersist && p->db!=0 ){
5057 sqlite3_set_authorizer(p->db, safeModeAuth, p);
5062 ** Attempt to close the databaes connection. Report errors.
5064 void close_db(sqlite3 *db){
5065 int rc = sqlite3_close(db);
5066 if( rc ){
5067 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
5068 rc, sqlite3_errmsg(db));
5072 #if HAVE_READLINE || HAVE_EDITLINE
5074 ** Readline completion callbacks
5076 static char *readline_completion_generator(const char *text, int state){
5077 static sqlite3_stmt *pStmt = 0;
5078 char *zRet;
5079 if( state==0 ){
5080 char *zSql;
5081 sqlite3_finalize(pStmt);
5082 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5083 " FROM completion(%Q) ORDER BY 1", text);
5084 shell_check_oom(zSql);
5085 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5086 sqlite3_free(zSql);
5088 if( sqlite3_step(pStmt)==SQLITE_ROW ){
5089 const char *z = (const char*)sqlite3_column_text(pStmt,0);
5090 zRet = z ? strdup(z) : 0;
5091 }else{
5092 sqlite3_finalize(pStmt);
5093 pStmt = 0;
5094 zRet = 0;
5096 return zRet;
5098 static char **readline_completion(const char *zText, int iStart, int iEnd){
5099 rl_attempted_completion_over = 1;
5100 return rl_completion_matches(zText, readline_completion_generator);
5103 #elif HAVE_LINENOISE
5105 ** Linenoise completion callback
5107 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
5108 int nLine = strlen30(zLine);
5109 int i, iStart;
5110 sqlite3_stmt *pStmt = 0;
5111 char *zSql;
5112 char zBuf[1000];
5114 if( nLine>sizeof(zBuf)-30 ) return;
5115 if( zLine[0]=='.' || zLine[0]=='#') return;
5116 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
5117 if( i==nLine-1 ) return;
5118 iStart = i+1;
5119 memcpy(zBuf, zLine, iStart);
5120 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
5121 " FROM completion(%Q,%Q) ORDER BY 1",
5122 &zLine[iStart], zLine);
5123 shell_check_oom(zSql);
5124 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
5125 sqlite3_free(zSql);
5126 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
5127 while( sqlite3_step(pStmt)==SQLITE_ROW ){
5128 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
5129 int nCompletion = sqlite3_column_bytes(pStmt, 0);
5130 if( iStart+nCompletion < sizeof(zBuf)-1 && zCompletion ){
5131 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
5132 linenoiseAddCompletion(lc, zBuf);
5135 sqlite3_finalize(pStmt);
5137 #endif
5140 ** Do C-language style dequoting.
5142 ** \a -> alarm
5143 ** \b -> backspace
5144 ** \t -> tab
5145 ** \n -> newline
5146 ** \v -> vertical tab
5147 ** \f -> form feed
5148 ** \r -> carriage return
5149 ** \s -> space
5150 ** \" -> "
5151 ** \' -> '
5152 ** \\ -> backslash
5153 ** \NNN -> ascii character NNN in octal
5155 static void resolve_backslashes(char *z){
5156 int i, j;
5157 char c;
5158 while( *z && *z!='\\' ) z++;
5159 for(i=j=0; (c = z[i])!=0; i++, j++){
5160 if( c=='\\' && z[i+1]!=0 ){
5161 c = z[++i];
5162 if( c=='a' ){
5163 c = '\a';
5164 }else if( c=='b' ){
5165 c = '\b';
5166 }else if( c=='t' ){
5167 c = '\t';
5168 }else if( c=='n' ){
5169 c = '\n';
5170 }else if( c=='v' ){
5171 c = '\v';
5172 }else if( c=='f' ){
5173 c = '\f';
5174 }else if( c=='r' ){
5175 c = '\r';
5176 }else if( c=='"' ){
5177 c = '"';
5178 }else if( c=='\'' ){
5179 c = '\'';
5180 }else if( c=='\\' ){
5181 c = '\\';
5182 }else if( c>='0' && c<='7' ){
5183 c -= '0';
5184 if( z[i+1]>='0' && z[i+1]<='7' ){
5185 i++;
5186 c = (c<<3) + z[i] - '0';
5187 if( z[i+1]>='0' && z[i+1]<='7' ){
5188 i++;
5189 c = (c<<3) + z[i] - '0';
5194 z[j] = c;
5196 if( j<i ) z[j] = 0;
5200 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
5201 ** for TRUE and FALSE. Return the integer value if appropriate.
5203 static int booleanValue(const char *zArg){
5204 int i;
5205 if( zArg[0]=='0' && zArg[1]=='x' ){
5206 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
5207 }else{
5208 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
5210 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
5211 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
5212 return 1;
5214 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
5215 return 0;
5217 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
5218 zArg);
5219 return 0;
5223 ** Set or clear a shell flag according to a boolean value.
5225 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
5226 if( booleanValue(zArg) ){
5227 ShellSetFlag(p, mFlag);
5228 }else{
5229 ShellClearFlag(p, mFlag);
5234 ** Close an output file, assuming it is not stderr or stdout
5236 static void output_file_close(FILE *f){
5237 if( f && f!=stdout && f!=stderr ) fclose(f);
5241 ** Try to open an output file. The names "stdout" and "stderr" are
5242 ** recognized and do the right thing. NULL is returned if the output
5243 ** filename is "off".
5245 static FILE *output_file_open(const char *zFile, int bTextMode){
5246 FILE *f;
5247 if( strcmp(zFile,"stdout")==0 ){
5248 f = stdout;
5249 }else if( strcmp(zFile, "stderr")==0 ){
5250 f = stderr;
5251 }else if( strcmp(zFile, "off")==0 ){
5252 f = 0;
5253 }else{
5254 f = fopen(zFile, bTextMode ? "w" : "wb");
5255 if( f==0 ){
5256 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5259 return f;
5262 #ifndef SQLITE_OMIT_TRACE
5264 ** A routine for handling output from sqlite3_trace().
5266 static int sql_trace_callback(
5267 unsigned mType, /* The trace type */
5268 void *pArg, /* The ShellState pointer */
5269 void *pP, /* Usually a pointer to sqlite_stmt */
5270 void *pX /* Auxiliary output */
5272 ShellState *p = (ShellState*)pArg;
5273 sqlite3_stmt *pStmt;
5274 const char *zSql;
5275 int nSql;
5276 if( p->traceOut==0 ) return 0;
5277 if( mType==SQLITE_TRACE_CLOSE ){
5278 utf8_printf(p->traceOut, "-- closing database connection\n");
5279 return 0;
5281 if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){
5282 zSql = (const char*)pX;
5283 }else{
5284 pStmt = (sqlite3_stmt*)pP;
5285 switch( p->eTraceType ){
5286 case SHELL_TRACE_EXPANDED: {
5287 zSql = sqlite3_expanded_sql(pStmt);
5288 break;
5290 #ifdef SQLITE_ENABLE_NORMALIZE
5291 case SHELL_TRACE_NORMALIZED: {
5292 zSql = sqlite3_normalized_sql(pStmt);
5293 break;
5295 #endif
5296 default: {
5297 zSql = sqlite3_sql(pStmt);
5298 break;
5302 if( zSql==0 ) return 0;
5303 nSql = strlen30(zSql);
5304 while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; }
5305 switch( mType ){
5306 case SQLITE_TRACE_ROW:
5307 case SQLITE_TRACE_STMT: {
5308 utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql);
5309 break;
5311 case SQLITE_TRACE_PROFILE: {
5312 sqlite3_int64 nNanosec = *(sqlite3_int64*)pX;
5313 utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec);
5314 break;
5317 return 0;
5319 #endif
5322 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
5323 ** a useful spot to set a debugger breakpoint.
5325 static void test_breakpoint(void){
5326 static int nCall = 0;
5327 nCall++;
5331 ** An object used to read a CSV and other files for import.
5333 typedef struct ImportCtx ImportCtx;
5334 struct ImportCtx {
5335 const char *zFile; /* Name of the input file */
5336 FILE *in; /* Read the CSV text from this input stream */
5337 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */
5338 char *z; /* Accumulated text for a field */
5339 int n; /* Number of bytes in z */
5340 int nAlloc; /* Space allocated for z[] */
5341 int nLine; /* Current line number */
5342 int nRow; /* Number of rows imported */
5343 int nErr; /* Number of errors encountered */
5344 int bNotFirst; /* True if one or more bytes already read */
5345 int cTerm; /* Character that terminated the most recent field */
5346 int cColSep; /* The column separator character. (Usually ",") */
5347 int cRowSep; /* The row separator character. (Usually "\n") */
5350 /* Clean up resourced used by an ImportCtx */
5351 static void import_cleanup(ImportCtx *p){
5352 if( p->in!=0 && p->xCloser!=0 ){
5353 p->xCloser(p->in);
5354 p->in = 0;
5356 sqlite3_free(p->z);
5357 p->z = 0;
5360 /* Append a single byte to z[] */
5361 static void import_append_char(ImportCtx *p, int c){
5362 if( p->n+1>=p->nAlloc ){
5363 p->nAlloc += p->nAlloc + 100;
5364 p->z = sqlite3_realloc64(p->z, p->nAlloc);
5365 shell_check_oom(p->z);
5367 p->z[p->n++] = (char)c;
5370 /* Read a single field of CSV text. Compatible with rfc4180 and extended
5371 ** with the option of having a separator other than ",".
5373 ** + Input comes from p->in.
5374 ** + Store results in p->z of length p->n. Space to hold p->z comes
5375 ** from sqlite3_malloc64().
5376 ** + Use p->cSep as the column separator. The default is ",".
5377 ** + Use p->rSep as the row separator. The default is "\n".
5378 ** + Keep track of the line number in p->nLine.
5379 ** + Store the character that terminates the field in p->cTerm. Store
5380 ** EOF on end-of-file.
5381 ** + Report syntax errors on stderr
5383 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
5384 int c;
5385 int cSep = p->cColSep;
5386 int rSep = p->cRowSep;
5387 p->n = 0;
5388 c = fgetc(p->in);
5389 if( c==EOF || seenInterrupt ){
5390 p->cTerm = EOF;
5391 return 0;
5393 if( c=='"' ){
5394 int pc, ppc;
5395 int startLine = p->nLine;
5396 int cQuote = c;
5397 pc = ppc = 0;
5398 while( 1 ){
5399 c = fgetc(p->in);
5400 if( c==rSep ) p->nLine++;
5401 if( c==cQuote ){
5402 if( pc==cQuote ){
5403 pc = 0;
5404 continue;
5407 if( (c==cSep && pc==cQuote)
5408 || (c==rSep && pc==cQuote)
5409 || (c==rSep && pc=='\r' && ppc==cQuote)
5410 || (c==EOF && pc==cQuote)
5412 do{ p->n--; }while( p->z[p->n]!=cQuote );
5413 p->cTerm = c;
5414 break;
5416 if( pc==cQuote && c!='\r' ){
5417 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
5418 p->zFile, p->nLine, cQuote);
5420 if( c==EOF ){
5421 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
5422 p->zFile, startLine, cQuote);
5423 p->cTerm = c;
5424 break;
5426 import_append_char(p, c);
5427 ppc = pc;
5428 pc = c;
5430 }else{
5431 /* If this is the first field being parsed and it begins with the
5432 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
5433 if( (c&0xff)==0xef && p->bNotFirst==0 ){
5434 import_append_char(p, c);
5435 c = fgetc(p->in);
5436 if( (c&0xff)==0xbb ){
5437 import_append_char(p, c);
5438 c = fgetc(p->in);
5439 if( (c&0xff)==0xbf ){
5440 p->bNotFirst = 1;
5441 p->n = 0;
5442 return csv_read_one_field(p);
5446 while( c!=EOF && c!=cSep && c!=rSep ){
5447 import_append_char(p, c);
5448 c = fgetc(p->in);
5450 if( c==rSep ){
5451 p->nLine++;
5452 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
5454 p->cTerm = c;
5456 if( p->z ) p->z[p->n] = 0;
5457 p->bNotFirst = 1;
5458 return p->z;
5461 /* Read a single field of ASCII delimited text.
5463 ** + Input comes from p->in.
5464 ** + Store results in p->z of length p->n. Space to hold p->z comes
5465 ** from sqlite3_malloc64().
5466 ** + Use p->cSep as the column separator. The default is "\x1F".
5467 ** + Use p->rSep as the row separator. The default is "\x1E".
5468 ** + Keep track of the row number in p->nLine.
5469 ** + Store the character that terminates the field in p->cTerm. Store
5470 ** EOF on end-of-file.
5471 ** + Report syntax errors on stderr
5473 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
5474 int c;
5475 int cSep = p->cColSep;
5476 int rSep = p->cRowSep;
5477 p->n = 0;
5478 c = fgetc(p->in);
5479 if( c==EOF || seenInterrupt ){
5480 p->cTerm = EOF;
5481 return 0;
5483 while( c!=EOF && c!=cSep && c!=rSep ){
5484 import_append_char(p, c);
5485 c = fgetc(p->in);
5487 if( c==rSep ){
5488 p->nLine++;
5490 p->cTerm = c;
5491 if( p->z ) p->z[p->n] = 0;
5492 return p->z;
5496 ** Try to transfer data for table zTable. If an error is seen while
5497 ** moving forward, try to go backwards. The backwards movement won't
5498 ** work for WITHOUT ROWID tables.
5500 static void tryToCloneData(
5501 ShellState *p,
5502 sqlite3 *newDb,
5503 const char *zTable
5505 sqlite3_stmt *pQuery = 0;
5506 sqlite3_stmt *pInsert = 0;
5507 char *zQuery = 0;
5508 char *zInsert = 0;
5509 int rc;
5510 int i, j, n;
5511 int nTable = strlen30(zTable);
5512 int k = 0;
5513 int cnt = 0;
5514 const int spinRate = 10000;
5516 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
5517 shell_check_oom(zQuery);
5518 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5519 if( rc ){
5520 utf8_printf(stderr, "Error %d: %s on [%s]\n",
5521 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5522 zQuery);
5523 goto end_data_xfer;
5525 n = sqlite3_column_count(pQuery);
5526 zInsert = sqlite3_malloc64(200 + nTable + n*3);
5527 shell_check_oom(zInsert);
5528 sqlite3_snprintf(200+nTable,zInsert,
5529 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
5530 i = strlen30(zInsert);
5531 for(j=1; j<n; j++){
5532 memcpy(zInsert+i, ",?", 2);
5533 i += 2;
5535 memcpy(zInsert+i, ");", 3);
5536 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
5537 if( rc ){
5538 utf8_printf(stderr, "Error %d: %s on [%s]\n",
5539 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
5540 zQuery);
5541 goto end_data_xfer;
5543 for(k=0; k<2; k++){
5544 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5545 for(i=0; i<n; i++){
5546 switch( sqlite3_column_type(pQuery, i) ){
5547 case SQLITE_NULL: {
5548 sqlite3_bind_null(pInsert, i+1);
5549 break;
5551 case SQLITE_INTEGER: {
5552 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
5553 break;
5555 case SQLITE_FLOAT: {
5556 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
5557 break;
5559 case SQLITE_TEXT: {
5560 sqlite3_bind_text(pInsert, i+1,
5561 (const char*)sqlite3_column_text(pQuery,i),
5562 -1, SQLITE_STATIC);
5563 break;
5565 case SQLITE_BLOB: {
5566 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
5567 sqlite3_column_bytes(pQuery,i),
5568 SQLITE_STATIC);
5569 break;
5572 } /* End for */
5573 rc = sqlite3_step(pInsert);
5574 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
5575 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
5576 sqlite3_errmsg(newDb));
5578 sqlite3_reset(pInsert);
5579 cnt++;
5580 if( (cnt%spinRate)==0 ){
5581 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
5582 fflush(stdout);
5584 } /* End while */
5585 if( rc==SQLITE_DONE ) break;
5586 sqlite3_finalize(pQuery);
5587 sqlite3_free(zQuery);
5588 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
5589 zTable);
5590 shell_check_oom(zQuery);
5591 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5592 if( rc ){
5593 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
5594 break;
5596 } /* End for(k=0...) */
5598 end_data_xfer:
5599 sqlite3_finalize(pQuery);
5600 sqlite3_finalize(pInsert);
5601 sqlite3_free(zQuery);
5602 sqlite3_free(zInsert);
5607 ** Try to transfer all rows of the schema that match zWhere. For
5608 ** each row, invoke xForEach() on the object defined by that row.
5609 ** If an error is encountered while moving forward through the
5610 ** sqlite_schema table, try again moving backwards.
5612 static void tryToCloneSchema(
5613 ShellState *p,
5614 sqlite3 *newDb,
5615 const char *zWhere,
5616 void (*xForEach)(ShellState*,sqlite3*,const char*)
5618 sqlite3_stmt *pQuery = 0;
5619 char *zQuery = 0;
5620 int rc;
5621 const unsigned char *zName;
5622 const unsigned char *zSql;
5623 char *zErrMsg = 0;
5625 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5626 " WHERE %s", zWhere);
5627 shell_check_oom(zQuery);
5628 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5629 if( rc ){
5630 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5631 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5632 zQuery);
5633 goto end_schema_xfer;
5635 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
5636 zName = sqlite3_column_text(pQuery, 0);
5637 zSql = sqlite3_column_text(pQuery, 1);
5638 if( zName==0 || zSql==0 ) continue;
5639 printf("%s... ", zName); fflush(stdout);
5640 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5641 if( zErrMsg ){
5642 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5643 sqlite3_free(zErrMsg);
5644 zErrMsg = 0;
5646 if( xForEach ){
5647 xForEach(p, newDb, (const char*)zName);
5649 printf("done\n");
5651 if( rc!=SQLITE_DONE ){
5652 sqlite3_finalize(pQuery);
5653 sqlite3_free(zQuery);
5654 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_schema"
5655 " WHERE %s ORDER BY rowid DESC", zWhere);
5656 shell_check_oom(zQuery);
5657 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
5658 if( rc ){
5659 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
5660 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
5661 zQuery);
5662 goto end_schema_xfer;
5664 while( sqlite3_step(pQuery)==SQLITE_ROW ){
5665 zName = sqlite3_column_text(pQuery, 0);
5666 zSql = sqlite3_column_text(pQuery, 1);
5667 if( zName==0 || zSql==0 ) continue;
5668 printf("%s... ", zName); fflush(stdout);
5669 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
5670 if( zErrMsg ){
5671 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
5672 sqlite3_free(zErrMsg);
5673 zErrMsg = 0;
5675 if( xForEach ){
5676 xForEach(p, newDb, (const char*)zName);
5678 printf("done\n");
5681 end_schema_xfer:
5682 sqlite3_finalize(pQuery);
5683 sqlite3_free(zQuery);
5687 ** Open a new database file named "zNewDb". Try to recover as much information
5688 ** as possible out of the main database (which might be corrupt) and write it
5689 ** into zNewDb.
5691 static void tryToClone(ShellState *p, const char *zNewDb){
5692 int rc;
5693 sqlite3 *newDb = 0;
5694 if( access(zNewDb,0)==0 ){
5695 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
5696 return;
5698 rc = sqlite3_open(zNewDb, &newDb);
5699 if( rc ){
5700 utf8_printf(stderr, "Cannot create output database: %s\n",
5701 sqlite3_errmsg(newDb));
5702 }else{
5703 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
5704 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
5705 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
5706 tryToCloneSchema(p, newDb, "type!='table'", 0);
5707 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
5708 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5710 close_db(newDb);
5714 ** Change the output file back to stdout.
5716 ** If the p->doXdgOpen flag is set, that means the output was being
5717 ** redirected to a temporary file named by p->zTempFile. In that case,
5718 ** launch start/open/xdg-open on that temporary file.
5720 static void output_reset(ShellState *p){
5721 if( p->outfile[0]=='|' ){
5722 #ifndef SQLITE_OMIT_POPEN
5723 pclose(p->out);
5724 #endif
5725 }else{
5726 output_file_close(p->out);
5727 #ifndef SQLITE_NOHAVE_SYSTEM
5728 if( p->doXdgOpen ){
5729 const char *zXdgOpenCmd =
5730 #if defined(_WIN32)
5731 "start";
5732 #elif defined(__APPLE__)
5733 "open";
5734 #else
5735 "xdg-open";
5736 #endif
5737 char *zCmd;
5738 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
5739 if( system(zCmd) ){
5740 utf8_printf(stderr, "Failed: [%s]\n", zCmd);
5741 }else{
5742 /* Give the start/open/xdg-open command some time to get
5743 ** going before we continue, and potential delete the
5744 ** p->zTempFile data file out from under it */
5745 sqlite3_sleep(2000);
5747 sqlite3_free(zCmd);
5748 outputModePop(p);
5749 p->doXdgOpen = 0;
5751 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
5753 p->outfile[0] = 0;
5754 p->out = stdout;
5758 ** Run an SQL command and return the single integer result.
5760 static int db_int(sqlite3 *db, const char *zSql){
5761 sqlite3_stmt *pStmt;
5762 int res = 0;
5763 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
5764 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
5765 res = sqlite3_column_int(pStmt,0);
5767 sqlite3_finalize(pStmt);
5768 return res;
5772 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
5774 static unsigned int get2byteInt(unsigned char *a){
5775 return (a[0]<<8) + a[1];
5777 static unsigned int get4byteInt(unsigned char *a){
5778 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
5782 ** Implementation of the ".dbinfo" command.
5784 ** Return 1 on error, 2 to exit, and 0 otherwise.
5786 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
5787 static const struct { const char *zName; int ofst; } aField[] = {
5788 { "file change counter:", 24 },
5789 { "database page count:", 28 },
5790 { "freelist page count:", 36 },
5791 { "schema cookie:", 40 },
5792 { "schema format:", 44 },
5793 { "default cache size:", 48 },
5794 { "autovacuum top root:", 52 },
5795 { "incremental vacuum:", 64 },
5796 { "text encoding:", 56 },
5797 { "user version:", 60 },
5798 { "application id:", 68 },
5799 { "software version:", 96 },
5801 static const struct { const char *zName; const char *zSql; } aQuery[] = {
5802 { "number of tables:",
5803 "SELECT count(*) FROM %s WHERE type='table'" },
5804 { "number of indexes:",
5805 "SELECT count(*) FROM %s WHERE type='index'" },
5806 { "number of triggers:",
5807 "SELECT count(*) FROM %s WHERE type='trigger'" },
5808 { "number of views:",
5809 "SELECT count(*) FROM %s WHERE type='view'" },
5810 { "schema size:",
5811 "SELECT total(length(sql)) FROM %s" },
5813 int i, rc;
5814 unsigned iDataVersion;
5815 char *zSchemaTab;
5816 char *zDb = nArg>=2 ? azArg[1] : "main";
5817 sqlite3_stmt *pStmt = 0;
5818 unsigned char aHdr[100];
5819 open_db(p, 0);
5820 if( p->db==0 ) return 1;
5821 rc = sqlite3_prepare_v2(p->db,
5822 "SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
5823 -1, &pStmt, 0);
5824 if( rc ){
5825 utf8_printf(stderr, "error: %s\n", sqlite3_errmsg(p->db));
5826 sqlite3_finalize(pStmt);
5827 return 1;
5829 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
5830 if( sqlite3_step(pStmt)==SQLITE_ROW
5831 && sqlite3_column_bytes(pStmt,0)>100
5833 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
5834 sqlite3_finalize(pStmt);
5835 }else{
5836 raw_printf(stderr, "unable to read database header\n");
5837 sqlite3_finalize(pStmt);
5838 return 1;
5840 i = get2byteInt(aHdr+16);
5841 if( i==1 ) i = 65536;
5842 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
5843 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
5844 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
5845 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
5846 for(i=0; i<ArraySize(aField); i++){
5847 int ofst = aField[i].ofst;
5848 unsigned int val = get4byteInt(aHdr + ofst);
5849 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
5850 switch( ofst ){
5851 case 56: {
5852 if( val==1 ) raw_printf(p->out, " (utf8)");
5853 if( val==2 ) raw_printf(p->out, " (utf16le)");
5854 if( val==3 ) raw_printf(p->out, " (utf16be)");
5857 raw_printf(p->out, "\n");
5859 if( zDb==0 ){
5860 zSchemaTab = sqlite3_mprintf("main.sqlite_schema");
5861 }else if( strcmp(zDb,"temp")==0 ){
5862 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_schema");
5863 }else{
5864 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_schema", zDb);
5866 for(i=0; i<ArraySize(aQuery); i++){
5867 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5868 int val = db_int(p->db, zSql);
5869 sqlite3_free(zSql);
5870 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5872 sqlite3_free(zSchemaTab);
5873 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_DATA_VERSION, &iDataVersion);
5874 utf8_printf(p->out, "%-20s %u\n", "data version", iDataVersion);
5875 return 0;
5879 ** Print the current sqlite3_errmsg() value to stderr and return 1.
5881 static int shellDatabaseError(sqlite3 *db){
5882 const char *zErr = sqlite3_errmsg(db);
5883 utf8_printf(stderr, "Error: %s\n", zErr);
5884 return 1;
5888 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
5889 ** if they match and FALSE (0) if they do not match.
5891 ** Globbing rules:
5893 ** '*' Matches any sequence of zero or more characters.
5895 ** '?' Matches exactly one character.
5897 ** [...] Matches one character from the enclosed list of
5898 ** characters.
5900 ** [^...] Matches one character not in the enclosed list.
5902 ** '#' Matches any sequence of one or more digits with an
5903 ** optional + or - sign in front
5905 ** ' ' Any span of whitespace matches any other span of
5906 ** whitespace.
5908 ** Extra whitespace at the end of z[] is ignored.
5910 static int testcase_glob(const char *zGlob, const char *z){
5911 int c, c2;
5912 int invert;
5913 int seen;
5915 while( (c = (*(zGlob++)))!=0 ){
5916 if( IsSpace(c) ){
5917 if( !IsSpace(*z) ) return 0;
5918 while( IsSpace(*zGlob) ) zGlob++;
5919 while( IsSpace(*z) ) z++;
5920 }else if( c=='*' ){
5921 while( (c=(*(zGlob++))) == '*' || c=='?' ){
5922 if( c=='?' && (*(z++))==0 ) return 0;
5924 if( c==0 ){
5925 return 1;
5926 }else if( c=='[' ){
5927 while( *z && testcase_glob(zGlob-1,z)==0 ){
5928 z++;
5930 return (*z)!=0;
5932 while( (c2 = (*(z++)))!=0 ){
5933 while( c2!=c ){
5934 c2 = *(z++);
5935 if( c2==0 ) return 0;
5937 if( testcase_glob(zGlob,z) ) return 1;
5939 return 0;
5940 }else if( c=='?' ){
5941 if( (*(z++))==0 ) return 0;
5942 }else if( c=='[' ){
5943 int prior_c = 0;
5944 seen = 0;
5945 invert = 0;
5946 c = *(z++);
5947 if( c==0 ) return 0;
5948 c2 = *(zGlob++);
5949 if( c2=='^' ){
5950 invert = 1;
5951 c2 = *(zGlob++);
5953 if( c2==']' ){
5954 if( c==']' ) seen = 1;
5955 c2 = *(zGlob++);
5957 while( c2 && c2!=']' ){
5958 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5959 c2 = *(zGlob++);
5960 if( c>=prior_c && c<=c2 ) seen = 1;
5961 prior_c = 0;
5962 }else{
5963 if( c==c2 ){
5964 seen = 1;
5966 prior_c = c2;
5968 c2 = *(zGlob++);
5970 if( c2==0 || (seen ^ invert)==0 ) return 0;
5971 }else if( c=='#' ){
5972 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5973 if( !IsDigit(z[0]) ) return 0;
5974 z++;
5975 while( IsDigit(z[0]) ){ z++; }
5976 }else{
5977 if( c!=(*(z++)) ) return 0;
5980 while( IsSpace(*z) ){ z++; }
5981 return *z==0;
5986 ** Compare the string as a command-line option with either one or two
5987 ** initial "-" characters.
5989 static int optionMatch(const char *zStr, const char *zOpt){
5990 if( zStr[0]!='-' ) return 0;
5991 zStr++;
5992 if( zStr[0]=='-' ) zStr++;
5993 return strcmp(zStr, zOpt)==0;
5997 ** Delete a file.
5999 int shellDeleteFile(const char *zFilename){
6000 int rc;
6001 #ifdef _WIN32
6002 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
6003 rc = _wunlink(z);
6004 sqlite3_free(z);
6005 #else
6006 rc = unlink(zFilename);
6007 #endif
6008 return rc;
6012 ** Try to delete the temporary file (if there is one) and free the
6013 ** memory used to hold the name of the temp file.
6015 static void clearTempFile(ShellState *p){
6016 if( p->zTempFile==0 ) return;
6017 if( p->doXdgOpen ) return;
6018 if( shellDeleteFile(p->zTempFile) ) return;
6019 sqlite3_free(p->zTempFile);
6020 p->zTempFile = 0;
6024 ** Create a new temp file name with the given suffix.
6026 static void newTempFile(ShellState *p, const char *zSuffix){
6027 clearTempFile(p);
6028 sqlite3_free(p->zTempFile);
6029 p->zTempFile = 0;
6030 if( p->db ){
6031 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
6033 if( p->zTempFile==0 ){
6034 /* If p->db is an in-memory database then the TEMPFILENAME file-control
6035 ** will not work and we will need to fallback to guessing */
6036 char *zTemp;
6037 sqlite3_uint64 r;
6038 sqlite3_randomness(sizeof(r), &r);
6039 zTemp = getenv("TEMP");
6040 if( zTemp==0 ) zTemp = getenv("TMP");
6041 if( zTemp==0 ){
6042 #ifdef _WIN32
6043 zTemp = "\\tmp";
6044 #else
6045 zTemp = "/tmp";
6046 #endif
6048 p->zTempFile = sqlite3_mprintf("%s/temp%llx.%s", zTemp, r, zSuffix);
6049 }else{
6050 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
6052 shell_check_oom(p->zTempFile);
6057 ** The implementation of SQL scalar function fkey_collate_clause(), used
6058 ** by the ".lint fkey-indexes" command. This scalar function is always
6059 ** called with four arguments - the parent table name, the parent column name,
6060 ** the child table name and the child column name.
6062 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
6064 ** If either of the named tables or columns do not exist, this function
6065 ** returns an empty string. An empty string is also returned if both tables
6066 ** and columns exist but have the same default collation sequence. Or,
6067 ** if both exist but the default collation sequences are different, this
6068 ** function returns the string " COLLATE <parent-collation>", where
6069 ** <parent-collation> is the default collation sequence of the parent column.
6071 static void shellFkeyCollateClause(
6072 sqlite3_context *pCtx,
6073 int nVal,
6074 sqlite3_value **apVal
6076 sqlite3 *db = sqlite3_context_db_handle(pCtx);
6077 const char *zParent;
6078 const char *zParentCol;
6079 const char *zParentSeq;
6080 const char *zChild;
6081 const char *zChildCol;
6082 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
6083 int rc;
6085 assert( nVal==4 );
6086 zParent = (const char*)sqlite3_value_text(apVal[0]);
6087 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
6088 zChild = (const char*)sqlite3_value_text(apVal[2]);
6089 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
6091 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
6092 rc = sqlite3_table_column_metadata(
6093 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
6095 if( rc==SQLITE_OK ){
6096 rc = sqlite3_table_column_metadata(
6097 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
6101 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
6102 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
6103 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
6104 sqlite3_free(z);
6110 ** The implementation of dot-command ".lint fkey-indexes".
6112 static int lintFkeyIndexes(
6113 ShellState *pState, /* Current shell tool state */
6114 char **azArg, /* Array of arguments passed to dot command */
6115 int nArg /* Number of entries in azArg[] */
6117 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
6118 FILE *out = pState->out; /* Stream to write non-error output to */
6119 int bVerbose = 0; /* If -verbose is present */
6120 int bGroupByParent = 0; /* If -groupbyparent is present */
6121 int i; /* To iterate through azArg[] */
6122 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
6123 int rc; /* Return code */
6124 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
6127 ** This SELECT statement returns one row for each foreign key constraint
6128 ** in the schema of the main database. The column values are:
6130 ** 0. The text of an SQL statement similar to:
6132 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
6134 ** This SELECT is similar to the one that the foreign keys implementation
6135 ** needs to run internally on child tables. If there is an index that can
6136 ** be used to optimize this query, then it can also be used by the FK
6137 ** implementation to optimize DELETE or UPDATE statements on the parent
6138 ** table.
6140 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
6141 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
6142 ** contains an index that can be used to optimize the query.
6144 ** 2. Human readable text that describes the child table and columns. e.g.
6146 ** "child_table(child_key1, child_key2)"
6148 ** 3. Human readable text that describes the parent table and columns. e.g.
6150 ** "parent_table(parent_key1, parent_key2)"
6152 ** 4. A full CREATE INDEX statement for an index that could be used to
6153 ** optimize DELETE or UPDATE statements on the parent table. e.g.
6155 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
6157 ** 5. The name of the parent table.
6159 ** These six values are used by the C logic below to generate the report.
6161 const char *zSql =
6162 "SELECT "
6163 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
6164 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
6165 " || fkey_collate_clause("
6166 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
6167 ", "
6168 " 'SEARCH ' || s.name || ' USING COVERING INDEX*('"
6169 " || group_concat('*=?', ' AND ') || ')'"
6170 ", "
6171 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
6172 ", "
6173 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
6174 ", "
6175 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
6176 " || ' ON ' || quote(s.name) || '('"
6177 " || group_concat(quote(f.[from]) ||"
6178 " fkey_collate_clause("
6179 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
6180 " || ');'"
6181 ", "
6182 " f.[table] "
6183 "FROM sqlite_schema AS s, pragma_foreign_key_list(s.name) AS f "
6184 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
6185 "GROUP BY s.name, f.id "
6186 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
6188 const char *zGlobIPK = "SEARCH * USING INTEGER PRIMARY KEY (rowid=?)";
6190 for(i=2; i<nArg; i++){
6191 int n = strlen30(azArg[i]);
6192 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
6193 bVerbose = 1;
6195 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
6196 bGroupByParent = 1;
6197 zIndent = " ";
6199 else{
6200 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
6201 azArg[0], azArg[1]
6203 return SQLITE_ERROR;
6207 /* Register the fkey_collate_clause() SQL function */
6208 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
6209 0, shellFkeyCollateClause, 0, 0
6213 if( rc==SQLITE_OK ){
6214 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
6216 if( rc==SQLITE_OK ){
6217 sqlite3_bind_int(pSql, 1, bGroupByParent);
6220 if( rc==SQLITE_OK ){
6221 int rc2;
6222 char *zPrev = 0;
6223 while( SQLITE_ROW==sqlite3_step(pSql) ){
6224 int res = -1;
6225 sqlite3_stmt *pExplain = 0;
6226 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
6227 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
6228 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
6229 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
6230 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
6231 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
6233 if( zEQP==0 ) continue;
6234 if( zGlob==0 ) continue;
6235 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
6236 if( rc!=SQLITE_OK ) break;
6237 if( SQLITE_ROW==sqlite3_step(pExplain) ){
6238 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
6239 res = zPlan!=0 && ( 0==sqlite3_strglob(zGlob, zPlan)
6240 || 0==sqlite3_strglob(zGlobIPK, zPlan));
6242 rc = sqlite3_finalize(pExplain);
6243 if( rc!=SQLITE_OK ) break;
6245 if( res<0 ){
6246 raw_printf(stderr, "Error: internal error");
6247 break;
6248 }else{
6249 if( bGroupByParent
6250 && (bVerbose || res==0)
6251 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
6253 raw_printf(out, "-- Parent table %s\n", zParent);
6254 sqlite3_free(zPrev);
6255 zPrev = sqlite3_mprintf("%s", zParent);
6258 if( res==0 ){
6259 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
6260 }else if( bVerbose ){
6261 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
6262 zIndent, zFrom, zTarget
6267 sqlite3_free(zPrev);
6269 if( rc!=SQLITE_OK ){
6270 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6273 rc2 = sqlite3_finalize(pSql);
6274 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
6275 rc = rc2;
6276 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6278 }else{
6279 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
6282 return rc;
6286 ** Implementation of ".lint" dot command.
6288 static int lintDotCommand(
6289 ShellState *pState, /* Current shell tool state */
6290 char **azArg, /* Array of arguments passed to dot command */
6291 int nArg /* Number of entries in azArg[] */
6293 int n;
6294 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
6295 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
6296 return lintFkeyIndexes(pState, azArg, nArg);
6298 usage:
6299 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
6300 raw_printf(stderr, "Where sub-commands are:\n");
6301 raw_printf(stderr, " fkey-indexes\n");
6302 return SQLITE_ERROR;
6305 #if !defined SQLITE_OMIT_VIRTUALTABLE
6306 static void shellPrepare(
6307 sqlite3 *db,
6308 int *pRc,
6309 const char *zSql,
6310 sqlite3_stmt **ppStmt
6312 *ppStmt = 0;
6313 if( *pRc==SQLITE_OK ){
6314 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
6315 if( rc!=SQLITE_OK ){
6316 raw_printf(stderr, "sql error: %s (%d)\n",
6317 sqlite3_errmsg(db), sqlite3_errcode(db)
6319 *pRc = rc;
6325 ** Create a prepared statement using printf-style arguments for the SQL.
6327 ** This routine is could be marked "static". But it is not always used,
6328 ** depending on compile-time options. By omitting the "static", we avoid
6329 ** nuisance compiler warnings about "defined but not used".
6331 void shellPreparePrintf(
6332 sqlite3 *db,
6333 int *pRc,
6334 sqlite3_stmt **ppStmt,
6335 const char *zFmt,
6338 *ppStmt = 0;
6339 if( *pRc==SQLITE_OK ){
6340 va_list ap;
6341 char *z;
6342 va_start(ap, zFmt);
6343 z = sqlite3_vmprintf(zFmt, ap);
6344 va_end(ap);
6345 if( z==0 ){
6346 *pRc = SQLITE_NOMEM;
6347 }else{
6348 shellPrepare(db, pRc, z, ppStmt);
6349 sqlite3_free(z);
6354 /* Finalize the prepared statement created using shellPreparePrintf().
6356 ** This routine is could be marked "static". But it is not always used,
6357 ** depending on compile-time options. By omitting the "static", we avoid
6358 ** nuisance compiler warnings about "defined but not used".
6360 void shellFinalize(
6361 int *pRc,
6362 sqlite3_stmt *pStmt
6364 if( pStmt ){
6365 sqlite3 *db = sqlite3_db_handle(pStmt);
6366 int rc = sqlite3_finalize(pStmt);
6367 if( *pRc==SQLITE_OK ){
6368 if( rc!=SQLITE_OK ){
6369 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6371 *pRc = rc;
6376 /* Reset the prepared statement created using shellPreparePrintf().
6378 ** This routine is could be marked "static". But it is not always used,
6379 ** depending on compile-time options. By omitting the "static", we avoid
6380 ** nuisance compiler warnings about "defined but not used".
6382 void shellReset(
6383 int *pRc,
6384 sqlite3_stmt *pStmt
6386 int rc = sqlite3_reset(pStmt);
6387 if( *pRc==SQLITE_OK ){
6388 if( rc!=SQLITE_OK ){
6389 sqlite3 *db = sqlite3_db_handle(pStmt);
6390 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
6392 *pRc = rc;
6395 #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */
6397 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
6398 /******************************************************************************
6399 ** The ".archive" or ".ar" command.
6402 ** Structure representing a single ".ar" command.
6404 typedef struct ArCommand ArCommand;
6405 struct ArCommand {
6406 u8 eCmd; /* An AR_CMD_* value */
6407 u8 bVerbose; /* True if --verbose */
6408 u8 bZip; /* True if the archive is a ZIP */
6409 u8 bDryRun; /* True if --dry-run */
6410 u8 bAppend; /* True if --append */
6411 u8 bGlob; /* True if --glob */
6412 u8 fromCmdLine; /* Run from -A instead of .archive */
6413 int nArg; /* Number of command arguments */
6414 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
6415 const char *zFile; /* --file argument, or NULL */
6416 const char *zDir; /* --directory argument, or NULL */
6417 char **azArg; /* Array of command arguments */
6418 ShellState *p; /* Shell state */
6419 sqlite3 *db; /* Database containing the archive */
6423 ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
6425 static int arUsage(FILE *f){
6426 showHelp(f,"archive");
6427 return SQLITE_ERROR;
6431 ** Print an error message for the .ar command to stderr and return
6432 ** SQLITE_ERROR.
6434 static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
6435 va_list ap;
6436 char *z;
6437 va_start(ap, zFmt);
6438 z = sqlite3_vmprintf(zFmt, ap);
6439 va_end(ap);
6440 utf8_printf(stderr, "Error: %s\n", z);
6441 if( pAr->fromCmdLine ){
6442 utf8_printf(stderr, "Use \"-A\" for more help\n");
6443 }else{
6444 utf8_printf(stderr, "Use \".archive --help\" for more help\n");
6446 sqlite3_free(z);
6447 return SQLITE_ERROR;
6451 ** Values for ArCommand.eCmd.
6453 #define AR_CMD_CREATE 1
6454 #define AR_CMD_UPDATE 2
6455 #define AR_CMD_INSERT 3
6456 #define AR_CMD_EXTRACT 4
6457 #define AR_CMD_LIST 5
6458 #define AR_CMD_HELP 6
6459 #define AR_CMD_REMOVE 7
6462 ** Other (non-command) switches.
6464 #define AR_SWITCH_VERBOSE 8
6465 #define AR_SWITCH_FILE 9
6466 #define AR_SWITCH_DIRECTORY 10
6467 #define AR_SWITCH_APPEND 11
6468 #define AR_SWITCH_DRYRUN 12
6469 #define AR_SWITCH_GLOB 13
6471 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
6472 switch( eSwitch ){
6473 case AR_CMD_CREATE:
6474 case AR_CMD_EXTRACT:
6475 case AR_CMD_LIST:
6476 case AR_CMD_REMOVE:
6477 case AR_CMD_UPDATE:
6478 case AR_CMD_INSERT:
6479 case AR_CMD_HELP:
6480 if( pAr->eCmd ){
6481 return arErrorMsg(pAr, "multiple command options");
6483 pAr->eCmd = eSwitch;
6484 break;
6486 case AR_SWITCH_DRYRUN:
6487 pAr->bDryRun = 1;
6488 break;
6489 case AR_SWITCH_GLOB:
6490 pAr->bGlob = 1;
6491 break;
6492 case AR_SWITCH_VERBOSE:
6493 pAr->bVerbose = 1;
6494 break;
6495 case AR_SWITCH_APPEND:
6496 pAr->bAppend = 1;
6497 /* Fall thru into --file */
6498 case AR_SWITCH_FILE:
6499 pAr->zFile = zArg;
6500 break;
6501 case AR_SWITCH_DIRECTORY:
6502 pAr->zDir = zArg;
6503 break;
6506 return SQLITE_OK;
6510 ** Parse the command line for an ".ar" command. The results are written into
6511 ** structure (*pAr). SQLITE_OK is returned if the command line is parsed
6512 ** successfully, otherwise an error message is written to stderr and
6513 ** SQLITE_ERROR returned.
6515 static int arParseCommand(
6516 char **azArg, /* Array of arguments passed to dot command */
6517 int nArg, /* Number of entries in azArg[] */
6518 ArCommand *pAr /* Populate this object */
6520 struct ArSwitch {
6521 const char *zLong;
6522 char cShort;
6523 u8 eSwitch;
6524 u8 bArg;
6525 } aSwitch[] = {
6526 { "create", 'c', AR_CMD_CREATE, 0 },
6527 { "extract", 'x', AR_CMD_EXTRACT, 0 },
6528 { "insert", 'i', AR_CMD_INSERT, 0 },
6529 { "list", 't', AR_CMD_LIST, 0 },
6530 { "remove", 'r', AR_CMD_REMOVE, 0 },
6531 { "update", 'u', AR_CMD_UPDATE, 0 },
6532 { "help", 'h', AR_CMD_HELP, 0 },
6533 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
6534 { "file", 'f', AR_SWITCH_FILE, 1 },
6535 { "append", 'a', AR_SWITCH_APPEND, 1 },
6536 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
6537 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
6538 { "glob", 'g', AR_SWITCH_GLOB, 0 },
6540 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
6541 struct ArSwitch *pEnd = &aSwitch[nSwitch];
6543 if( nArg<=1 ){
6544 utf8_printf(stderr, "Wrong number of arguments. Usage:\n");
6545 return arUsage(stderr);
6546 }else{
6547 char *z = azArg[1];
6548 if( z[0]!='-' ){
6549 /* Traditional style [tar] invocation */
6550 int i;
6551 int iArg = 2;
6552 for(i=0; z[i]; i++){
6553 const char *zArg = 0;
6554 struct ArSwitch *pOpt;
6555 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6556 if( z[i]==pOpt->cShort ) break;
6558 if( pOpt==pEnd ){
6559 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6561 if( pOpt->bArg ){
6562 if( iArg>=nArg ){
6563 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
6565 zArg = azArg[iArg++];
6567 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6569 pAr->nArg = nArg-iArg;
6570 if( pAr->nArg>0 ){
6571 pAr->azArg = &azArg[iArg];
6573 }else{
6574 /* Non-traditional invocation */
6575 int iArg;
6576 for(iArg=1; iArg<nArg; iArg++){
6577 int n;
6578 z = azArg[iArg];
6579 if( z[0]!='-' ){
6580 /* All remaining command line words are command arguments. */
6581 pAr->azArg = &azArg[iArg];
6582 pAr->nArg = nArg-iArg;
6583 break;
6585 n = strlen30(z);
6587 if( z[1]!='-' ){
6588 int i;
6589 /* One or more short options */
6590 for(i=1; i<n; i++){
6591 const char *zArg = 0;
6592 struct ArSwitch *pOpt;
6593 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6594 if( z[i]==pOpt->cShort ) break;
6596 if( pOpt==pEnd ){
6597 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
6599 if( pOpt->bArg ){
6600 if( i<(n-1) ){
6601 zArg = &z[i+1];
6602 i = n;
6603 }else{
6604 if( iArg>=(nArg-1) ){
6605 return arErrorMsg(pAr, "option requires an argument: %c",
6606 z[i]);
6608 zArg = azArg[++iArg];
6611 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
6613 }else if( z[2]=='\0' ){
6614 /* A -- option, indicating that all remaining command line words
6615 ** are command arguments. */
6616 pAr->azArg = &azArg[iArg+1];
6617 pAr->nArg = nArg-iArg-1;
6618 break;
6619 }else{
6620 /* A long option */
6621 const char *zArg = 0; /* Argument for option, if any */
6622 struct ArSwitch *pMatch = 0; /* Matching option */
6623 struct ArSwitch *pOpt; /* Iterator */
6624 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
6625 const char *zLong = pOpt->zLong;
6626 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
6627 if( pMatch ){
6628 return arErrorMsg(pAr, "ambiguous option: %s",z);
6629 }else{
6630 pMatch = pOpt;
6635 if( pMatch==0 ){
6636 return arErrorMsg(pAr, "unrecognized option: %s", z);
6638 if( pMatch->bArg ){
6639 if( iArg>=(nArg-1) ){
6640 return arErrorMsg(pAr, "option requires an argument: %s", z);
6642 zArg = azArg[++iArg];
6644 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
6650 return SQLITE_OK;
6654 ** This function assumes that all arguments within the ArCommand.azArg[]
6655 ** array refer to archive members, as for the --extract, --list or --remove
6656 ** commands. It checks that each of them are "present". If any specified
6657 ** file is not present in the archive, an error is printed to stderr and an
6658 ** error code returned. Otherwise, if all specified arguments are present
6659 ** in the archive, SQLITE_OK is returned. Here, "present" means either an
6660 ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match
6661 ** when pAr->bGlob is true.
6663 ** This function strips any trailing '/' characters from each argument.
6664 ** This is consistent with the way the [tar] command seems to work on
6665 ** Linux.
6667 static int arCheckEntries(ArCommand *pAr){
6668 int rc = SQLITE_OK;
6669 if( pAr->nArg ){
6670 int i, j;
6671 sqlite3_stmt *pTest = 0;
6672 const char *zSel = (pAr->bGlob)
6673 ? "SELECT name FROM %s WHERE glob($name,name)"
6674 : "SELECT name FROM %s WHERE name=$name";
6676 shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable);
6677 j = sqlite3_bind_parameter_index(pTest, "$name");
6678 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
6679 char *z = pAr->azArg[i];
6680 int n = strlen30(z);
6681 int bOk = 0;
6682 while( n>0 && z[n-1]=='/' ) n--;
6683 z[n] = '\0';
6684 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
6685 if( SQLITE_ROW==sqlite3_step(pTest) ){
6686 bOk = 1;
6688 shellReset(&rc, pTest);
6689 if( rc==SQLITE_OK && bOk==0 ){
6690 utf8_printf(stderr, "not found in archive: %s\n", z);
6691 rc = SQLITE_ERROR;
6694 shellFinalize(&rc, pTest);
6696 return rc;
6700 ** Format a WHERE clause that can be used against the "sqlar" table to
6701 ** identify all archive members that match the command arguments held
6702 ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
6703 ** The caller is responsible for eventually calling sqlite3_free() on
6704 ** any non-NULL (*pzWhere) value. Here, "match" means strict equality
6705 ** when pAr->bGlob is false and GLOB match when pAr->bGlob is true.
6707 static void arWhereClause(
6708 int *pRc,
6709 ArCommand *pAr,
6710 char **pzWhere /* OUT: New WHERE clause */
6712 char *zWhere = 0;
6713 const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
6714 if( *pRc==SQLITE_OK ){
6715 if( pAr->nArg==0 ){
6716 zWhere = sqlite3_mprintf("1");
6717 }else{
6718 int i;
6719 const char *zSep = "";
6720 for(i=0; i<pAr->nArg; i++){
6721 const char *z = pAr->azArg[i];
6722 zWhere = sqlite3_mprintf(
6723 "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
6724 zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
6726 if( zWhere==0 ){
6727 *pRc = SQLITE_NOMEM;
6728 break;
6730 zSep = " OR ";
6734 *pzWhere = zWhere;
6738 ** Implementation of .ar "lisT" command.
6740 static int arListCommand(ArCommand *pAr){
6741 const char *zSql = "SELECT %s FROM %s WHERE %s";
6742 const char *azCols[] = {
6743 "name",
6744 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
6747 char *zWhere = 0;
6748 sqlite3_stmt *pSql = 0;
6749 int rc;
6751 rc = arCheckEntries(pAr);
6752 arWhereClause(&rc, pAr, &zWhere);
6754 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
6755 pAr->zSrcTable, zWhere);
6756 if( pAr->bDryRun ){
6757 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6758 }else{
6759 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6760 if( pAr->bVerbose ){
6761 utf8_printf(pAr->p->out, "%s % 10d %s %s\n",
6762 sqlite3_column_text(pSql, 0),
6763 sqlite3_column_int(pSql, 1),
6764 sqlite3_column_text(pSql, 2),
6765 sqlite3_column_text(pSql, 3)
6767 }else{
6768 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6772 shellFinalize(&rc, pSql);
6773 sqlite3_free(zWhere);
6774 return rc;
6779 ** Implementation of .ar "Remove" command.
6781 static int arRemoveCommand(ArCommand *pAr){
6782 int rc = 0;
6783 char *zSql = 0;
6784 char *zWhere = 0;
6786 if( pAr->nArg ){
6787 /* Verify that args actually exist within the archive before proceeding.
6788 ** And formulate a WHERE clause to match them. */
6789 rc = arCheckEntries(pAr);
6790 arWhereClause(&rc, pAr, &zWhere);
6792 if( rc==SQLITE_OK ){
6793 zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;",
6794 pAr->zSrcTable, zWhere);
6795 if( pAr->bDryRun ){
6796 utf8_printf(pAr->p->out, "%s\n", zSql);
6797 }else{
6798 char *zErr = 0;
6799 rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0);
6800 if( rc==SQLITE_OK ){
6801 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6802 if( rc!=SQLITE_OK ){
6803 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
6804 }else{
6805 rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0);
6808 if( zErr ){
6809 utf8_printf(stdout, "ERROR: %s\n", zErr);
6810 sqlite3_free(zErr);
6814 sqlite3_free(zWhere);
6815 sqlite3_free(zSql);
6816 return rc;
6820 ** Implementation of .ar "eXtract" command.
6822 static int arExtractCommand(ArCommand *pAr){
6823 const char *zSql1 =
6824 "SELECT "
6825 " ($dir || name),"
6826 " writefile(($dir || name), %s, mode, mtime) "
6827 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)"
6828 " AND name NOT GLOB '*..[/\\]*'";
6830 const char *azExtraArg[] = {
6831 "sqlar_uncompress(data, sz)",
6832 "data"
6835 sqlite3_stmt *pSql = 0;
6836 int rc = SQLITE_OK;
6837 char *zDir = 0;
6838 char *zWhere = 0;
6839 int i, j;
6841 /* If arguments are specified, check that they actually exist within
6842 ** the archive before proceeding. And formulate a WHERE clause to
6843 ** match them. */
6844 rc = arCheckEntries(pAr);
6845 arWhereClause(&rc, pAr, &zWhere);
6847 if( rc==SQLITE_OK ){
6848 if( pAr->zDir ){
6849 zDir = sqlite3_mprintf("%s/", pAr->zDir);
6850 }else{
6851 zDir = sqlite3_mprintf("");
6853 if( zDir==0 ) rc = SQLITE_NOMEM;
6856 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
6857 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
6860 if( rc==SQLITE_OK ){
6861 j = sqlite3_bind_parameter_index(pSql, "$dir");
6862 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
6864 /* Run the SELECT statement twice. The first time, writefile() is called
6865 ** for all archive members that should be extracted. The second time,
6866 ** only for the directories. This is because the timestamps for
6867 ** extracted directories must be reset after they are populated (as
6868 ** populating them changes the timestamp). */
6869 for(i=0; i<2; i++){
6870 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
6871 sqlite3_bind_int(pSql, j, i);
6872 if( pAr->bDryRun ){
6873 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
6874 }else{
6875 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
6876 if( i==0 && pAr->bVerbose ){
6877 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
6881 shellReset(&rc, pSql);
6883 shellFinalize(&rc, pSql);
6886 sqlite3_free(zDir);
6887 sqlite3_free(zWhere);
6888 return rc;
6892 ** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
6894 static int arExecSql(ArCommand *pAr, const char *zSql){
6895 int rc;
6896 if( pAr->bDryRun ){
6897 utf8_printf(pAr->p->out, "%s\n", zSql);
6898 rc = SQLITE_OK;
6899 }else{
6900 char *zErr = 0;
6901 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
6902 if( zErr ){
6903 utf8_printf(stdout, "ERROR: %s\n", zErr);
6904 sqlite3_free(zErr);
6907 return rc;
6912 ** Implementation of .ar "create", "insert", and "update" commands.
6914 ** create -> Create a new SQL archive
6915 ** insert -> Insert or reinsert all files listed
6916 ** update -> Insert files that have changed or that were not
6917 ** previously in the archive
6919 ** Create the "sqlar" table in the database if it does not already exist.
6920 ** Then add each file in the azFile[] array to the archive. Directories
6921 ** are added recursively. If argument bVerbose is non-zero, a message is
6922 ** printed on stdout for each file archived.
6924 ** The create command is the same as update, except that it drops
6925 ** any existing "sqlar" table before beginning. The "insert" command
6926 ** always overwrites every file named on the command-line, where as
6927 ** "update" only overwrites if the size or mtime or mode has changed.
6929 static int arCreateOrUpdateCommand(
6930 ArCommand *pAr, /* Command arguments and options */
6931 int bUpdate, /* true for a --create. */
6932 int bOnlyIfChanged /* Only update if file has changed */
6934 const char *zCreate =
6935 "CREATE TABLE IF NOT EXISTS sqlar(\n"
6936 " name TEXT PRIMARY KEY, -- name of the file\n"
6937 " mode INT, -- access permissions\n"
6938 " mtime INT, -- last modification time\n"
6939 " sz INT, -- original file size\n"
6940 " data BLOB -- compressed content\n"
6941 ")";
6942 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
6943 const char *zInsertFmt[2] = {
6944 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
6945 " SELECT\n"
6946 " %s,\n"
6947 " mode,\n"
6948 " mtime,\n"
6949 " CASE substr(lsmode(mode),1,1)\n"
6950 " WHEN '-' THEN length(data)\n"
6951 " WHEN 'd' THEN 0\n"
6952 " ELSE -1 END,\n"
6953 " sqlar_compress(data)\n"
6954 " FROM fsdir(%Q,%Q) AS disk\n"
6955 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6957 "REPLACE INTO %s(name,mode,mtime,data)\n"
6958 " SELECT\n"
6959 " %s,\n"
6960 " mode,\n"
6961 " mtime,\n"
6962 " data\n"
6963 " FROM fsdir(%Q,%Q) AS disk\n"
6964 " WHERE lsmode(mode) NOT LIKE '?%%'%s;"
6966 int i; /* For iterating through azFile[] */
6967 int rc; /* Return code */
6968 const char *zTab = 0; /* SQL table into which to insert */
6969 char *zSql;
6970 char zTemp[50];
6971 char *zExists = 0;
6973 arExecSql(pAr, "PRAGMA page_size=512");
6974 rc = arExecSql(pAr, "SAVEPOINT ar;");
6975 if( rc!=SQLITE_OK ) return rc;
6976 zTemp[0] = 0;
6977 if( pAr->bZip ){
6978 /* Initialize the zipfile virtual table, if necessary */
6979 if( pAr->zFile ){
6980 sqlite3_uint64 r;
6981 sqlite3_randomness(sizeof(r),&r);
6982 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
6983 zTab = zTemp;
6984 zSql = sqlite3_mprintf(
6985 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
6986 zTab, pAr->zFile
6988 rc = arExecSql(pAr, zSql);
6989 sqlite3_free(zSql);
6990 }else{
6991 zTab = "zip";
6993 }else{
6994 /* Initialize the table for an SQLAR */
6995 zTab = "sqlar";
6996 if( bUpdate==0 ){
6997 rc = arExecSql(pAr, zDrop);
6998 if( rc!=SQLITE_OK ) goto end_ar_transaction;
7000 rc = arExecSql(pAr, zCreate);
7002 if( bOnlyIfChanged ){
7003 zExists = sqlite3_mprintf(
7004 " AND NOT EXISTS("
7005 "SELECT 1 FROM %s AS mem"
7006 " WHERE mem.name=disk.name"
7007 " AND mem.mtime=disk.mtime"
7008 " AND mem.mode=disk.mode)", zTab);
7009 }else{
7010 zExists = sqlite3_mprintf("");
7012 if( zExists==0 ) rc = SQLITE_NOMEM;
7013 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
7014 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
7015 pAr->bVerbose ? "shell_putsnl(name)" : "name",
7016 pAr->azArg[i], pAr->zDir, zExists);
7017 rc = arExecSql(pAr, zSql2);
7018 sqlite3_free(zSql2);
7020 end_ar_transaction:
7021 if( rc!=SQLITE_OK ){
7022 sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0);
7023 }else{
7024 rc = arExecSql(pAr, "RELEASE ar;");
7025 if( pAr->bZip && pAr->zFile ){
7026 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
7027 arExecSql(pAr, zSql);
7028 sqlite3_free(zSql);
7031 sqlite3_free(zExists);
7032 return rc;
7036 ** Implementation of ".ar" dot command.
7038 static int arDotCommand(
7039 ShellState *pState, /* Current shell tool state */
7040 int fromCmdLine, /* True if -A command-line option, not .ar cmd */
7041 char **azArg, /* Array of arguments passed to dot command */
7042 int nArg /* Number of entries in azArg[] */
7044 ArCommand cmd;
7045 int rc;
7046 memset(&cmd, 0, sizeof(cmd));
7047 cmd.fromCmdLine = fromCmdLine;
7048 rc = arParseCommand(azArg, nArg, &cmd);
7049 if( rc==SQLITE_OK ){
7050 int eDbType = SHELL_OPEN_UNSPEC;
7051 cmd.p = pState;
7052 cmd.db = pState->db;
7053 if( cmd.zFile ){
7054 eDbType = deduceDatabaseType(cmd.zFile, 1);
7055 }else{
7056 eDbType = pState->openMode;
7058 if( eDbType==SHELL_OPEN_ZIPFILE ){
7059 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
7060 if( cmd.zFile==0 ){
7061 cmd.zSrcTable = sqlite3_mprintf("zip");
7062 }else{
7063 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
7066 cmd.bZip = 1;
7067 }else if( cmd.zFile ){
7068 int flags;
7069 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
7070 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT
7071 || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){
7072 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
7073 }else{
7074 flags = SQLITE_OPEN_READONLY;
7076 cmd.db = 0;
7077 if( cmd.bDryRun ){
7078 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
7079 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
7081 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
7082 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
7083 if( rc!=SQLITE_OK ){
7084 utf8_printf(stderr, "cannot open file: %s (%s)\n",
7085 cmd.zFile, sqlite3_errmsg(cmd.db)
7087 goto end_ar_command;
7089 sqlite3_fileio_init(cmd.db, 0, 0);
7090 sqlite3_sqlar_init(cmd.db, 0, 0);
7091 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
7092 shellPutsFunc, 0, 0);
7095 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
7096 if( cmd.eCmd!=AR_CMD_CREATE
7097 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
7099 utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
7100 rc = SQLITE_ERROR;
7101 goto end_ar_command;
7103 cmd.zSrcTable = sqlite3_mprintf("sqlar");
7106 switch( cmd.eCmd ){
7107 case AR_CMD_CREATE:
7108 rc = arCreateOrUpdateCommand(&cmd, 0, 0);
7109 break;
7111 case AR_CMD_EXTRACT:
7112 rc = arExtractCommand(&cmd);
7113 break;
7115 case AR_CMD_LIST:
7116 rc = arListCommand(&cmd);
7117 break;
7119 case AR_CMD_HELP:
7120 arUsage(pState->out);
7121 break;
7123 case AR_CMD_INSERT:
7124 rc = arCreateOrUpdateCommand(&cmd, 1, 0);
7125 break;
7127 case AR_CMD_REMOVE:
7128 rc = arRemoveCommand(&cmd);
7129 break;
7131 default:
7132 assert( cmd.eCmd==AR_CMD_UPDATE );
7133 rc = arCreateOrUpdateCommand(&cmd, 1, 1);
7134 break;
7137 end_ar_command:
7138 if( cmd.db!=pState->db ){
7139 close_db(cmd.db);
7141 sqlite3_free(cmd.zSrcTable);
7143 return rc;
7145 /* End of the ".archive" or ".ar" command logic
7146 *******************************************************************************/
7147 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
7149 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
7151 ** If (*pRc) is not SQLITE_OK when this function is called, it is a no-op.
7152 ** Otherwise, the SQL statement or statements in zSql are executed using
7153 ** database connection db and the error code written to *pRc before
7154 ** this function returns.
7156 static void shellExec(sqlite3 *db, int *pRc, const char *zSql){
7157 int rc = *pRc;
7158 if( rc==SQLITE_OK ){
7159 char *zErr = 0;
7160 rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
7161 if( rc!=SQLITE_OK ){
7162 raw_printf(stderr, "SQL error: %s\n", zErr);
7164 sqlite3_free(zErr);
7165 *pRc = rc;
7170 ** Like shellExec(), except that zFmt is a printf() style format string.
7172 static void shellExecPrintf(sqlite3 *db, int *pRc, const char *zFmt, ...){
7173 char *z = 0;
7174 if( *pRc==SQLITE_OK ){
7175 va_list ap;
7176 va_start(ap, zFmt);
7177 z = sqlite3_vmprintf(zFmt, ap);
7178 va_end(ap);
7179 if( z==0 ){
7180 *pRc = SQLITE_NOMEM;
7181 }else{
7182 shellExec(db, pRc, z);
7184 sqlite3_free(z);
7189 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7190 ** Otherwise, an attempt is made to allocate, zero and return a pointer
7191 ** to a buffer nByte bytes in size. If an OOM error occurs, *pRc is set
7192 ** to SQLITE_NOMEM and NULL returned.
7194 static void *shellMalloc(int *pRc, sqlite3_int64 nByte){
7195 void *pRet = 0;
7196 if( *pRc==SQLITE_OK ){
7197 pRet = sqlite3_malloc64(nByte);
7198 if( pRet==0 ){
7199 *pRc = SQLITE_NOMEM;
7200 }else{
7201 memset(pRet, 0, nByte);
7204 return pRet;
7208 ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
7209 ** Otherwise, zFmt is treated as a printf() style string. The result of
7210 ** formatting it along with any trailing arguments is written into a
7211 ** buffer obtained from sqlite3_malloc(), and pointer to which is returned.
7212 ** It is the responsibility of the caller to eventually free this buffer
7213 ** using a call to sqlite3_free().
7215 ** If an OOM error occurs, (*pRc) is set to SQLITE_NOMEM and a NULL
7216 ** pointer returned.
7218 static char *shellMPrintf(int *pRc, const char *zFmt, ...){
7219 char *z = 0;
7220 if( *pRc==SQLITE_OK ){
7221 va_list ap;
7222 va_start(ap, zFmt);
7223 z = sqlite3_vmprintf(zFmt, ap);
7224 va_end(ap);
7225 if( z==0 ){
7226 *pRc = SQLITE_NOMEM;
7229 return z;
7234 ** When running the ".recover" command, each output table, and the special
7235 ** orphaned row table if it is required, is represented by an instance
7236 ** of the following struct.
7238 typedef struct RecoverTable RecoverTable;
7239 struct RecoverTable {
7240 char *zQuoted; /* Quoted version of table name */
7241 int nCol; /* Number of columns in table */
7242 char **azlCol; /* Array of column lists */
7243 int iPk; /* Index of IPK column */
7247 ** Free a RecoverTable object allocated by recoverFindTable() or
7248 ** recoverOrphanTable().
7250 static void recoverFreeTable(RecoverTable *pTab){
7251 if( pTab ){
7252 sqlite3_free(pTab->zQuoted);
7253 if( pTab->azlCol ){
7254 int i;
7255 for(i=0; i<=pTab->nCol; i++){
7256 sqlite3_free(pTab->azlCol[i]);
7258 sqlite3_free(pTab->azlCol);
7260 sqlite3_free(pTab);
7265 ** This function is a no-op if (*pRc) is not SQLITE_OK when it is called.
7266 ** Otherwise, it allocates and returns a RecoverTable object based on the
7267 ** final four arguments passed to this function. It is the responsibility
7268 ** of the caller to eventually free the returned object using
7269 ** recoverFreeTable().
7271 static RecoverTable *recoverNewTable(
7272 int *pRc, /* IN/OUT: Error code */
7273 const char *zName, /* Name of table */
7274 const char *zSql, /* CREATE TABLE statement */
7275 int bIntkey,
7276 int nCol
7278 sqlite3 *dbtmp = 0; /* sqlite3 handle for testing CREATE TABLE */
7279 int rc = *pRc;
7280 RecoverTable *pTab = 0;
7282 pTab = (RecoverTable*)shellMalloc(&rc, sizeof(RecoverTable));
7283 if( rc==SQLITE_OK ){
7284 int nSqlCol = 0;
7285 int bSqlIntkey = 0;
7286 sqlite3_stmt *pStmt = 0;
7288 rc = sqlite3_open("", &dbtmp);
7289 if( rc==SQLITE_OK ){
7290 sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0,
7291 shellIdQuote, 0, 0);
7293 if( rc==SQLITE_OK ){
7294 rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0);
7296 if( rc==SQLITE_OK ){
7297 rc = sqlite3_exec(dbtmp, zSql, 0, 0, 0);
7298 if( rc==SQLITE_ERROR ){
7299 rc = SQLITE_OK;
7300 goto finished;
7303 shellPreparePrintf(dbtmp, &rc, &pStmt,
7304 "SELECT count(*) FROM pragma_table_info(%Q)", zName
7306 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7307 nSqlCol = sqlite3_column_int(pStmt, 0);
7309 shellFinalize(&rc, pStmt);
7311 if( rc!=SQLITE_OK || nSqlCol<nCol ){
7312 goto finished;
7315 shellPreparePrintf(dbtmp, &rc, &pStmt,
7316 "SELECT ("
7317 " SELECT substr(data,1,1)==X'0D' FROM sqlite_dbpage WHERE pgno=rootpage"
7318 ") FROM sqlite_schema WHERE name = %Q", zName
7320 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7321 bSqlIntkey = sqlite3_column_int(pStmt, 0);
7323 shellFinalize(&rc, pStmt);
7325 if( bIntkey==bSqlIntkey ){
7326 int i;
7327 const char *zPk = "_rowid_";
7328 sqlite3_stmt *pPkFinder = 0;
7330 /* If this is an intkey table and there is an INTEGER PRIMARY KEY,
7331 ** set zPk to the name of the PK column, and pTab->iPk to the index
7332 ** of the column, where columns are 0-numbered from left to right.
7333 ** Or, if this is a WITHOUT ROWID table or if there is no IPK column,
7334 ** leave zPk as "_rowid_" and pTab->iPk at -2. */
7335 pTab->iPk = -2;
7336 if( bIntkey ){
7337 shellPreparePrintf(dbtmp, &rc, &pPkFinder,
7338 "SELECT cid, name FROM pragma_table_info(%Q) "
7339 " WHERE pk=1 AND type='integer' COLLATE nocase"
7340 " AND NOT EXISTS (SELECT cid FROM pragma_table_info(%Q) WHERE pk=2)"
7341 , zName, zName
7343 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPkFinder) ){
7344 pTab->iPk = sqlite3_column_int(pPkFinder, 0);
7345 zPk = (const char*)sqlite3_column_text(pPkFinder, 1);
7346 if( zPk==0 ){ zPk = "_"; /* Defensive. Should never happen */ }
7350 pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName);
7351 pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1));
7352 pTab->nCol = nSqlCol;
7354 if( bIntkey ){
7355 pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk);
7356 }else{
7357 pTab->azlCol[0] = shellMPrintf(&rc, "");
7359 i = 1;
7360 shellPreparePrintf(dbtmp, &rc, &pStmt,
7361 "SELECT %Q || group_concat(shell_idquote(name), ', ') "
7362 " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) "
7363 "FROM pragma_table_info(%Q)",
7364 bIntkey ? ", " : "", pTab->iPk,
7365 bIntkey ? "" : "(CASE WHEN pk=0 THEN 1000000 ELSE pk END), ",
7366 zName
7368 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7369 const char *zText = (const char*)sqlite3_column_text(pStmt, 0);
7370 pTab->azlCol[i] = shellMPrintf(&rc, "%s%s", pTab->azlCol[0], zText);
7371 i++;
7373 shellFinalize(&rc, pStmt);
7375 shellFinalize(&rc, pPkFinder);
7379 finished:
7380 sqlite3_close(dbtmp);
7381 *pRc = rc;
7382 if( rc!=SQLITE_OK || (pTab && pTab->zQuoted==0) ){
7383 recoverFreeTable(pTab);
7384 pTab = 0;
7386 return pTab;
7390 ** This function is called to search the schema recovered from the
7391 ** sqlite_schema table of the (possibly) corrupt database as part
7392 ** of a ".recover" command. Specifically, for a table with root page
7393 ** iRoot and at least nCol columns. Additionally, if bIntkey is 0, the
7394 ** table must be a WITHOUT ROWID table, or if non-zero, not one of
7395 ** those.
7397 ** If a table is found, a (RecoverTable*) object is returned. Or, if
7398 ** no such table is found, but bIntkey is false and iRoot is the
7399 ** root page of an index in the recovered schema, then (*pbNoop) is
7400 ** set to true and NULL returned. Or, if there is no such table or
7401 ** index, NULL is returned and (*pbNoop) set to 0, indicating that
7402 ** the caller should write data to the orphans table.
7404 static RecoverTable *recoverFindTable(
7405 ShellState *pState, /* Shell state object */
7406 int *pRc, /* IN/OUT: Error code */
7407 int iRoot, /* Root page of table */
7408 int bIntkey, /* True for an intkey table */
7409 int nCol, /* Number of columns in table */
7410 int *pbNoop /* OUT: True if iRoot is root of index */
7412 sqlite3_stmt *pStmt = 0;
7413 RecoverTable *pRet = 0;
7414 int bNoop = 0;
7415 const char *zSql = 0;
7416 const char *zName = 0;
7418 /* Search the recovered schema for an object with root page iRoot. */
7419 shellPreparePrintf(pState->db, pRc, &pStmt,
7420 "SELECT type, name, sql FROM recovery.schema WHERE rootpage=%d", iRoot
7422 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7423 const char *zType = (const char*)sqlite3_column_text(pStmt, 0);
7424 if( bIntkey==0 && sqlite3_stricmp(zType, "index")==0 ){
7425 bNoop = 1;
7426 break;
7428 if( sqlite3_stricmp(zType, "table")==0 ){
7429 zName = (const char*)sqlite3_column_text(pStmt, 1);
7430 zSql = (const char*)sqlite3_column_text(pStmt, 2);
7431 if( zName!=0 && zSql!=0 ){
7432 pRet = recoverNewTable(pRc, zName, zSql, bIntkey, nCol);
7433 break;
7438 shellFinalize(pRc, pStmt);
7439 *pbNoop = bNoop;
7440 return pRet;
7444 ** Return a RecoverTable object representing the orphans table.
7446 static RecoverTable *recoverOrphanTable(
7447 ShellState *pState, /* Shell state object */
7448 int *pRc, /* IN/OUT: Error code */
7449 const char *zLostAndFound, /* Base name for orphans table */
7450 int nCol /* Number of user data columns */
7452 RecoverTable *pTab = 0;
7453 if( nCol>=0 && *pRc==SQLITE_OK ){
7454 int i;
7456 /* This block determines the name of the orphan table. The prefered
7457 ** name is zLostAndFound. But if that clashes with another name
7458 ** in the recovered schema, try zLostAndFound_0, zLostAndFound_1
7459 ** and so on until a non-clashing name is found. */
7460 int iTab = 0;
7461 char *zTab = shellMPrintf(pRc, "%s", zLostAndFound);
7462 sqlite3_stmt *pTest = 0;
7463 shellPrepare(pState->db, pRc,
7464 "SELECT 1 FROM recovery.schema WHERE name=?", &pTest
7466 if( pTest ) sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7467 while( *pRc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pTest) ){
7468 shellReset(pRc, pTest);
7469 sqlite3_free(zTab);
7470 zTab = shellMPrintf(pRc, "%s_%d", zLostAndFound, iTab++);
7471 sqlite3_bind_text(pTest, 1, zTab, -1, SQLITE_TRANSIENT);
7473 shellFinalize(pRc, pTest);
7475 pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable));
7476 if( pTab ){
7477 pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab);
7478 pTab->nCol = nCol;
7479 pTab->iPk = -2;
7480 if( nCol>0 ){
7481 pTab->azlCol = (char**)shellMalloc(pRc, sizeof(char*) * (nCol+1));
7482 if( pTab->azlCol ){
7483 pTab->azlCol[nCol] = shellMPrintf(pRc, "");
7484 for(i=nCol-1; i>=0; i--){
7485 pTab->azlCol[i] = shellMPrintf(pRc, "%s, NULL", pTab->azlCol[i+1]);
7490 if( *pRc!=SQLITE_OK ){
7491 recoverFreeTable(pTab);
7492 pTab = 0;
7493 }else{
7494 raw_printf(pState->out,
7495 "CREATE TABLE %s(rootpgno INTEGER, "
7496 "pgno INTEGER, nfield INTEGER, id INTEGER", pTab->zQuoted
7498 for(i=0; i<nCol; i++){
7499 raw_printf(pState->out, ", c%d", i);
7501 raw_printf(pState->out, ");\n");
7504 sqlite3_free(zTab);
7506 return pTab;
7510 ** This function is called to recover data from the database. A script
7511 ** to construct a new database containing all recovered data is output
7512 ** on stream pState->out.
7514 static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){
7515 int rc = SQLITE_OK;
7516 sqlite3_stmt *pLoop = 0; /* Loop through all root pages */
7517 sqlite3_stmt *pPages = 0; /* Loop through all pages in a group */
7518 sqlite3_stmt *pCells = 0; /* Loop through all cells in a page */
7519 const char *zRecoveryDb = ""; /* Name of "recovery" database */
7520 const char *zLostAndFound = "lost_and_found";
7521 int i;
7522 int nOrphan = -1;
7523 RecoverTable *pOrphan = 0;
7525 int bFreelist = 1; /* 0 if --freelist-corrupt is specified */
7526 int bRowids = 1; /* 0 if --no-rowids */
7527 for(i=1; i<nArg; i++){
7528 char *z = azArg[i];
7529 int n;
7530 if( z[0]=='-' && z[1]=='-' ) z++;
7531 n = strlen30(z);
7532 if( n<=17 && memcmp("-freelist-corrupt", z, n)==0 ){
7533 bFreelist = 0;
7534 }else
7535 if( n<=12 && memcmp("-recovery-db", z, n)==0 && i<(nArg-1) ){
7536 i++;
7537 zRecoveryDb = azArg[i];
7538 }else
7539 if( n<=15 && memcmp("-lost-and-found", z, n)==0 && i<(nArg-1) ){
7540 i++;
7541 zLostAndFound = azArg[i];
7542 }else
7543 if( n<=10 && memcmp("-no-rowids", z, n)==0 ){
7544 bRowids = 0;
7546 else{
7547 utf8_printf(stderr, "unexpected option: %s\n", azArg[i]);
7548 showHelp(pState->out, azArg[0]);
7549 return 1;
7553 shellExecPrintf(pState->db, &rc,
7554 /* Attach an in-memory database named 'recovery'. Create an indexed
7555 ** cache of the sqlite_dbptr virtual table. */
7556 "PRAGMA writable_schema = on;"
7557 "ATTACH %Q AS recovery;"
7558 "DROP TABLE IF EXISTS recovery.dbptr;"
7559 "DROP TABLE IF EXISTS recovery.freelist;"
7560 "DROP TABLE IF EXISTS recovery.map;"
7561 "DROP TABLE IF EXISTS recovery.schema;"
7562 "CREATE TABLE recovery.freelist(pgno INTEGER PRIMARY KEY);", zRecoveryDb
7565 if( bFreelist ){
7566 shellExec(pState->db, &rc,
7567 "WITH trunk(pgno) AS ("
7568 " SELECT shell_int32("
7569 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 8) AS x "
7570 " WHERE x>0"
7571 " UNION"
7572 " SELECT shell_int32("
7573 " (SELECT data FROM sqlite_dbpage WHERE pgno=trunk.pgno), 0) AS x "
7574 " FROM trunk WHERE x>0"
7575 "),"
7576 "freelist(data, n, freepgno) AS ("
7577 " SELECT data, min(16384, shell_int32(data, 1)-1), t.pgno "
7578 " FROM trunk t, sqlite_dbpage s WHERE s.pgno=t.pgno"
7579 " UNION ALL"
7580 " SELECT data, n-1, shell_int32(data, 2+n) "
7581 " FROM freelist WHERE n>=0"
7583 "REPLACE INTO recovery.freelist SELECT freepgno FROM freelist;"
7587 /* If this is an auto-vacuum database, add all pointer-map pages to
7588 ** the freelist table. Do this regardless of whether or not
7589 ** --freelist-corrupt was specified. */
7590 shellExec(pState->db, &rc,
7591 "WITH ptrmap(pgno) AS ("
7592 " SELECT 2 WHERE shell_int32("
7593 " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13"
7594 " )"
7595 " UNION ALL "
7596 " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp "
7597 " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)"
7599 "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap"
7602 shellExec(pState->db, &rc,
7603 "CREATE TABLE recovery.dbptr("
7604 " pgno, child, PRIMARY KEY(child, pgno)"
7605 ") WITHOUT ROWID;"
7606 "INSERT OR IGNORE INTO recovery.dbptr(pgno, child) "
7607 " SELECT * FROM sqlite_dbptr"
7608 " WHERE pgno NOT IN freelist AND child NOT IN freelist;"
7610 /* Delete any pointer to page 1. This ensures that page 1 is considered
7611 ** a root page, regardless of how corrupt the db is. */
7612 "DELETE FROM recovery.dbptr WHERE child = 1;"
7614 /* Delete all pointers to any pages that have more than one pointer
7615 ** to them. Such pages will be treated as root pages when recovering
7616 ** data. */
7617 "DELETE FROM recovery.dbptr WHERE child IN ("
7618 " SELECT child FROM recovery.dbptr GROUP BY child HAVING count(*)>1"
7619 ");"
7621 /* Create the "map" table that will (eventually) contain instructions
7622 ** for dealing with each page in the db that contains one or more
7623 ** records. */
7624 "CREATE TABLE recovery.map("
7625 "pgno INTEGER PRIMARY KEY, maxlen INT, intkey, root INT"
7626 ");"
7628 /* Populate table [map]. If there are circular loops of pages in the
7629 ** database, the following adds all pages in such a loop to the map
7630 ** as individual root pages. This could be handled better. */
7631 "WITH pages(i, maxlen) AS ("
7632 " SELECT page_count, ("
7633 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=page_count"
7634 " ) FROM pragma_page_count WHERE page_count>0"
7635 " UNION ALL"
7636 " SELECT i-1, ("
7637 " SELECT max(field+1) FROM sqlite_dbdata WHERE pgno=i-1"
7638 " ) FROM pages WHERE i>=2"
7640 "INSERT INTO recovery.map(pgno, maxlen, intkey, root) "
7641 " SELECT i, maxlen, NULL, ("
7642 " WITH p(orig, pgno, parent) AS ("
7643 " SELECT 0, i, (SELECT pgno FROM recovery.dbptr WHERE child=i)"
7644 " UNION "
7645 " SELECT i, p.parent, "
7646 " (SELECT pgno FROM recovery.dbptr WHERE child=p.parent) FROM p"
7647 " )"
7648 " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)"
7649 ") "
7650 "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;"
7651 "UPDATE recovery.map AS o SET intkey = ("
7652 " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno"
7653 ");"
7655 /* Extract data from page 1 and any linked pages into table
7656 ** recovery.schema. With the same schema as an sqlite_schema table. */
7657 "CREATE TABLE recovery.schema(type, name, tbl_name, rootpage, sql);"
7658 "INSERT INTO recovery.schema SELECT "
7659 " max(CASE WHEN field=0 THEN value ELSE NULL END),"
7660 " max(CASE WHEN field=1 THEN value ELSE NULL END),"
7661 " max(CASE WHEN field=2 THEN value ELSE NULL END),"
7662 " max(CASE WHEN field=3 THEN value ELSE NULL END),"
7663 " max(CASE WHEN field=4 THEN value ELSE NULL END)"
7664 "FROM sqlite_dbdata WHERE pgno IN ("
7665 " SELECT pgno FROM recovery.map WHERE root=1"
7667 "GROUP BY pgno, cell;"
7668 "CREATE INDEX recovery.schema_rootpage ON schema(rootpage);"
7671 /* Open a transaction, then print out all non-virtual, non-"sqlite_%"
7672 ** CREATE TABLE statements that extracted from the existing schema. */
7673 if( rc==SQLITE_OK ){
7674 sqlite3_stmt *pStmt = 0;
7675 /* ".recover" might output content in an order which causes immediate
7676 ** foreign key constraints to be violated. So disable foreign-key
7677 ** constraint enforcement to prevent problems when running the output
7678 ** script. */
7679 raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n");
7680 raw_printf(pState->out, "BEGIN;\n");
7681 raw_printf(pState->out, "PRAGMA writable_schema = on;\n");
7682 shellPrepare(pState->db, &rc,
7683 "SELECT sql FROM recovery.schema "
7684 "WHERE type='table' AND sql LIKE 'create table%'", &pStmt
7686 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7687 const char *zCreateTable = (const char*)sqlite3_column_text(pStmt, 0);
7688 raw_printf(pState->out, "CREATE TABLE IF NOT EXISTS %s;\n",
7689 &zCreateTable[12]
7692 shellFinalize(&rc, pStmt);
7695 /* Figure out if an orphan table will be required. And if so, how many
7696 ** user columns it should contain */
7697 shellPrepare(pState->db, &rc,
7698 "SELECT coalesce(max(maxlen), -2) FROM recovery.map WHERE root>1"
7699 , &pLoop
7701 if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7702 nOrphan = sqlite3_column_int(pLoop, 0);
7704 shellFinalize(&rc, pLoop);
7705 pLoop = 0;
7707 shellPrepare(pState->db, &rc,
7708 "SELECT pgno FROM recovery.map WHERE root=?", &pPages
7711 shellPrepare(pState->db, &rc,
7712 "SELECT max(field), group_concat(shell_escape_crnl(quote"
7713 "(case when (? AND field<0) then NULL else value end)"
7714 "), ', ')"
7715 ", min(field) "
7716 "FROM sqlite_dbdata WHERE pgno = ? AND field != ?"
7717 "GROUP BY cell", &pCells
7720 /* Loop through each root page. */
7721 shellPrepare(pState->db, &rc,
7722 "SELECT root, intkey, max(maxlen) FROM recovery.map"
7723 " WHERE root>1 GROUP BY root, intkey ORDER BY root=("
7724 " SELECT rootpage FROM recovery.schema WHERE name='sqlite_sequence'"
7725 ")", &pLoop
7727 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pLoop) ){
7728 int iRoot = sqlite3_column_int(pLoop, 0);
7729 int bIntkey = sqlite3_column_int(pLoop, 1);
7730 int nCol = sqlite3_column_int(pLoop, 2);
7731 int bNoop = 0;
7732 RecoverTable *pTab;
7734 assert( bIntkey==0 || bIntkey==1 );
7735 pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop);
7736 if( bNoop || rc ) continue;
7737 if( pTab==0 ){
7738 if( pOrphan==0 ){
7739 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7741 pTab = pOrphan;
7742 if( pTab==0 ) break;
7745 if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){
7746 raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n");
7748 sqlite3_bind_int(pPages, 1, iRoot);
7749 if( bRowids==0 && pTab->iPk<0 ){
7750 sqlite3_bind_int(pCells, 1, 1);
7751 }else{
7752 sqlite3_bind_int(pCells, 1, 0);
7754 sqlite3_bind_int(pCells, 3, pTab->iPk);
7756 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){
7757 int iPgno = sqlite3_column_int(pPages, 0);
7758 sqlite3_bind_int(pCells, 2, iPgno);
7759 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){
7760 int nField = sqlite3_column_int(pCells, 0);
7761 int iMin = sqlite3_column_int(pCells, 2);
7762 const char *zVal = (const char*)sqlite3_column_text(pCells, 1);
7764 RecoverTable *pTab2 = pTab;
7765 if( pTab!=pOrphan && (iMin<0)!=bIntkey ){
7766 if( pOrphan==0 ){
7767 pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan);
7769 pTab2 = pOrphan;
7770 if( pTab2==0 ) break;
7773 nField = nField+1;
7774 if( pTab2==pOrphan ){
7775 raw_printf(pState->out,
7776 "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n",
7777 pTab2->zQuoted, iRoot, iPgno, nField,
7778 iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField]
7780 }else{
7781 raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n",
7782 pTab2->zQuoted, pTab2->azlCol[nField], zVal
7786 shellReset(&rc, pCells);
7788 shellReset(&rc, pPages);
7789 if( pTab!=pOrphan ) recoverFreeTable(pTab);
7791 shellFinalize(&rc, pLoop);
7792 shellFinalize(&rc, pPages);
7793 shellFinalize(&rc, pCells);
7794 recoverFreeTable(pOrphan);
7796 /* The rest of the schema */
7797 if( rc==SQLITE_OK ){
7798 sqlite3_stmt *pStmt = 0;
7799 shellPrepare(pState->db, &rc,
7800 "SELECT sql, name FROM recovery.schema "
7801 "WHERE sql NOT LIKE 'create table%'", &pStmt
7803 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
7804 const char *zSql = (const char*)sqlite3_column_text(pStmt, 0);
7805 if( sqlite3_strnicmp(zSql, "create virt", 11)==0 ){
7806 const char *zName = (const char*)sqlite3_column_text(pStmt, 1);
7807 char *zPrint = shellMPrintf(&rc,
7808 "INSERT INTO sqlite_schema VALUES('table', %Q, %Q, 0, %Q)",
7809 zName, zName, zSql
7811 raw_printf(pState->out, "%s;\n", zPrint);
7812 sqlite3_free(zPrint);
7813 }else{
7814 raw_printf(pState->out, "%s;\n", zSql);
7817 shellFinalize(&rc, pStmt);
7820 if( rc==SQLITE_OK ){
7821 raw_printf(pState->out, "PRAGMA writable_schema = off;\n");
7822 raw_printf(pState->out, "COMMIT;\n");
7824 sqlite3_exec(pState->db, "DETACH recovery", 0, 0, 0);
7825 return rc;
7827 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
7831 * zAutoColumn(zCol, &db, ?) => Maybe init db, add column zCol to it.
7832 * zAutoColumn(0, &db, ?) => (db!=0) Form columns spec for CREATE TABLE,
7833 * close db and set it to 0, and return the columns spec, to later
7834 * be sqlite3_free()'ed by the caller.
7835 * The return is 0 when either:
7836 * (a) The db was not initialized and zCol==0 (There are no columns.)
7837 * (b) zCol!=0 (Column was added, db initialized as needed.)
7838 * The 3rd argument, pRenamed, references an out parameter. If the
7839 * pointer is non-zero, its referent will be set to a summary of renames
7840 * done if renaming was necessary, or set to 0 if none was done. The out
7841 * string (if any) must be sqlite3_free()'ed by the caller.
7843 #ifdef SHELL_DEBUG
7844 #define rc_err_oom_die(rc) \
7845 if( rc==SQLITE_NOMEM ) shell_check_oom(0); \
7846 else if(!(rc==SQLITE_OK||rc==SQLITE_DONE)) \
7847 fprintf(stderr,"E:%d\n",rc), assert(0)
7848 #else
7849 static void rc_err_oom_die(int rc){
7850 if( rc==SQLITE_NOMEM ) shell_check_oom(0);
7851 assert(rc==SQLITE_OK||rc==SQLITE_DONE);
7853 #endif
7855 #ifdef SHELL_COLFIX_DB /* If this is set, the DB can be in a file. */
7856 static char zCOL_DB[] = SHELL_STRINGIFY(SHELL_COLFIX_DB);
7857 #else /* Otherwise, memory is faster/better for the transient DB. */
7858 static const char *zCOL_DB = ":memory:";
7859 #endif
7861 /* Define character (as C string) to separate generated column ordinal
7862 * from protected part of incoming column names. This defaults to "_"
7863 * so that incoming column identifiers that did not need not be quoted
7864 * remain usable without being quoted. It must be one character.
7866 #ifndef SHELL_AUTOCOLUMN_SEP
7867 # define AUTOCOLUMN_SEP "_"
7868 #else
7869 # define AUTOCOLUMN_SEP SHELL_STRINGIFY(SHELL_AUTOCOLUMN_SEP)
7870 #endif
7872 static char *zAutoColumn(const char *zColNew, sqlite3 **pDb, char **pzRenamed){
7873 /* Queries and D{D,M}L used here */
7874 static const char * const zTabMake = "\
7875 CREATE TABLE ColNames(\
7876 cpos INTEGER PRIMARY KEY,\
7877 name TEXT, nlen INT, chop INT, reps INT, suff TEXT);\
7878 CREATE VIEW RepeatedNames AS \
7879 SELECT DISTINCT t.name FROM ColNames t \
7880 WHERE t.name COLLATE NOCASE IN (\
7881 SELECT o.name FROM ColNames o WHERE o.cpos<>t.cpos\
7884 static const char * const zTabFill = "\
7885 INSERT INTO ColNames(name,nlen,chop,reps,suff)\
7886 VALUES(iif(length(?1)>0,?1,'?'),max(length(?1),1),0,0,'')\
7888 static const char * const zHasDupes = "\
7889 SELECT count(DISTINCT (substring(name,1,nlen-chop)||suff) COLLATE NOCASE)\
7890 <count(name) FROM ColNames\
7892 #ifdef SHELL_COLUMN_RENAME_CLEAN
7893 static const char * const zDedoctor = "\
7894 UPDATE ColNames SET chop=iif(\
7895 (substring(name,nlen,1) BETWEEN '0' AND '9')\
7896 AND (rtrim(name,'0123456790') glob '*"AUTOCOLUMN_SEP"'),\
7897 nlen-length(rtrim(name, '"AUTOCOLUMN_SEP"0123456789')),\
7901 #endif
7902 static const char * const zSetReps = "\
7903 UPDATE ColNames AS t SET reps=\
7904 (SELECT count(*) FROM ColNames d \
7905 WHERE substring(t.name,1,t.nlen-t.chop)=substring(d.name,1,d.nlen-d.chop)\
7906 COLLATE NOCASE\
7909 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7910 static const char * const zColDigits = "\
7911 SELECT CAST(ceil(log(count(*)+0.5)) AS INT) FROM ColNames \
7913 #endif
7914 static const char * const zRenameRank =
7915 #ifdef SHELL_COLUMN_RENAME_CLEAN
7916 "UPDATE ColNames AS t SET suff="
7917 "iif(reps>1, printf('%c%0*d', '"AUTOCOLUMN_SEP"', $1, cpos), '')"
7918 #else /* ...RENAME_MINIMAL_ONE_PASS */
7919 "WITH Lzn(nlz) AS (" /* Find minimum extraneous leading 0's for uniqueness */
7920 " SELECT 0 AS nlz"
7921 " UNION"
7922 " SELECT nlz+1 AS nlz FROM Lzn"
7923 " WHERE EXISTS("
7924 " SELECT 1"
7925 " FROM ColNames t, ColNames o"
7926 " WHERE"
7927 " iif(t.name IN (SELECT * FROM RepeatedNames),"
7928 " printf('%s"AUTOCOLUMN_SEP"%s',"
7929 " t.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,t.cpos),2)),"
7930 " t.name"
7931 " )"
7932 " ="
7933 " iif(o.name IN (SELECT * FROM RepeatedNames),"
7934 " printf('%s"AUTOCOLUMN_SEP"%s',"
7935 " o.name, substring(printf('%.*c%0.*d',nlz+1,'0',$1,o.cpos),2)),"
7936 " o.name"
7937 " )"
7938 " COLLATE NOCASE"
7939 " AND o.cpos<>t.cpos"
7940 " GROUP BY t.cpos"
7941 " )"
7942 ") UPDATE Colnames AS t SET"
7943 " chop = 0," /* No chopping, never touch incoming names. */
7944 " suff = iif(name IN (SELECT * FROM RepeatedNames),"
7945 " printf('"AUTOCOLUMN_SEP"%s', substring("
7946 " printf('%.*c%0.*d',(SELECT max(nlz) FROM Lzn)+1,'0',1,t.cpos),2)),"
7947 " ''"
7948 " )"
7949 #endif
7951 static const char * const zCollectVar = "\
7952 SELECT\
7953 '('||x'0a'\
7954 || group_concat(\
7955 cname||' TEXT',\
7956 ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
7957 ||')' AS ColsSpec \
7958 FROM (\
7959 SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \
7960 FROM ColNames ORDER BY cpos\
7962 static const char * const zRenamesDone =
7963 "SELECT group_concat("
7964 " printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff)),"
7965 " ','||x'0a')"
7966 "FROM ColNames WHERE suff<>'' OR chop!=0"
7968 int rc;
7969 sqlite3_stmt *pStmt = 0;
7970 assert(pDb!=0);
7971 if( zColNew ){
7972 /* Add initial or additional column. Init db if necessary. */
7973 if( *pDb==0 ){
7974 if( SQLITE_OK!=sqlite3_open(zCOL_DB, pDb) ) return 0;
7975 #ifdef SHELL_COLFIX_DB
7976 if(*zCOL_DB!=':')
7977 sqlite3_exec(*pDb,"drop table if exists ColNames;"
7978 "drop view if exists RepeatedNames;",0,0,0);
7979 #endif
7980 rc = sqlite3_exec(*pDb, zTabMake, 0, 0, 0);
7981 rc_err_oom_die(rc);
7983 assert(*pDb!=0);
7984 rc = sqlite3_prepare_v2(*pDb, zTabFill, -1, &pStmt, 0);
7985 rc_err_oom_die(rc);
7986 rc = sqlite3_bind_text(pStmt, 1, zColNew, -1, 0);
7987 rc_err_oom_die(rc);
7988 rc = sqlite3_step(pStmt);
7989 rc_err_oom_die(rc);
7990 sqlite3_finalize(pStmt);
7991 return 0;
7992 }else if( *pDb==0 ){
7993 return 0;
7994 }else{
7995 /* Formulate the columns spec, close the DB, zero *pDb. */
7996 char *zColsSpec = 0;
7997 int hasDupes = db_int(*pDb, zHasDupes);
7998 #ifdef SQLITE_ENABLE_MATH_FUNCTIONS
7999 int nDigits = (hasDupes)? db_int(*pDb, zColDigits) : 0;
8000 #else
8001 # define nDigits 2
8002 #endif
8003 if( hasDupes ){
8004 #ifdef SHELL_COLUMN_RENAME_CLEAN
8005 rc = sqlite3_exec(*pDb, zDedoctor, 0, 0, 0);
8006 rc_err_oom_die(rc);
8007 #endif
8008 rc = sqlite3_exec(*pDb, zSetReps, 0, 0, 0);
8009 rc_err_oom_die(rc);
8010 rc = sqlite3_prepare_v2(*pDb, zRenameRank, -1, &pStmt, 0);
8011 rc_err_oom_die(rc);
8012 sqlite3_bind_int(pStmt, 1, nDigits);
8013 rc = sqlite3_step(pStmt);
8014 sqlite3_finalize(pStmt);
8015 assert(rc==SQLITE_DONE);
8017 assert(db_int(*pDb, zHasDupes)==0); /* Consider: remove this */
8018 rc = sqlite3_prepare_v2(*pDb, zCollectVar, -1, &pStmt, 0);
8019 rc_err_oom_die(rc);
8020 rc = sqlite3_step(pStmt);
8021 if( rc==SQLITE_ROW ){
8022 zColsSpec = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8023 }else{
8024 zColsSpec = 0;
8026 if( pzRenamed!=0 ){
8027 if( !hasDupes ) *pzRenamed = 0;
8028 else{
8029 sqlite3_finalize(pStmt);
8030 if( SQLITE_OK==sqlite3_prepare_v2(*pDb, zRenamesDone, -1, &pStmt, 0)
8031 && SQLITE_ROW==sqlite3_step(pStmt) ){
8032 *pzRenamed = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
8033 }else
8034 *pzRenamed = 0;
8037 sqlite3_finalize(pStmt);
8038 sqlite3_close(*pDb);
8039 *pDb = 0;
8040 return zColsSpec;
8045 ** If an input line begins with "." then invoke this routine to
8046 ** process that line.
8048 ** Return 1 on error, 2 to exit, and 0 otherwise.
8050 static int do_meta_command(char *zLine, ShellState *p){
8051 int h = 1;
8052 int nArg = 0;
8053 int n, c;
8054 int rc = 0;
8055 char *azArg[52];
8057 #ifndef SQLITE_OMIT_VIRTUALTABLE
8058 if( p->expert.pExpert ){
8059 expertFinish(p, 1, 0);
8061 #endif
8063 /* Parse the input line into tokens.
8065 while( zLine[h] && nArg<ArraySize(azArg)-1 ){
8066 while( IsSpace(zLine[h]) ){ h++; }
8067 if( zLine[h]==0 ) break;
8068 if( zLine[h]=='\'' || zLine[h]=='"' ){
8069 int delim = zLine[h++];
8070 azArg[nArg++] = &zLine[h];
8071 while( zLine[h] && zLine[h]!=delim ){
8072 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
8073 h++;
8075 if( zLine[h]==delim ){
8076 zLine[h++] = 0;
8078 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
8079 }else{
8080 azArg[nArg++] = &zLine[h];
8081 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
8082 if( zLine[h] ) zLine[h++] = 0;
8083 resolve_backslashes(azArg[nArg-1]);
8086 azArg[nArg] = 0;
8088 /* Process the input line.
8090 if( nArg==0 ) return 0; /* no tokens, no error */
8091 n = strlen30(azArg[0]);
8092 c = azArg[0][0];
8093 clearTempFile(p);
8095 #ifndef SQLITE_OMIT_AUTHORIZATION
8096 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
8097 if( nArg!=2 ){
8098 raw_printf(stderr, "Usage: .auth ON|OFF\n");
8099 rc = 1;
8100 goto meta_command_exit;
8102 open_db(p, 0);
8103 if( booleanValue(azArg[1]) ){
8104 sqlite3_set_authorizer(p->db, shellAuth, p);
8105 }else if( p->bSafeModePersist ){
8106 sqlite3_set_authorizer(p->db, safeModeAuth, p);
8107 }else{
8108 sqlite3_set_authorizer(p->db, 0, 0);
8110 }else
8111 #endif
8113 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
8114 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
8115 open_db(p, 0);
8116 failIfSafeMode(p, "cannot run .archive in safe mode");
8117 rc = arDotCommand(p, 0, azArg, nArg);
8118 }else
8119 #endif
8121 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
8122 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
8124 const char *zDestFile = 0;
8125 const char *zDb = 0;
8126 sqlite3 *pDest;
8127 sqlite3_backup *pBackup;
8128 int j;
8129 int bAsync = 0;
8130 const char *zVfs = 0;
8131 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
8132 for(j=1; j<nArg; j++){
8133 const char *z = azArg[j];
8134 if( z[0]=='-' ){
8135 if( z[1]=='-' ) z++;
8136 if( strcmp(z, "-append")==0 ){
8137 zVfs = "apndvfs";
8138 }else
8139 if( strcmp(z, "-async")==0 ){
8140 bAsync = 1;
8141 }else
8143 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
8144 return 1;
8146 }else if( zDestFile==0 ){
8147 zDestFile = azArg[j];
8148 }else if( zDb==0 ){
8149 zDb = zDestFile;
8150 zDestFile = azArg[j];
8151 }else{
8152 raw_printf(stderr, "Usage: .backup ?DB? ?OPTIONS? FILENAME\n");
8153 return 1;
8156 if( zDestFile==0 ){
8157 raw_printf(stderr, "missing FILENAME argument on .backup\n");
8158 return 1;
8160 if( zDb==0 ) zDb = "main";
8161 rc = sqlite3_open_v2(zDestFile, &pDest,
8162 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
8163 if( rc!=SQLITE_OK ){
8164 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
8165 close_db(pDest);
8166 return 1;
8168 if( bAsync ){
8169 sqlite3_exec(pDest, "PRAGMA synchronous=OFF; PRAGMA journal_mode=OFF;",
8170 0, 0, 0);
8172 open_db(p, 0);
8173 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
8174 if( pBackup==0 ){
8175 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8176 close_db(pDest);
8177 return 1;
8179 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
8180 sqlite3_backup_finish(pBackup);
8181 if( rc==SQLITE_DONE ){
8182 rc = 0;
8183 }else{
8184 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
8185 rc = 1;
8187 close_db(pDest);
8188 }else
8190 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
8191 if( nArg==2 ){
8192 bail_on_error = booleanValue(azArg[1]);
8193 }else{
8194 raw_printf(stderr, "Usage: .bail on|off\n");
8195 rc = 1;
8197 }else
8199 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
8200 if( nArg==2 ){
8201 if( booleanValue(azArg[1]) ){
8202 setBinaryMode(p->out, 1);
8203 }else{
8204 setTextMode(p->out, 1);
8206 }else{
8207 raw_printf(stderr, "Usage: .binary on|off\n");
8208 rc = 1;
8210 }else
8212 /* The undocumented ".breakpoint" command causes a call to the no-op
8213 ** routine named test_breakpoint().
8215 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
8216 test_breakpoint();
8217 }else
8219 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
8220 failIfSafeMode(p, "cannot run .cd in safe mode");
8221 if( nArg==2 ){
8222 #if defined(_WIN32) || defined(WIN32)
8223 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
8224 rc = !SetCurrentDirectoryW(z);
8225 sqlite3_free(z);
8226 #else
8227 rc = chdir(azArg[1]);
8228 #endif
8229 if( rc ){
8230 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
8231 rc = 1;
8233 }else{
8234 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
8235 rc = 1;
8237 }else
8239 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
8240 if( nArg==2 ){
8241 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
8242 }else{
8243 raw_printf(stderr, "Usage: .changes on|off\n");
8244 rc = 1;
8246 }else
8248 /* Cancel output redirection, if it is currently set (by .testcase)
8249 ** Then read the content of the testcase-out.txt file and compare against
8250 ** azArg[1]. If there are differences, report an error and exit.
8252 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
8253 char *zRes = 0;
8254 output_reset(p);
8255 if( nArg!=2 ){
8256 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
8257 rc = 2;
8258 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
8259 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
8260 rc = 2;
8261 }else if( testcase_glob(azArg[1],zRes)==0 ){
8262 utf8_printf(stderr,
8263 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
8264 p->zTestcase, azArg[1], zRes);
8265 rc = 1;
8266 }else{
8267 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
8268 p->nCheck++;
8270 sqlite3_free(zRes);
8271 }else
8273 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
8274 failIfSafeMode(p, "cannot run .clone in safe mode");
8275 if( nArg==2 ){
8276 tryToClone(p, azArg[1]);
8277 }else{
8278 raw_printf(stderr, "Usage: .clone FILENAME\n");
8279 rc = 1;
8281 }else
8283 if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){
8284 if( nArg==1 ){
8285 /* List available connections */
8286 int i;
8287 for(i=0; i<ArraySize(p->aAuxDb); i++){
8288 const char *zFile = p->aAuxDb[i].zDbFilename;
8289 if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){
8290 zFile = "(not open)";
8291 }else if( zFile==0 ){
8292 zFile = "(memory)";
8293 }else if( zFile[0]==0 ){
8294 zFile = "(temporary-file)";
8296 if( p->pAuxDb == &p->aAuxDb[i] ){
8297 utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile);
8298 }else if( p->aAuxDb[i].db!=0 ){
8299 utf8_printf(stdout, " %d: %s\n", i, zFile);
8302 }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){
8303 int i = azArg[1][0] - '0';
8304 if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && i<ArraySize(p->aAuxDb) ){
8305 p->pAuxDb->db = p->db;
8306 p->pAuxDb = &p->aAuxDb[i];
8307 globalDb = p->db = p->pAuxDb->db;
8308 p->pAuxDb->db = 0;
8310 }else if( nArg==3 && strcmp(azArg[1], "close")==0
8311 && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){
8312 int i = azArg[2][0] - '0';
8313 if( i<0 || i>=ArraySize(p->aAuxDb) ){
8314 /* No-op */
8315 }else if( p->pAuxDb == &p->aAuxDb[i] ){
8316 raw_printf(stderr, "cannot close the active database connection\n");
8317 rc = 1;
8318 }else if( p->aAuxDb[i].db ){
8319 session_close_all(p, i);
8320 close_db(p->aAuxDb[i].db);
8321 p->aAuxDb[i].db = 0;
8323 }else{
8324 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
8325 rc = 1;
8327 }else
8329 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
8330 char **azName = 0;
8331 int nName = 0;
8332 sqlite3_stmt *pStmt;
8333 int i;
8334 open_db(p, 0);
8335 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
8336 if( rc ){
8337 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
8338 rc = 1;
8339 }else{
8340 while( sqlite3_step(pStmt)==SQLITE_ROW ){
8341 const char *zSchema = (const char *)sqlite3_column_text(pStmt,1);
8342 const char *zFile = (const char*)sqlite3_column_text(pStmt,2);
8343 if( zSchema==0 || zFile==0 ) continue;
8344 azName = sqlite3_realloc(azName, (nName+1)*2*sizeof(char*));
8345 shell_check_oom(azName);
8346 azName[nName*2] = strdup(zSchema);
8347 azName[nName*2+1] = strdup(zFile);
8348 nName++;
8351 sqlite3_finalize(pStmt);
8352 for(i=0; i<nName; i++){
8353 int eTxn = sqlite3_txn_state(p->db, azName[i*2]);
8354 int bRdonly = sqlite3_db_readonly(p->db, azName[i*2]);
8355 const char *z = azName[i*2+1];
8356 utf8_printf(p->out, "%s: %s %s%s\n",
8357 azName[i*2],
8358 z && z[0] ? z : "\"\"",
8359 bRdonly ? "r/o" : "r/w",
8360 eTxn==SQLITE_TXN_NONE ? "" :
8361 eTxn==SQLITE_TXN_READ ? " read-txn" : " write-txn");
8362 free(azName[i*2]);
8363 free(azName[i*2+1]);
8365 sqlite3_free(azName);
8366 }else
8368 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
8369 static const struct DbConfigChoices {
8370 const char *zName;
8371 int op;
8372 } aDbConfig[] = {
8373 { "defensive", SQLITE_DBCONFIG_DEFENSIVE },
8374 { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
8375 { "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
8376 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
8377 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
8378 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
8379 { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
8380 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
8381 { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
8382 { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
8383 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
8384 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
8385 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
8386 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
8387 { "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
8388 { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
8390 int ii, v;
8391 open_db(p, 0);
8392 for(ii=0; ii<ArraySize(aDbConfig); ii++){
8393 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
8394 if( nArg>=3 ){
8395 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
8397 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
8398 utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
8399 if( nArg>1 ) break;
8401 if( nArg>1 && ii==ArraySize(aDbConfig) ){
8402 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
8403 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
8405 }else
8407 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
8408 rc = shell_dbinfo_command(p, nArg, azArg);
8409 }else
8411 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
8412 if( c=='r' && strncmp(azArg[0], "recover", n)==0 ){
8413 open_db(p, 0);
8414 rc = recoverDatabaseCmd(p, nArg, azArg);
8415 }else
8416 #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */
8418 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
8419 char *zLike = 0;
8420 char *zSql;
8421 int i;
8422 int savedShowHeader = p->showHeader;
8423 int savedShellFlags = p->shellFlgs;
8424 ShellClearFlag(p,
8425 SHFLG_PreserveRowid|SHFLG_Newlines|SHFLG_Echo
8426 |SHFLG_DumpDataOnly|SHFLG_DumpNoSys);
8427 for(i=1; i<nArg; i++){
8428 if( azArg[i][0]=='-' ){
8429 const char *z = azArg[i]+1;
8430 if( z[0]=='-' ) z++;
8431 if( strcmp(z,"preserve-rowids")==0 ){
8432 #ifdef SQLITE_OMIT_VIRTUALTABLE
8433 raw_printf(stderr, "The --preserve-rowids option is not compatible"
8434 " with SQLITE_OMIT_VIRTUALTABLE\n");
8435 rc = 1;
8436 sqlite3_free(zLike);
8437 goto meta_command_exit;
8438 #else
8439 ShellSetFlag(p, SHFLG_PreserveRowid);
8440 #endif
8441 }else
8442 if( strcmp(z,"newlines")==0 ){
8443 ShellSetFlag(p, SHFLG_Newlines);
8444 }else
8445 if( strcmp(z,"data-only")==0 ){
8446 ShellSetFlag(p, SHFLG_DumpDataOnly);
8447 }else
8448 if( strcmp(z,"nosys")==0 ){
8449 ShellSetFlag(p, SHFLG_DumpNoSys);
8450 }else
8452 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
8453 rc = 1;
8454 sqlite3_free(zLike);
8455 goto meta_command_exit;
8457 }else{
8458 /* azArg[i] contains a LIKE pattern. This ".dump" request should
8459 ** only dump data for tables for which either the table name matches
8460 ** the LIKE pattern, or the table appears to be a shadow table of
8461 ** a virtual table for which the name matches the LIKE pattern.
8463 char *zExpr = sqlite3_mprintf(
8464 "name LIKE %Q ESCAPE '\\' OR EXISTS ("
8465 " SELECT 1 FROM sqlite_schema WHERE "
8466 " name LIKE %Q ESCAPE '\\' AND"
8467 " sql LIKE 'CREATE VIRTUAL TABLE%%' AND"
8468 " substr(o.name, 1, length(name)+1) == (name||'_')"
8469 ")", azArg[i], azArg[i]
8472 if( zLike ){
8473 zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr);
8474 }else{
8475 zLike = zExpr;
8480 open_db(p, 0);
8482 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8483 /* When playing back a "dump", the content might appear in an order
8484 ** which causes immediate foreign key constraints to be violated.
8485 ** So disable foreign-key constraint enforcement to prevent problems. */
8486 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
8487 raw_printf(p->out, "BEGIN TRANSACTION;\n");
8489 p->writableSchema = 0;
8490 p->showHeader = 0;
8491 /* Set writable_schema=ON since doing so forces SQLite to initialize
8492 ** as much of the schema as it can even if the sqlite_schema table is
8493 ** corrupt. */
8494 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
8495 p->nErr = 0;
8496 if( zLike==0 ) zLike = sqlite3_mprintf("true");
8497 zSql = sqlite3_mprintf(
8498 "SELECT name, type, sql FROM sqlite_schema AS o "
8499 "WHERE (%s) AND type=='table'"
8500 " AND sql NOT NULL"
8501 " ORDER BY tbl_name='sqlite_sequence', rowid",
8502 zLike
8504 run_schema_dump_query(p,zSql);
8505 sqlite3_free(zSql);
8506 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8507 zSql = sqlite3_mprintf(
8508 "SELECT sql FROM sqlite_schema AS o "
8509 "WHERE (%s) AND sql NOT NULL"
8510 " AND type IN ('index','trigger','view')",
8511 zLike
8513 run_table_dump_query(p, zSql);
8514 sqlite3_free(zSql);
8516 sqlite3_free(zLike);
8517 if( p->writableSchema ){
8518 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
8519 p->writableSchema = 0;
8521 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
8522 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
8523 if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
8524 raw_printf(p->out, p->nErr?"ROLLBACK; -- due to errors\n":"COMMIT;\n");
8526 p->showHeader = savedShowHeader;
8527 p->shellFlgs = savedShellFlags;
8528 }else
8530 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
8531 if( nArg==2 ){
8532 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
8533 }else{
8534 raw_printf(stderr, "Usage: .echo on|off\n");
8535 rc = 1;
8537 }else
8539 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
8540 if( nArg==2 ){
8541 p->autoEQPtest = 0;
8542 if( p->autoEQPtrace ){
8543 if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0);
8544 p->autoEQPtrace = 0;
8546 if( strcmp(azArg[1],"full")==0 ){
8547 p->autoEQP = AUTOEQP_full;
8548 }else if( strcmp(azArg[1],"trigger")==0 ){
8549 p->autoEQP = AUTOEQP_trigger;
8550 #ifdef SQLITE_DEBUG
8551 }else if( strcmp(azArg[1],"test")==0 ){
8552 p->autoEQP = AUTOEQP_on;
8553 p->autoEQPtest = 1;
8554 }else if( strcmp(azArg[1],"trace")==0 ){
8555 p->autoEQP = AUTOEQP_full;
8556 p->autoEQPtrace = 1;
8557 open_db(p, 0);
8558 sqlite3_exec(p->db, "SELECT name FROM sqlite_schema LIMIT 1", 0, 0, 0);
8559 sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0);
8560 #endif
8561 }else{
8562 p->autoEQP = (u8)booleanValue(azArg[1]);
8564 }else{
8565 raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n");
8566 rc = 1;
8568 }else
8570 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
8571 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
8572 rc = 2;
8573 }else
8575 /* The ".explain" command is automatic now. It is largely pointless. It
8576 ** retained purely for backwards compatibility */
8577 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
8578 int val = 1;
8579 if( nArg>=2 ){
8580 if( strcmp(azArg[1],"auto")==0 ){
8581 val = 99;
8582 }else{
8583 val = booleanValue(azArg[1]);
8586 if( val==1 && p->mode!=MODE_Explain ){
8587 p->normalMode = p->mode;
8588 p->mode = MODE_Explain;
8589 p->autoExplain = 0;
8590 }else if( val==0 ){
8591 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8592 p->autoExplain = 0;
8593 }else if( val==99 ){
8594 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
8595 p->autoExplain = 1;
8597 }else
8599 #ifndef SQLITE_OMIT_VIRTUALTABLE
8600 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
8601 if( p->bSafeMode ){
8602 raw_printf(stderr,
8603 "Cannot run experimental commands such as \"%s\" in safe mode\n",
8604 azArg[0]);
8605 rc = 1;
8606 }else{
8607 open_db(p, 0);
8608 expertDotCommand(p, azArg, nArg);
8610 }else
8611 #endif
8613 if( c=='f' && strncmp(azArg[0], "filectrl", n)==0 ){
8614 static const struct {
8615 const char *zCtrlName; /* Name of a test-control option */
8616 int ctrlCode; /* Integer code for that option */
8617 const char *zUsage; /* Usage notes */
8618 } aCtrl[] = {
8619 { "chunk_size", SQLITE_FCNTL_CHUNK_SIZE, "SIZE" },
8620 { "data_version", SQLITE_FCNTL_DATA_VERSION, "" },
8621 { "has_moved", SQLITE_FCNTL_HAS_MOVED, "" },
8622 { "lock_timeout", SQLITE_FCNTL_LOCK_TIMEOUT, "MILLISEC" },
8623 { "persist_wal", SQLITE_FCNTL_PERSIST_WAL, "[BOOLEAN]" },
8624 /* { "pragma", SQLITE_FCNTL_PRAGMA, "NAME ARG" },*/
8625 { "psow", SQLITE_FCNTL_POWERSAFE_OVERWRITE, "[BOOLEAN]" },
8626 { "reserve_bytes", SQLITE_FCNTL_RESERVE_BYTES, "[N]" },
8627 { "size_limit", SQLITE_FCNTL_SIZE_LIMIT, "[LIMIT]" },
8628 { "tempfilename", SQLITE_FCNTL_TEMPFILENAME, "" },
8629 /* { "win32_av_retry", SQLITE_FCNTL_WIN32_AV_RETRY, "COUNT DELAY" },*/
8631 int filectrl = -1;
8632 int iCtrl = -1;
8633 sqlite3_int64 iRes = 0; /* Integer result to display if rc2==1 */
8634 int isOk = 0; /* 0: usage 1: %lld 2: no-result */
8635 int n2, i;
8636 const char *zCmd = 0;
8637 const char *zSchema = 0;
8639 open_db(p, 0);
8640 zCmd = nArg>=2 ? azArg[1] : "help";
8642 if( zCmd[0]=='-'
8643 && (strcmp(zCmd,"--schema")==0 || strcmp(zCmd,"-schema")==0)
8644 && nArg>=4
8646 zSchema = azArg[2];
8647 for(i=3; i<nArg; i++) azArg[i-2] = azArg[i];
8648 nArg -= 2;
8649 zCmd = azArg[1];
8652 /* The argument can optionally begin with "-" or "--" */
8653 if( zCmd[0]=='-' && zCmd[1] ){
8654 zCmd++;
8655 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
8658 /* --help lists all file-controls */
8659 if( strcmp(zCmd,"help")==0 ){
8660 utf8_printf(p->out, "Available file-controls:\n");
8661 for(i=0; i<ArraySize(aCtrl); i++){
8662 utf8_printf(p->out, " .filectrl %s %s\n",
8663 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
8665 rc = 1;
8666 goto meta_command_exit;
8669 /* convert filectrl text option to value. allow any unique prefix
8670 ** of the option name, or a numerical value. */
8671 n2 = strlen30(zCmd);
8672 for(i=0; i<ArraySize(aCtrl); i++){
8673 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
8674 if( filectrl<0 ){
8675 filectrl = aCtrl[i].ctrlCode;
8676 iCtrl = i;
8677 }else{
8678 utf8_printf(stderr, "Error: ambiguous file-control: \"%s\"\n"
8679 "Use \".filectrl --help\" for help\n", zCmd);
8680 rc = 1;
8681 goto meta_command_exit;
8685 if( filectrl<0 ){
8686 utf8_printf(stderr,"Error: unknown file-control: %s\n"
8687 "Use \".filectrl --help\" for help\n", zCmd);
8688 }else{
8689 switch(filectrl){
8690 case SQLITE_FCNTL_SIZE_LIMIT: {
8691 if( nArg!=2 && nArg!=3 ) break;
8692 iRes = nArg==3 ? integerValue(azArg[2]) : -1;
8693 sqlite3_file_control(p->db, zSchema, SQLITE_FCNTL_SIZE_LIMIT, &iRes);
8694 isOk = 1;
8695 break;
8697 case SQLITE_FCNTL_LOCK_TIMEOUT:
8698 case SQLITE_FCNTL_CHUNK_SIZE: {
8699 int x;
8700 if( nArg!=3 ) break;
8701 x = (int)integerValue(azArg[2]);
8702 sqlite3_file_control(p->db, zSchema, filectrl, &x);
8703 isOk = 2;
8704 break;
8706 case SQLITE_FCNTL_PERSIST_WAL:
8707 case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
8708 int x;
8709 if( nArg!=2 && nArg!=3 ) break;
8710 x = nArg==3 ? booleanValue(azArg[2]) : -1;
8711 sqlite3_file_control(p->db, zSchema, filectrl, &x);
8712 iRes = x;
8713 isOk = 1;
8714 break;
8716 case SQLITE_FCNTL_DATA_VERSION:
8717 case SQLITE_FCNTL_HAS_MOVED: {
8718 int x;
8719 if( nArg!=2 ) break;
8720 sqlite3_file_control(p->db, zSchema, filectrl, &x);
8721 iRes = x;
8722 isOk = 1;
8723 break;
8725 case SQLITE_FCNTL_TEMPFILENAME: {
8726 char *z = 0;
8727 if( nArg!=2 ) break;
8728 sqlite3_file_control(p->db, zSchema, filectrl, &z);
8729 if( z ){
8730 utf8_printf(p->out, "%s\n", z);
8731 sqlite3_free(z);
8733 isOk = 2;
8734 break;
8736 case SQLITE_FCNTL_RESERVE_BYTES: {
8737 int x;
8738 if( nArg>=3 ){
8739 x = atoi(azArg[2]);
8740 sqlite3_file_control(p->db, zSchema, filectrl, &x);
8742 x = -1;
8743 sqlite3_file_control(p->db, zSchema, filectrl, &x);
8744 utf8_printf(p->out,"%d\n", x);
8745 isOk = 2;
8746 break;
8750 if( isOk==0 && iCtrl>=0 ){
8751 utf8_printf(p->out, "Usage: .filectrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
8752 rc = 1;
8753 }else if( isOk==1 ){
8754 char zBuf[100];
8755 sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", iRes);
8756 raw_printf(p->out, "%s\n", zBuf);
8758 }else
8760 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
8761 ShellState data;
8762 int doStats = 0;
8763 memcpy(&data, p, sizeof(data));
8764 data.showHeader = 0;
8765 data.cMode = data.mode = MODE_Semi;
8766 if( nArg==2 && optionMatch(azArg[1], "indent") ){
8767 data.cMode = data.mode = MODE_Pretty;
8768 nArg = 1;
8770 if( nArg!=1 ){
8771 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
8772 rc = 1;
8773 goto meta_command_exit;
8775 open_db(p, 0);
8776 rc = sqlite3_exec(p->db,
8777 "SELECT sql FROM"
8778 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
8779 " FROM sqlite_schema UNION ALL"
8780 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) "
8781 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
8782 "ORDER BY x",
8783 callback, &data, 0
8785 if( rc==SQLITE_OK ){
8786 sqlite3_stmt *pStmt;
8787 rc = sqlite3_prepare_v2(p->db,
8788 "SELECT rowid FROM sqlite_schema"
8789 " WHERE name GLOB 'sqlite_stat[134]'",
8790 -1, &pStmt, 0);
8791 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
8792 sqlite3_finalize(pStmt);
8794 if( doStats==0 ){
8795 raw_printf(p->out, "/* No STAT tables available */\n");
8796 }else{
8797 raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8798 data.cMode = data.mode = MODE_Insert;
8799 data.zDestTable = "sqlite_stat1";
8800 shell_exec(&data, "SELECT * FROM sqlite_stat1", 0);
8801 data.zDestTable = "sqlite_stat4";
8802 shell_exec(&data, "SELECT * FROM sqlite_stat4", 0);
8803 raw_printf(p->out, "ANALYZE sqlite_schema;\n");
8805 }else
8807 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
8808 if( nArg==2 ){
8809 p->showHeader = booleanValue(azArg[1]);
8810 p->shellFlgs |= SHFLG_HeaderSet;
8811 }else{
8812 raw_printf(stderr, "Usage: .headers on|off\n");
8813 rc = 1;
8815 }else
8817 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
8818 if( nArg>=2 ){
8819 n = showHelp(p->out, azArg[1]);
8820 if( n==0 ){
8821 utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]);
8823 }else{
8824 showHelp(p->out, 0);
8826 }else
8828 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
8829 char *zTable = 0; /* Insert data into this table */
8830 char *zSchema = 0; /* within this schema (may default to "main") */
8831 char *zFile = 0; /* Name of file to extra content from */
8832 sqlite3_stmt *pStmt = NULL; /* A statement */
8833 int nCol; /* Number of columns in the table */
8834 int nByte; /* Number of bytes in an SQL string */
8835 int i, j; /* Loop counters */
8836 int needCommit; /* True to COMMIT or ROLLBACK at end */
8837 int nSep; /* Number of bytes in p->colSeparator[] */
8838 char *zSql; /* An SQL statement */
8839 char *zFullTabName; /* Table name with schema if applicable */
8840 ImportCtx sCtx; /* Reader context */
8841 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
8842 int eVerbose = 0; /* Larger for more console output */
8843 int nSkip = 0; /* Initial lines to skip */
8844 int useOutputMode = 1; /* Use output mode to determine separators */
8845 char *zCreate = 0; /* CREATE TABLE statement text */
8847 failIfSafeMode(p, "cannot run .import in safe mode");
8848 memset(&sCtx, 0, sizeof(sCtx));
8849 sCtx.z = sqlite3_malloc64(120);
8850 if( sCtx.z==0 ){
8851 import_cleanup(&sCtx);
8852 shell_out_of_memory();
8854 if( p->mode==MODE_Ascii ){
8855 xRead = ascii_read_one_field;
8856 }else{
8857 xRead = csv_read_one_field;
8859 for(i=1; i<nArg; i++){
8860 char *z = azArg[i];
8861 if( z[0]=='-' && z[1]=='-' ) z++;
8862 if( z[0]!='-' ){
8863 if( zFile==0 ){
8864 zFile = z;
8865 }else if( zTable==0 ){
8866 zTable = z;
8867 }else{
8868 utf8_printf(p->out, "ERROR: extra argument: \"%s\". Usage:\n", z);
8869 showHelp(p->out, "import");
8870 rc = 1;
8871 goto meta_command_exit;
8873 }else if( strcmp(z,"-v")==0 ){
8874 eVerbose++;
8875 }else if( strcmp(z,"-schema")==0 && i<nArg-1 ){
8876 zSchema = azArg[++i];
8877 }else if( strcmp(z,"-skip")==0 && i<nArg-1 ){
8878 nSkip = integerValue(azArg[++i]);
8879 }else if( strcmp(z,"-ascii")==0 ){
8880 sCtx.cColSep = SEP_Unit[0];
8881 sCtx.cRowSep = SEP_Record[0];
8882 xRead = ascii_read_one_field;
8883 useOutputMode = 0;
8884 }else if( strcmp(z,"-csv")==0 ){
8885 sCtx.cColSep = ',';
8886 sCtx.cRowSep = '\n';
8887 xRead = csv_read_one_field;
8888 useOutputMode = 0;
8889 }else{
8890 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n", z);
8891 showHelp(p->out, "import");
8892 rc = 1;
8893 goto meta_command_exit;
8896 if( zTable==0 ){
8897 utf8_printf(p->out, "ERROR: missing %s argument. Usage:\n",
8898 zFile==0 ? "FILE" : "TABLE");
8899 showHelp(p->out, "import");
8900 rc = 1;
8901 goto meta_command_exit;
8903 seenInterrupt = 0;
8904 open_db(p, 0);
8905 if( useOutputMode ){
8906 /* If neither the --csv or --ascii options are specified, then set
8907 ** the column and row separator characters from the output mode. */
8908 nSep = strlen30(p->colSeparator);
8909 if( nSep==0 ){
8910 raw_printf(stderr,
8911 "Error: non-null column separator required for import\n");
8912 rc = 1;
8913 goto meta_command_exit;
8915 if( nSep>1 ){
8916 raw_printf(stderr,
8917 "Error: multi-character column separators not allowed"
8918 " for import\n");
8919 rc = 1;
8920 goto meta_command_exit;
8922 nSep = strlen30(p->rowSeparator);
8923 if( nSep==0 ){
8924 raw_printf(stderr,
8925 "Error: non-null row separator required for import\n");
8926 rc = 1;
8927 goto meta_command_exit;
8929 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator,SEP_CrLf)==0 ){
8930 /* When importing CSV (only), if the row separator is set to the
8931 ** default output row separator, change it to the default input
8932 ** row separator. This avoids having to maintain different input
8933 ** and output row separators. */
8934 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
8935 nSep = strlen30(p->rowSeparator);
8937 if( nSep>1 ){
8938 raw_printf(stderr, "Error: multi-character row separators not allowed"
8939 " for import\n");
8940 rc = 1;
8941 goto meta_command_exit;
8943 sCtx.cColSep = p->colSeparator[0];
8944 sCtx.cRowSep = p->rowSeparator[0];
8946 sCtx.zFile = zFile;
8947 sCtx.nLine = 1;
8948 if( sCtx.zFile[0]=='|' ){
8949 #ifdef SQLITE_OMIT_POPEN
8950 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
8951 rc = 1;
8952 goto meta_command_exit;
8953 #else
8954 sCtx.in = popen(sCtx.zFile+1, "r");
8955 sCtx.zFile = "<pipe>";
8956 sCtx.xCloser = pclose;
8957 #endif
8958 }else{
8959 sCtx.in = fopen(sCtx.zFile, "rb");
8960 sCtx.xCloser = fclose;
8962 if( sCtx.in==0 ){
8963 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
8964 rc = 1;
8965 import_cleanup(&sCtx);
8966 goto meta_command_exit;
8968 if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
8969 char zSep[2];
8970 zSep[1] = 0;
8971 zSep[0] = sCtx.cColSep;
8972 utf8_printf(p->out, "Column separator ");
8973 output_c_string(p->out, zSep);
8974 utf8_printf(p->out, ", row separator ");
8975 zSep[0] = sCtx.cRowSep;
8976 output_c_string(p->out, zSep);
8977 utf8_printf(p->out, "\n");
8979 /* Below, resources must be freed before exit. */
8980 while( (nSkip--)>0 ){
8981 while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
8983 if( zSchema!=0 ){
8984 zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
8985 }else{
8986 zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
8988 zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
8989 if( zSql==0 || zFullTabName==0 ){
8990 import_cleanup(&sCtx);
8991 shell_out_of_memory();
8993 nByte = strlen30(zSql);
8994 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
8995 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
8996 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
8997 sqlite3 *dbCols = 0;
8998 char *zRenames = 0;
8999 char *zColDefs;
9000 zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
9001 while( xRead(&sCtx) ){
9002 zAutoColumn(sCtx.z, &dbCols, 0);
9003 if( sCtx.cTerm!=sCtx.cColSep ) break;
9005 zColDefs = zAutoColumn(0, &dbCols, &zRenames);
9006 if( zRenames!=0 ){
9007 utf8_printf((stdin_is_interactive && p->in==stdin)? p->out : stderr,
9008 "Columns renamed during .import %s due to duplicates:\n"
9009 "%s\n", sCtx.zFile, zRenames);
9010 sqlite3_free(zRenames);
9012 assert(dbCols==0);
9013 if( zColDefs==0 ){
9014 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
9015 import_fail:
9016 sqlite3_free(zCreate);
9017 sqlite3_free(zSql);
9018 sqlite3_free(zFullTabName);
9019 import_cleanup(&sCtx);
9020 rc = 1;
9021 goto meta_command_exit;
9023 zCreate = sqlite3_mprintf("%z%z\n", zCreate, zColDefs);
9024 if( eVerbose>=1 ){
9025 utf8_printf(p->out, "%s\n", zCreate);
9027 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
9028 if( rc ){
9029 utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
9030 goto import_fail;
9032 sqlite3_free(zCreate);
9033 zCreate = 0;
9034 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9036 if( rc ){
9037 if (pStmt) sqlite3_finalize(pStmt);
9038 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
9039 goto import_fail;
9041 sqlite3_free(zSql);
9042 nCol = sqlite3_column_count(pStmt);
9043 sqlite3_finalize(pStmt);
9044 pStmt = 0;
9045 if( nCol==0 ) return 0; /* no columns, no error */
9046 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
9047 if( zSql==0 ){
9048 import_cleanup(&sCtx);
9049 shell_out_of_memory();
9051 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
9052 j = strlen30(zSql);
9053 for(i=1; i<nCol; i++){
9054 zSql[j++] = ',';
9055 zSql[j++] = '?';
9057 zSql[j++] = ')';
9058 zSql[j] = 0;
9059 if( eVerbose>=2 ){
9060 utf8_printf(p->out, "Insert using: %s\n", zSql);
9062 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9063 if( rc ){
9064 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9065 if (pStmt) sqlite3_finalize(pStmt);
9066 goto import_fail;
9068 sqlite3_free(zSql);
9069 sqlite3_free(zFullTabName);
9070 needCommit = sqlite3_get_autocommit(p->db);
9071 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
9073 int startLine = sCtx.nLine;
9074 for(i=0; i<nCol; i++){
9075 char *z = xRead(&sCtx);
9077 ** Did we reach end-of-file before finding any columns?
9078 ** If so, stop instead of NULL filling the remaining columns.
9080 if( z==0 && i==0 ) break;
9082 ** Did we reach end-of-file OR end-of-line before finding any
9083 ** columns in ASCII mode? If so, stop instead of NULL filling
9084 ** the remaining columns.
9086 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
9087 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
9088 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
9089 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9090 "filling the rest with NULL\n",
9091 sCtx.zFile, startLine, nCol, i+1);
9092 i += 2;
9093 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
9096 if( sCtx.cTerm==sCtx.cColSep ){
9098 xRead(&sCtx);
9099 i++;
9100 }while( sCtx.cTerm==sCtx.cColSep );
9101 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
9102 "extras ignored\n",
9103 sCtx.zFile, startLine, nCol, i);
9105 if( i>=nCol ){
9106 sqlite3_step(pStmt);
9107 rc = sqlite3_reset(pStmt);
9108 if( rc!=SQLITE_OK ){
9109 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
9110 startLine, sqlite3_errmsg(p->db));
9111 sCtx.nErr++;
9112 }else{
9113 sCtx.nRow++;
9116 }while( sCtx.cTerm!=EOF );
9118 import_cleanup(&sCtx);
9119 sqlite3_finalize(pStmt);
9120 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
9121 if( eVerbose>0 ){
9122 utf8_printf(p->out,
9123 "Added %d rows with %d errors using %d lines of input\n",
9124 sCtx.nRow, sCtx.nErr, sCtx.nLine-1);
9126 }else
9128 #ifndef SQLITE_UNTESTABLE
9129 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
9130 char *zSql;
9131 char *zCollist = 0;
9132 sqlite3_stmt *pStmt;
9133 int tnum = 0;
9134 int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */
9135 int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
9136 int i;
9137 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
9138 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
9139 " .imposter off\n");
9140 /* Also allowed, but not documented:
9142 ** .imposter TABLE IMPOSTER
9144 ** where TABLE is a WITHOUT ROWID table. In that case, the
9145 ** imposter is another WITHOUT ROWID table with the columns in
9146 ** storage order. */
9147 rc = 1;
9148 goto meta_command_exit;
9150 open_db(p, 0);
9151 if( nArg==2 ){
9152 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
9153 goto meta_command_exit;
9155 zSql = sqlite3_mprintf(
9156 "SELECT rootpage, 0 FROM sqlite_schema"
9157 " WHERE name='%q' AND type='index'"
9158 "UNION ALL "
9159 "SELECT rootpage, 1 FROM sqlite_schema"
9160 " WHERE name='%q' AND type='table'"
9161 " AND sql LIKE '%%without%%rowid%%'",
9162 azArg[1], azArg[1]
9164 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9165 sqlite3_free(zSql);
9166 if( sqlite3_step(pStmt)==SQLITE_ROW ){
9167 tnum = sqlite3_column_int(pStmt, 0);
9168 isWO = sqlite3_column_int(pStmt, 1);
9170 sqlite3_finalize(pStmt);
9171 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
9172 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9173 sqlite3_free(zSql);
9174 i = 0;
9175 while( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9176 char zLabel[20];
9177 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
9178 i++;
9179 if( zCol==0 ){
9180 if( sqlite3_column_int(pStmt,1)==-1 ){
9181 zCol = "_ROWID_";
9182 }else{
9183 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
9184 zCol = zLabel;
9187 if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
9188 lenPK = (int)strlen(zCollist);
9190 if( zCollist==0 ){
9191 zCollist = sqlite3_mprintf("\"%w\"", zCol);
9192 }else{
9193 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
9196 sqlite3_finalize(pStmt);
9197 if( i==0 || tnum==0 ){
9198 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
9199 rc = 1;
9200 sqlite3_free(zCollist);
9201 goto meta_command_exit;
9203 if( lenPK==0 ) lenPK = 100000;
9204 zSql = sqlite3_mprintf(
9205 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
9206 azArg[2], zCollist, lenPK, zCollist);
9207 sqlite3_free(zCollist);
9208 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
9209 if( rc==SQLITE_OK ){
9210 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
9211 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
9212 if( rc ){
9213 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
9214 }else{
9215 utf8_printf(stdout, "%s;\n", zSql);
9216 raw_printf(stdout,
9217 "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
9218 azArg[1], isWO ? "table" : "index"
9221 }else{
9222 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
9223 rc = 1;
9225 sqlite3_free(zSql);
9226 }else
9227 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
9229 #ifdef SQLITE_ENABLE_IOTRACE
9230 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
9231 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
9232 if( iotrace && iotrace!=stdout ) fclose(iotrace);
9233 iotrace = 0;
9234 if( nArg<2 ){
9235 sqlite3IoTrace = 0;
9236 }else if( strcmp(azArg[1], "-")==0 ){
9237 sqlite3IoTrace = iotracePrintf;
9238 iotrace = stdout;
9239 }else{
9240 iotrace = fopen(azArg[1], "w");
9241 if( iotrace==0 ){
9242 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9243 sqlite3IoTrace = 0;
9244 rc = 1;
9245 }else{
9246 sqlite3IoTrace = iotracePrintf;
9249 }else
9250 #endif
9252 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
9253 static const struct {
9254 const char *zLimitName; /* Name of a limit */
9255 int limitCode; /* Integer code for that limit */
9256 } aLimit[] = {
9257 { "length", SQLITE_LIMIT_LENGTH },
9258 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
9259 { "column", SQLITE_LIMIT_COLUMN },
9260 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
9261 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
9262 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
9263 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
9264 { "attached", SQLITE_LIMIT_ATTACHED },
9265 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
9266 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
9267 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
9268 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
9270 int i, n2;
9271 open_db(p, 0);
9272 if( nArg==1 ){
9273 for(i=0; i<ArraySize(aLimit); i++){
9274 printf("%20s %d\n", aLimit[i].zLimitName,
9275 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
9277 }else if( nArg>3 ){
9278 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
9279 rc = 1;
9280 goto meta_command_exit;
9281 }else{
9282 int iLimit = -1;
9283 n2 = strlen30(azArg[1]);
9284 for(i=0; i<ArraySize(aLimit); i++){
9285 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
9286 if( iLimit<0 ){
9287 iLimit = i;
9288 }else{
9289 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
9290 rc = 1;
9291 goto meta_command_exit;
9295 if( iLimit<0 ){
9296 utf8_printf(stderr, "unknown limit: \"%s\"\n"
9297 "enter \".limits\" with no arguments for a list.\n",
9298 azArg[1]);
9299 rc = 1;
9300 goto meta_command_exit;
9302 if( nArg==3 ){
9303 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
9304 (int)integerValue(azArg[2]));
9306 printf("%20s %d\n", aLimit[iLimit].zLimitName,
9307 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
9309 }else
9311 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
9312 open_db(p, 0);
9313 lintDotCommand(p, azArg, nArg);
9314 }else
9316 #ifndef SQLITE_OMIT_LOAD_EXTENSION
9317 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
9318 const char *zFile, *zProc;
9319 char *zErrMsg = 0;
9320 failIfSafeMode(p, "cannot run .load in safe mode");
9321 if( nArg<2 ){
9322 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
9323 rc = 1;
9324 goto meta_command_exit;
9326 zFile = azArg[1];
9327 zProc = nArg>=3 ? azArg[2] : 0;
9328 open_db(p, 0);
9329 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
9330 if( rc!=SQLITE_OK ){
9331 utf8_printf(stderr, "Error: %s\n", zErrMsg);
9332 sqlite3_free(zErrMsg);
9333 rc = 1;
9335 }else
9336 #endif
9338 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
9339 failIfSafeMode(p, "cannot run .log in safe mode");
9340 if( nArg!=2 ){
9341 raw_printf(stderr, "Usage: .log FILENAME\n");
9342 rc = 1;
9343 }else{
9344 const char *zFile = azArg[1];
9345 output_file_close(p->pLog);
9346 p->pLog = output_file_open(zFile, 0);
9348 }else
9350 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
9351 const char *zMode = 0;
9352 const char *zTabname = 0;
9353 int i, n2;
9354 ColModeOpts cmOpts = ColModeOpts_default;
9355 for(i=1; i<nArg; i++){
9356 const char *z = azArg[i];
9357 if( optionMatch(z,"wrap") && i+1<nArg ){
9358 cmOpts.iWrap = integerValue(azArg[++i]);
9359 }else if( optionMatch(z,"ww") ){
9360 cmOpts.bWordWrap = 1;
9361 }else if( optionMatch(z,"wordwrap") && i+1<nArg ){
9362 cmOpts.bWordWrap = (u8)booleanValue(azArg[++i]);
9363 }else if( optionMatch(z,"quote") ){
9364 cmOpts.bQuote = 1;
9365 }else if( optionMatch(z,"noquote") ){
9366 cmOpts.bQuote = 0;
9367 }else if( zMode==0 ){
9368 zMode = z;
9369 /* Apply defaults for qbox pseudo-mods. If that
9370 * overwrites already-set values, user was informed of this.
9372 if( strcmp(z, "qbox")==0 ){
9373 ColModeOpts cmo = ColModeOpts_default_qbox;
9374 zMode = "box";
9375 cmOpts = cmo;
9377 }else if( zTabname==0 ){
9378 zTabname = z;
9379 }else if( z[0]=='-' ){
9380 utf8_printf(stderr, "unknown option: %s\n", z);
9381 utf8_printf(stderr, "options:\n"
9382 " --noquote\n"
9383 " --quote\n"
9384 " --wordwrap on/off\n"
9385 " --wrap N\n"
9386 " --ww\n");
9387 rc = 1;
9388 goto meta_command_exit;
9389 }else{
9390 utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9391 rc = 1;
9392 goto meta_command_exit;
9395 if( zMode==0 ){
9396 if( p->mode==MODE_Column
9397 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
9399 raw_printf
9400 (p->out,
9401 "current output mode: %s --wrap %d --wordwrap %s --%squote\n",
9402 modeDescr[p->mode], p->cmOpts.iWrap,
9403 p->cmOpts.bWordWrap ? "on" : "off",
9404 p->cmOpts.bQuote ? "" : "no");
9405 }else{
9406 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
9408 zMode = modeDescr[p->mode];
9410 n2 = strlen30(zMode);
9411 if( strncmp(zMode,"lines",n2)==0 ){
9412 p->mode = MODE_Line;
9413 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9414 }else if( strncmp(zMode,"columns",n2)==0 ){
9415 p->mode = MODE_Column;
9416 if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){
9417 p->showHeader = 1;
9419 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9420 p->cmOpts = cmOpts;
9421 }else if( strncmp(zMode,"list",n2)==0 ){
9422 p->mode = MODE_List;
9423 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
9424 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9425 }else if( strncmp(zMode,"html",n2)==0 ){
9426 p->mode = MODE_Html;
9427 }else if( strncmp(zMode,"tcl",n2)==0 ){
9428 p->mode = MODE_Tcl;
9429 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
9430 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9431 }else if( strncmp(zMode,"csv",n2)==0 ){
9432 p->mode = MODE_Csv;
9433 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9434 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9435 }else if( strncmp(zMode,"tabs",n2)==0 ){
9436 p->mode = MODE_List;
9437 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
9438 }else if( strncmp(zMode,"insert",n2)==0 ){
9439 p->mode = MODE_Insert;
9440 set_table_name(p, zTabname ? zTabname : "table");
9441 }else if( strncmp(zMode,"quote",n2)==0 ){
9442 p->mode = MODE_Quote;
9443 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9444 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
9445 }else if( strncmp(zMode,"ascii",n2)==0 ){
9446 p->mode = MODE_Ascii;
9447 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
9448 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
9449 }else if( strncmp(zMode,"markdown",n2)==0 ){
9450 p->mode = MODE_Markdown;
9451 p->cmOpts = cmOpts;
9452 }else if( strncmp(zMode,"table",n2)==0 ){
9453 p->mode = MODE_Table;
9454 p->cmOpts = cmOpts;
9455 }else if( strncmp(zMode,"box",n2)==0 ){
9456 p->mode = MODE_Box;
9457 p->cmOpts = cmOpts;
9458 }else if( strncmp(zMode,"count",n2)==0 ){
9459 p->mode = MODE_Count;
9460 }else if( strncmp(zMode,"off",n2)==0 ){
9461 p->mode = MODE_Off;
9462 }else if( strncmp(zMode,"json",n2)==0 ){
9463 p->mode = MODE_Json;
9464 }else{
9465 raw_printf(stderr, "Error: mode should be one of: "
9466 "ascii box column csv html insert json line list markdown "
9467 "qbox quote table tabs tcl\n");
9468 rc = 1;
9470 p->cMode = p->mode;
9471 }else
9473 if( c=='n' && strcmp(azArg[0], "nonce")==0 ){
9474 if( nArg!=2 ){
9475 raw_printf(stderr, "Usage: .nonce NONCE\n");
9476 rc = 1;
9477 }else if( p->zNonce==0 || strcmp(azArg[1],p->zNonce)!=0 ){
9478 raw_printf(stderr, "line %d: incorrect nonce: \"%s\"\n",
9479 p->lineno, azArg[1]);
9480 exit(1);
9481 }else{
9482 p->bSafeMode = 0;
9483 return 0; /* Return immediately to bypass the safe mode reset
9484 ** at the end of this procedure */
9486 }else
9488 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
9489 if( nArg==2 ){
9490 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
9491 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
9492 }else{
9493 raw_printf(stderr, "Usage: .nullvalue STRING\n");
9494 rc = 1;
9496 }else
9498 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
9499 const char *zFN = 0; /* Pointer to constant filename */
9500 char *zNewFilename = 0; /* Name of the database file to open */
9501 int iName = 1; /* Index in azArg[] of the filename */
9502 int newFlag = 0; /* True to delete file before opening */
9503 int openMode = SHELL_OPEN_UNSPEC;
9505 /* Check for command-line arguments */
9506 for(iName=1; iName<nArg; iName++){
9507 const char *z = azArg[iName];
9508 if( optionMatch(z,"new") ){
9509 newFlag = 1;
9510 #ifdef SQLITE_HAVE_ZLIB
9511 }else if( optionMatch(z, "zip") ){
9512 openMode = SHELL_OPEN_ZIPFILE;
9513 #endif
9514 }else if( optionMatch(z, "append") ){
9515 openMode = SHELL_OPEN_APPENDVFS;
9516 }else if( optionMatch(z, "readonly") ){
9517 openMode = SHELL_OPEN_READONLY;
9518 }else if( optionMatch(z, "nofollow") ){
9519 p->openFlags |= SQLITE_OPEN_NOFOLLOW;
9520 #ifndef SQLITE_OMIT_DESERIALIZE
9521 }else if( optionMatch(z, "deserialize") ){
9522 openMode = SHELL_OPEN_DESERIALIZE;
9523 }else if( optionMatch(z, "hexdb") ){
9524 openMode = SHELL_OPEN_HEXDB;
9525 }else if( optionMatch(z, "maxsize") && iName+1<nArg ){
9526 p->szMax = integerValue(azArg[++iName]);
9527 #endif /* SQLITE_OMIT_DESERIALIZE */
9528 }else if( z[0]=='-' ){
9529 utf8_printf(stderr, "unknown option: %s\n", z);
9530 rc = 1;
9531 goto meta_command_exit;
9532 }else if( zFN ){
9533 utf8_printf(stderr, "extra argument: \"%s\"\n", z);
9534 rc = 1;
9535 goto meta_command_exit;
9536 }else{
9537 zFN = z;
9541 /* Close the existing database */
9542 session_close_all(p, -1);
9543 close_db(p->db);
9544 p->db = 0;
9545 p->pAuxDb->zDbFilename = 0;
9546 sqlite3_free(p->pAuxDb->zFreeOnClose);
9547 p->pAuxDb->zFreeOnClose = 0;
9548 p->openMode = openMode;
9549 p->openFlags = 0;
9550 p->szMax = 0;
9552 /* If a filename is specified, try to open it first */
9553 if( zFN || p->openMode==SHELL_OPEN_HEXDB ){
9554 if( newFlag && zFN && !p->bSafeMode ) shellDeleteFile(zFN);
9555 if( p->bSafeMode
9556 && p->openMode!=SHELL_OPEN_HEXDB
9557 && zFN
9558 && strcmp(zFN,":memory:")!=0
9560 failIfSafeMode(p, "cannot open disk-based database files in safe mode");
9562 if( zFN ){
9563 zNewFilename = sqlite3_mprintf("%s", zFN);
9564 shell_check_oom(zNewFilename);
9565 }else{
9566 zNewFilename = 0;
9568 p->pAuxDb->zDbFilename = zNewFilename;
9569 open_db(p, OPEN_DB_KEEPALIVE);
9570 if( p->db==0 ){
9571 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
9572 sqlite3_free(zNewFilename);
9573 }else{
9574 p->pAuxDb->zFreeOnClose = zNewFilename;
9577 if( p->db==0 ){
9578 /* As a fall-back open a TEMP database */
9579 p->pAuxDb->zDbFilename = 0;
9580 open_db(p, 0);
9582 }else
9584 if( (c=='o'
9585 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
9586 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
9588 char *zFile = 0;
9589 int bTxtMode = 0;
9590 int i;
9591 int eMode = 0;
9592 int bBOM = 0;
9593 int bOnce = 0; /* 0: .output, 1: .once, 2: .excel */
9595 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
9596 if( c=='e' ){
9597 eMode = 'x';
9598 bOnce = 2;
9599 }else if( strncmp(azArg[0],"once",n)==0 ){
9600 bOnce = 1;
9602 for(i=1; i<nArg; i++){
9603 char *z = azArg[i];
9604 if( z[0]=='-' ){
9605 if( z[1]=='-' ) z++;
9606 if( strcmp(z,"-bom")==0 ){
9607 bBOM = 1;
9608 }else if( c!='e' && strcmp(z,"-x")==0 ){
9609 eMode = 'x'; /* spreadsheet */
9610 }else if( c!='e' && strcmp(z,"-e")==0 ){
9611 eMode = 'e'; /* text editor */
9612 }else{
9613 utf8_printf(p->out, "ERROR: unknown option: \"%s\". Usage:\n",
9614 azArg[i]);
9615 showHelp(p->out, azArg[0]);
9616 rc = 1;
9617 goto meta_command_exit;
9619 }else if( zFile==0 && eMode!='e' && eMode!='x' ){
9620 zFile = sqlite3_mprintf("%s", z);
9621 if( zFile && zFile[0]=='|' ){
9622 while( i+1<nArg ) zFile = sqlite3_mprintf("%z %s", zFile, azArg[++i]);
9623 break;
9625 }else{
9626 utf8_printf(p->out,"ERROR: extra parameter: \"%s\". Usage:\n",
9627 azArg[i]);
9628 showHelp(p->out, azArg[0]);
9629 rc = 1;
9630 sqlite3_free(zFile);
9631 goto meta_command_exit;
9634 if( zFile==0 ){
9635 zFile = sqlite3_mprintf("stdout");
9637 if( bOnce ){
9638 p->outCount = 2;
9639 }else{
9640 p->outCount = 0;
9642 output_reset(p);
9643 #ifndef SQLITE_NOHAVE_SYSTEM
9644 if( eMode=='e' || eMode=='x' ){
9645 p->doXdgOpen = 1;
9646 outputModePush(p);
9647 if( eMode=='x' ){
9648 /* spreadsheet mode. Output as CSV. */
9649 newTempFile(p, "csv");
9650 ShellClearFlag(p, SHFLG_Echo);
9651 p->mode = MODE_Csv;
9652 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
9653 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
9654 }else{
9655 /* text editor mode */
9656 newTempFile(p, "txt");
9657 bTxtMode = 1;
9659 sqlite3_free(zFile);
9660 zFile = sqlite3_mprintf("%s", p->zTempFile);
9662 #endif /* SQLITE_NOHAVE_SYSTEM */
9663 shell_check_oom(zFile);
9664 if( zFile[0]=='|' ){
9665 #ifdef SQLITE_OMIT_POPEN
9666 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9667 rc = 1;
9668 p->out = stdout;
9669 #else
9670 p->out = popen(zFile + 1, "w");
9671 if( p->out==0 ){
9672 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
9673 p->out = stdout;
9674 rc = 1;
9675 }else{
9676 if( bBOM ) fprintf(p->out,"\357\273\277");
9677 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9679 #endif
9680 }else{
9681 p->out = output_file_open(zFile, bTxtMode);
9682 if( p->out==0 ){
9683 if( strcmp(zFile,"off")!=0 ){
9684 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
9686 p->out = stdout;
9687 rc = 1;
9688 } else {
9689 if( bBOM ) fprintf(p->out,"\357\273\277");
9690 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
9693 sqlite3_free(zFile);
9694 }else
9696 if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){
9697 open_db(p,0);
9698 if( nArg<=1 ) goto parameter_syntax_error;
9700 /* .parameter clear
9701 ** Clear all bind parameters by dropping the TEMP table that holds them.
9703 if( nArg==2 && strcmp(azArg[1],"clear")==0 ){
9704 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.sqlite_parameters;",
9705 0, 0, 0);
9706 }else
9708 /* .parameter list
9709 ** List all bind parameters.
9711 if( nArg==2 && strcmp(azArg[1],"list")==0 ){
9712 sqlite3_stmt *pStmt = 0;
9713 int rx;
9714 int len = 0;
9715 rx = sqlite3_prepare_v2(p->db,
9716 "SELECT max(length(key)) "
9717 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9718 if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9719 len = sqlite3_column_int(pStmt, 0);
9720 if( len>40 ) len = 40;
9722 sqlite3_finalize(pStmt);
9723 pStmt = 0;
9724 if( len ){
9725 rx = sqlite3_prepare_v2(p->db,
9726 "SELECT key, quote(value) "
9727 "FROM temp.sqlite_parameters;", -1, &pStmt, 0);
9728 while( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
9729 utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0),
9730 sqlite3_column_text(pStmt,1));
9732 sqlite3_finalize(pStmt);
9734 }else
9736 /* .parameter init
9737 ** Make sure the TEMP table used to hold bind parameters exists.
9738 ** Create it if necessary.
9740 if( nArg==2 && strcmp(azArg[1],"init")==0 ){
9741 bind_table_init(p);
9742 }else
9744 /* .parameter set NAME VALUE
9745 ** Set or reset a bind parameter. NAME should be the full parameter
9746 ** name exactly as it appears in the query. (ex: $abc, @def). The
9747 ** VALUE can be in either SQL literal notation, or if not it will be
9748 ** understood to be a text string.
9750 if( nArg==4 && strcmp(azArg[1],"set")==0 ){
9751 int rx;
9752 char *zSql;
9753 sqlite3_stmt *pStmt;
9754 const char *zKey = azArg[2];
9755 const char *zValue = azArg[3];
9756 bind_table_init(p);
9757 zSql = sqlite3_mprintf(
9758 "REPLACE INTO temp.sqlite_parameters(key,value)"
9759 "VALUES(%Q,%s);", zKey, zValue);
9760 shell_check_oom(zSql);
9761 pStmt = 0;
9762 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9763 sqlite3_free(zSql);
9764 if( rx!=SQLITE_OK ){
9765 sqlite3_finalize(pStmt);
9766 pStmt = 0;
9767 zSql = sqlite3_mprintf(
9768 "REPLACE INTO temp.sqlite_parameters(key,value)"
9769 "VALUES(%Q,%Q);", zKey, zValue);
9770 shell_check_oom(zSql);
9771 rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
9772 sqlite3_free(zSql);
9773 if( rx!=SQLITE_OK ){
9774 utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db));
9775 sqlite3_finalize(pStmt);
9776 pStmt = 0;
9777 rc = 1;
9780 sqlite3_step(pStmt);
9781 sqlite3_finalize(pStmt);
9782 }else
9784 /* .parameter unset NAME
9785 ** Remove the NAME binding from the parameter binding table, if it
9786 ** exists.
9788 if( nArg==3 && strcmp(azArg[1],"unset")==0 ){
9789 char *zSql = sqlite3_mprintf(
9790 "DELETE FROM temp.sqlite_parameters WHERE key=%Q", azArg[2]);
9791 shell_check_oom(zSql);
9792 sqlite3_exec(p->db, zSql, 0, 0, 0);
9793 sqlite3_free(zSql);
9794 }else
9795 /* If no command name matches, show a syntax error */
9796 parameter_syntax_error:
9797 showHelp(p->out, "parameter");
9798 }else
9800 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
9801 int i;
9802 for(i=1; i<nArg; i++){
9803 if( i>1 ) raw_printf(p->out, " ");
9804 utf8_printf(p->out, "%s", azArg[i]);
9806 raw_printf(p->out, "\n");
9807 }else
9809 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9810 if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){
9811 int i;
9812 int nn = 0;
9813 p->flgProgress = 0;
9814 p->mxProgress = 0;
9815 p->nProgress = 0;
9816 for(i=1; i<nArg; i++){
9817 const char *z = azArg[i];
9818 if( z[0]=='-' ){
9819 z++;
9820 if( z[0]=='-' ) z++;
9821 if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){
9822 p->flgProgress |= SHELL_PROGRESS_QUIET;
9823 continue;
9825 if( strcmp(z,"reset")==0 ){
9826 p->flgProgress |= SHELL_PROGRESS_RESET;
9827 continue;
9829 if( strcmp(z,"once")==0 ){
9830 p->flgProgress |= SHELL_PROGRESS_ONCE;
9831 continue;
9833 if( strcmp(z,"limit")==0 ){
9834 if( i+1>=nArg ){
9835 utf8_printf(stderr, "Error: missing argument on --limit\n");
9836 rc = 1;
9837 goto meta_command_exit;
9838 }else{
9839 p->mxProgress = (int)integerValue(azArg[++i]);
9841 continue;
9843 utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]);
9844 rc = 1;
9845 goto meta_command_exit;
9846 }else{
9847 nn = (int)integerValue(z);
9850 open_db(p, 0);
9851 sqlite3_progress_handler(p->db, nn, progress_handler, p);
9852 }else
9853 #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */
9855 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
9856 if( nArg >= 2) {
9857 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
9859 if( nArg >= 3) {
9860 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
9862 }else
9864 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
9865 rc = 2;
9866 }else
9868 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
9869 FILE *inSaved = p->in;
9870 int savedLineno = p->lineno;
9871 failIfSafeMode(p, "cannot run .read in safe mode");
9872 if( nArg!=2 ){
9873 raw_printf(stderr, "Usage: .read FILE\n");
9874 rc = 1;
9875 goto meta_command_exit;
9877 if( azArg[1][0]=='|' ){
9878 #ifdef SQLITE_OMIT_POPEN
9879 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
9880 rc = 1;
9881 p->out = stdout;
9882 #else
9883 p->in = popen(azArg[1]+1, "r");
9884 if( p->in==0 ){
9885 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
9886 rc = 1;
9887 }else{
9888 rc = process_input(p);
9889 pclose(p->in);
9891 #endif
9892 }else if( (p->in = openChrSource(azArg[1]))==0 ){
9893 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
9894 rc = 1;
9895 }else{
9896 rc = process_input(p);
9897 fclose(p->in);
9899 p->in = inSaved;
9900 p->lineno = savedLineno;
9901 }else
9903 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
9904 const char *zSrcFile;
9905 const char *zDb;
9906 sqlite3 *pSrc;
9907 sqlite3_backup *pBackup;
9908 int nTimeout = 0;
9910 failIfSafeMode(p, "cannot run .restore in safe mode");
9911 if( nArg==2 ){
9912 zSrcFile = azArg[1];
9913 zDb = "main";
9914 }else if( nArg==3 ){
9915 zSrcFile = azArg[2];
9916 zDb = azArg[1];
9917 }else{
9918 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
9919 rc = 1;
9920 goto meta_command_exit;
9922 rc = sqlite3_open(zSrcFile, &pSrc);
9923 if( rc!=SQLITE_OK ){
9924 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
9925 close_db(pSrc);
9926 return 1;
9928 open_db(p, 0);
9929 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
9930 if( pBackup==0 ){
9931 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9932 close_db(pSrc);
9933 return 1;
9935 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
9936 || rc==SQLITE_BUSY ){
9937 if( rc==SQLITE_BUSY ){
9938 if( nTimeout++ >= 3 ) break;
9939 sqlite3_sleep(100);
9942 sqlite3_backup_finish(pBackup);
9943 if( rc==SQLITE_DONE ){
9944 rc = 0;
9945 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
9946 raw_printf(stderr, "Error: source database is busy\n");
9947 rc = 1;
9948 }else{
9949 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
9950 rc = 1;
9952 close_db(pSrc);
9953 }else
9955 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
9956 if( nArg==2 ){
9957 p->scanstatsOn = (u8)booleanValue(azArg[1]);
9958 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
9959 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
9960 #endif
9961 }else{
9962 raw_printf(stderr, "Usage: .scanstats on|off\n");
9963 rc = 1;
9965 }else
9967 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
9968 ShellText sSelect;
9969 ShellState data;
9970 char *zErrMsg = 0;
9971 const char *zDiv = "(";
9972 const char *zName = 0;
9973 int iSchema = 0;
9974 int bDebug = 0;
9975 int bNoSystemTabs = 0;
9976 int ii;
9978 open_db(p, 0);
9979 memcpy(&data, p, sizeof(data));
9980 data.showHeader = 0;
9981 data.cMode = data.mode = MODE_Semi;
9982 initText(&sSelect);
9983 for(ii=1; ii<nArg; ii++){
9984 if( optionMatch(azArg[ii],"indent") ){
9985 data.cMode = data.mode = MODE_Pretty;
9986 }else if( optionMatch(azArg[ii],"debug") ){
9987 bDebug = 1;
9988 }else if( optionMatch(azArg[ii],"nosys") ){
9989 bNoSystemTabs = 1;
9990 }else if( azArg[ii][0]=='-' ){
9991 utf8_printf(stderr, "Unknown option: \"%s\"\n", azArg[ii]);
9992 rc = 1;
9993 goto meta_command_exit;
9994 }else if( zName==0 ){
9995 zName = azArg[ii];
9996 }else{
9997 raw_printf(stderr, "Usage: .schema ?--indent? ?--nosys? ?LIKE-PATTERN?\n");
9998 rc = 1;
9999 goto meta_command_exit;
10002 if( zName!=0 ){
10003 int isSchema = sqlite3_strlike(zName, "sqlite_master", '\\')==0
10004 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
10005 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
10006 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
10007 if( isSchema ){
10008 char *new_argv[2], *new_colv[2];
10009 new_argv[0] = sqlite3_mprintf(
10010 "CREATE TABLE %s (\n"
10011 " type text,\n"
10012 " name text,\n"
10013 " tbl_name text,\n"
10014 " rootpage integer,\n"
10015 " sql text\n"
10016 ")", zName);
10017 shell_check_oom(new_argv[0]);
10018 new_argv[1] = 0;
10019 new_colv[0] = "sql";
10020 new_colv[1] = 0;
10021 callback(&data, 1, new_argv, new_colv);
10022 sqlite3_free(new_argv[0]);
10025 if( zDiv ){
10026 sqlite3_stmt *pStmt = 0;
10027 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
10028 -1, &pStmt, 0);
10029 if( rc ){
10030 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
10031 sqlite3_finalize(pStmt);
10032 rc = 1;
10033 goto meta_command_exit;
10035 appendText(&sSelect, "SELECT sql FROM", 0);
10036 iSchema = 0;
10037 while( sqlite3_step(pStmt)==SQLITE_ROW ){
10038 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
10039 char zScNum[30];
10040 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
10041 appendText(&sSelect, zDiv, 0);
10042 zDiv = " UNION ALL ";
10043 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
10044 if( sqlite3_stricmp(zDb, "main")!=0 ){
10045 appendText(&sSelect, zDb, '\'');
10046 }else{
10047 appendText(&sSelect, "NULL", 0);
10049 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
10050 appendText(&sSelect, zScNum, 0);
10051 appendText(&sSelect, " AS snum, ", 0);
10052 appendText(&sSelect, zDb, '\'');
10053 appendText(&sSelect, " AS sname FROM ", 0);
10054 appendText(&sSelect, zDb, quoteChar(zDb));
10055 appendText(&sSelect, ".sqlite_schema", 0);
10057 sqlite3_finalize(pStmt);
10058 #ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS
10059 if( zName ){
10060 appendText(&sSelect,
10061 " UNION ALL SELECT shell_module_schema(name),"
10062 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list",
10065 #endif
10066 appendText(&sSelect, ") WHERE ", 0);
10067 if( zName ){
10068 char *zQarg = sqlite3_mprintf("%Q", zName);
10069 int bGlob;
10070 shell_check_oom(zQarg);
10071 bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
10072 strchr(zName, '[') != 0;
10073 if( strchr(zName, '.') ){
10074 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
10075 }else{
10076 appendText(&sSelect, "lower(tbl_name)", 0);
10078 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
10079 appendText(&sSelect, zQarg, 0);
10080 if( !bGlob ){
10081 appendText(&sSelect, " ESCAPE '\\' ", 0);
10083 appendText(&sSelect, " AND ", 0);
10084 sqlite3_free(zQarg);
10086 if( bNoSystemTabs ){
10087 appendText(&sSelect, "name NOT LIKE 'sqlite_%%' AND ", 0);
10089 appendText(&sSelect, "sql IS NOT NULL"
10090 " ORDER BY snum, rowid", 0);
10091 if( bDebug ){
10092 utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
10093 }else{
10094 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
10096 freeText(&sSelect);
10098 if( zErrMsg ){
10099 utf8_printf(stderr,"Error: %s\n", zErrMsg);
10100 sqlite3_free(zErrMsg);
10101 rc = 1;
10102 }else if( rc != SQLITE_OK ){
10103 raw_printf(stderr,"Error: querying schema information\n");
10104 rc = 1;
10105 }else{
10106 rc = 0;
10108 }else
10110 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
10111 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
10112 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 1, &x);
10113 }else
10115 #if defined(SQLITE_ENABLE_SESSION)
10116 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
10117 struct AuxDb *pAuxDb = p->pAuxDb;
10118 OpenSession *pSession = &pAuxDb->aSession[0];
10119 char **azCmd = &azArg[1];
10120 int iSes = 0;
10121 int nCmd = nArg - 1;
10122 int i;
10123 if( nArg<=1 ) goto session_syntax_error;
10124 open_db(p, 0);
10125 if( nArg>=3 ){
10126 for(iSes=0; iSes<pAuxDb->nSession; iSes++){
10127 if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break;
10129 if( iSes<pAuxDb->nSession ){
10130 pSession = &pAuxDb->aSession[iSes];
10131 azCmd++;
10132 nCmd--;
10133 }else{
10134 pSession = &pAuxDb->aSession[0];
10135 iSes = 0;
10139 /* .session attach TABLE
10140 ** Invoke the sqlite3session_attach() interface to attach a particular
10141 ** table so that it is never filtered.
10143 if( strcmp(azCmd[0],"attach")==0 ){
10144 if( nCmd!=2 ) goto session_syntax_error;
10145 if( pSession->p==0 ){
10146 session_not_open:
10147 raw_printf(stderr, "ERROR: No sessions are open\n");
10148 }else{
10149 rc = sqlite3session_attach(pSession->p, azCmd[1]);
10150 if( rc ){
10151 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
10152 rc = 0;
10155 }else
10157 /* .session changeset FILE
10158 ** .session patchset FILE
10159 ** Write a changeset or patchset into a file. The file is overwritten.
10161 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
10162 FILE *out = 0;
10163 failIfSafeMode(p, "cannot run \".session %s\" in safe mode", azCmd[0]);
10164 if( nCmd!=2 ) goto session_syntax_error;
10165 if( pSession->p==0 ) goto session_not_open;
10166 out = fopen(azCmd[1], "wb");
10167 if( out==0 ){
10168 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n",
10169 azCmd[1]);
10170 }else{
10171 int szChng;
10172 void *pChng;
10173 if( azCmd[0][0]=='c' ){
10174 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
10175 }else{
10176 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
10178 if( rc ){
10179 printf("Error: error code %d\n", rc);
10180 rc = 0;
10182 if( pChng
10183 && fwrite(pChng, szChng, 1, out)!=1 ){
10184 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
10185 szChng);
10187 sqlite3_free(pChng);
10188 fclose(out);
10190 }else
10192 /* .session close
10193 ** Close the identified session
10195 if( strcmp(azCmd[0], "close")==0 ){
10196 if( nCmd!=1 ) goto session_syntax_error;
10197 if( pAuxDb->nSession ){
10198 session_close(pSession);
10199 pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession];
10201 }else
10203 /* .session enable ?BOOLEAN?
10204 ** Query or set the enable flag
10206 if( strcmp(azCmd[0], "enable")==0 ){
10207 int ii;
10208 if( nCmd>2 ) goto session_syntax_error;
10209 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10210 if( pAuxDb->nSession ){
10211 ii = sqlite3session_enable(pSession->p, ii);
10212 utf8_printf(p->out, "session %s enable flag = %d\n",
10213 pSession->zName, ii);
10215 }else
10217 /* .session filter GLOB ....
10218 ** Set a list of GLOB patterns of table names to be excluded.
10220 if( strcmp(azCmd[0], "filter")==0 ){
10221 int ii, nByte;
10222 if( nCmd<2 ) goto session_syntax_error;
10223 if( pAuxDb->nSession ){
10224 for(ii=0; ii<pSession->nFilter; ii++){
10225 sqlite3_free(pSession->azFilter[ii]);
10227 sqlite3_free(pSession->azFilter);
10228 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
10229 pSession->azFilter = sqlite3_malloc( nByte );
10230 if( pSession->azFilter==0 ){
10231 raw_printf(stderr, "Error: out or memory\n");
10232 exit(1);
10234 for(ii=1; ii<nCmd; ii++){
10235 char *x = pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
10236 shell_check_oom(x);
10238 pSession->nFilter = ii-1;
10240 }else
10242 /* .session indirect ?BOOLEAN?
10243 ** Query or set the indirect flag
10245 if( strcmp(azCmd[0], "indirect")==0 ){
10246 int ii;
10247 if( nCmd>2 ) goto session_syntax_error;
10248 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
10249 if( pAuxDb->nSession ){
10250 ii = sqlite3session_indirect(pSession->p, ii);
10251 utf8_printf(p->out, "session %s indirect flag = %d\n",
10252 pSession->zName, ii);
10254 }else
10256 /* .session isempty
10257 ** Determine if the session is empty
10259 if( strcmp(azCmd[0], "isempty")==0 ){
10260 int ii;
10261 if( nCmd!=1 ) goto session_syntax_error;
10262 if( pAuxDb->nSession ){
10263 ii = sqlite3session_isempty(pSession->p);
10264 utf8_printf(p->out, "session %s isempty flag = %d\n",
10265 pSession->zName, ii);
10267 }else
10269 /* .session list
10270 ** List all currently open sessions
10272 if( strcmp(azCmd[0],"list")==0 ){
10273 for(i=0; i<pAuxDb->nSession; i++){
10274 utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName);
10276 }else
10278 /* .session open DB NAME
10279 ** Open a new session called NAME on the attached database DB.
10280 ** DB is normally "main".
10282 if( strcmp(azCmd[0],"open")==0 ){
10283 char *zName;
10284 if( nCmd!=3 ) goto session_syntax_error;
10285 zName = azCmd[2];
10286 if( zName[0]==0 ) goto session_syntax_error;
10287 for(i=0; i<pAuxDb->nSession; i++){
10288 if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){
10289 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
10290 goto meta_command_exit;
10293 if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){
10294 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession));
10295 goto meta_command_exit;
10297 pSession = &pAuxDb->aSession[pAuxDb->nSession];
10298 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
10299 if( rc ){
10300 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
10301 rc = 0;
10302 goto meta_command_exit;
10304 pSession->nFilter = 0;
10305 sqlite3session_table_filter(pSession->p, session_filter, pSession);
10306 pAuxDb->nSession++;
10307 pSession->zName = sqlite3_mprintf("%s", zName);
10308 shell_check_oom(pSession->zName);
10309 }else
10310 /* If no command name matches, show a syntax error */
10311 session_syntax_error:
10312 showHelp(p->out, "session");
10313 }else
10314 #endif
10316 #ifdef SQLITE_DEBUG
10317 /* Undocumented commands for internal testing. Subject to change
10318 ** without notice. */
10319 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
10320 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
10321 int i, v;
10322 for(i=1; i<nArg; i++){
10323 v = booleanValue(azArg[i]);
10324 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
10327 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
10328 int i; sqlite3_int64 v;
10329 for(i=1; i<nArg; i++){
10330 char zBuf[200];
10331 v = integerValue(azArg[i]);
10332 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
10333 utf8_printf(p->out, "%s", zBuf);
10336 }else
10337 #endif
10339 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
10340 int bIsInit = 0; /* True to initialize the SELFTEST table */
10341 int bVerbose = 0; /* Verbose output */
10342 int bSelftestExists; /* True if SELFTEST already exists */
10343 int i, k; /* Loop counters */
10344 int nTest = 0; /* Number of tests runs */
10345 int nErr = 0; /* Number of errors seen */
10346 ShellText str; /* Answer for a query */
10347 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
10349 open_db(p,0);
10350 for(i=1; i<nArg; i++){
10351 const char *z = azArg[i];
10352 if( z[0]=='-' && z[1]=='-' ) z++;
10353 if( strcmp(z,"-init")==0 ){
10354 bIsInit = 1;
10355 }else
10356 if( strcmp(z,"-v")==0 ){
10357 bVerbose++;
10358 }else
10360 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10361 azArg[i], azArg[0]);
10362 raw_printf(stderr, "Should be one of: --init -v\n");
10363 rc = 1;
10364 goto meta_command_exit;
10367 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
10368 != SQLITE_OK ){
10369 bSelftestExists = 0;
10370 }else{
10371 bSelftestExists = 1;
10373 if( bIsInit ){
10374 createSelftestTable(p);
10375 bSelftestExists = 1;
10377 initText(&str);
10378 appendText(&str, "x", 0);
10379 for(k=bSelftestExists; k>=0; k--){
10380 if( k==1 ){
10381 rc = sqlite3_prepare_v2(p->db,
10382 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
10383 -1, &pStmt, 0);
10384 }else{
10385 rc = sqlite3_prepare_v2(p->db,
10386 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
10387 " (1,'run','PRAGMA integrity_check','ok')",
10388 -1, &pStmt, 0);
10390 if( rc ){
10391 raw_printf(stderr, "Error querying the selftest table\n");
10392 rc = 1;
10393 sqlite3_finalize(pStmt);
10394 goto meta_command_exit;
10396 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
10397 int tno = sqlite3_column_int(pStmt, 0);
10398 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
10399 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
10400 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
10402 if( zOp==0 ) continue;
10403 if( zSql==0 ) continue;
10404 if( zAns==0 ) continue;
10405 k = 0;
10406 if( bVerbose>0 ){
10407 printf("%d: %s %s\n", tno, zOp, zSql);
10409 if( strcmp(zOp,"memo")==0 ){
10410 utf8_printf(p->out, "%s\n", zSql);
10411 }else
10412 if( strcmp(zOp,"run")==0 ){
10413 char *zErrMsg = 0;
10414 str.n = 0;
10415 str.z[0] = 0;
10416 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
10417 nTest++;
10418 if( bVerbose ){
10419 utf8_printf(p->out, "Result: %s\n", str.z);
10421 if( rc || zErrMsg ){
10422 nErr++;
10423 rc = 1;
10424 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
10425 sqlite3_free(zErrMsg);
10426 }else if( strcmp(zAns,str.z)!=0 ){
10427 nErr++;
10428 rc = 1;
10429 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
10430 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
10432 }else
10434 utf8_printf(stderr,
10435 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
10436 rc = 1;
10437 break;
10439 } /* End loop over rows of content from SELFTEST */
10440 sqlite3_finalize(pStmt);
10441 } /* End loop over k */
10442 freeText(&str);
10443 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
10444 }else
10446 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
10447 if( nArg<2 || nArg>3 ){
10448 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
10449 rc = 1;
10451 if( nArg>=2 ){
10452 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
10453 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
10455 if( nArg>=3 ){
10456 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
10457 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
10459 }else
10461 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
10462 const char *zLike = 0; /* Which table to checksum. 0 means everything */
10463 int i; /* Loop counter */
10464 int bSchema = 0; /* Also hash the schema */
10465 int bSeparate = 0; /* Hash each table separately */
10466 int iSize = 224; /* Hash algorithm to use */
10467 int bDebug = 0; /* Only show the query that would have run */
10468 sqlite3_stmt *pStmt; /* For querying tables names */
10469 char *zSql; /* SQL to be run */
10470 char *zSep; /* Separator */
10471 ShellText sSql; /* Complete SQL for the query to run the hash */
10472 ShellText sQuery; /* Set of queries used to read all content */
10473 open_db(p, 0);
10474 for(i=1; i<nArg; i++){
10475 const char *z = azArg[i];
10476 if( z[0]=='-' ){
10477 z++;
10478 if( z[0]=='-' ) z++;
10479 if( strcmp(z,"schema")==0 ){
10480 bSchema = 1;
10481 }else
10482 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
10483 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
10485 iSize = atoi(&z[5]);
10486 }else
10487 if( strcmp(z,"debug")==0 ){
10488 bDebug = 1;
10489 }else
10491 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
10492 azArg[i], azArg[0]);
10493 showHelp(p->out, azArg[0]);
10494 rc = 1;
10495 goto meta_command_exit;
10497 }else if( zLike ){
10498 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
10499 rc = 1;
10500 goto meta_command_exit;
10501 }else{
10502 zLike = z;
10503 bSeparate = 1;
10504 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
10507 if( bSchema ){
10508 zSql = "SELECT lower(name) FROM sqlite_schema"
10509 " WHERE type='table' AND coalesce(rootpage,0)>1"
10510 " UNION ALL SELECT 'sqlite_schema'"
10511 " ORDER BY 1 collate nocase";
10512 }else{
10513 zSql = "SELECT lower(name) FROM sqlite_schema"
10514 " WHERE type='table' AND coalesce(rootpage,0)>1"
10515 " AND name NOT LIKE 'sqlite_%'"
10516 " ORDER BY 1 collate nocase";
10518 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
10519 initText(&sQuery);
10520 initText(&sSql);
10521 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
10522 zSep = "VALUES(";
10523 while( SQLITE_ROW==sqlite3_step(pStmt) ){
10524 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
10525 if( zTab==0 ) continue;
10526 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
10527 if( strncmp(zTab, "sqlite_",7)!=0 ){
10528 appendText(&sQuery,"SELECT * FROM ", 0);
10529 appendText(&sQuery,zTab,'"');
10530 appendText(&sQuery," NOT INDEXED;", 0);
10531 }else if( strcmp(zTab, "sqlite_schema")==0 ){
10532 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_schema"
10533 " ORDER BY name;", 0);
10534 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
10535 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
10536 " ORDER BY name;", 0);
10537 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
10538 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
10539 " ORDER BY tbl,idx;", 0);
10540 }else if( strcmp(zTab, "sqlite_stat4")==0 ){
10541 appendText(&sQuery, "SELECT * FROM ", 0);
10542 appendText(&sQuery, zTab, 0);
10543 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
10545 appendText(&sSql, zSep, 0);
10546 appendText(&sSql, sQuery.z, '\'');
10547 sQuery.n = 0;
10548 appendText(&sSql, ",", 0);
10549 appendText(&sSql, zTab, '\'');
10550 zSep = "),(";
10552 sqlite3_finalize(pStmt);
10553 if( bSeparate ){
10554 zSql = sqlite3_mprintf(
10555 "%s))"
10556 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
10557 " FROM [sha3sum$query]",
10558 sSql.z, iSize);
10559 }else{
10560 zSql = sqlite3_mprintf(
10561 "%s))"
10562 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
10563 " FROM [sha3sum$query]",
10564 sSql.z, iSize);
10566 shell_check_oom(zSql);
10567 freeText(&sQuery);
10568 freeText(&sSql);
10569 if( bDebug ){
10570 utf8_printf(p->out, "%s\n", zSql);
10571 }else{
10572 shell_exec(p, zSql, 0);
10574 sqlite3_free(zSql);
10575 }else
10577 #ifndef SQLITE_NOHAVE_SYSTEM
10578 if( c=='s'
10579 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
10581 char *zCmd;
10582 int i, x;
10583 failIfSafeMode(p, "cannot run .%s in safe mode", azArg[0]);
10584 if( nArg<2 ){
10585 raw_printf(stderr, "Usage: .system COMMAND\n");
10586 rc = 1;
10587 goto meta_command_exit;
10589 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
10590 for(i=2; i<nArg && zCmd!=0; i++){
10591 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
10592 zCmd, azArg[i]);
10594 x = zCmd!=0 ? system(zCmd) : 1;
10595 sqlite3_free(zCmd);
10596 if( x ) raw_printf(stderr, "System command returns %d\n", x);
10597 }else
10598 #endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
10600 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
10601 static const char *azBool[] = { "off", "on", "trigger", "full"};
10602 const char *zOut;
10603 int i;
10604 if( nArg!=1 ){
10605 raw_printf(stderr, "Usage: .show\n");
10606 rc = 1;
10607 goto meta_command_exit;
10609 utf8_printf(p->out, "%12.12s: %s\n","echo",
10610 azBool[ShellHasFlag(p, SHFLG_Echo)]);
10611 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
10612 utf8_printf(p->out, "%12.12s: %s\n","explain",
10613 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
10614 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
10615 if( p->mode==MODE_Column
10616 || (p->mode>=MODE_Markdown && p->mode<=MODE_Box)
10618 utf8_printf
10619 (p->out, "%12.12s: %s --wrap %d --wordwrap %s --%squote\n", "mode",
10620 modeDescr[p->mode], p->cmOpts.iWrap,
10621 p->cmOpts.bWordWrap ? "on" : "off",
10622 p->cmOpts.bQuote ? "" : "no");
10623 }else{
10624 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
10626 utf8_printf(p->out, "%12.12s: ", "nullvalue");
10627 output_c_string(p->out, p->nullValue);
10628 raw_printf(p->out, "\n");
10629 utf8_printf(p->out,"%12.12s: %s\n","output",
10630 strlen30(p->outfile) ? p->outfile : "stdout");
10631 utf8_printf(p->out,"%12.12s: ", "colseparator");
10632 output_c_string(p->out, p->colSeparator);
10633 raw_printf(p->out, "\n");
10634 utf8_printf(p->out,"%12.12s: ", "rowseparator");
10635 output_c_string(p->out, p->rowSeparator);
10636 raw_printf(p->out, "\n");
10637 switch( p->statsOn ){
10638 case 0: zOut = "off"; break;
10639 default: zOut = "on"; break;
10640 case 2: zOut = "stmt"; break;
10641 case 3: zOut = "vmstep"; break;
10643 utf8_printf(p->out, "%12.12s: %s\n","stats", zOut);
10644 utf8_printf(p->out, "%12.12s: ", "width");
10645 for (i=0;i<p->nWidth;i++) {
10646 raw_printf(p->out, "%d ", p->colWidth[i]);
10648 raw_printf(p->out, "\n");
10649 utf8_printf(p->out, "%12.12s: %s\n", "filename",
10650 p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : "");
10651 }else
10653 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
10654 if( nArg==2 ){
10655 if( strcmp(azArg[1],"stmt")==0 ){
10656 p->statsOn = 2;
10657 }else if( strcmp(azArg[1],"vmstep")==0 ){
10658 p->statsOn = 3;
10659 }else{
10660 p->statsOn = (u8)booleanValue(azArg[1]);
10662 }else if( nArg==1 ){
10663 display_stats(p->db, p, 0);
10664 }else{
10665 raw_printf(stderr, "Usage: .stats ?on|off|stmt|vmstep?\n");
10666 rc = 1;
10668 }else
10670 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
10671 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
10672 || strncmp(azArg[0], "indexes", n)==0) )
10674 sqlite3_stmt *pStmt;
10675 char **azResult;
10676 int nRow, nAlloc;
10677 int ii;
10678 ShellText s;
10679 initText(&s);
10680 open_db(p, 0);
10681 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
10682 if( rc ){
10683 sqlite3_finalize(pStmt);
10684 return shellDatabaseError(p->db);
10687 if( nArg>2 && c=='i' ){
10688 /* It is an historical accident that the .indexes command shows an error
10689 ** when called with the wrong number of arguments whereas the .tables
10690 ** command does not. */
10691 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
10692 rc = 1;
10693 sqlite3_finalize(pStmt);
10694 goto meta_command_exit;
10696 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
10697 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
10698 if( zDbName==0 ) continue;
10699 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
10700 if( sqlite3_stricmp(zDbName, "main")==0 ){
10701 appendText(&s, "SELECT name FROM ", 0);
10702 }else{
10703 appendText(&s, "SELECT ", 0);
10704 appendText(&s, zDbName, '\'');
10705 appendText(&s, "||'.'||name FROM ", 0);
10707 appendText(&s, zDbName, '"');
10708 appendText(&s, ".sqlite_schema ", 0);
10709 if( c=='t' ){
10710 appendText(&s," WHERE type IN ('table','view')"
10711 " AND name NOT LIKE 'sqlite_%'"
10712 " AND name LIKE ?1", 0);
10713 }else{
10714 appendText(&s," WHERE type='index'"
10715 " AND tbl_name LIKE ?1", 0);
10718 rc = sqlite3_finalize(pStmt);
10719 if( rc==SQLITE_OK ){
10720 appendText(&s, " ORDER BY 1", 0);
10721 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
10723 freeText(&s);
10724 if( rc ) return shellDatabaseError(p->db);
10726 /* Run the SQL statement prepared by the above block. Store the results
10727 ** as an array of nul-terminated strings in azResult[]. */
10728 nRow = nAlloc = 0;
10729 azResult = 0;
10730 if( nArg>1 ){
10731 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
10732 }else{
10733 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
10735 while( sqlite3_step(pStmt)==SQLITE_ROW ){
10736 if( nRow>=nAlloc ){
10737 char **azNew;
10738 int n2 = nAlloc*2 + 10;
10739 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
10740 shell_check_oom(azNew);
10741 nAlloc = n2;
10742 azResult = azNew;
10744 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
10745 shell_check_oom(azResult[nRow]);
10746 nRow++;
10748 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
10749 rc = shellDatabaseError(p->db);
10752 /* Pretty-print the contents of array azResult[] to the output */
10753 if( rc==0 && nRow>0 ){
10754 int len, maxlen = 0;
10755 int i, j;
10756 int nPrintCol, nPrintRow;
10757 for(i=0; i<nRow; i++){
10758 len = strlen30(azResult[i]);
10759 if( len>maxlen ) maxlen = len;
10761 nPrintCol = 80/(maxlen+2);
10762 if( nPrintCol<1 ) nPrintCol = 1;
10763 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
10764 for(i=0; i<nPrintRow; i++){
10765 for(j=i; j<nRow; j+=nPrintRow){
10766 char *zSp = j<nPrintRow ? "" : " ";
10767 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
10768 azResult[j] ? azResult[j]:"");
10770 raw_printf(p->out, "\n");
10774 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
10775 sqlite3_free(azResult);
10776 }else
10778 /* Begin redirecting output to the file "testcase-out.txt" */
10779 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
10780 output_reset(p);
10781 p->out = output_file_open("testcase-out.txt", 0);
10782 if( p->out==0 ){
10783 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
10785 if( nArg>=2 ){
10786 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
10787 }else{
10788 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
10790 }else
10792 #ifndef SQLITE_UNTESTABLE
10793 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
10794 static const struct {
10795 const char *zCtrlName; /* Name of a test-control option */
10796 int ctrlCode; /* Integer code for that option */
10797 int unSafe; /* Not valid for --safe mode */
10798 const char *zUsage; /* Usage notes */
10799 } aCtrl[] = {
10800 { "always", SQLITE_TESTCTRL_ALWAYS, 1, "BOOLEAN" },
10801 { "assert", SQLITE_TESTCTRL_ASSERT, 1, "BOOLEAN" },
10802 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS,1, "" },*/
10803 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, 1, "" },*/
10804 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, 0, "" },
10805 { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,0,"BOOLEAN" },
10806 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, 1,"" },*/
10807 { "imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
10808 { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
10809 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
10810 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
10811 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" },
10812 #ifdef YYCOVERAGE
10813 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" },
10814 #endif
10815 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE,0, "OFFSET " },
10816 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE,0, "" },
10817 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, 0, "" },
10818 { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, 0, "SEED ?db?" },
10819 { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, 0, "" },
10820 { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, 0, "NMAX" },
10821 { "tune", SQLITE_TESTCTRL_TUNE, 1, "ID VALUE" },
10823 int testctrl = -1;
10824 int iCtrl = -1;
10825 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
10826 int isOk = 0;
10827 int i, n2;
10828 const char *zCmd = 0;
10830 open_db(p, 0);
10831 zCmd = nArg>=2 ? azArg[1] : "help";
10833 /* The argument can optionally begin with "-" or "--" */
10834 if( zCmd[0]=='-' && zCmd[1] ){
10835 zCmd++;
10836 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
10839 /* --help lists all test-controls */
10840 if( strcmp(zCmd,"help")==0 ){
10841 utf8_printf(p->out, "Available test-controls:\n");
10842 for(i=0; i<ArraySize(aCtrl); i++){
10843 utf8_printf(p->out, " .testctrl %s %s\n",
10844 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
10846 rc = 1;
10847 goto meta_command_exit;
10850 /* convert testctrl text option to value. allow any unique prefix
10851 ** of the option name, or a numerical value. */
10852 n2 = strlen30(zCmd);
10853 for(i=0; i<ArraySize(aCtrl); i++){
10854 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
10855 if( testctrl<0 ){
10856 testctrl = aCtrl[i].ctrlCode;
10857 iCtrl = i;
10858 }else{
10859 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
10860 "Use \".testctrl --help\" for help\n", zCmd);
10861 rc = 1;
10862 goto meta_command_exit;
10866 if( testctrl<0 ){
10867 utf8_printf(stderr,"Error: unknown test-control: %s\n"
10868 "Use \".testctrl --help\" for help\n", zCmd);
10869 }else if( aCtrl[iCtrl].unSafe && p->bSafeMode ){
10870 utf8_printf(stderr,
10871 "line %d: \".testctrl %s\" may not be used in safe mode\n",
10872 p->lineno, aCtrl[iCtrl].zCtrlName);
10873 exit(1);
10874 }else{
10875 switch(testctrl){
10877 /* sqlite3_test_control(int, db, int) */
10878 case SQLITE_TESTCTRL_OPTIMIZATIONS:
10879 if( nArg==3 ){
10880 unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
10881 rc2 = sqlite3_test_control(testctrl, p->db, opt);
10882 isOk = 3;
10884 break;
10886 /* sqlite3_test_control(int) */
10887 case SQLITE_TESTCTRL_PRNG_SAVE:
10888 case SQLITE_TESTCTRL_PRNG_RESTORE:
10889 case SQLITE_TESTCTRL_BYTEORDER:
10890 if( nArg==2 ){
10891 rc2 = sqlite3_test_control(testctrl);
10892 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
10894 break;
10896 /* sqlite3_test_control(int, uint) */
10897 case SQLITE_TESTCTRL_PENDING_BYTE:
10898 if( nArg==3 ){
10899 unsigned int opt = (unsigned int)integerValue(azArg[2]);
10900 rc2 = sqlite3_test_control(testctrl, opt);
10901 isOk = 3;
10903 break;
10905 /* sqlite3_test_control(int, int, sqlite3*) */
10906 case SQLITE_TESTCTRL_PRNG_SEED:
10907 if( nArg==3 || nArg==4 ){
10908 int ii = (int)integerValue(azArg[2]);
10909 sqlite3 *db;
10910 if( ii==0 && strcmp(azArg[2],"random")==0 ){
10911 sqlite3_randomness(sizeof(ii),&ii);
10912 printf("-- random seed: %d\n", ii);
10914 if( nArg==3 ){
10915 db = 0;
10916 }else{
10917 db = p->db;
10918 /* Make sure the schema has been loaded */
10919 sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0);
10921 rc2 = sqlite3_test_control(testctrl, ii, db);
10922 isOk = 3;
10924 break;
10926 /* sqlite3_test_control(int, int) */
10927 case SQLITE_TESTCTRL_ASSERT:
10928 case SQLITE_TESTCTRL_ALWAYS:
10929 if( nArg==3 ){
10930 int opt = booleanValue(azArg[2]);
10931 rc2 = sqlite3_test_control(testctrl, opt);
10932 isOk = 1;
10934 break;
10936 /* sqlite3_test_control(int, int) */
10937 case SQLITE_TESTCTRL_LOCALTIME_FAULT:
10938 case SQLITE_TESTCTRL_NEVER_CORRUPT:
10939 if( nArg==3 ){
10940 int opt = booleanValue(azArg[2]);
10941 rc2 = sqlite3_test_control(testctrl, opt);
10942 isOk = 3;
10944 break;
10946 /* sqlite3_test_control(sqlite3*) */
10947 case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
10948 rc2 = sqlite3_test_control(testctrl, p->db);
10949 isOk = 3;
10950 break;
10952 case SQLITE_TESTCTRL_IMPOSTER:
10953 if( nArg==5 ){
10954 rc2 = sqlite3_test_control(testctrl, p->db,
10955 azArg[2],
10956 integerValue(azArg[3]),
10957 integerValue(azArg[4]));
10958 isOk = 3;
10960 break;
10962 case SQLITE_TESTCTRL_SEEK_COUNT: {
10963 u64 x = 0;
10964 rc2 = sqlite3_test_control(testctrl, p->db, &x);
10965 utf8_printf(p->out, "%llu\n", x);
10966 isOk = 3;
10967 break;
10970 #ifdef YYCOVERAGE
10971 case SQLITE_TESTCTRL_PARSER_COVERAGE: {
10972 if( nArg==2 ){
10973 sqlite3_test_control(testctrl, p->out);
10974 isOk = 3;
10976 break;
10978 #endif
10979 #ifdef SQLITE_DEBUG
10980 case SQLITE_TESTCTRL_TUNE: {
10981 if( nArg==4 ){
10982 int id = (int)integerValue(azArg[2]);
10983 int val = (int)integerValue(azArg[3]);
10984 sqlite3_test_control(testctrl, id, &val);
10985 isOk = 3;
10986 }else if( nArg==3 ){
10987 int id = (int)integerValue(azArg[2]);
10988 sqlite3_test_control(testctrl, -id, &rc2);
10989 isOk = 1;
10990 }else if( nArg==2 ){
10991 int id = 1;
10992 while(1){
10993 int val = 0;
10994 rc2 = sqlite3_test_control(testctrl, -id, &val);
10995 if( rc2!=SQLITE_OK ) break;
10996 if( id>1 ) utf8_printf(p->out, " ");
10997 utf8_printf(p->out, "%d: %d", id, val);
10998 id++;
11000 if( id>1 ) utf8_printf(p->out, "\n");
11001 isOk = 3;
11003 break;
11005 #endif
11006 case SQLITE_TESTCTRL_SORTER_MMAP:
11007 if( nArg==3 ){
11008 int opt = (unsigned int)integerValue(azArg[2]);
11009 rc2 = sqlite3_test_control(testctrl, p->db, opt);
11010 isOk = 3;
11012 break;
11015 if( isOk==0 && iCtrl>=0 ){
11016 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage);
11017 rc = 1;
11018 }else if( isOk==1 ){
11019 raw_printf(p->out, "%d\n", rc2);
11020 }else if( isOk==2 ){
11021 raw_printf(p->out, "0x%08x\n", rc2);
11023 }else
11024 #endif /* !defined(SQLITE_UNTESTABLE) */
11026 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
11027 open_db(p, 0);
11028 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
11029 }else
11031 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
11032 if( nArg==2 ){
11033 enableTimer = booleanValue(azArg[1]);
11034 if( enableTimer && !HAS_TIMER ){
11035 raw_printf(stderr, "Error: timer not available on this system.\n");
11036 enableTimer = 0;
11038 }else{
11039 raw_printf(stderr, "Usage: .timer on|off\n");
11040 rc = 1;
11042 }else
11044 #ifndef SQLITE_OMIT_TRACE
11045 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
11046 int mType = 0;
11047 int jj;
11048 open_db(p, 0);
11049 for(jj=1; jj<nArg; jj++){
11050 const char *z = azArg[jj];
11051 if( z[0]=='-' ){
11052 if( optionMatch(z, "expanded") ){
11053 p->eTraceType = SHELL_TRACE_EXPANDED;
11055 #ifdef SQLITE_ENABLE_NORMALIZE
11056 else if( optionMatch(z, "normalized") ){
11057 p->eTraceType = SHELL_TRACE_NORMALIZED;
11059 #endif
11060 else if( optionMatch(z, "plain") ){
11061 p->eTraceType = SHELL_TRACE_PLAIN;
11063 else if( optionMatch(z, "profile") ){
11064 mType |= SQLITE_TRACE_PROFILE;
11066 else if( optionMatch(z, "row") ){
11067 mType |= SQLITE_TRACE_ROW;
11069 else if( optionMatch(z, "stmt") ){
11070 mType |= SQLITE_TRACE_STMT;
11072 else if( optionMatch(z, "close") ){
11073 mType |= SQLITE_TRACE_CLOSE;
11075 else {
11076 raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z);
11077 rc = 1;
11078 goto meta_command_exit;
11080 }else{
11081 output_file_close(p->traceOut);
11082 p->traceOut = output_file_open(azArg[1], 0);
11085 if( p->traceOut==0 ){
11086 sqlite3_trace_v2(p->db, 0, 0, 0);
11087 }else{
11088 if( mType==0 ) mType = SQLITE_TRACE_STMT;
11089 sqlite3_trace_v2(p->db, mType, sql_trace_callback, p);
11091 }else
11092 #endif /* !defined(SQLITE_OMIT_TRACE) */
11094 #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11095 if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){
11096 int ii;
11097 int lenOpt;
11098 char *zOpt;
11099 if( nArg<2 ){
11100 raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n");
11101 rc = 1;
11102 goto meta_command_exit;
11104 open_db(p, 0);
11105 zOpt = azArg[1];
11106 if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++;
11107 lenOpt = (int)strlen(zOpt);
11108 if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){
11109 assert( azArg[nArg]==0 );
11110 sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0);
11111 }else{
11112 for(ii=1; ii<nArg; ii++){
11113 sqlite3_create_module(p->db, azArg[ii], 0, 0);
11116 }else
11117 #endif
11119 #if SQLITE_USER_AUTHENTICATION
11120 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
11121 if( nArg<2 ){
11122 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
11123 rc = 1;
11124 goto meta_command_exit;
11126 open_db(p, 0);
11127 if( strcmp(azArg[1],"login")==0 ){
11128 if( nArg!=4 ){
11129 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
11130 rc = 1;
11131 goto meta_command_exit;
11133 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
11134 strlen30(azArg[3]));
11135 if( rc ){
11136 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
11137 rc = 1;
11139 }else if( strcmp(azArg[1],"add")==0 ){
11140 if( nArg!=5 ){
11141 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
11142 rc = 1;
11143 goto meta_command_exit;
11145 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11146 booleanValue(azArg[4]));
11147 if( rc ){
11148 raw_printf(stderr, "User-Add failed: %d\n", rc);
11149 rc = 1;
11151 }else if( strcmp(azArg[1],"edit")==0 ){
11152 if( nArg!=5 ){
11153 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
11154 rc = 1;
11155 goto meta_command_exit;
11157 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
11158 booleanValue(azArg[4]));
11159 if( rc ){
11160 raw_printf(stderr, "User-Edit failed: %d\n", rc);
11161 rc = 1;
11163 }else if( strcmp(azArg[1],"delete")==0 ){
11164 if( nArg!=3 ){
11165 raw_printf(stderr, "Usage: .user delete USER\n");
11166 rc = 1;
11167 goto meta_command_exit;
11169 rc = sqlite3_user_delete(p->db, azArg[2]);
11170 if( rc ){
11171 raw_printf(stderr, "User-Delete failed: %d\n", rc);
11172 rc = 1;
11174 }else{
11175 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
11176 rc = 1;
11177 goto meta_command_exit;
11179 }else
11180 #endif /* SQLITE_USER_AUTHENTICATION */
11182 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
11183 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
11184 sqlite3_libversion(), sqlite3_sourceid());
11185 #if SQLITE_HAVE_ZLIB
11186 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
11187 #endif
11188 #define CTIMEOPT_VAL_(opt) #opt
11189 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
11190 #if defined(__clang__) && defined(__clang_major__)
11191 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
11192 CTIMEOPT_VAL(__clang_minor__) "."
11193 CTIMEOPT_VAL(__clang_patchlevel__) "\n");
11194 #elif defined(_MSC_VER)
11195 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
11196 #elif defined(__GNUC__) && defined(__VERSION__)
11197 utf8_printf(p->out, "gcc-" __VERSION__ "\n");
11198 #endif
11199 }else
11201 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
11202 const char *zDbName = nArg==2 ? azArg[1] : "main";
11203 sqlite3_vfs *pVfs = 0;
11204 if( p->db ){
11205 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
11206 if( pVfs ){
11207 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
11208 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
11209 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
11210 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11213 }else
11215 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
11216 sqlite3_vfs *pVfs;
11217 sqlite3_vfs *pCurrent = 0;
11218 if( p->db ){
11219 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
11221 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
11222 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
11223 pVfs==pCurrent ? " <--- CURRENT" : "");
11224 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
11225 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
11226 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
11227 if( pVfs->pNext ){
11228 raw_printf(p->out, "-----------------------------------\n");
11231 }else
11233 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
11234 const char *zDbName = nArg==2 ? azArg[1] : "main";
11235 char *zVfsName = 0;
11236 if( p->db ){
11237 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
11238 if( zVfsName ){
11239 utf8_printf(p->out, "%s\n", zVfsName);
11240 sqlite3_free(zVfsName);
11243 }else
11245 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
11246 unsigned int x = nArg>=2 ? (unsigned int)integerValue(azArg[1]) : 0xffffffff;
11247 sqlite3_test_control(SQLITE_TESTCTRL_TRACEFLAGS, 3, &x);
11248 }else
11250 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
11251 int j;
11252 assert( nArg<=ArraySize(azArg) );
11253 p->nWidth = nArg-1;
11254 p->colWidth = realloc(p->colWidth, (p->nWidth+1)*sizeof(int)*2);
11255 if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory();
11256 if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth];
11257 for(j=1; j<nArg; j++){
11258 p->colWidth[j-1] = (int)integerValue(azArg[j]);
11260 }else
11263 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
11264 " \"%s\". Enter \".help\" for help\n", azArg[0]);
11265 rc = 1;
11268 meta_command_exit:
11269 if( p->outCount ){
11270 p->outCount--;
11271 if( p->outCount==0 ) output_reset(p);
11273 p->bSafeMode = p->bSafeModePersist;
11274 return rc;
11277 /* Line scan result and intermediate states (supporting scan resumption)
11279 #ifndef CHAR_BIT
11280 # define CHAR_BIT 8
11281 #endif
11282 typedef enum {
11283 QSS_HasDark = 1<<CHAR_BIT, QSS_EndingSemi = 2<<CHAR_BIT,
11284 QSS_CharMask = (1<<CHAR_BIT)-1, QSS_ScanMask = 3<<CHAR_BIT,
11285 QSS_Start = 0
11286 } QuickScanState;
11287 #define QSS_SETV(qss, newst) ((newst) | ((qss) & QSS_ScanMask))
11288 #define QSS_INPLAIN(qss) (((qss)&QSS_CharMask)==QSS_Start)
11289 #define QSS_PLAINWHITE(qss) (((qss)&~QSS_EndingSemi)==QSS_Start)
11290 #define QSS_PLAINDARK(qss) (((qss)&~QSS_EndingSemi)==QSS_HasDark)
11291 #define QSS_SEMITERM(qss) (((qss)&~QSS_HasDark)==QSS_EndingSemi)
11294 ** Scan line for classification to guide shell's handling.
11295 ** The scan is resumable for subsequent lines when prior
11296 ** return values are passed as the 2nd argument.
11298 static QuickScanState quickscan(char *zLine, QuickScanState qss){
11299 char cin;
11300 char cWait = (char)qss; /* intentional narrowing loss */
11301 if( cWait==0 ){
11302 PlainScan:
11303 assert( cWait==0 );
11304 while( (cin = *zLine++)!=0 ){
11305 if( IsSpace(cin) )
11306 continue;
11307 switch (cin){
11308 case '-':
11309 if( *zLine!='-' )
11310 break;
11311 while((cin = *++zLine)!=0 )
11312 if( cin=='\n')
11313 goto PlainScan;
11314 return qss;
11315 case ';':
11316 qss |= QSS_EndingSemi;
11317 continue;
11318 case '/':
11319 if( *zLine=='*' ){
11320 ++zLine;
11321 cWait = '*';
11322 qss = QSS_SETV(qss, cWait);
11323 goto TermScan;
11325 break;
11326 case '[':
11327 cin = ']';
11328 /* fall thru */
11329 case '`': case '\'': case '"':
11330 cWait = cin;
11331 qss = QSS_HasDark | cWait;
11332 goto TermScan;
11333 default:
11334 break;
11336 qss = (qss & ~QSS_EndingSemi) | QSS_HasDark;
11338 }else{
11339 TermScan:
11340 while( (cin = *zLine++)!=0 ){
11341 if( cin==cWait ){
11342 switch( cWait ){
11343 case '*':
11344 if( *zLine != '/' )
11345 continue;
11346 ++zLine;
11347 cWait = 0;
11348 qss = QSS_SETV(qss, 0);
11349 goto PlainScan;
11350 case '`': case '\'': case '"':
11351 if(*zLine==cWait){
11352 ++zLine;
11353 continue;
11355 /* fall thru */
11356 case ']':
11357 cWait = 0;
11358 qss = QSS_SETV(qss, 0);
11359 goto PlainScan;
11360 default: assert(0);
11365 return qss;
11369 ** Return TRUE if the line typed in is an SQL command terminator other
11370 ** than a semi-colon. The SQL Server style "go" command is understood
11371 ** as is the Oracle "/".
11373 static int line_is_command_terminator(char *zLine){
11374 while( IsSpace(zLine[0]) ){ zLine++; };
11375 if( zLine[0]=='/' )
11376 zLine += 1; /* Oracle */
11377 else if ( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o' )
11378 zLine += 2; /* SQL Server */
11379 else
11380 return 0;
11381 return quickscan(zLine,QSS_Start)==QSS_Start;
11385 ** We need a default sqlite3_complete() implementation to use in case
11386 ** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes
11387 ** any arbitrary text is a complete SQL statement. This is not very
11388 ** user-friendly, but it does seem to work.
11390 #ifdef SQLITE_OMIT_COMPLETE
11391 #define sqlite3_complete(x) 1
11392 #endif
11395 ** Return true if zSql is a complete SQL statement. Return false if it
11396 ** ends in the middle of a string literal or C-style comment.
11398 static int line_is_complete(char *zSql, int nSql){
11399 int rc;
11400 if( zSql==0 ) return 1;
11401 zSql[nSql] = ';';
11402 zSql[nSql+1] = 0;
11403 rc = sqlite3_complete(zSql);
11404 zSql[nSql] = 0;
11405 return rc;
11409 ** Run a single line of SQL. Return the number of errors.
11411 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
11412 int rc;
11413 char *zErrMsg = 0;
11415 open_db(p, 0);
11416 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
11417 if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0;
11418 BEGIN_TIMER;
11419 rc = shell_exec(p, zSql, &zErrMsg);
11420 END_TIMER;
11421 if( rc || zErrMsg ){
11422 char zPrefix[100];
11423 const char *zErrorTail;
11424 const char *zErrorType;
11425 if( zErrMsg==0 ){
11426 zErrorType = "Error";
11427 zErrorTail = sqlite3_errmsg(p->db);
11428 }else if( strncmp(zErrMsg, "in prepare, ",12)==0 ){
11429 zErrorType = "Parse error";
11430 zErrorTail = &zErrMsg[12];
11431 }else if( strncmp(zErrMsg, "stepping, ", 10)==0 ){
11432 zErrorType = "Runtime error";
11433 zErrorTail = &zErrMsg[10];
11434 }else{
11435 zErrorType = "Error";
11436 zErrorTail = zErrMsg;
11438 if( in!=0 || !stdin_is_interactive ){
11439 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
11440 "%s near line %d:", zErrorType, startline);
11441 }else{
11442 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%s:", zErrorType);
11444 utf8_printf(stderr, "%s %s\n", zPrefix, zErrorTail);
11445 sqlite3_free(zErrMsg);
11446 zErrMsg = 0;
11447 return 1;
11448 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
11449 char zLineBuf[2000];
11450 sqlite3_snprintf(sizeof(zLineBuf), zLineBuf,
11451 "changes: %lld total_changes: %lld",
11452 sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
11453 raw_printf(p->out, "%s\n", zLineBuf);
11455 return 0;
11460 ** Read input from *in and process it. If *in==0 then input
11461 ** is interactive - the user is typing it it. Otherwise, input
11462 ** is coming from a file or device. A prompt is issued and history
11463 ** is saved only if input is interactive. An interrupt signal will
11464 ** cause this routine to exit immediately, unless input is interactive.
11466 ** Return the number of errors.
11468 static int process_input(ShellState *p){
11469 char *zLine = 0; /* A single input line */
11470 char *zSql = 0; /* Accumulated SQL text */
11471 int nLine; /* Length of current line */
11472 int nSql = 0; /* Bytes of zSql[] used */
11473 int nAlloc = 0; /* Allocated zSql[] space */
11474 int rc; /* Error code */
11475 int errCnt = 0; /* Number of errors seen */
11476 int startline = 0; /* Line number for start of current input */
11477 QuickScanState qss = QSS_Start; /* Accumulated line status (so far) */
11479 if( p->inputNesting==MAX_INPUT_NESTING ){
11480 /* This will be more informative in a later version. */
11481 utf8_printf(stderr,"Input nesting limit (%d) reached at line %d."
11482 " Check recursion.\n", MAX_INPUT_NESTING, p->lineno);
11483 return 1;
11485 ++p->inputNesting;
11486 p->lineno = 0;
11487 while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){
11488 fflush(p->out);
11489 zLine = one_input_line(p->in, zLine, nSql>0);
11490 if( zLine==0 ){
11491 /* End of input */
11492 if( p->in==0 && stdin_is_interactive ) printf("\n");
11493 break;
11495 if( seenInterrupt ){
11496 if( p->in!=0 ) break;
11497 seenInterrupt = 0;
11499 p->lineno++;
11500 if( QSS_INPLAIN(qss)
11501 && line_is_command_terminator(zLine)
11502 && line_is_complete(zSql, nSql) ){
11503 memcpy(zLine,";",2);
11505 qss = quickscan(zLine, qss);
11506 if( QSS_PLAINWHITE(qss) && nSql==0 ){
11507 if( ShellHasFlag(p, SHFLG_Echo) )
11508 printf("%s\n", zLine);
11509 /* Just swallow single-line whitespace */
11510 qss = QSS_Start;
11511 continue;
11513 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
11514 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
11515 if( zLine[0]=='.' ){
11516 rc = do_meta_command(zLine, p);
11517 if( rc==2 ){ /* exit requested */
11518 break;
11519 }else if( rc ){
11520 errCnt++;
11523 qss = QSS_Start;
11524 continue;
11526 /* No single-line dispositions remain; accumulate line(s). */
11527 nLine = strlen30(zLine);
11528 if( nSql+nLine+2>=nAlloc ){
11529 /* Grow buffer by half-again increments when big. */
11530 nAlloc = nSql+(nSql>>1)+nLine+100;
11531 zSql = realloc(zSql, nAlloc);
11532 shell_check_oom(zSql);
11534 if( nSql==0 ){
11535 int i;
11536 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
11537 assert( nAlloc>0 && zSql!=0 );
11538 memcpy(zSql, zLine+i, nLine+1-i);
11539 startline = p->lineno;
11540 nSql = nLine-i;
11541 }else{
11542 zSql[nSql++] = '\n';
11543 memcpy(zSql+nSql, zLine, nLine+1);
11544 nSql += nLine;
11546 if( nSql && QSS_SEMITERM(qss) && sqlite3_complete(zSql) ){
11547 errCnt += runOneSqlLine(p, zSql, p->in, startline);
11548 nSql = 0;
11549 if( p->outCount ){
11550 output_reset(p);
11551 p->outCount = 0;
11552 }else{
11553 clearTempFile(p);
11555 p->bSafeMode = p->bSafeModePersist;
11556 qss = QSS_Start;
11557 }else if( nSql && QSS_PLAINWHITE(qss) ){
11558 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
11559 nSql = 0;
11560 qss = QSS_Start;
11563 if( nSql && QSS_PLAINDARK(qss) ){
11564 errCnt += runOneSqlLine(p, zSql, p->in, startline);
11566 free(zSql);
11567 free(zLine);
11568 --p->inputNesting;
11569 return errCnt>0;
11573 ** Return a pathname which is the user's home directory. A
11574 ** 0 return indicates an error of some kind.
11576 static char *find_home_dir(int clearFlag){
11577 static char *home_dir = NULL;
11578 if( clearFlag ){
11579 free(home_dir);
11580 home_dir = 0;
11581 return 0;
11583 if( home_dir ) return home_dir;
11585 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
11586 && !defined(__RTP__) && !defined(_WRS_KERNEL)
11588 struct passwd *pwent;
11589 uid_t uid = getuid();
11590 if( (pwent=getpwuid(uid)) != NULL) {
11591 home_dir = pwent->pw_dir;
11594 #endif
11596 #if defined(_WIN32_WCE)
11597 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
11599 home_dir = "/";
11600 #else
11602 #if defined(_WIN32) || defined(WIN32)
11603 if (!home_dir) {
11604 home_dir = getenv("USERPROFILE");
11606 #endif
11608 if (!home_dir) {
11609 home_dir = getenv("HOME");
11612 #if defined(_WIN32) || defined(WIN32)
11613 if (!home_dir) {
11614 char *zDrive, *zPath;
11615 int n;
11616 zDrive = getenv("HOMEDRIVE");
11617 zPath = getenv("HOMEPATH");
11618 if( zDrive && zPath ){
11619 n = strlen30(zDrive) + strlen30(zPath) + 1;
11620 home_dir = malloc( n );
11621 if( home_dir==0 ) return 0;
11622 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
11623 return home_dir;
11625 home_dir = "c:\\";
11627 #endif
11629 #endif /* !_WIN32_WCE */
11631 if( home_dir ){
11632 int n = strlen30(home_dir) + 1;
11633 char *z = malloc( n );
11634 if( z ) memcpy(z, home_dir, n);
11635 home_dir = z;
11638 return home_dir;
11642 ** Read input from the file given by sqliterc_override. Or if that
11643 ** parameter is NULL, take input from ~/.sqliterc
11645 ** Returns the number of errors.
11647 static void process_sqliterc(
11648 ShellState *p, /* Configuration data */
11649 const char *sqliterc_override /* Name of config file. NULL to use default */
11651 char *home_dir = NULL;
11652 const char *sqliterc = sqliterc_override;
11653 char *zBuf = 0;
11654 FILE *inSaved = p->in;
11655 int savedLineno = p->lineno;
11657 if (sqliterc == NULL) {
11658 home_dir = find_home_dir(0);
11659 if( home_dir==0 ){
11660 raw_printf(stderr, "-- warning: cannot find home directory;"
11661 " cannot read ~/.sqliterc\n");
11662 return;
11664 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
11665 shell_check_oom(zBuf);
11666 sqliterc = zBuf;
11668 p->in = fopen(sqliterc,"rb");
11669 if( p->in ){
11670 if( stdin_is_interactive ){
11671 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
11673 if( process_input(p) && bail_on_error ) exit(1);
11674 fclose(p->in);
11675 }else if( sqliterc_override!=0 ){
11676 utf8_printf(stderr,"cannot open: \"%s\"\n", sqliterc);
11677 if( bail_on_error ) exit(1);
11679 p->in = inSaved;
11680 p->lineno = savedLineno;
11681 sqlite3_free(zBuf);
11685 ** Show available command line options
11687 static const char zOptions[] =
11688 #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
11689 " -A ARGS... run \".archive ARGS\" and exit\n"
11690 #endif
11691 " -append append the database to the end of the file\n"
11692 " -ascii set output mode to 'ascii'\n"
11693 " -bail stop after hitting an error\n"
11694 " -batch force batch I/O\n"
11695 " -box set output mode to 'box'\n"
11696 " -column set output mode to 'column'\n"
11697 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
11698 " -csv set output mode to 'csv'\n"
11699 #if !defined(SQLITE_OMIT_DESERIALIZE)
11700 " -deserialize open the database using sqlite3_deserialize()\n"
11701 #endif
11702 " -echo print commands before execution\n"
11703 " -init FILENAME read/process named file\n"
11704 " -[no]header turn headers on or off\n"
11705 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11706 " -heap SIZE Size of heap for memsys3 or memsys5\n"
11707 #endif
11708 " -help show this message\n"
11709 " -html set output mode to HTML\n"
11710 " -interactive force interactive I/O\n"
11711 " -json set output mode to 'json'\n"
11712 " -line set output mode to 'line'\n"
11713 " -list set output mode to 'list'\n"
11714 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
11715 " -markdown set output mode to 'markdown'\n"
11716 #if !defined(SQLITE_OMIT_DESERIALIZE)
11717 " -maxsize N maximum size for a --deserialize database\n"
11718 #endif
11719 " -memtrace trace all memory allocations and deallocations\n"
11720 " -mmap N default mmap size set to N\n"
11721 #ifdef SQLITE_ENABLE_MULTIPLEX
11722 " -multiplex enable the multiplexor VFS\n"
11723 #endif
11724 " -newline SEP set output row separator. Default: '\\n'\n"
11725 " -nofollow refuse to open symbolic links to database files\n"
11726 " -nonce STRING set the safe-mode escape nonce\n"
11727 " -nullvalue TEXT set text string for NULL values. Default ''\n"
11728 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
11729 " -quote set output mode to 'quote'\n"
11730 " -readonly open the database read-only\n"
11731 " -safe enable safe-mode\n"
11732 " -separator SEP set output column separator. Default: '|'\n"
11733 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
11734 " -sorterref SIZE sorter references threshold size\n"
11735 #endif
11736 " -stats print memory stats before each finalize\n"
11737 " -table set output mode to 'table'\n"
11738 " -tabs set output mode to 'tabs'\n"
11739 " -version show SQLite version\n"
11740 " -vfs NAME use NAME as the default VFS\n"
11741 #ifdef SQLITE_ENABLE_VFSTRACE
11742 " -vfstrace enable tracing of all VFS calls\n"
11743 #endif
11744 #ifdef SQLITE_HAVE_ZLIB
11745 " -zip open the file as a ZIP Archive\n"
11746 #endif
11748 static void usage(int showDetail){
11749 utf8_printf(stderr,
11750 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
11751 "FILENAME is the name of an SQLite database. A new database is created\n"
11752 "if the file does not previously exist.\n", Argv0);
11753 if( showDetail ){
11754 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
11755 }else{
11756 raw_printf(stderr, "Use the -help option for additional information\n");
11758 exit(1);
11762 ** Internal check: Verify that the SQLite is uninitialized. Print a
11763 ** error message if it is initialized.
11765 static void verify_uninitialized(void){
11766 if( sqlite3_config(-1)==SQLITE_MISUSE ){
11767 utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
11768 " initialization.\n");
11773 ** Initialize the state information in data
11775 static void main_init(ShellState *data) {
11776 memset(data, 0, sizeof(*data));
11777 data->normalMode = data->cMode = data->mode = MODE_List;
11778 data->autoExplain = 1;
11779 data->pAuxDb = &data->aAuxDb[0];
11780 memcpy(data->colSeparator,SEP_Column, 2);
11781 memcpy(data->rowSeparator,SEP_Row, 2);
11782 data->showHeader = 0;
11783 data->shellFlgs = SHFLG_Lookaside;
11784 verify_uninitialized();
11785 sqlite3_config(SQLITE_CONFIG_URI, 1);
11786 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
11787 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
11788 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
11789 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
11793 ** Output text to the console in a font that attracts extra attention.
11795 #ifdef _WIN32
11796 static void printBold(const char *zText){
11797 #if !SQLITE_OS_WINRT
11798 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
11799 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
11800 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
11801 SetConsoleTextAttribute(out,
11802 FOREGROUND_RED|FOREGROUND_INTENSITY
11804 #endif
11805 printf("%s", zText);
11806 #if !SQLITE_OS_WINRT
11807 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
11808 #endif
11810 #else
11811 static void printBold(const char *zText){
11812 printf("\033[1m%s\033[0m", zText);
11814 #endif
11817 ** Get the argument to an --option. Throw an error and die if no argument
11818 ** is available.
11820 static char *cmdline_option_value(int argc, char **argv, int i){
11821 if( i==argc ){
11822 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
11823 argv[0], argv[argc-1]);
11824 exit(1);
11826 return argv[i];
11829 #ifndef SQLITE_SHELL_IS_UTF8
11830 # if (defined(_WIN32) || defined(WIN32)) \
11831 && (defined(_MSC_VER) || (defined(UNICODE) && defined(__GNUC__)))
11832 # define SQLITE_SHELL_IS_UTF8 (0)
11833 # else
11834 # define SQLITE_SHELL_IS_UTF8 (1)
11835 # endif
11836 #endif
11838 #if SQLITE_SHELL_IS_UTF8
11839 int SQLITE_CDECL main(int argc, char **argv){
11840 #else
11841 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
11842 char **argv;
11843 #endif
11844 char *zErrMsg = 0;
11845 ShellState data;
11846 const char *zInitFile = 0;
11847 int i;
11848 int rc = 0;
11849 int warnInmemoryDb = 0;
11850 int readStdin = 1;
11851 int nCmd = 0;
11852 char **azCmd = 0;
11853 const char *zVfs = 0; /* Value of -vfs command-line option */
11854 #if !SQLITE_SHELL_IS_UTF8
11855 char **argvToFree = 0;
11856 int argcToFree = 0;
11857 #endif
11859 setBinaryMode(stdin, 0);
11860 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
11861 stdin_is_interactive = isatty(0);
11862 stdout_is_console = isatty(1);
11864 #if !defined(_WIN32_WCE)
11865 if( getenv("SQLITE_DEBUG_BREAK") ){
11866 if( isatty(0) && isatty(2) ){
11867 fprintf(stderr,
11868 "attach debugger to process %d and press any key to continue.\n",
11869 GETPID());
11870 fgetc(stdin);
11871 }else{
11872 #if defined(_WIN32) || defined(WIN32)
11873 #if SQLITE_OS_WINRT
11874 __debugbreak();
11875 #else
11876 DebugBreak();
11877 #endif
11878 #elif defined(SIGTRAP)
11879 raise(SIGTRAP);
11880 #endif
11883 #endif
11885 #if USE_SYSTEM_SQLITE+0!=1
11886 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
11887 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
11888 sqlite3_sourceid(), SQLITE_SOURCE_ID);
11889 exit(1);
11891 #endif
11892 main_init(&data);
11894 /* On Windows, we must translate command-line arguments into UTF-8.
11895 ** The SQLite memory allocator subsystem has to be enabled in order to
11896 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
11897 ** subsequent sqlite3_config() calls will work. So copy all results into
11898 ** memory that does not come from the SQLite memory allocator.
11900 #if !SQLITE_SHELL_IS_UTF8
11901 sqlite3_initialize();
11902 argvToFree = malloc(sizeof(argv[0])*argc*2);
11903 shell_check_oom(argvToFree);
11904 argcToFree = argc;
11905 argv = argvToFree + argc;
11906 for(i=0; i<argc; i++){
11907 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
11908 int n;
11909 shell_check_oom(z);
11910 n = (int)strlen(z);
11911 argv[i] = malloc( n+1 );
11912 shell_check_oom(argv[i]);
11913 memcpy(argv[i], z, n+1);
11914 argvToFree[i] = argv[i];
11915 sqlite3_free(z);
11917 sqlite3_shutdown();
11918 #endif
11920 assert( argc>=1 && argv && argv[0] );
11921 Argv0 = argv[0];
11923 /* Make sure we have a valid signal handler early, before anything
11924 ** else is done.
11926 #ifdef SIGINT
11927 signal(SIGINT, interrupt_handler);
11928 #elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
11929 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
11930 #endif
11932 #ifdef SQLITE_SHELL_DBNAME_PROC
11934 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
11935 ** of a C-function that will provide the name of the database file. Use
11936 ** this compile-time option to embed this shell program in larger
11937 ** applications. */
11938 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
11939 SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename);
11940 warnInmemoryDb = 0;
11942 #endif
11944 /* Do an initial pass through the command-line argument to locate
11945 ** the name of the database file, the name of the initialization file,
11946 ** the size of the alternative malloc heap,
11947 ** and the first command to execute.
11949 verify_uninitialized();
11950 for(i=1; i<argc; i++){
11951 char *z;
11952 z = argv[i];
11953 if( z[0]!='-' ){
11954 if( data.aAuxDb->zDbFilename==0 ){
11955 data.aAuxDb->zDbFilename = z;
11956 }else{
11957 /* Excesss arguments are interpreted as SQL (or dot-commands) and
11958 ** mean that nothing is read from stdin */
11959 readStdin = 0;
11960 nCmd++;
11961 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
11962 shell_check_oom(azCmd);
11963 azCmd[nCmd-1] = z;
11966 if( z[1]=='-' ) z++;
11967 if( strcmp(z,"-separator")==0
11968 || strcmp(z,"-nullvalue")==0
11969 || strcmp(z,"-newline")==0
11970 || strcmp(z,"-cmd")==0
11972 (void)cmdline_option_value(argc, argv, ++i);
11973 }else if( strcmp(z,"-init")==0 ){
11974 zInitFile = cmdline_option_value(argc, argv, ++i);
11975 }else if( strcmp(z,"-batch")==0 ){
11976 /* Need to check for batch mode here to so we can avoid printing
11977 ** informational messages (like from process_sqliterc) before
11978 ** we do the actual processing of arguments later in a second pass.
11980 stdin_is_interactive = 0;
11981 }else if( strcmp(z,"-heap")==0 ){
11982 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
11983 const char *zSize;
11984 sqlite3_int64 szHeap;
11986 zSize = cmdline_option_value(argc, argv, ++i);
11987 szHeap = integerValue(zSize);
11988 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
11989 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
11990 #else
11991 (void)cmdline_option_value(argc, argv, ++i);
11992 #endif
11993 }else if( strcmp(z,"-pagecache")==0 ){
11994 sqlite3_int64 n, sz;
11995 sz = integerValue(cmdline_option_value(argc,argv,++i));
11996 if( sz>70000 ) sz = 70000;
11997 if( sz<0 ) sz = 0;
11998 n = integerValue(cmdline_option_value(argc,argv,++i));
11999 if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
12000 n = 0xffffffffffffLL/sz;
12002 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
12003 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
12004 data.shellFlgs |= SHFLG_Pagecache;
12005 }else if( strcmp(z,"-lookaside")==0 ){
12006 int n, sz;
12007 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
12008 if( sz<0 ) sz = 0;
12009 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12010 if( n<0 ) n = 0;
12011 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
12012 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
12013 }else if( strcmp(z,"-threadsafe")==0 ){
12014 int n;
12015 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
12016 switch( n ){
12017 case 0: sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); break;
12018 case 2: sqlite3_config(SQLITE_CONFIG_MULTITHREAD); break;
12019 default: sqlite3_config(SQLITE_CONFIG_SERIALIZED); break;
12021 #ifdef SQLITE_ENABLE_VFSTRACE
12022 }else if( strcmp(z,"-vfstrace")==0 ){
12023 extern int vfstrace_register(
12024 const char *zTraceName,
12025 const char *zOldVfsName,
12026 int (*xOut)(const char*,void*),
12027 void *pOutArg,
12028 int makeDefault
12030 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
12031 #endif
12032 #ifdef SQLITE_ENABLE_MULTIPLEX
12033 }else if( strcmp(z,"-multiplex")==0 ){
12034 extern int sqlite3_multiple_initialize(const char*,int);
12035 sqlite3_multiplex_initialize(0, 1);
12036 #endif
12037 }else if( strcmp(z,"-mmap")==0 ){
12038 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12039 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
12040 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
12041 }else if( strcmp(z,"-sorterref")==0 ){
12042 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
12043 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
12044 #endif
12045 }else if( strcmp(z,"-vfs")==0 ){
12046 zVfs = cmdline_option_value(argc, argv, ++i);
12047 #ifdef SQLITE_HAVE_ZLIB
12048 }else if( strcmp(z,"-zip")==0 ){
12049 data.openMode = SHELL_OPEN_ZIPFILE;
12050 #endif
12051 }else if( strcmp(z,"-append")==0 ){
12052 data.openMode = SHELL_OPEN_APPENDVFS;
12053 #ifndef SQLITE_OMIT_DESERIALIZE
12054 }else if( strcmp(z,"-deserialize")==0 ){
12055 data.openMode = SHELL_OPEN_DESERIALIZE;
12056 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12057 data.szMax = integerValue(argv[++i]);
12058 #endif
12059 }else if( strcmp(z,"-readonly")==0 ){
12060 data.openMode = SHELL_OPEN_READONLY;
12061 }else if( strcmp(z,"-nofollow")==0 ){
12062 data.openFlags = SQLITE_OPEN_NOFOLLOW;
12063 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12064 }else if( strncmp(z, "-A",2)==0 ){
12065 /* All remaining command-line arguments are passed to the ".archive"
12066 ** command, so ignore them */
12067 break;
12068 #endif
12069 }else if( strcmp(z, "-memtrace")==0 ){
12070 sqlite3MemTraceActivate(stderr);
12071 }else if( strcmp(z,"-bail")==0 ){
12072 bail_on_error = 1;
12073 }else if( strcmp(z,"-nonce")==0 ){
12074 free(data.zNonce);
12075 data.zNonce = strdup(argv[++i]);
12076 }else if( strcmp(z,"-safe")==0 ){
12077 /* no-op - catch this on the second pass */
12080 verify_uninitialized();
12083 #ifdef SQLITE_SHELL_INIT_PROC
12085 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
12086 ** of a C-function that will perform initialization actions on SQLite that
12087 ** occur just before or after sqlite3_initialize(). Use this compile-time
12088 ** option to embed this shell program in larger applications. */
12089 extern void SQLITE_SHELL_INIT_PROC(void);
12090 SQLITE_SHELL_INIT_PROC();
12092 #else
12093 /* All the sqlite3_config() calls have now been made. So it is safe
12094 ** to call sqlite3_initialize() and process any command line -vfs option. */
12095 sqlite3_initialize();
12096 #endif
12098 if( zVfs ){
12099 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
12100 if( pVfs ){
12101 sqlite3_vfs_register(pVfs, 1);
12102 }else{
12103 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
12104 exit(1);
12108 if( data.pAuxDb->zDbFilename==0 ){
12109 #ifndef SQLITE_OMIT_MEMORYDB
12110 data.pAuxDb->zDbFilename = ":memory:";
12111 warnInmemoryDb = argc==1;
12112 #else
12113 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
12114 return 1;
12115 #endif
12117 data.out = stdout;
12118 sqlite3_appendvfs_init(0,0,0);
12120 /* Go ahead and open the database file if it already exists. If the
12121 ** file does not exist, delay opening it. This prevents empty database
12122 ** files from being created if a user mistypes the database name argument
12123 ** to the sqlite command-line tool.
12125 if( access(data.pAuxDb->zDbFilename, 0)==0 ){
12126 open_db(&data, 0);
12129 /* Process the initialization file if there is one. If no -init option
12130 ** is given on the command line, look for a file named ~/.sqliterc and
12131 ** try to process it.
12133 process_sqliterc(&data,zInitFile);
12135 /* Make a second pass through the command-line argument and set
12136 ** options. This second pass is delayed until after the initialization
12137 ** file is processed so that the command-line arguments will override
12138 ** settings in the initialization file.
12140 for(i=1; i<argc; i++){
12141 char *z = argv[i];
12142 if( z[0]!='-' ) continue;
12143 if( z[1]=='-' ){ z++; }
12144 if( strcmp(z,"-init")==0 ){
12145 i++;
12146 }else if( strcmp(z,"-html")==0 ){
12147 data.mode = MODE_Html;
12148 }else if( strcmp(z,"-list")==0 ){
12149 data.mode = MODE_List;
12150 }else if( strcmp(z,"-quote")==0 ){
12151 data.mode = MODE_Quote;
12152 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Comma);
12153 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12154 }else if( strcmp(z,"-line")==0 ){
12155 data.mode = MODE_Line;
12156 }else if( strcmp(z,"-column")==0 ){
12157 data.mode = MODE_Column;
12158 }else if( strcmp(z,"-json")==0 ){
12159 data.mode = MODE_Json;
12160 }else if( strcmp(z,"-markdown")==0 ){
12161 data.mode = MODE_Markdown;
12162 }else if( strcmp(z,"-table")==0 ){
12163 data.mode = MODE_Table;
12164 }else if( strcmp(z,"-box")==0 ){
12165 data.mode = MODE_Box;
12166 }else if( strcmp(z,"-csv")==0 ){
12167 data.mode = MODE_Csv;
12168 memcpy(data.colSeparator,",",2);
12169 #ifdef SQLITE_HAVE_ZLIB
12170 }else if( strcmp(z,"-zip")==0 ){
12171 data.openMode = SHELL_OPEN_ZIPFILE;
12172 #endif
12173 }else if( strcmp(z,"-append")==0 ){
12174 data.openMode = SHELL_OPEN_APPENDVFS;
12175 #ifndef SQLITE_OMIT_DESERIALIZE
12176 }else if( strcmp(z,"-deserialize")==0 ){
12177 data.openMode = SHELL_OPEN_DESERIALIZE;
12178 }else if( strcmp(z,"-maxsize")==0 && i+1<argc ){
12179 data.szMax = integerValue(argv[++i]);
12180 #endif
12181 }else if( strcmp(z,"-readonly")==0 ){
12182 data.openMode = SHELL_OPEN_READONLY;
12183 }else if( strcmp(z,"-nofollow")==0 ){
12184 data.openFlags |= SQLITE_OPEN_NOFOLLOW;
12185 }else if( strcmp(z,"-ascii")==0 ){
12186 data.mode = MODE_Ascii;
12187 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Unit);
12188 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Record);
12189 }else if( strcmp(z,"-tabs")==0 ){
12190 data.mode = MODE_List;
12191 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, SEP_Tab);
12192 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator, SEP_Row);
12193 }else if( strcmp(z,"-separator")==0 ){
12194 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
12195 "%s",cmdline_option_value(argc,argv,++i));
12196 }else if( strcmp(z,"-newline")==0 ){
12197 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
12198 "%s",cmdline_option_value(argc,argv,++i));
12199 }else if( strcmp(z,"-nullvalue")==0 ){
12200 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
12201 "%s",cmdline_option_value(argc,argv,++i));
12202 }else if( strcmp(z,"-header")==0 ){
12203 data.showHeader = 1;
12204 ShellSetFlag(&data, SHFLG_HeaderSet);
12205 }else if( strcmp(z,"-noheader")==0 ){
12206 data.showHeader = 0;
12207 ShellSetFlag(&data, SHFLG_HeaderSet);
12208 }else if( strcmp(z,"-echo")==0 ){
12209 ShellSetFlag(&data, SHFLG_Echo);
12210 }else if( strcmp(z,"-eqp")==0 ){
12211 data.autoEQP = AUTOEQP_on;
12212 }else if( strcmp(z,"-eqpfull")==0 ){
12213 data.autoEQP = AUTOEQP_full;
12214 }else if( strcmp(z,"-stats")==0 ){
12215 data.statsOn = 1;
12216 }else if( strcmp(z,"-scanstats")==0 ){
12217 data.scanstatsOn = 1;
12218 }else if( strcmp(z,"-backslash")==0 ){
12219 /* Undocumented command-line option: -backslash
12220 ** Causes C-style backslash escapes to be evaluated in SQL statements
12221 ** prior to sending the SQL into SQLite. Useful for injecting
12222 ** crazy bytes in the middle of SQL statements for testing and debugging.
12224 ShellSetFlag(&data, SHFLG_Backslash);
12225 }else if( strcmp(z,"-bail")==0 ){
12226 /* No-op. The bail_on_error flag should already be set. */
12227 }else if( strcmp(z,"-version")==0 ){
12228 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
12229 return 0;
12230 }else if( strcmp(z,"-interactive")==0 ){
12231 stdin_is_interactive = 1;
12232 }else if( strcmp(z,"-batch")==0 ){
12233 stdin_is_interactive = 0;
12234 }else if( strcmp(z,"-heap")==0 ){
12235 i++;
12236 }else if( strcmp(z,"-pagecache")==0 ){
12237 i+=2;
12238 }else if( strcmp(z,"-lookaside")==0 ){
12239 i+=2;
12240 }else if( strcmp(z,"-threadsafe")==0 ){
12241 i+=2;
12242 }else if( strcmp(z,"-nonce")==0 ){
12243 i += 2;
12244 }else if( strcmp(z,"-mmap")==0 ){
12245 i++;
12246 }else if( strcmp(z,"-memtrace")==0 ){
12247 i++;
12248 #ifdef SQLITE_ENABLE_SORTER_REFERENCES
12249 }else if( strcmp(z,"-sorterref")==0 ){
12250 i++;
12251 #endif
12252 }else if( strcmp(z,"-vfs")==0 ){
12253 i++;
12254 #ifdef SQLITE_ENABLE_VFSTRACE
12255 }else if( strcmp(z,"-vfstrace")==0 ){
12256 i++;
12257 #endif
12258 #ifdef SQLITE_ENABLE_MULTIPLEX
12259 }else if( strcmp(z,"-multiplex")==0 ){
12260 i++;
12261 #endif
12262 }else if( strcmp(z,"-help")==0 ){
12263 usage(1);
12264 }else if( strcmp(z,"-cmd")==0 ){
12265 /* Run commands that follow -cmd first and separately from commands
12266 ** that simply appear on the command-line. This seems goofy. It would
12267 ** be better if all commands ran in the order that they appear. But
12268 ** we retain the goofy behavior for historical compatibility. */
12269 if( i==argc-1 ) break;
12270 z = cmdline_option_value(argc,argv,++i);
12271 if( z[0]=='.' ){
12272 rc = do_meta_command(z, &data);
12273 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
12274 }else{
12275 open_db(&data, 0);
12276 rc = shell_exec(&data, z, &zErrMsg);
12277 if( zErrMsg!=0 ){
12278 utf8_printf(stderr,"Error: %s\n", zErrMsg);
12279 if( bail_on_error ) return rc!=0 ? rc : 1;
12280 }else if( rc!=0 ){
12281 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
12282 if( bail_on_error ) return rc;
12285 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
12286 }else if( strncmp(z, "-A", 2)==0 ){
12287 if( nCmd>0 ){
12288 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
12289 " with \"%s\"\n", z);
12290 return 1;
12292 open_db(&data, OPEN_DB_ZIPFILE);
12293 if( z[2] ){
12294 argv[i] = &z[2];
12295 arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
12296 }else{
12297 arDotCommand(&data, 1, argv+i, argc-i);
12299 readStdin = 0;
12300 break;
12301 #endif
12302 }else if( strcmp(z,"-safe")==0 ){
12303 data.bSafeMode = data.bSafeModePersist = 1;
12304 }else{
12305 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
12306 raw_printf(stderr,"Use -help for a list of options.\n");
12307 return 1;
12309 data.cMode = data.mode;
12312 if( !readStdin ){
12313 /* Run all arguments that do not begin with '-' as if they were separate
12314 ** command-line inputs, except for the argToSkip argument which contains
12315 ** the database filename.
12317 for(i=0; i<nCmd; i++){
12318 if( azCmd[i][0]=='.' ){
12319 rc = do_meta_command(azCmd[i], &data);
12320 if( rc ){
12321 free(azCmd);
12322 return rc==2 ? 0 : rc;
12324 }else{
12325 open_db(&data, 0);
12326 rc = shell_exec(&data, azCmd[i], &zErrMsg);
12327 if( zErrMsg || rc ){
12328 if( zErrMsg!=0 ){
12329 utf8_printf(stderr,"Error: %s\n", zErrMsg);
12330 }else{
12331 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
12333 sqlite3_free(zErrMsg);
12334 free(azCmd);
12335 return rc!=0 ? rc : 1;
12339 }else{
12340 /* Run commands received from standard input
12342 if( stdin_is_interactive ){
12343 char *zHome;
12344 char *zHistory;
12345 int nHistory;
12346 printf(
12347 "SQLite version %s %.19s\n" /*extra-version-info*/
12348 "Enter \".help\" for usage hints.\n",
12349 sqlite3_libversion(), sqlite3_sourceid()
12351 if( warnInmemoryDb ){
12352 printf("Connected to a ");
12353 printBold("transient in-memory database");
12354 printf(".\nUse \".open FILENAME\" to reopen on a "
12355 "persistent database.\n");
12357 zHistory = getenv("SQLITE_HISTORY");
12358 if( zHistory ){
12359 zHistory = strdup(zHistory);
12360 }else if( (zHome = find_home_dir(0))!=0 ){
12361 nHistory = strlen30(zHome) + 20;
12362 if( (zHistory = malloc(nHistory))!=0 ){
12363 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
12366 if( zHistory ){ shell_read_history(zHistory); }
12367 #if HAVE_READLINE || HAVE_EDITLINE
12368 rl_attempted_completion_function = readline_completion;
12369 #elif HAVE_LINENOISE
12370 linenoiseSetCompletionCallback(linenoise_completion);
12371 #endif
12372 data.in = 0;
12373 rc = process_input(&data);
12374 if( zHistory ){
12375 shell_stifle_history(2000);
12376 shell_write_history(zHistory);
12377 free(zHistory);
12379 }else{
12380 data.in = stdin;
12381 rc = process_input(&data);
12384 free(azCmd);
12385 set_table_name(&data, 0);
12386 if( data.db ){
12387 session_close_all(&data, -1);
12388 close_db(data.db);
12390 for(i=0; i<ArraySize(data.aAuxDb); i++){
12391 sqlite3_free(data.aAuxDb[i].zFreeOnClose);
12392 if( data.aAuxDb[i].db ){
12393 session_close_all(&data, i);
12394 close_db(data.aAuxDb[i].db);
12397 find_home_dir(1);
12398 output_reset(&data);
12399 data.doXdgOpen = 0;
12400 clearTempFile(&data);
12401 #if !SQLITE_SHELL_IS_UTF8
12402 for(i=0; i<argcToFree; i++) free(argvToFree[i]);
12403 free(argvToFree);
12404 #endif
12405 free(data.colWidth);
12406 free(data.zNonce);
12407 /* Clear the global data structure so that valgrind will detect memory
12408 ** leaks */
12409 memset(&data, 0, sizeof(data));
12410 return rc;