Get writes working on the sqlite_dbpage virtual table. Add a few test cases.
[sqlite.git] / src / shell.c
blobf7be9415709db262c189a872814c2c71fffd60e0
1 /* DO NOT EDIT!
2 ** This file is automatically generated by the script in the canonical
3 ** SQLite source tree at tool/mkshellc.tcl. That script combines source
4 ** code from various constituent source files of SQLite into this single
5 ** "shell.c" file used to implement the SQLite command-line shell.
6 **
7 ** Most of the code found below comes from the "src/shell.c.in" file in
8 ** the canonical SQLite source tree. That main file contains "INCLUDE"
9 ** lines that specify other files in the canonical source tree that are
10 ** inserted to getnerate this complete program source file.
12 ** The code from multiple files is combined into this single "shell.c"
13 ** source file to help make the command-line program easier to compile.
15 ** To modify this program, get a copy of the canonical SQLite source tree,
16 ** edit the src/shell.c.in" and/or some of the other files that are included
17 ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script.
20 ** 2001 September 15
22 ** The author disclaims copyright to this source code. In place of
23 ** a legal notice, here is a blessing:
25 ** May you do good and not evil.
26 ** May you find forgiveness for yourself and forgive others.
27 ** May you share freely, never taking more than you give.
29 *************************************************************************
30 ** This file contains code to implement the "sqlite" command line
31 ** utility for accessing SQLite databases.
33 #if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
34 /* This needs to come before any includes for MSVC compiler */
35 #define _CRT_SECURE_NO_WARNINGS
36 #endif
39 ** Warning pragmas copied from msvc.h in the core.
41 #if defined(_MSC_VER)
42 #pragma warning(disable : 4054)
43 #pragma warning(disable : 4055)
44 #pragma warning(disable : 4100)
45 #pragma warning(disable : 4127)
46 #pragma warning(disable : 4130)
47 #pragma warning(disable : 4152)
48 #pragma warning(disable : 4189)
49 #pragma warning(disable : 4206)
50 #pragma warning(disable : 4210)
51 #pragma warning(disable : 4232)
52 #pragma warning(disable : 4244)
53 #pragma warning(disable : 4305)
54 #pragma warning(disable : 4306)
55 #pragma warning(disable : 4702)
56 #pragma warning(disable : 4706)
57 #endif /* defined(_MSC_VER) */
60 ** No support for loadable extensions in VxWorks.
62 #if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
63 # define SQLITE_OMIT_LOAD_EXTENSION 1
64 #endif
67 ** Enable large-file support for fopen() and friends on unix.
69 #ifndef SQLITE_DISABLE_LFS
70 # define _LARGE_FILE 1
71 # ifndef _FILE_OFFSET_BITS
72 # define _FILE_OFFSET_BITS 64
73 # endif
74 # define _LARGEFILE_SOURCE 1
75 #endif
77 #include <stdlib.h>
78 #include <string.h>
79 #include <stdio.h>
80 #include <assert.h>
81 #include "sqlite3.h"
82 #if SQLITE_USER_AUTHENTICATION
83 # include "sqlite3userauth.h"
84 #endif
85 #include <ctype.h>
86 #include <stdarg.h>
88 #if !defined(_WIN32) && !defined(WIN32)
89 # include <signal.h>
90 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
91 # include <pwd.h>
92 # endif
93 # include <unistd.h>
94 # include <sys/types.h>
95 #endif
97 #if HAVE_READLINE
98 # include <readline/readline.h>
99 # include <readline/history.h>
100 #endif
102 #if HAVE_EDITLINE
103 # include <editline/readline.h>
104 #endif
106 #if HAVE_EDITLINE || HAVE_READLINE
108 # define shell_add_history(X) add_history(X)
109 # define shell_read_history(X) read_history(X)
110 # define shell_write_history(X) write_history(X)
111 # define shell_stifle_history(X) stifle_history(X)
112 # define shell_readline(X) readline(X)
114 #elif HAVE_LINENOISE
116 # include "linenoise.h"
117 # define shell_add_history(X) linenoiseHistoryAdd(X)
118 # define shell_read_history(X) linenoiseHistoryLoad(X)
119 # define shell_write_history(X) linenoiseHistorySave(X)
120 # define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
121 # define shell_readline(X) linenoise(X)
123 #else
125 # define shell_read_history(X)
126 # define shell_write_history(X)
127 # define shell_stifle_history(X)
129 # define SHELL_USE_LOCAL_GETLINE 1
130 #endif
133 #if defined(_WIN32) || defined(WIN32)
134 # include <io.h>
135 # include <fcntl.h>
136 # define isatty(h) _isatty(h)
137 # ifndef access
138 # define access(f,m) _access((f),(m))
139 # endif
140 # undef popen
141 # define popen _popen
142 # undef pclose
143 # define pclose _pclose
144 #else
145 /* Make sure isatty() has a prototype. */
146 extern int isatty(int);
148 # if !defined(__RTP__) && !defined(_WRS_KERNEL)
149 /* popen and pclose are not C89 functions and so are
150 ** sometimes omitted from the <stdio.h> header */
151 extern FILE *popen(const char*,const char*);
152 extern int pclose(FILE*);
153 # else
154 # define SQLITE_OMIT_POPEN 1
155 # endif
156 #endif
158 #if defined(_WIN32_WCE)
159 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
160 * thus we always assume that we have a console. That can be
161 * overridden with the -batch command line option.
163 #define isatty(x) 1
164 #endif
166 /* ctype macros that work with signed characters */
167 #define IsSpace(X) isspace((unsigned char)X)
168 #define IsDigit(X) isdigit((unsigned char)X)
169 #define ToLower(X) (char)tolower((unsigned char)X)
171 #if defined(_WIN32) || defined(WIN32)
172 #include <windows.h>
174 /* string conversion routines only needed on Win32 */
175 extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
176 extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
177 extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
178 extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
179 #endif
181 /* On Windows, we normally run with output mode of TEXT so that \n characters
182 ** are automatically translated into \r\n. However, this behavior needs
183 ** to be disabled in some cases (ex: when generating CSV output and when
184 ** rendering quoted strings that contain \n characters). The following
185 ** routines take care of that.
187 #if defined(_WIN32) || defined(WIN32)
188 static void setBinaryMode(FILE *file, int isOutput){
189 if( isOutput ) fflush(file);
190 _setmode(_fileno(file), _O_BINARY);
192 static void setTextMode(FILE *file, int isOutput){
193 if( isOutput ) fflush(file);
194 _setmode(_fileno(file), _O_TEXT);
196 #else
197 # define setBinaryMode(X,Y)
198 # define setTextMode(X,Y)
199 #endif
202 /* True if the timer is enabled */
203 static int enableTimer = 0;
205 /* Return the current wall-clock time */
206 static sqlite3_int64 timeOfDay(void){
207 static sqlite3_vfs *clockVfs = 0;
208 sqlite3_int64 t;
209 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
210 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
211 clockVfs->xCurrentTimeInt64(clockVfs, &t);
212 }else{
213 double r;
214 clockVfs->xCurrentTime(clockVfs, &r);
215 t = (sqlite3_int64)(r*86400000.0);
217 return t;
220 #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
221 #include <sys/time.h>
222 #include <sys/resource.h>
224 /* VxWorks does not support getrusage() as far as we can determine */
225 #if defined(_WRS_KERNEL) || defined(__RTP__)
226 struct rusage {
227 struct timeval ru_utime; /* user CPU time used */
228 struct timeval ru_stime; /* system CPU time used */
230 #define getrusage(A,B) memset(B,0,sizeof(*B))
231 #endif
233 /* Saved resource information for the beginning of an operation */
234 static struct rusage sBegin; /* CPU time at start */
235 static sqlite3_int64 iBegin; /* Wall-clock time at start */
238 ** Begin timing an operation
240 static void beginTimer(void){
241 if( enableTimer ){
242 getrusage(RUSAGE_SELF, &sBegin);
243 iBegin = timeOfDay();
247 /* Return the difference of two time_structs in seconds */
248 static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
249 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
250 (double)(pEnd->tv_sec - pStart->tv_sec);
254 ** Print the timing results.
256 static void endTimer(void){
257 if( enableTimer ){
258 sqlite3_int64 iEnd = timeOfDay();
259 struct rusage sEnd;
260 getrusage(RUSAGE_SELF, &sEnd);
261 printf("Run Time: real %.3f user %f sys %f\n",
262 (iEnd - iBegin)*0.001,
263 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
264 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
268 #define BEGIN_TIMER beginTimer()
269 #define END_TIMER endTimer()
270 #define HAS_TIMER 1
272 #elif (defined(_WIN32) || defined(WIN32))
274 /* Saved resource information for the beginning of an operation */
275 static HANDLE hProcess;
276 static FILETIME ftKernelBegin;
277 static FILETIME ftUserBegin;
278 static sqlite3_int64 ftWallBegin;
279 typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
280 LPFILETIME, LPFILETIME);
281 static GETPROCTIMES getProcessTimesAddr = NULL;
284 ** Check to see if we have timer support. Return 1 if necessary
285 ** support found (or found previously).
287 static int hasTimer(void){
288 if( getProcessTimesAddr ){
289 return 1;
290 } else {
291 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
292 ** versions. See if the version we are running on has it, and if it
293 ** does, save off a pointer to it and the current process handle.
295 hProcess = GetCurrentProcess();
296 if( hProcess ){
297 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
298 if( NULL != hinstLib ){
299 getProcessTimesAddr =
300 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
301 if( NULL != getProcessTimesAddr ){
302 return 1;
304 FreeLibrary(hinstLib);
308 return 0;
312 ** Begin timing an operation
314 static void beginTimer(void){
315 if( enableTimer && getProcessTimesAddr ){
316 FILETIME ftCreation, ftExit;
317 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
318 &ftKernelBegin,&ftUserBegin);
319 ftWallBegin = timeOfDay();
323 /* Return the difference of two FILETIME structs in seconds */
324 static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
325 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
326 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
327 return (double) ((i64End - i64Start) / 10000000.0);
331 ** Print the timing results.
333 static void endTimer(void){
334 if( enableTimer && getProcessTimesAddr){
335 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
336 sqlite3_int64 ftWallEnd = timeOfDay();
337 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
338 printf("Run Time: real %.3f user %f sys %f\n",
339 (ftWallEnd - ftWallBegin)*0.001,
340 timeDiff(&ftUserBegin, &ftUserEnd),
341 timeDiff(&ftKernelBegin, &ftKernelEnd));
345 #define BEGIN_TIMER beginTimer()
346 #define END_TIMER endTimer()
347 #define HAS_TIMER hasTimer()
349 #else
350 #define BEGIN_TIMER
351 #define END_TIMER
352 #define HAS_TIMER 0
353 #endif
356 ** Used to prevent warnings about unused parameters
358 #define UNUSED_PARAMETER(x) (void)(x)
361 ** If the following flag is set, then command execution stops
362 ** at an error if we are not interactive.
364 static int bail_on_error = 0;
367 ** Threat stdin as an interactive input if the following variable
368 ** is true. Otherwise, assume stdin is connected to a file or pipe.
370 static int stdin_is_interactive = 1;
373 ** On Windows systems we have to know if standard output is a console
374 ** in order to translate UTF-8 into MBCS. The following variable is
375 ** true if translation is required.
377 static int stdout_is_console = 1;
380 ** The following is the open SQLite database. We make a pointer
381 ** to this database a static variable so that it can be accessed
382 ** by the SIGINT handler to interrupt database processing.
384 static sqlite3 *globalDb = 0;
387 ** True if an interrupt (Control-C) has been received.
389 static volatile int seenInterrupt = 0;
392 ** This is the name of our program. It is set in main(), used
393 ** in a number of other places, mostly for error messages.
395 static char *Argv0;
398 ** Prompt strings. Initialized in main. Settable with
399 ** .prompt main continue
401 static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
402 static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
405 ** Render output like fprintf(). Except, if the output is going to the
406 ** console and if this is running on a Windows machine, translate the
407 ** output from UTF-8 into MBCS.
409 #if defined(_WIN32) || defined(WIN32)
410 void utf8_printf(FILE *out, const char *zFormat, ...){
411 va_list ap;
412 va_start(ap, zFormat);
413 if( stdout_is_console && (out==stdout || out==stderr) ){
414 char *z1 = sqlite3_vmprintf(zFormat, ap);
415 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
416 sqlite3_free(z1);
417 fputs(z2, out);
418 sqlite3_free(z2);
419 }else{
420 vfprintf(out, zFormat, ap);
422 va_end(ap);
424 #elif !defined(utf8_printf)
425 # define utf8_printf fprintf
426 #endif
429 ** Render output like fprintf(). This should not be used on anything that
430 ** includes string formatting (e.g. "%s").
432 #if !defined(raw_printf)
433 # define raw_printf fprintf
434 #endif
437 ** Write I/O traces to the following stream.
439 #ifdef SQLITE_ENABLE_IOTRACE
440 static FILE *iotrace = 0;
441 #endif
444 ** This routine works like printf in that its first argument is a
445 ** format string and subsequent arguments are values to be substituted
446 ** in place of % fields. The result of formatting this string
447 ** is written to iotrace.
449 #ifdef SQLITE_ENABLE_IOTRACE
450 static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
451 va_list ap;
452 char *z;
453 if( iotrace==0 ) return;
454 va_start(ap, zFormat);
455 z = sqlite3_vmprintf(zFormat, ap);
456 va_end(ap);
457 utf8_printf(iotrace, "%s", z);
458 sqlite3_free(z);
460 #endif
463 ** Output string zUtf to stream pOut as w characters. If w is negative,
464 ** then right-justify the text. W is the width in UTF-8 characters, not
465 ** in bytes. This is different from the %*.*s specification in printf
466 ** since with %*.*s the width is measured in bytes, not characters.
468 static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
469 int i;
470 int n;
471 int aw = w<0 ? -w : w;
472 char zBuf[1000];
473 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
474 for(i=n=0; zUtf[i]; i++){
475 if( (zUtf[i]&0xc0)!=0x80 ){
476 n++;
477 if( n==aw ){
478 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
479 break;
483 if( n>=aw ){
484 utf8_printf(pOut, "%.*s", i, zUtf);
485 }else if( w<0 ){
486 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
487 }else{
488 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
494 ** Determines if a string is a number of not.
496 static int isNumber(const char *z, int *realnum){
497 if( *z=='-' || *z=='+' ) z++;
498 if( !IsDigit(*z) ){
499 return 0;
501 z++;
502 if( realnum ) *realnum = 0;
503 while( IsDigit(*z) ){ z++; }
504 if( *z=='.' ){
505 z++;
506 if( !IsDigit(*z) ) return 0;
507 while( IsDigit(*z) ){ z++; }
508 if( realnum ) *realnum = 1;
510 if( *z=='e' || *z=='E' ){
511 z++;
512 if( *z=='+' || *z=='-' ) z++;
513 if( !IsDigit(*z) ) return 0;
514 while( IsDigit(*z) ){ z++; }
515 if( realnum ) *realnum = 1;
517 return *z==0;
521 ** Compute a string length that is limited to what can be stored in
522 ** lower 30 bits of a 32-bit signed integer.
524 static int strlen30(const char *z){
525 const char *z2 = z;
526 while( *z2 ){ z2++; }
527 return 0x3fffffff & (int)(z2 - z);
531 ** Return the length of a string in characters. Multibyte UTF8 characters
532 ** count as a single character.
534 static int strlenChar(const char *z){
535 int n = 0;
536 while( *z ){
537 if( (0xc0&*(z++))!=0x80 ) n++;
539 return n;
543 ** This routine reads a line of text from FILE in, stores
544 ** the text in memory obtained from malloc() and returns a pointer
545 ** to the text. NULL is returned at end of file, or if malloc()
546 ** fails.
548 ** If zLine is not NULL then it is a malloced buffer returned from
549 ** a previous call to this routine that may be reused.
551 static char *local_getline(char *zLine, FILE *in){
552 int nLine = zLine==0 ? 0 : 100;
553 int n = 0;
555 while( 1 ){
556 if( n+100>nLine ){
557 nLine = nLine*2 + 100;
558 zLine = realloc(zLine, nLine);
559 if( zLine==0 ) return 0;
561 if( fgets(&zLine[n], nLine - n, in)==0 ){
562 if( n==0 ){
563 free(zLine);
564 return 0;
566 zLine[n] = 0;
567 break;
569 while( zLine[n] ) n++;
570 if( n>0 && zLine[n-1]=='\n' ){
571 n--;
572 if( n>0 && zLine[n-1]=='\r' ) n--;
573 zLine[n] = 0;
574 break;
577 #if defined(_WIN32) || defined(WIN32)
578 /* For interactive input on Windows systems, translate the
579 ** multi-byte characterset characters into UTF-8. */
580 if( stdin_is_interactive && in==stdin ){
581 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
582 if( zTrans ){
583 int nTrans = strlen30(zTrans)+1;
584 if( nTrans>nLine ){
585 zLine = realloc(zLine, nTrans);
586 if( zLine==0 ){
587 sqlite3_free(zTrans);
588 return 0;
591 memcpy(zLine, zTrans, nTrans);
592 sqlite3_free(zTrans);
595 #endif /* defined(_WIN32) || defined(WIN32) */
596 return zLine;
600 ** Retrieve a single line of input text.
602 ** If in==0 then read from standard input and prompt before each line.
603 ** If isContinuation is true, then a continuation prompt is appropriate.
604 ** If isContinuation is zero, then the main prompt should be used.
606 ** If zPrior is not NULL then it is a buffer from a prior call to this
607 ** routine that can be reused.
609 ** The result is stored in space obtained from malloc() and must either
610 ** be freed by the caller or else passed back into this routine via the
611 ** zPrior argument for reuse.
613 static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
614 char *zPrompt;
615 char *zResult;
616 if( in!=0 ){
617 zResult = local_getline(zPrior, in);
618 }else{
619 zPrompt = isContinuation ? continuePrompt : mainPrompt;
620 #if SHELL_USE_LOCAL_GETLINE
621 printf("%s", zPrompt);
622 fflush(stdout);
623 zResult = local_getline(zPrior, stdin);
624 #else
625 free(zPrior);
626 zResult = shell_readline(zPrompt);
627 if( zResult && *zResult ) shell_add_history(zResult);
628 #endif
630 return zResult;
633 ** A variable length string to which one can append text.
635 typedef struct ShellText ShellText;
636 struct ShellText {
637 char *z;
638 int n;
639 int nAlloc;
643 ** Initialize and destroy a ShellText object
645 static void initText(ShellText *p){
646 memset(p, 0, sizeof(*p));
648 static void freeText(ShellText *p){
649 free(p->z);
650 initText(p);
653 /* zIn is either a pointer to a NULL-terminated string in memory obtained
654 ** from malloc(), or a NULL pointer. The string pointed to by zAppend is
655 ** added to zIn, and the result returned in memory obtained from malloc().
656 ** zIn, if it was not NULL, is freed.
658 ** If the third argument, quote, is not '\0', then it is used as a
659 ** quote character for zAppend.
661 static void appendText(ShellText *p, char const *zAppend, char quote){
662 int len;
663 int i;
664 int nAppend = strlen30(zAppend);
666 len = nAppend+p->n+1;
667 if( quote ){
668 len += 2;
669 for(i=0; i<nAppend; i++){
670 if( zAppend[i]==quote ) len++;
674 if( p->n+len>=p->nAlloc ){
675 p->nAlloc = p->nAlloc*2 + len + 20;
676 p->z = realloc(p->z, p->nAlloc);
677 if( p->z==0 ){
678 memset(p, 0, sizeof(*p));
679 return;
683 if( quote ){
684 char *zCsr = p->z+p->n;
685 *zCsr++ = quote;
686 for(i=0; i<nAppend; i++){
687 *zCsr++ = zAppend[i];
688 if( zAppend[i]==quote ) *zCsr++ = quote;
690 *zCsr++ = quote;
691 p->n = (int)(zCsr - p->z);
692 *zCsr = '\0';
693 }else{
694 memcpy(p->z+p->n, zAppend, nAppend);
695 p->n += nAppend;
696 p->z[p->n] = '\0';
701 ** Attempt to determine if identifier zName needs to be quoted, either
702 ** because it contains non-alphanumeric characters, or because it is an
703 ** SQLite keyword. Be conservative in this estimate: When in doubt assume
704 ** that quoting is required.
706 ** Return '"' if quoting is required. Return 0 if no quoting is required.
708 static char quoteChar(const char *zName){
709 /* All SQLite keywords, in alphabetical order */
710 static const char *azKeywords[] = {
711 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
712 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
713 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
714 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
715 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
716 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
717 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
718 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
719 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
720 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
721 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
722 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
723 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
724 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
725 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
726 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
727 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
728 "WITH", "WITHOUT",
730 int i, lwr, upr, mid, c;
731 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
732 for(i=0; zName[i]; i++){
733 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
735 lwr = 0;
736 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
737 while( lwr<=upr ){
738 mid = (lwr+upr)/2;
739 c = sqlite3_stricmp(azKeywords[mid], zName);
740 if( c==0 ) return '"';
741 if( c<0 ){
742 lwr = mid+1;
743 }else{
744 upr = mid-1;
747 return 0;
751 ** SQL function: shell_add_schema(S,X)
753 ** Add the schema name X to the CREATE statement in S and return the result.
754 ** Examples:
756 ** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
758 ** Also works on
760 ** CREATE INDEX
761 ** CREATE UNIQUE INDEX
762 ** CREATE VIEW
763 ** CREATE TRIGGER
764 ** CREATE VIRTUAL TABLE
766 ** This UDF is used by the .schema command to insert the schema name of
767 ** attached databases into the middle of the sqlite_master.sql field.
769 static void shellAddSchemaName(
770 sqlite3_context *pCtx,
771 int nVal,
772 sqlite3_value **apVal
774 static const char *aPrefix[] = {
775 "TABLE",
776 "INDEX",
777 "UNIQUE INDEX",
778 "VIEW",
779 "TRIGGER",
780 "VIRTUAL TABLE"
782 int i = 0;
783 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
784 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
785 assert( nVal==2 );
786 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
787 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
788 int n = strlen30(aPrefix[i]);
789 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
790 char cQuote = quoteChar(zSchema);
791 char *z;
792 if( cQuote ){
793 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
794 }else{
795 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
797 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
798 return;
802 sqlite3_result_value(pCtx, apVal[0]);
806 ** The source code for several run-time loadable extensions is inserted
807 ** below by the ../tool/mkshellc.tcl script. Before processing that included
808 ** code, we need to override some macros to make the included program code
809 ** work here in the middle of this regular program.
811 #define SQLITE_EXTENSION_INIT1
812 #define SQLITE_EXTENSION_INIT2(X) (void)(X)
814 /************************* Begin ../ext/misc/shathree.c ******************/
816 ** 2017-03-08
818 ** The author disclaims copyright to this source code. In place of
819 ** a legal notice, here is a blessing:
821 ** May you do good and not evil.
822 ** May you find forgiveness for yourself and forgive others.
823 ** May you share freely, never taking more than you give.
825 ******************************************************************************
827 ** This SQLite extension implements a functions that compute SHA1 hashes.
828 ** Two SQL functions are implemented:
830 ** sha3(X,SIZE)
831 ** sha3_query(Y,SIZE)
833 ** The sha3(X) function computes the SHA3 hash of the input X, or NULL if
834 ** X is NULL.
836 ** The sha3_query(Y) function evalutes all queries in the SQL statements of Y
837 ** and returns a hash of their results.
839 ** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm
840 ** is used. If SIZE is included it must be one of the integers 224, 256,
841 ** 384, or 512, to determine SHA3 hash variant that is computed.
843 SQLITE_EXTENSION_INIT1
844 #include <assert.h>
845 #include <string.h>
846 #include <stdarg.h>
847 typedef sqlite3_uint64 u64;
849 /******************************************************************************
850 ** The Hash Engine
853 ** Macros to determine whether the machine is big or little endian,
854 ** and whether or not that determination is run-time or compile-time.
856 ** For best performance, an attempt is made to guess at the byte-order
857 ** using C-preprocessor macros. If that is unsuccessful, or if
858 ** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
859 ** at run-time.
861 #ifndef SHA3_BYTEORDER
862 # if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
863 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
864 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
865 defined(__arm__)
866 # define SHA3_BYTEORDER 1234
867 # elif defined(sparc) || defined(__ppc__)
868 # define SHA3_BYTEORDER 4321
869 # else
870 # define SHA3_BYTEORDER 0
871 # endif
872 #endif
876 ** State structure for a SHA3 hash in progress
878 typedef struct SHA3Context SHA3Context;
879 struct SHA3Context {
880 union {
881 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
882 unsigned char x[1600]; /* ... or 1600 bytes */
883 } u;
884 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
885 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
886 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
890 ** A single step of the Keccak mixing function for a 1600-bit state
892 static void KeccakF1600Step(SHA3Context *p){
893 int i;
894 u64 B0, B1, B2, B3, B4;
895 u64 C0, C1, C2, C3, C4;
896 u64 D0, D1, D2, D3, D4;
897 static const u64 RC[] = {
898 0x0000000000000001ULL, 0x0000000000008082ULL,
899 0x800000000000808aULL, 0x8000000080008000ULL,
900 0x000000000000808bULL, 0x0000000080000001ULL,
901 0x8000000080008081ULL, 0x8000000000008009ULL,
902 0x000000000000008aULL, 0x0000000000000088ULL,
903 0x0000000080008009ULL, 0x000000008000000aULL,
904 0x000000008000808bULL, 0x800000000000008bULL,
905 0x8000000000008089ULL, 0x8000000000008003ULL,
906 0x8000000000008002ULL, 0x8000000000000080ULL,
907 0x000000000000800aULL, 0x800000008000000aULL,
908 0x8000000080008081ULL, 0x8000000000008080ULL,
909 0x0000000080000001ULL, 0x8000000080008008ULL
911 # define A00 (p->u.s[0])
912 # define A01 (p->u.s[1])
913 # define A02 (p->u.s[2])
914 # define A03 (p->u.s[3])
915 # define A04 (p->u.s[4])
916 # define A10 (p->u.s[5])
917 # define A11 (p->u.s[6])
918 # define A12 (p->u.s[7])
919 # define A13 (p->u.s[8])
920 # define A14 (p->u.s[9])
921 # define A20 (p->u.s[10])
922 # define A21 (p->u.s[11])
923 # define A22 (p->u.s[12])
924 # define A23 (p->u.s[13])
925 # define A24 (p->u.s[14])
926 # define A30 (p->u.s[15])
927 # define A31 (p->u.s[16])
928 # define A32 (p->u.s[17])
929 # define A33 (p->u.s[18])
930 # define A34 (p->u.s[19])
931 # define A40 (p->u.s[20])
932 # define A41 (p->u.s[21])
933 # define A42 (p->u.s[22])
934 # define A43 (p->u.s[23])
935 # define A44 (p->u.s[24])
936 # define ROL64(a,x) ((a<<x)|(a>>(64-x)))
938 for(i=0; i<24; i+=4){
939 C0 = A00^A10^A20^A30^A40;
940 C1 = A01^A11^A21^A31^A41;
941 C2 = A02^A12^A22^A32^A42;
942 C3 = A03^A13^A23^A33^A43;
943 C4 = A04^A14^A24^A34^A44;
944 D0 = C4^ROL64(C1, 1);
945 D1 = C0^ROL64(C2, 1);
946 D2 = C1^ROL64(C3, 1);
947 D3 = C2^ROL64(C4, 1);
948 D4 = C3^ROL64(C0, 1);
950 B0 = (A00^D0);
951 B1 = ROL64((A11^D1), 44);
952 B2 = ROL64((A22^D2), 43);
953 B3 = ROL64((A33^D3), 21);
954 B4 = ROL64((A44^D4), 14);
955 A00 = B0 ^((~B1)& B2 );
956 A00 ^= RC[i];
957 A11 = B1 ^((~B2)& B3 );
958 A22 = B2 ^((~B3)& B4 );
959 A33 = B3 ^((~B4)& B0 );
960 A44 = B4 ^((~B0)& B1 );
962 B2 = ROL64((A20^D0), 3);
963 B3 = ROL64((A31^D1), 45);
964 B4 = ROL64((A42^D2), 61);
965 B0 = ROL64((A03^D3), 28);
966 B1 = ROL64((A14^D4), 20);
967 A20 = B0 ^((~B1)& B2 );
968 A31 = B1 ^((~B2)& B3 );
969 A42 = B2 ^((~B3)& B4 );
970 A03 = B3 ^((~B4)& B0 );
971 A14 = B4 ^((~B0)& B1 );
973 B4 = ROL64((A40^D0), 18);
974 B0 = ROL64((A01^D1), 1);
975 B1 = ROL64((A12^D2), 6);
976 B2 = ROL64((A23^D3), 25);
977 B3 = ROL64((A34^D4), 8);
978 A40 = B0 ^((~B1)& B2 );
979 A01 = B1 ^((~B2)& B3 );
980 A12 = B2 ^((~B3)& B4 );
981 A23 = B3 ^((~B4)& B0 );
982 A34 = B4 ^((~B0)& B1 );
984 B1 = ROL64((A10^D0), 36);
985 B2 = ROL64((A21^D1), 10);
986 B3 = ROL64((A32^D2), 15);
987 B4 = ROL64((A43^D3), 56);
988 B0 = ROL64((A04^D4), 27);
989 A10 = B0 ^((~B1)& B2 );
990 A21 = B1 ^((~B2)& B3 );
991 A32 = B2 ^((~B3)& B4 );
992 A43 = B3 ^((~B4)& B0 );
993 A04 = B4 ^((~B0)& B1 );
995 B3 = ROL64((A30^D0), 41);
996 B4 = ROL64((A41^D1), 2);
997 B0 = ROL64((A02^D2), 62);
998 B1 = ROL64((A13^D3), 55);
999 B2 = ROL64((A24^D4), 39);
1000 A30 = B0 ^((~B1)& B2 );
1001 A41 = B1 ^((~B2)& B3 );
1002 A02 = B2 ^((~B3)& B4 );
1003 A13 = B3 ^((~B4)& B0 );
1004 A24 = B4 ^((~B0)& B1 );
1006 C0 = A00^A20^A40^A10^A30;
1007 C1 = A11^A31^A01^A21^A41;
1008 C2 = A22^A42^A12^A32^A02;
1009 C3 = A33^A03^A23^A43^A13;
1010 C4 = A44^A14^A34^A04^A24;
1011 D0 = C4^ROL64(C1, 1);
1012 D1 = C0^ROL64(C2, 1);
1013 D2 = C1^ROL64(C3, 1);
1014 D3 = C2^ROL64(C4, 1);
1015 D4 = C3^ROL64(C0, 1);
1017 B0 = (A00^D0);
1018 B1 = ROL64((A31^D1), 44);
1019 B2 = ROL64((A12^D2), 43);
1020 B3 = ROL64((A43^D3), 21);
1021 B4 = ROL64((A24^D4), 14);
1022 A00 = B0 ^((~B1)& B2 );
1023 A00 ^= RC[i+1];
1024 A31 = B1 ^((~B2)& B3 );
1025 A12 = B2 ^((~B3)& B4 );
1026 A43 = B3 ^((~B4)& B0 );
1027 A24 = B4 ^((~B0)& B1 );
1029 B2 = ROL64((A40^D0), 3);
1030 B3 = ROL64((A21^D1), 45);
1031 B4 = ROL64((A02^D2), 61);
1032 B0 = ROL64((A33^D3), 28);
1033 B1 = ROL64((A14^D4), 20);
1034 A40 = B0 ^((~B1)& B2 );
1035 A21 = B1 ^((~B2)& B3 );
1036 A02 = B2 ^((~B3)& B4 );
1037 A33 = B3 ^((~B4)& B0 );
1038 A14 = B4 ^((~B0)& B1 );
1040 B4 = ROL64((A30^D0), 18);
1041 B0 = ROL64((A11^D1), 1);
1042 B1 = ROL64((A42^D2), 6);
1043 B2 = ROL64((A23^D3), 25);
1044 B3 = ROL64((A04^D4), 8);
1045 A30 = B0 ^((~B1)& B2 );
1046 A11 = B1 ^((~B2)& B3 );
1047 A42 = B2 ^((~B3)& B4 );
1048 A23 = B3 ^((~B4)& B0 );
1049 A04 = B4 ^((~B0)& B1 );
1051 B1 = ROL64((A20^D0), 36);
1052 B2 = ROL64((A01^D1), 10);
1053 B3 = ROL64((A32^D2), 15);
1054 B4 = ROL64((A13^D3), 56);
1055 B0 = ROL64((A44^D4), 27);
1056 A20 = B0 ^((~B1)& B2 );
1057 A01 = B1 ^((~B2)& B3 );
1058 A32 = B2 ^((~B3)& B4 );
1059 A13 = B3 ^((~B4)& B0 );
1060 A44 = B4 ^((~B0)& B1 );
1062 B3 = ROL64((A10^D0), 41);
1063 B4 = ROL64((A41^D1), 2);
1064 B0 = ROL64((A22^D2), 62);
1065 B1 = ROL64((A03^D3), 55);
1066 B2 = ROL64((A34^D4), 39);
1067 A10 = B0 ^((~B1)& B2 );
1068 A41 = B1 ^((~B2)& B3 );
1069 A22 = B2 ^((~B3)& B4 );
1070 A03 = B3 ^((~B4)& B0 );
1071 A34 = B4 ^((~B0)& B1 );
1073 C0 = A00^A40^A30^A20^A10;
1074 C1 = A31^A21^A11^A01^A41;
1075 C2 = A12^A02^A42^A32^A22;
1076 C3 = A43^A33^A23^A13^A03;
1077 C4 = A24^A14^A04^A44^A34;
1078 D0 = C4^ROL64(C1, 1);
1079 D1 = C0^ROL64(C2, 1);
1080 D2 = C1^ROL64(C3, 1);
1081 D3 = C2^ROL64(C4, 1);
1082 D4 = C3^ROL64(C0, 1);
1084 B0 = (A00^D0);
1085 B1 = ROL64((A21^D1), 44);
1086 B2 = ROL64((A42^D2), 43);
1087 B3 = ROL64((A13^D3), 21);
1088 B4 = ROL64((A34^D4), 14);
1089 A00 = B0 ^((~B1)& B2 );
1090 A00 ^= RC[i+2];
1091 A21 = B1 ^((~B2)& B3 );
1092 A42 = B2 ^((~B3)& B4 );
1093 A13 = B3 ^((~B4)& B0 );
1094 A34 = B4 ^((~B0)& B1 );
1096 B2 = ROL64((A30^D0), 3);
1097 B3 = ROL64((A01^D1), 45);
1098 B4 = ROL64((A22^D2), 61);
1099 B0 = ROL64((A43^D3), 28);
1100 B1 = ROL64((A14^D4), 20);
1101 A30 = B0 ^((~B1)& B2 );
1102 A01 = B1 ^((~B2)& B3 );
1103 A22 = B2 ^((~B3)& B4 );
1104 A43 = B3 ^((~B4)& B0 );
1105 A14 = B4 ^((~B0)& B1 );
1107 B4 = ROL64((A10^D0), 18);
1108 B0 = ROL64((A31^D1), 1);
1109 B1 = ROL64((A02^D2), 6);
1110 B2 = ROL64((A23^D3), 25);
1111 B3 = ROL64((A44^D4), 8);
1112 A10 = B0 ^((~B1)& B2 );
1113 A31 = B1 ^((~B2)& B3 );
1114 A02 = B2 ^((~B3)& B4 );
1115 A23 = B3 ^((~B4)& B0 );
1116 A44 = B4 ^((~B0)& B1 );
1118 B1 = ROL64((A40^D0), 36);
1119 B2 = ROL64((A11^D1), 10);
1120 B3 = ROL64((A32^D2), 15);
1121 B4 = ROL64((A03^D3), 56);
1122 B0 = ROL64((A24^D4), 27);
1123 A40 = B0 ^((~B1)& B2 );
1124 A11 = B1 ^((~B2)& B3 );
1125 A32 = B2 ^((~B3)& B4 );
1126 A03 = B3 ^((~B4)& B0 );
1127 A24 = B4 ^((~B0)& B1 );
1129 B3 = ROL64((A20^D0), 41);
1130 B4 = ROL64((A41^D1), 2);
1131 B0 = ROL64((A12^D2), 62);
1132 B1 = ROL64((A33^D3), 55);
1133 B2 = ROL64((A04^D4), 39);
1134 A20 = B0 ^((~B1)& B2 );
1135 A41 = B1 ^((~B2)& B3 );
1136 A12 = B2 ^((~B3)& B4 );
1137 A33 = B3 ^((~B4)& B0 );
1138 A04 = B4 ^((~B0)& B1 );
1140 C0 = A00^A30^A10^A40^A20;
1141 C1 = A21^A01^A31^A11^A41;
1142 C2 = A42^A22^A02^A32^A12;
1143 C3 = A13^A43^A23^A03^A33;
1144 C4 = A34^A14^A44^A24^A04;
1145 D0 = C4^ROL64(C1, 1);
1146 D1 = C0^ROL64(C2, 1);
1147 D2 = C1^ROL64(C3, 1);
1148 D3 = C2^ROL64(C4, 1);
1149 D4 = C3^ROL64(C0, 1);
1151 B0 = (A00^D0);
1152 B1 = ROL64((A01^D1), 44);
1153 B2 = ROL64((A02^D2), 43);
1154 B3 = ROL64((A03^D3), 21);
1155 B4 = ROL64((A04^D4), 14);
1156 A00 = B0 ^((~B1)& B2 );
1157 A00 ^= RC[i+3];
1158 A01 = B1 ^((~B2)& B3 );
1159 A02 = B2 ^((~B3)& B4 );
1160 A03 = B3 ^((~B4)& B0 );
1161 A04 = B4 ^((~B0)& B1 );
1163 B2 = ROL64((A10^D0), 3);
1164 B3 = ROL64((A11^D1), 45);
1165 B4 = ROL64((A12^D2), 61);
1166 B0 = ROL64((A13^D3), 28);
1167 B1 = ROL64((A14^D4), 20);
1168 A10 = B0 ^((~B1)& B2 );
1169 A11 = B1 ^((~B2)& B3 );
1170 A12 = B2 ^((~B3)& B4 );
1171 A13 = B3 ^((~B4)& B0 );
1172 A14 = B4 ^((~B0)& B1 );
1174 B4 = ROL64((A20^D0), 18);
1175 B0 = ROL64((A21^D1), 1);
1176 B1 = ROL64((A22^D2), 6);
1177 B2 = ROL64((A23^D3), 25);
1178 B3 = ROL64((A24^D4), 8);
1179 A20 = B0 ^((~B1)& B2 );
1180 A21 = B1 ^((~B2)& B3 );
1181 A22 = B2 ^((~B3)& B4 );
1182 A23 = B3 ^((~B4)& B0 );
1183 A24 = B4 ^((~B0)& B1 );
1185 B1 = ROL64((A30^D0), 36);
1186 B2 = ROL64((A31^D1), 10);
1187 B3 = ROL64((A32^D2), 15);
1188 B4 = ROL64((A33^D3), 56);
1189 B0 = ROL64((A34^D4), 27);
1190 A30 = B0 ^((~B1)& B2 );
1191 A31 = B1 ^((~B2)& B3 );
1192 A32 = B2 ^((~B3)& B4 );
1193 A33 = B3 ^((~B4)& B0 );
1194 A34 = B4 ^((~B0)& B1 );
1196 B3 = ROL64((A40^D0), 41);
1197 B4 = ROL64((A41^D1), 2);
1198 B0 = ROL64((A42^D2), 62);
1199 B1 = ROL64((A43^D3), 55);
1200 B2 = ROL64((A44^D4), 39);
1201 A40 = B0 ^((~B1)& B2 );
1202 A41 = B1 ^((~B2)& B3 );
1203 A42 = B2 ^((~B3)& B4 );
1204 A43 = B3 ^((~B4)& B0 );
1205 A44 = B4 ^((~B0)& B1 );
1210 ** Initialize a new hash. iSize determines the size of the hash
1211 ** in bits and should be one of 224, 256, 384, or 512. Or iSize
1212 ** can be zero to use the default hash size of 256 bits.
1214 static void SHA3Init(SHA3Context *p, int iSize){
1215 memset(p, 0, sizeof(*p));
1216 if( iSize>=128 && iSize<=512 ){
1217 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1218 }else{
1219 p->nRate = (1600 - 2*256)/8;
1221 #if SHA3_BYTEORDER==1234
1222 /* Known to be little-endian at compile-time. No-op */
1223 #elif SHA3_BYTEORDER==4321
1224 p->ixMask = 7; /* Big-endian */
1225 #else
1227 static unsigned int one = 1;
1228 if( 1==*(unsigned char*)&one ){
1229 /* Little endian. No byte swapping. */
1230 p->ixMask = 0;
1231 }else{
1232 /* Big endian. Byte swap. */
1233 p->ixMask = 7;
1236 #endif
1240 ** Make consecutive calls to the SHA3Update function to add new content
1241 ** to the hash
1243 static void SHA3Update(
1244 SHA3Context *p,
1245 const unsigned char *aData,
1246 unsigned int nData
1248 unsigned int i = 0;
1249 #if SHA3_BYTEORDER==1234
1250 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1251 for(; i+7<nData; i+=8){
1252 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1253 p->nLoaded += 8;
1254 if( p->nLoaded>=p->nRate ){
1255 KeccakF1600Step(p);
1256 p->nLoaded = 0;
1260 #endif
1261 for(; i<nData; i++){
1262 #if SHA3_BYTEORDER==1234
1263 p->u.x[p->nLoaded] ^= aData[i];
1264 #elif SHA3_BYTEORDER==4321
1265 p->u.x[p->nLoaded^0x07] ^= aData[i];
1266 #else
1267 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1268 #endif
1269 p->nLoaded++;
1270 if( p->nLoaded==p->nRate ){
1271 KeccakF1600Step(p);
1272 p->nLoaded = 0;
1278 ** After all content has been added, invoke SHA3Final() to compute
1279 ** the final hash. The function returns a pointer to the binary
1280 ** hash value.
1282 static unsigned char *SHA3Final(SHA3Context *p){
1283 unsigned int i;
1284 if( p->nLoaded==p->nRate-1 ){
1285 const unsigned char c1 = 0x86;
1286 SHA3Update(p, &c1, 1);
1287 }else{
1288 const unsigned char c2 = 0x06;
1289 const unsigned char c3 = 0x80;
1290 SHA3Update(p, &c2, 1);
1291 p->nLoaded = p->nRate - 1;
1292 SHA3Update(p, &c3, 1);
1294 for(i=0; i<p->nRate; i++){
1295 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1297 return &p->u.x[p->nRate];
1299 /* End of the hashing logic
1300 *****************************************************************************/
1303 ** Implementation of the sha3(X,SIZE) function.
1305 ** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
1306 ** size is 256. If X is a BLOB, it is hashed as is.
1307 ** For all other non-NULL types of input, X is converted into a UTF-8 string
1308 ** and the string is hashed without the trailing 0x00 terminator. The hash
1309 ** of a NULL value is NULL.
1311 static void sha3Func(
1312 sqlite3_context *context,
1313 int argc,
1314 sqlite3_value **argv
1316 SHA3Context cx;
1317 int eType = sqlite3_value_type(argv[0]);
1318 int nByte = sqlite3_value_bytes(argv[0]);
1319 int iSize;
1320 if( argc==1 ){
1321 iSize = 256;
1322 }else{
1323 iSize = sqlite3_value_int(argv[1]);
1324 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1325 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1326 "384 512", -1);
1327 return;
1330 if( eType==SQLITE_NULL ) return;
1331 SHA3Init(&cx, iSize);
1332 if( eType==SQLITE_BLOB ){
1333 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1334 }else{
1335 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1337 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1340 /* Compute a string using sqlite3_vsnprintf() with a maximum length
1341 ** of 50 bytes and add it to the hash.
1343 static void hash_step_vformat(
1344 SHA3Context *p, /* Add content to this context */
1345 const char *zFormat,
1348 va_list ap;
1349 int n;
1350 char zBuf[50];
1351 va_start(ap, zFormat);
1352 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1353 va_end(ap);
1354 n = (int)strlen(zBuf);
1355 SHA3Update(p, (unsigned char*)zBuf, n);
1359 ** Implementation of the sha3_query(SQL,SIZE) function.
1361 ** This function compiles and runs the SQL statement(s) given in the
1362 ** argument. The results are hashed using a SIZE-bit SHA3. The default
1363 ** size is 256.
1365 ** The format of the byte stream that is hashed is summarized as follows:
1367 ** S<n>:<sql>
1368 ** R
1369 ** N
1370 ** I<int>
1371 ** F<ieee-float>
1372 ** B<size>:<bytes>
1373 ** T<size>:<text>
1375 ** <sql> is the original SQL text for each statement run and <n> is
1376 ** the size of that text. The SQL text is UTF-8. A single R character
1377 ** occurs before the start of each row. N means a NULL value.
1378 ** I mean an 8-byte little-endian integer <int>. F is a floating point
1379 ** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1380 ** B means blobs of <size> bytes. T means text rendered as <size>
1381 ** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
1382 ** text integers.
1384 ** For each SQL statement in the X input, there is one S segment. Each
1385 ** S segment is followed by zero or more R segments, one for each row in the
1386 ** result set. After each R, there are one or more N, I, F, B, or T segments,
1387 ** one for each column in the result set. Segments are concatentated directly
1388 ** with no delimiters of any kind.
1390 static void sha3QueryFunc(
1391 sqlite3_context *context,
1392 int argc,
1393 sqlite3_value **argv
1395 sqlite3 *db = sqlite3_context_db_handle(context);
1396 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1397 sqlite3_stmt *pStmt = 0;
1398 int nCol; /* Number of columns in the result set */
1399 int i; /* Loop counter */
1400 int rc;
1401 int n;
1402 const char *z;
1403 SHA3Context cx;
1404 int iSize;
1406 if( argc==1 ){
1407 iSize = 256;
1408 }else{
1409 iSize = sqlite3_value_int(argv[1]);
1410 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1411 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1412 "384 512", -1);
1413 return;
1416 if( zSql==0 ) return;
1417 SHA3Init(&cx, iSize);
1418 while( zSql[0] ){
1419 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1420 if( rc ){
1421 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1422 zSql, sqlite3_errmsg(db));
1423 sqlite3_finalize(pStmt);
1424 sqlite3_result_error(context, zMsg, -1);
1425 sqlite3_free(zMsg);
1426 return;
1428 if( !sqlite3_stmt_readonly(pStmt) ){
1429 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1430 sqlite3_finalize(pStmt);
1431 sqlite3_result_error(context, zMsg, -1);
1432 sqlite3_free(zMsg);
1433 return;
1435 nCol = sqlite3_column_count(pStmt);
1436 z = sqlite3_sql(pStmt);
1437 n = (int)strlen(z);
1438 hash_step_vformat(&cx,"S%d:",n);
1439 SHA3Update(&cx,(unsigned char*)z,n);
1441 /* Compute a hash over the result of the query */
1442 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1443 SHA3Update(&cx,(const unsigned char*)"R",1);
1444 for(i=0; i<nCol; i++){
1445 switch( sqlite3_column_type(pStmt,i) ){
1446 case SQLITE_NULL: {
1447 SHA3Update(&cx, (const unsigned char*)"N",1);
1448 break;
1450 case SQLITE_INTEGER: {
1451 sqlite3_uint64 u;
1452 int j;
1453 unsigned char x[9];
1454 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1455 memcpy(&u, &v, 8);
1456 for(j=8; j>=1; j--){
1457 x[j] = u & 0xff;
1458 u >>= 8;
1460 x[0] = 'I';
1461 SHA3Update(&cx, x, 9);
1462 break;
1464 case SQLITE_FLOAT: {
1465 sqlite3_uint64 u;
1466 int j;
1467 unsigned char x[9];
1468 double r = sqlite3_column_double(pStmt,i);
1469 memcpy(&u, &r, 8);
1470 for(j=8; j>=1; j--){
1471 x[j] = u & 0xff;
1472 u >>= 8;
1474 x[0] = 'F';
1475 SHA3Update(&cx,x,9);
1476 break;
1478 case SQLITE_TEXT: {
1479 int n2 = sqlite3_column_bytes(pStmt, i);
1480 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1481 hash_step_vformat(&cx,"T%d:",n2);
1482 SHA3Update(&cx, z2, n2);
1483 break;
1485 case SQLITE_BLOB: {
1486 int n2 = sqlite3_column_bytes(pStmt, i);
1487 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1488 hash_step_vformat(&cx,"B%d:",n2);
1489 SHA3Update(&cx, z2, n2);
1490 break;
1495 sqlite3_finalize(pStmt);
1497 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1501 #ifdef _WIN32
1503 #endif
1504 int sqlite3_shathree_init(
1505 sqlite3 *db,
1506 char **pzErrMsg,
1507 const sqlite3_api_routines *pApi
1509 int rc = SQLITE_OK;
1510 SQLITE_EXTENSION_INIT2(pApi);
1511 (void)pzErrMsg; /* Unused parameter */
1512 rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0,
1513 sha3Func, 0, 0);
1514 if( rc==SQLITE_OK ){
1515 rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0,
1516 sha3Func, 0, 0);
1518 if( rc==SQLITE_OK ){
1519 rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0,
1520 sha3QueryFunc, 0, 0);
1522 if( rc==SQLITE_OK ){
1523 rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0,
1524 sha3QueryFunc, 0, 0);
1526 return rc;
1529 /************************* End ../ext/misc/shathree.c ********************/
1530 /************************* Begin ../ext/misc/fileio.c ******************/
1532 ** 2014-06-13
1534 ** The author disclaims copyright to this source code. In place of
1535 ** a legal notice, here is a blessing:
1537 ** May you do good and not evil.
1538 ** May you find forgiveness for yourself and forgive others.
1539 ** May you share freely, never taking more than you give.
1541 ******************************************************************************
1543 ** This SQLite extension implements SQL functions readfile() and
1544 ** writefile().
1546 SQLITE_EXTENSION_INIT1
1547 #include <stdio.h>
1550 ** Implementation of the "readfile(X)" SQL function. The entire content
1551 ** of the file named X is read and returned as a BLOB. NULL is returned
1552 ** if the file does not exist or is unreadable.
1554 static void readfileFunc(
1555 sqlite3_context *context,
1556 int argc,
1557 sqlite3_value **argv
1559 const char *zName;
1560 FILE *in;
1561 long nIn;
1562 void *pBuf;
1564 (void)(argc); /* Unused parameter */
1565 zName = (const char*)sqlite3_value_text(argv[0]);
1566 if( zName==0 ) return;
1567 in = fopen(zName, "rb");
1568 if( in==0 ) return;
1569 fseek(in, 0, SEEK_END);
1570 nIn = ftell(in);
1571 rewind(in);
1572 pBuf = sqlite3_malloc( nIn );
1573 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1574 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1575 }else{
1576 sqlite3_free(pBuf);
1578 fclose(in);
1582 ** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1583 ** is written into file X. The number of bytes written is returned. Or
1584 ** NULL is returned if something goes wrong, such as being unable to open
1585 ** file X for writing.
1587 static void writefileFunc(
1588 sqlite3_context *context,
1589 int argc,
1590 sqlite3_value **argv
1592 FILE *out;
1593 const char *z;
1594 sqlite3_int64 rc;
1595 const char *zFile;
1597 (void)(argc); /* Unused parameter */
1598 zFile = (const char*)sqlite3_value_text(argv[0]);
1599 if( zFile==0 ) return;
1600 out = fopen(zFile, "wb");
1601 if( out==0 ) return;
1602 z = (const char*)sqlite3_value_blob(argv[1]);
1603 if( z==0 ){
1604 rc = 0;
1605 }else{
1606 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
1608 fclose(out);
1609 sqlite3_result_int64(context, rc);
1613 #ifdef _WIN32
1615 #endif
1616 int sqlite3_fileio_init(
1617 sqlite3 *db,
1618 char **pzErrMsg,
1619 const sqlite3_api_routines *pApi
1621 int rc = SQLITE_OK;
1622 SQLITE_EXTENSION_INIT2(pApi);
1623 (void)pzErrMsg; /* Unused parameter */
1624 rc = sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0,
1625 readfileFunc, 0, 0);
1626 if( rc==SQLITE_OK ){
1627 rc = sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0,
1628 writefileFunc, 0, 0);
1630 return rc;
1633 /************************* End ../ext/misc/fileio.c ********************/
1634 /************************* Begin ../ext/misc/completion.c ******************/
1636 ** 2017-07-10
1638 ** The author disclaims copyright to this source code. In place of
1639 ** a legal notice, here is a blessing:
1641 ** May you do good and not evil.
1642 ** May you find forgiveness for yourself and forgive others.
1643 ** May you share freely, never taking more than you give.
1645 *************************************************************************
1647 ** This file implements an eponymous virtual table that returns suggested
1648 ** completions for a partial SQL input.
1650 ** Suggested usage:
1652 ** SELECT DISTINCT candidate COLLATE nocase
1653 ** FROM completion($prefix,$wholeline)
1654 ** ORDER BY 1;
1656 ** The two query parameters are optional. $prefix is the text of the
1657 ** current word being typed and that is to be completed. $wholeline is
1658 ** the complete input line, used for context.
1660 ** The raw completion() table might return the same candidate multiple
1661 ** times, for example if the same column name is used to two or more
1662 ** tables. And the candidates are returned in an arbitrary order. Hence,
1663 ** the DISTINCT and ORDER BY are recommended.
1665 ** This virtual table operates at the speed of human typing, and so there
1666 ** is no attempt to make it fast. Even a slow implementation will be much
1667 ** faster than any human can type.
1670 SQLITE_EXTENSION_INIT1
1671 #include <assert.h>
1672 #include <string.h>
1673 #include <ctype.h>
1675 #ifndef SQLITE_OMIT_VIRTUALTABLE
1677 /* completion_vtab is a subclass of sqlite3_vtab which will
1678 ** serve as the underlying representation of a completion virtual table
1680 typedef struct completion_vtab completion_vtab;
1681 struct completion_vtab {
1682 sqlite3_vtab base; /* Base class - must be first */
1683 sqlite3 *db; /* Database connection for this completion vtab */
1686 /* completion_cursor is a subclass of sqlite3_vtab_cursor which will
1687 ** serve as the underlying representation of a cursor that scans
1688 ** over rows of the result
1690 typedef struct completion_cursor completion_cursor;
1691 struct completion_cursor {
1692 sqlite3_vtab_cursor base; /* Base class - must be first */
1693 sqlite3 *db; /* Database connection for this cursor */
1694 int nPrefix, nLine; /* Number of bytes in zPrefix and zLine */
1695 char *zPrefix; /* The prefix for the word we want to complete */
1696 char *zLine; /* The whole that we want to complete */
1697 const char *zCurrentRow; /* Current output row */
1698 sqlite3_stmt *pStmt; /* Current statement */
1699 sqlite3_int64 iRowid; /* The rowid */
1700 int ePhase; /* Current phase */
1701 int j; /* inter-phase counter */
1704 /* Values for ePhase:
1706 #define COMPLETION_FIRST_PHASE 1
1707 #define COMPLETION_KEYWORDS 1
1708 #define COMPLETION_PRAGMAS 2
1709 #define COMPLETION_FUNCTIONS 3
1710 #define COMPLETION_COLLATIONS 4
1711 #define COMPLETION_INDEXES 5
1712 #define COMPLETION_TRIGGERS 6
1713 #define COMPLETION_DATABASES 7
1714 #define COMPLETION_TABLES 8
1715 #define COMPLETION_COLUMNS 9
1716 #define COMPLETION_MODULES 10
1717 #define COMPLETION_EOF 11
1720 ** The completionConnect() method is invoked to create a new
1721 ** completion_vtab that describes the completion virtual table.
1723 ** Think of this routine as the constructor for completion_vtab objects.
1725 ** All this routine needs to do is:
1727 ** (1) Allocate the completion_vtab object and initialize all fields.
1729 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
1730 ** result set of queries against completion will look like.
1732 static int completionConnect(
1733 sqlite3 *db,
1734 void *pAux,
1735 int argc, const char *const*argv,
1736 sqlite3_vtab **ppVtab,
1737 char **pzErr
1739 completion_vtab *pNew;
1740 int rc;
1742 (void)(pAux); /* Unused parameter */
1743 (void)(argc); /* Unused parameter */
1744 (void)(argv); /* Unused parameter */
1745 (void)(pzErr); /* Unused parameter */
1747 /* Column numbers */
1748 #define COMPLETION_COLUMN_CANDIDATE 0 /* Suggested completion of the input */
1749 #define COMPLETION_COLUMN_PREFIX 1 /* Prefix of the word to be completed */
1750 #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
1751 #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
1753 rc = sqlite3_declare_vtab(db,
1754 "CREATE TABLE x("
1755 " candidate TEXT,"
1756 " prefix TEXT HIDDEN,"
1757 " wholeline TEXT HIDDEN,"
1758 " phase INT HIDDEN" /* Used for debugging only */
1759 ")");
1760 if( rc==SQLITE_OK ){
1761 pNew = sqlite3_malloc( sizeof(*pNew) );
1762 *ppVtab = (sqlite3_vtab*)pNew;
1763 if( pNew==0 ) return SQLITE_NOMEM;
1764 memset(pNew, 0, sizeof(*pNew));
1765 pNew->db = db;
1767 return rc;
1771 ** This method is the destructor for completion_cursor objects.
1773 static int completionDisconnect(sqlite3_vtab *pVtab){
1774 sqlite3_free(pVtab);
1775 return SQLITE_OK;
1779 ** Constructor for a new completion_cursor object.
1781 static int completionOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
1782 completion_cursor *pCur;
1783 pCur = sqlite3_malloc( sizeof(*pCur) );
1784 if( pCur==0 ) return SQLITE_NOMEM;
1785 memset(pCur, 0, sizeof(*pCur));
1786 pCur->db = ((completion_vtab*)p)->db;
1787 *ppCursor = &pCur->base;
1788 return SQLITE_OK;
1792 ** Reset the completion_cursor.
1794 static void completionCursorReset(completion_cursor *pCur){
1795 sqlite3_free(pCur->zPrefix); pCur->zPrefix = 0; pCur->nPrefix = 0;
1796 sqlite3_free(pCur->zLine); pCur->zLine = 0; pCur->nLine = 0;
1797 sqlite3_finalize(pCur->pStmt); pCur->pStmt = 0;
1798 pCur->j = 0;
1802 ** Destructor for a completion_cursor.
1804 static int completionClose(sqlite3_vtab_cursor *cur){
1805 completionCursorReset((completion_cursor*)cur);
1806 sqlite3_free(cur);
1807 return SQLITE_OK;
1811 ** All SQL keywords understood by SQLite
1813 static const char *completionKwrds[] = {
1814 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
1815 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
1816 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
1817 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
1818 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
1819 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
1820 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
1821 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
1822 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
1823 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
1824 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
1825 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
1826 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
1827 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
1828 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
1829 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
1830 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
1831 "WITH", "WITHOUT",
1833 #define completionKwCount \
1834 (int)(sizeof(completionKwrds)/sizeof(completionKwrds[0]))
1837 ** Advance a completion_cursor to its next row of output.
1839 ** The ->ePhase, ->j, and ->pStmt fields of the completion_cursor object
1840 ** record the current state of the scan. This routine sets ->zCurrentRow
1841 ** to the current row of output and then returns. If no more rows remain,
1842 ** then ->ePhase is set to COMPLETION_EOF which will signal the virtual
1843 ** table that has reached the end of its scan.
1845 ** The current implementation just lists potential identifiers and
1846 ** keywords and filters them by zPrefix. Future enhancements should
1847 ** take zLine into account to try to restrict the set of identifiers and
1848 ** keywords based on what would be legal at the current point of input.
1850 static int completionNext(sqlite3_vtab_cursor *cur){
1851 completion_cursor *pCur = (completion_cursor*)cur;
1852 int eNextPhase = 0; /* Next phase to try if current phase reaches end */
1853 int iCol = -1; /* If >=0, step pCur->pStmt and use the i-th column */
1854 pCur->iRowid++;
1855 while( pCur->ePhase!=COMPLETION_EOF ){
1856 switch( pCur->ePhase ){
1857 case COMPLETION_KEYWORDS: {
1858 if( pCur->j >= completionKwCount ){
1859 pCur->zCurrentRow = 0;
1860 pCur->ePhase = COMPLETION_DATABASES;
1861 }else{
1862 pCur->zCurrentRow = completionKwrds[pCur->j++];
1864 iCol = -1;
1865 break;
1867 case COMPLETION_DATABASES: {
1868 if( pCur->pStmt==0 ){
1869 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1,
1870 &pCur->pStmt, 0);
1872 iCol = 1;
1873 eNextPhase = COMPLETION_TABLES;
1874 break;
1876 case COMPLETION_TABLES: {
1877 if( pCur->pStmt==0 ){
1878 sqlite3_stmt *pS2;
1879 char *zSql = 0;
1880 const char *zSep = "";
1881 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
1882 while( sqlite3_step(pS2)==SQLITE_ROW ){
1883 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
1884 zSql = sqlite3_mprintf(
1885 "%z%s"
1886 "SELECT name FROM \"%w\".sqlite_master"
1887 " WHERE type='table'",
1888 zSql, zSep, zDb
1890 if( zSql==0 ) return SQLITE_NOMEM;
1891 zSep = " UNION ";
1893 sqlite3_finalize(pS2);
1894 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
1895 sqlite3_free(zSql);
1897 iCol = 0;
1898 eNextPhase = COMPLETION_COLUMNS;
1899 break;
1901 case COMPLETION_COLUMNS: {
1902 if( pCur->pStmt==0 ){
1903 sqlite3_stmt *pS2;
1904 char *zSql = 0;
1905 const char *zSep = "";
1906 sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pS2, 0);
1907 while( sqlite3_step(pS2)==SQLITE_ROW ){
1908 const char *zDb = (const char*)sqlite3_column_text(pS2, 1);
1909 zSql = sqlite3_mprintf(
1910 "%z%s"
1911 "SELECT pti.name FROM \"%w\".sqlite_master AS sm"
1912 " JOIN pragma_table_info(sm.name,%Q) AS pti"
1913 " WHERE sm.type='table'",
1914 zSql, zSep, zDb, zDb
1916 if( zSql==0 ) return SQLITE_NOMEM;
1917 zSep = " UNION ";
1919 sqlite3_finalize(pS2);
1920 sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pStmt, 0);
1921 sqlite3_free(zSql);
1923 iCol = 0;
1924 eNextPhase = COMPLETION_EOF;
1925 break;
1928 if( iCol<0 ){
1929 /* This case is when the phase presets zCurrentRow */
1930 if( pCur->zCurrentRow==0 ) continue;
1931 }else{
1932 if( sqlite3_step(pCur->pStmt)==SQLITE_ROW ){
1933 /* Extract the next row of content */
1934 pCur->zCurrentRow = (const char*)sqlite3_column_text(pCur->pStmt, iCol);
1935 }else{
1936 /* When all rows are finished, advance to the next phase */
1937 sqlite3_finalize(pCur->pStmt);
1938 pCur->pStmt = 0;
1939 pCur->ePhase = eNextPhase;
1940 continue;
1943 if( pCur->nPrefix==0 ) break;
1944 if( sqlite3_strnicmp(pCur->zPrefix, pCur->zCurrentRow, pCur->nPrefix)==0 ){
1945 break;
1949 return SQLITE_OK;
1953 ** Return values of columns for the row at which the completion_cursor
1954 ** is currently pointing.
1956 static int completionColumn(
1957 sqlite3_vtab_cursor *cur, /* The cursor */
1958 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
1959 int i /* Which column to return */
1961 completion_cursor *pCur = (completion_cursor*)cur;
1962 switch( i ){
1963 case COMPLETION_COLUMN_CANDIDATE: {
1964 sqlite3_result_text(ctx, pCur->zCurrentRow, -1, SQLITE_TRANSIENT);
1965 break;
1967 case COMPLETION_COLUMN_PREFIX: {
1968 sqlite3_result_text(ctx, pCur->zPrefix, -1, SQLITE_TRANSIENT);
1969 break;
1971 case COMPLETION_COLUMN_WHOLELINE: {
1972 sqlite3_result_text(ctx, pCur->zLine, -1, SQLITE_TRANSIENT);
1973 break;
1975 case COMPLETION_COLUMN_PHASE: {
1976 sqlite3_result_int(ctx, pCur->ePhase);
1977 break;
1980 return SQLITE_OK;
1984 ** Return the rowid for the current row. In this implementation, the
1985 ** rowid is the same as the output value.
1987 static int completionRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
1988 completion_cursor *pCur = (completion_cursor*)cur;
1989 *pRowid = pCur->iRowid;
1990 return SQLITE_OK;
1994 ** Return TRUE if the cursor has been moved off of the last
1995 ** row of output.
1997 static int completionEof(sqlite3_vtab_cursor *cur){
1998 completion_cursor *pCur = (completion_cursor*)cur;
1999 return pCur->ePhase >= COMPLETION_EOF;
2003 ** This method is called to "rewind" the completion_cursor object back
2004 ** to the first row of output. This method is always called at least
2005 ** once prior to any call to completionColumn() or completionRowid() or
2006 ** completionEof().
2008 static int completionFilter(
2009 sqlite3_vtab_cursor *pVtabCursor,
2010 int idxNum, const char *idxStr,
2011 int argc, sqlite3_value **argv
2013 completion_cursor *pCur = (completion_cursor *)pVtabCursor;
2014 int iArg = 0;
2015 (void)(idxStr); /* Unused parameter */
2016 (void)(argc); /* Unused parameter */
2017 completionCursorReset(pCur);
2018 if( idxNum & 1 ){
2019 pCur->nPrefix = sqlite3_value_bytes(argv[iArg]);
2020 if( pCur->nPrefix>0 ){
2021 pCur->zPrefix = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
2022 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
2024 iArg++;
2026 if( idxNum & 2 ){
2027 pCur->nLine = sqlite3_value_bytes(argv[iArg]);
2028 if( pCur->nLine>0 ){
2029 pCur->zLine = sqlite3_mprintf("%s", sqlite3_value_text(argv[iArg]));
2030 if( pCur->zLine==0 ) return SQLITE_NOMEM;
2032 iArg++;
2034 if( pCur->zLine!=0 && pCur->zPrefix==0 ){
2035 int i = pCur->nLine;
2036 while( i>0 && (isalnum(pCur->zLine[i-1]) || pCur->zLine[i-1]=='_') ){
2037 i--;
2039 pCur->nPrefix = pCur->nLine - i;
2040 if( pCur->nPrefix>0 ){
2041 pCur->zPrefix = sqlite3_mprintf("%.*s", pCur->nPrefix, pCur->zLine + i);
2042 if( pCur->zPrefix==0 ) return SQLITE_NOMEM;
2045 pCur->iRowid = 0;
2046 pCur->ePhase = COMPLETION_FIRST_PHASE;
2047 return completionNext(pVtabCursor);
2051 ** SQLite will invoke this method one or more times while planning a query
2052 ** that uses the completion virtual table. This routine needs to create
2053 ** a query plan for each invocation and compute an estimated cost for that
2054 ** plan.
2056 ** There are two hidden parameters that act as arguments to the table-valued
2057 ** function: "prefix" and "wholeline". Bit 0 of idxNum is set if "prefix"
2058 ** is available and bit 1 is set if "wholeline" is available.
2060 static int completionBestIndex(
2061 sqlite3_vtab *tab,
2062 sqlite3_index_info *pIdxInfo
2064 int i; /* Loop over constraints */
2065 int idxNum = 0; /* The query plan bitmask */
2066 int prefixIdx = -1; /* Index of the start= constraint, or -1 if none */
2067 int wholelineIdx = -1; /* Index of the stop= constraint, or -1 if none */
2068 int nArg = 0; /* Number of arguments that completeFilter() expects */
2069 const struct sqlite3_index_constraint *pConstraint;
2071 (void)(tab); /* Unused parameter */
2072 pConstraint = pIdxInfo->aConstraint;
2073 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2074 if( pConstraint->usable==0 ) continue;
2075 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
2076 switch( pConstraint->iColumn ){
2077 case COMPLETION_COLUMN_PREFIX:
2078 prefixIdx = i;
2079 idxNum |= 1;
2080 break;
2081 case COMPLETION_COLUMN_WHOLELINE:
2082 wholelineIdx = i;
2083 idxNum |= 2;
2084 break;
2087 if( prefixIdx>=0 ){
2088 pIdxInfo->aConstraintUsage[prefixIdx].argvIndex = ++nArg;
2089 pIdxInfo->aConstraintUsage[prefixIdx].omit = 1;
2091 if( wholelineIdx>=0 ){
2092 pIdxInfo->aConstraintUsage[wholelineIdx].argvIndex = ++nArg;
2093 pIdxInfo->aConstraintUsage[wholelineIdx].omit = 1;
2095 pIdxInfo->idxNum = idxNum;
2096 pIdxInfo->estimatedCost = (double)5000 - 1000*nArg;
2097 pIdxInfo->estimatedRows = 500 - 100*nArg;
2098 return SQLITE_OK;
2102 ** This following structure defines all the methods for the
2103 ** completion virtual table.
2105 static sqlite3_module completionModule = {
2106 0, /* iVersion */
2107 0, /* xCreate */
2108 completionConnect, /* xConnect */
2109 completionBestIndex, /* xBestIndex */
2110 completionDisconnect, /* xDisconnect */
2111 0, /* xDestroy */
2112 completionOpen, /* xOpen - open a cursor */
2113 completionClose, /* xClose - close a cursor */
2114 completionFilter, /* xFilter - configure scan constraints */
2115 completionNext, /* xNext - advance a cursor */
2116 completionEof, /* xEof - check for end of scan */
2117 completionColumn, /* xColumn - read data */
2118 completionRowid, /* xRowid - read data */
2119 0, /* xUpdate */
2120 0, /* xBegin */
2121 0, /* xSync */
2122 0, /* xCommit */
2123 0, /* xRollback */
2124 0, /* xFindMethod */
2125 0, /* xRename */
2126 0, /* xSavepoint */
2127 0, /* xRelease */
2128 0 /* xRollbackTo */
2131 #endif /* SQLITE_OMIT_VIRTUALTABLE */
2133 int sqlite3CompletionVtabInit(sqlite3 *db){
2134 int rc = SQLITE_OK;
2135 #ifndef SQLITE_OMIT_VIRTUALTABLE
2136 rc = sqlite3_create_module(db, "completion", &completionModule, 0);
2137 #endif
2138 return rc;
2141 #ifdef _WIN32
2143 #endif
2144 int sqlite3_completion_init(
2145 sqlite3 *db,
2146 char **pzErrMsg,
2147 const sqlite3_api_routines *pApi
2149 int rc = SQLITE_OK;
2150 SQLITE_EXTENSION_INIT2(pApi);
2151 (void)(pzErrMsg); /* Unused parameter */
2152 #ifndef SQLITE_OMIT_VIRTUALTABLE
2153 rc = sqlite3CompletionVtabInit(db);
2154 #endif
2155 return rc;
2158 /************************* End ../ext/misc/completion.c ********************/
2160 #if defined(SQLITE_ENABLE_SESSION)
2162 ** State information for a single open session
2164 typedef struct OpenSession OpenSession;
2165 struct OpenSession {
2166 char *zName; /* Symbolic name for this session */
2167 int nFilter; /* Number of xFilter rejection GLOB patterns */
2168 char **azFilter; /* Array of xFilter rejection GLOB patterns */
2169 sqlite3_session *p; /* The open session */
2171 #endif
2174 ** Shell output mode information from before ".explain on",
2175 ** saved so that it can be restored by ".explain off"
2177 typedef struct SavedModeInfo SavedModeInfo;
2178 struct SavedModeInfo {
2179 int valid; /* Is there legit data in here? */
2180 int mode; /* Mode prior to ".explain on" */
2181 int showHeader; /* The ".header" setting prior to ".explain on" */
2182 int colWidth[100]; /* Column widths prior to ".explain on" */
2186 ** State information about the database connection is contained in an
2187 ** instance of the following structure.
2189 typedef struct ShellState ShellState;
2190 struct ShellState {
2191 sqlite3 *db; /* The database */
2192 int autoExplain; /* Automatically turn on .explain mode */
2193 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
2194 int statsOn; /* True to display memory stats before each finalize */
2195 int scanstatsOn; /* True to display scan stats before each finalize */
2196 int outCount; /* Revert to stdout when reaching zero */
2197 int cnt; /* Number of records displayed so far */
2198 FILE *out; /* Write results here */
2199 FILE *traceOut; /* Output for sqlite3_trace() */
2200 int nErr; /* Number of errors seen */
2201 int mode; /* An output mode setting */
2202 int cMode; /* temporary output mode for the current query */
2203 int normalMode; /* Output mode before ".explain on" */
2204 int writableSchema; /* True if PRAGMA writable_schema=ON */
2205 int showHeader; /* True to show column names in List or Column mode */
2206 int nCheck; /* Number of ".check" commands run */
2207 unsigned shellFlgs; /* Various flags */
2208 char *zDestTable; /* Name of destination table when MODE_Insert */
2209 char zTestcase[30]; /* Name of current test case */
2210 char colSeparator[20]; /* Column separator character for several modes */
2211 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
2212 int colWidth[100]; /* Requested width of each column when in column mode*/
2213 int actualWidth[100]; /* Actual width of each column */
2214 char nullValue[20]; /* The text to print when a NULL comes back from
2215 ** the database */
2216 char outfile[FILENAME_MAX]; /* Filename for *out */
2217 const char *zDbFilename; /* name of the database file */
2218 char *zFreeOnClose; /* Filename to free when closing */
2219 const char *zVfs; /* Name of VFS to use */
2220 sqlite3_stmt *pStmt; /* Current statement if any. */
2221 FILE *pLog; /* Write log output here */
2222 int *aiIndent; /* Array of indents used in MODE_Explain */
2223 int nIndent; /* Size of array aiIndent[] */
2224 int iIndent; /* Index of current op in aiIndent[] */
2225 #if defined(SQLITE_ENABLE_SESSION)
2226 int nSession; /* Number of active sessions */
2227 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
2228 #endif
2232 ** These are the allowed shellFlgs values
2234 #define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
2235 #define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
2236 #define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
2237 #define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
2238 #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
2239 #define SHFLG_CountChanges 0x00000020 /* .changes setting */
2240 #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
2243 ** Macros for testing and setting shellFlgs
2245 #define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
2246 #define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
2247 #define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
2250 ** These are the allowed modes.
2252 #define MODE_Line 0 /* One column per line. Blank line between records */
2253 #define MODE_Column 1 /* One record per line in neat columns */
2254 #define MODE_List 2 /* One record per line with a separator */
2255 #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
2256 #define MODE_Html 4 /* Generate an XHTML table */
2257 #define MODE_Insert 5 /* Generate SQL "insert" statements */
2258 #define MODE_Quote 6 /* Quote values as for SQL */
2259 #define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
2260 #define MODE_Csv 8 /* Quote strings, numbers are plain */
2261 #define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
2262 #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
2263 #define MODE_Pretty 11 /* Pretty-print schemas */
2265 static const char *modeDescr[] = {
2266 "line",
2267 "column",
2268 "list",
2269 "semi",
2270 "html",
2271 "insert",
2272 "quote",
2273 "tcl",
2274 "csv",
2275 "explain",
2276 "ascii",
2277 "prettyprint",
2281 ** These are the column/row/line separators used by the various
2282 ** import/export modes.
2284 #define SEP_Column "|"
2285 #define SEP_Row "\n"
2286 #define SEP_Tab "\t"
2287 #define SEP_Space " "
2288 #define SEP_Comma ","
2289 #define SEP_CrLf "\r\n"
2290 #define SEP_Unit "\x1F"
2291 #define SEP_Record "\x1E"
2294 ** Number of elements in an array
2296 #define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
2299 ** A callback for the sqlite3_log() interface.
2301 static void shellLog(void *pArg, int iErrCode, const char *zMsg){
2302 ShellState *p = (ShellState*)pArg;
2303 if( p->pLog==0 ) return;
2304 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
2305 fflush(p->pLog);
2309 ** Output the given string as a hex-encoded blob (eg. X'1234' )
2311 static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
2312 int i;
2313 char *zBlob = (char *)pBlob;
2314 raw_printf(out,"X'");
2315 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
2316 raw_printf(out,"'");
2320 ** Find a string that is not found anywhere in z[]. Return a pointer
2321 ** to that string.
2323 ** Try to use zA and zB first. If both of those are already found in z[]
2324 ** then make up some string and store it in the buffer zBuf.
2326 static const char *unused_string(
2327 const char *z, /* Result must not appear anywhere in z */
2328 const char *zA, const char *zB, /* Try these first */
2329 char *zBuf /* Space to store a generated string */
2331 unsigned i = 0;
2332 if( strstr(z, zA)==0 ) return zA;
2333 if( strstr(z, zB)==0 ) return zB;
2335 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
2336 }while( strstr(z,zBuf)!=0 );
2337 return zBuf;
2341 ** Output the given string as a quoted string using SQL quoting conventions.
2343 ** See also: output_quoted_escaped_string()
2345 static void output_quoted_string(FILE *out, const char *z){
2346 int i;
2347 char c;
2348 setBinaryMode(out, 1);
2349 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
2350 if( c==0 ){
2351 utf8_printf(out,"'%s'",z);
2352 }else{
2353 raw_printf(out, "'");
2354 while( *z ){
2355 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
2356 if( c=='\'' ) i++;
2357 if( i ){
2358 utf8_printf(out, "%.*s", i, z);
2359 z += i;
2361 if( c=='\'' ){
2362 raw_printf(out, "'");
2363 continue;
2365 if( c==0 ){
2366 break;
2368 z++;
2370 raw_printf(out, "'");
2372 setTextMode(out, 1);
2376 ** Output the given string as a quoted string using SQL quoting conventions.
2377 ** Additionallly , escape the "\n" and "\r" characters so that they do not
2378 ** get corrupted by end-of-line translation facilities in some operating
2379 ** systems.
2381 ** This is like output_quoted_string() but with the addition of the \r\n
2382 ** escape mechanism.
2384 static void output_quoted_escaped_string(FILE *out, const char *z){
2385 int i;
2386 char c;
2387 setBinaryMode(out, 1);
2388 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
2389 if( c==0 ){
2390 utf8_printf(out,"'%s'",z);
2391 }else{
2392 const char *zNL = 0;
2393 const char *zCR = 0;
2394 int nNL = 0;
2395 int nCR = 0;
2396 char zBuf1[20], zBuf2[20];
2397 for(i=0; z[i]; i++){
2398 if( z[i]=='\n' ) nNL++;
2399 if( z[i]=='\r' ) nCR++;
2401 if( nNL ){
2402 raw_printf(out, "replace(");
2403 zNL = unused_string(z, "\\n", "\\012", zBuf1);
2405 if( nCR ){
2406 raw_printf(out, "replace(");
2407 zCR = unused_string(z, "\\r", "\\015", zBuf2);
2409 raw_printf(out, "'");
2410 while( *z ){
2411 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
2412 if( c=='\'' ) i++;
2413 if( i ){
2414 utf8_printf(out, "%.*s", i, z);
2415 z += i;
2417 if( c=='\'' ){
2418 raw_printf(out, "'");
2419 continue;
2421 if( c==0 ){
2422 break;
2424 z++;
2425 if( c=='\n' ){
2426 raw_printf(out, "%s", zNL);
2427 continue;
2429 raw_printf(out, "%s", zCR);
2431 raw_printf(out, "'");
2432 if( nCR ){
2433 raw_printf(out, ",'%s',char(13))", zCR);
2435 if( nNL ){
2436 raw_printf(out, ",'%s',char(10))", zNL);
2439 setTextMode(out, 1);
2443 ** Output the given string as a quoted according to C or TCL quoting rules.
2445 static void output_c_string(FILE *out, const char *z){
2446 unsigned int c;
2447 fputc('"', out);
2448 while( (c = *(z++))!=0 ){
2449 if( c=='\\' ){
2450 fputc(c, out);
2451 fputc(c, out);
2452 }else if( c=='"' ){
2453 fputc('\\', out);
2454 fputc('"', out);
2455 }else if( c=='\t' ){
2456 fputc('\\', out);
2457 fputc('t', out);
2458 }else if( c=='\n' ){
2459 fputc('\\', out);
2460 fputc('n', out);
2461 }else if( c=='\r' ){
2462 fputc('\\', out);
2463 fputc('r', out);
2464 }else if( !isprint(c&0xff) ){
2465 raw_printf(out, "\\%03o", c&0xff);
2466 }else{
2467 fputc(c, out);
2470 fputc('"', out);
2474 ** Output the given string with characters that are special to
2475 ** HTML escaped.
2477 static void output_html_string(FILE *out, const char *z){
2478 int i;
2479 if( z==0 ) z = "";
2480 while( *z ){
2481 for(i=0; z[i]
2482 && z[i]!='<'
2483 && z[i]!='&'
2484 && z[i]!='>'
2485 && z[i]!='\"'
2486 && z[i]!='\'';
2487 i++){}
2488 if( i>0 ){
2489 utf8_printf(out,"%.*s",i,z);
2491 if( z[i]=='<' ){
2492 raw_printf(out,"&lt;");
2493 }else if( z[i]=='&' ){
2494 raw_printf(out,"&amp;");
2495 }else if( z[i]=='>' ){
2496 raw_printf(out,"&gt;");
2497 }else if( z[i]=='\"' ){
2498 raw_printf(out,"&quot;");
2499 }else if( z[i]=='\'' ){
2500 raw_printf(out,"&#39;");
2501 }else{
2502 break;
2504 z += i + 1;
2509 ** If a field contains any character identified by a 1 in the following
2510 ** array, then the string must be quoted for CSV.
2512 static const char needCsvQuote[] = {
2513 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2514 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2515 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
2516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2518 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2519 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2520 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
2521 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2522 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2523 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2524 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2525 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2526 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2527 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2528 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2532 ** Output a single term of CSV. Actually, p->colSeparator is used for
2533 ** the separator, which may or may not be a comma. p->nullValue is
2534 ** the null value. Strings are quoted if necessary. The separator
2535 ** is only issued if bSep is true.
2537 static void output_csv(ShellState *p, const char *z, int bSep){
2538 FILE *out = p->out;
2539 if( z==0 ){
2540 utf8_printf(out,"%s",p->nullValue);
2541 }else{
2542 int i;
2543 int nSep = strlen30(p->colSeparator);
2544 for(i=0; z[i]; i++){
2545 if( needCsvQuote[((unsigned char*)z)[i]]
2546 || (z[i]==p->colSeparator[0] &&
2547 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
2548 i = 0;
2549 break;
2552 if( i==0 ){
2553 putc('"', out);
2554 for(i=0; z[i]; i++){
2555 if( z[i]=='"' ) putc('"', out);
2556 putc(z[i], out);
2558 putc('"', out);
2559 }else{
2560 utf8_printf(out, "%s", z);
2563 if( bSep ){
2564 utf8_printf(p->out, "%s", p->colSeparator);
2568 #ifdef SIGINT
2570 ** This routine runs when the user presses Ctrl-C
2572 static void interrupt_handler(int NotUsed){
2573 UNUSED_PARAMETER(NotUsed);
2574 seenInterrupt++;
2575 if( seenInterrupt>2 ) exit(1);
2576 if( globalDb ) sqlite3_interrupt(globalDb);
2578 #endif
2580 #ifndef SQLITE_OMIT_AUTHORIZATION
2582 ** When the ".auth ON" is set, the following authorizer callback is
2583 ** invoked. It always returns SQLITE_OK.
2585 static int shellAuth(
2586 void *pClientData,
2587 int op,
2588 const char *zA1,
2589 const char *zA2,
2590 const char *zA3,
2591 const char *zA4
2593 ShellState *p = (ShellState*)pClientData;
2594 static const char *azAction[] = { 0,
2595 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
2596 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
2597 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
2598 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
2599 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
2600 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
2601 "PRAGMA", "READ", "SELECT",
2602 "TRANSACTION", "UPDATE", "ATTACH",
2603 "DETACH", "ALTER_TABLE", "REINDEX",
2604 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
2605 "FUNCTION", "SAVEPOINT", "RECURSIVE"
2607 int i;
2608 const char *az[4];
2609 az[0] = zA1;
2610 az[1] = zA2;
2611 az[2] = zA3;
2612 az[3] = zA4;
2613 utf8_printf(p->out, "authorizer: %s", azAction[op]);
2614 for(i=0; i<4; i++){
2615 raw_printf(p->out, " ");
2616 if( az[i] ){
2617 output_c_string(p->out, az[i]);
2618 }else{
2619 raw_printf(p->out, "NULL");
2622 raw_printf(p->out, "\n");
2623 return SQLITE_OK;
2625 #endif
2628 ** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
2630 ** This routine converts some CREATE TABLE statements for shadow tables
2631 ** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
2633 static void printSchemaLine(FILE *out, const char *z, const char *zTail){
2634 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
2635 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
2636 }else{
2637 utf8_printf(out, "%s%s", z, zTail);
2640 static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
2641 char c = z[n];
2642 z[n] = 0;
2643 printSchemaLine(out, z, zTail);
2644 z[n] = c;
2648 ** This is the callback routine that the shell
2649 ** invokes for each row of a query result.
2651 static int shell_callback(
2652 void *pArg,
2653 int nArg, /* Number of result columns */
2654 char **azArg, /* Text of each result column */
2655 char **azCol, /* Column names */
2656 int *aiType /* Column types */
2658 int i;
2659 ShellState *p = (ShellState*)pArg;
2661 if( azArg==0 ) return 0;
2662 switch( p->cMode ){
2663 case MODE_Line: {
2664 int w = 5;
2665 if( azArg==0 ) break;
2666 for(i=0; i<nArg; i++){
2667 int len = strlen30(azCol[i] ? azCol[i] : "");
2668 if( len>w ) w = len;
2670 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
2671 for(i=0; i<nArg; i++){
2672 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
2673 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
2675 break;
2677 case MODE_Explain:
2678 case MODE_Column: {
2679 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
2680 const int *colWidth;
2681 int showHdr;
2682 char *rowSep;
2683 if( p->cMode==MODE_Column ){
2684 colWidth = p->colWidth;
2685 showHdr = p->showHeader;
2686 rowSep = p->rowSeparator;
2687 }else{
2688 colWidth = aExplainWidths;
2689 showHdr = 1;
2690 rowSep = SEP_Row;
2692 if( p->cnt++==0 ){
2693 for(i=0; i<nArg; i++){
2694 int w, n;
2695 if( i<ArraySize(p->colWidth) ){
2696 w = colWidth[i];
2697 }else{
2698 w = 0;
2700 if( w==0 ){
2701 w = strlenChar(azCol[i] ? azCol[i] : "");
2702 if( w<10 ) w = 10;
2703 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
2704 if( w<n ) w = n;
2706 if( i<ArraySize(p->actualWidth) ){
2707 p->actualWidth[i] = w;
2709 if( showHdr ){
2710 utf8_width_print(p->out, w, azCol[i]);
2711 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
2714 if( showHdr ){
2715 for(i=0; i<nArg; i++){
2716 int w;
2717 if( i<ArraySize(p->actualWidth) ){
2718 w = p->actualWidth[i];
2719 if( w<0 ) w = -w;
2720 }else{
2721 w = 10;
2723 utf8_printf(p->out,"%-*.*s%s",w,w,
2724 "----------------------------------------------------------"
2725 "----------------------------------------------------------",
2726 i==nArg-1 ? rowSep : " ");
2730 if( azArg==0 ) break;
2731 for(i=0; i<nArg; i++){
2732 int w;
2733 if( i<ArraySize(p->actualWidth) ){
2734 w = p->actualWidth[i];
2735 }else{
2736 w = 10;
2738 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
2739 w = strlenChar(azArg[i]);
2741 if( i==1 && p->aiIndent && p->pStmt ){
2742 if( p->iIndent<p->nIndent ){
2743 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
2745 p->iIndent++;
2747 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
2748 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
2750 break;
2752 case MODE_Semi: { /* .schema and .fullschema output */
2753 printSchemaLine(p->out, azArg[0], ";\n");
2754 break;
2756 case MODE_Pretty: { /* .schema and .fullschema with --indent */
2757 char *z;
2758 int j;
2759 int nParen = 0;
2760 char cEnd = 0;
2761 char c;
2762 int nLine = 0;
2763 assert( nArg==1 );
2764 if( azArg[0]==0 ) break;
2765 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
2766 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
2768 utf8_printf(p->out, "%s;\n", azArg[0]);
2769 break;
2771 z = sqlite3_mprintf("%s", azArg[0]);
2772 j = 0;
2773 for(i=0; IsSpace(z[i]); i++){}
2774 for(; (c = z[i])!=0; i++){
2775 if( IsSpace(c) ){
2776 if( z[j-1]=='\r' ) z[j-1] = '\n';
2777 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
2778 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
2779 j--;
2781 z[j++] = c;
2783 while( j>0 && IsSpace(z[j-1]) ){ j--; }
2784 z[j] = 0;
2785 if( strlen30(z)>=79 ){
2786 for(i=j=0; (c = z[i])!=0; i++){
2787 if( c==cEnd ){
2788 cEnd = 0;
2789 }else if( c=='"' || c=='\'' || c=='`' ){
2790 cEnd = c;
2791 }else if( c=='[' ){
2792 cEnd = ']';
2793 }else if( c=='(' ){
2794 nParen++;
2795 }else if( c==')' ){
2796 nParen--;
2797 if( nLine>0 && nParen==0 && j>0 ){
2798 printSchemaLineN(p->out, z, j, "\n");
2799 j = 0;
2802 z[j++] = c;
2803 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
2804 if( c=='\n' ) j--;
2805 printSchemaLineN(p->out, z, j, "\n ");
2806 j = 0;
2807 nLine++;
2808 while( IsSpace(z[i+1]) ){ i++; }
2811 z[j] = 0;
2813 printSchemaLine(p->out, z, ";\n");
2814 sqlite3_free(z);
2815 break;
2817 case MODE_List: {
2818 if( p->cnt++==0 && p->showHeader ){
2819 for(i=0; i<nArg; i++){
2820 utf8_printf(p->out,"%s%s",azCol[i],
2821 i==nArg-1 ? p->rowSeparator : p->colSeparator);
2824 if( azArg==0 ) break;
2825 for(i=0; i<nArg; i++){
2826 char *z = azArg[i];
2827 if( z==0 ) z = p->nullValue;
2828 utf8_printf(p->out, "%s", z);
2829 if( i<nArg-1 ){
2830 utf8_printf(p->out, "%s", p->colSeparator);
2831 }else{
2832 utf8_printf(p->out, "%s", p->rowSeparator);
2835 break;
2837 case MODE_Html: {
2838 if( p->cnt++==0 && p->showHeader ){
2839 raw_printf(p->out,"<TR>");
2840 for(i=0; i<nArg; i++){
2841 raw_printf(p->out,"<TH>");
2842 output_html_string(p->out, azCol[i]);
2843 raw_printf(p->out,"</TH>\n");
2845 raw_printf(p->out,"</TR>\n");
2847 if( azArg==0 ) break;
2848 raw_printf(p->out,"<TR>");
2849 for(i=0; i<nArg; i++){
2850 raw_printf(p->out,"<TD>");
2851 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2852 raw_printf(p->out,"</TD>\n");
2854 raw_printf(p->out,"</TR>\n");
2855 break;
2857 case MODE_Tcl: {
2858 if( p->cnt++==0 && p->showHeader ){
2859 for(i=0; i<nArg; i++){
2860 output_c_string(p->out,azCol[i] ? azCol[i] : "");
2861 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2863 utf8_printf(p->out, "%s", p->rowSeparator);
2865 if( azArg==0 ) break;
2866 for(i=0; i<nArg; i++){
2867 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
2868 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
2870 utf8_printf(p->out, "%s", p->rowSeparator);
2871 break;
2873 case MODE_Csv: {
2874 setBinaryMode(p->out, 1);
2875 if( p->cnt++==0 && p->showHeader ){
2876 for(i=0; i<nArg; i++){
2877 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
2879 utf8_printf(p->out, "%s", p->rowSeparator);
2881 if( nArg>0 ){
2882 for(i=0; i<nArg; i++){
2883 output_csv(p, azArg[i], i<nArg-1);
2885 utf8_printf(p->out, "%s", p->rowSeparator);
2887 setTextMode(p->out, 1);
2888 break;
2890 case MODE_Insert: {
2891 if( azArg==0 ) break;
2892 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2893 if( p->showHeader ){
2894 raw_printf(p->out,"(");
2895 for(i=0; i<nArg; i++){
2896 if( i>0 ) raw_printf(p->out, ",");
2897 if( quoteChar(azCol[i]) ){
2898 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2899 utf8_printf(p->out, "%s", z);
2900 sqlite3_free(z);
2901 }else{
2902 raw_printf(p->out, "%s", azCol[i]);
2905 raw_printf(p->out,")");
2907 p->cnt++;
2908 for(i=0; i<nArg; i++){
2909 raw_printf(p->out, i>0 ? "," : " VALUES(");
2910 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2911 utf8_printf(p->out,"NULL");
2912 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2913 if( ShellHasFlag(p, SHFLG_Newlines) ){
2914 output_quoted_string(p->out, azArg[i]);
2915 }else{
2916 output_quoted_escaped_string(p->out, azArg[i]);
2918 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2919 utf8_printf(p->out,"%s", azArg[i]);
2920 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2921 char z[50];
2922 double r = sqlite3_column_double(p->pStmt, i);
2923 sqlite3_snprintf(50,z,"%!.20g", r);
2924 raw_printf(p->out, "%s", z);
2925 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2926 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2927 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2928 output_hex_blob(p->out, pBlob, nBlob);
2929 }else if( isNumber(azArg[i], 0) ){
2930 utf8_printf(p->out,"%s", azArg[i]);
2931 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2932 output_quoted_string(p->out, azArg[i]);
2933 }else{
2934 output_quoted_escaped_string(p->out, azArg[i]);
2937 raw_printf(p->out,");\n");
2938 break;
2940 case MODE_Quote: {
2941 if( azArg==0 ) break;
2942 if( p->cnt==0 && p->showHeader ){
2943 for(i=0; i<nArg; i++){
2944 if( i>0 ) raw_printf(p->out, ",");
2945 output_quoted_string(p->out, azCol[i]);
2947 raw_printf(p->out,"\n");
2949 p->cnt++;
2950 for(i=0; i<nArg; i++){
2951 if( i>0 ) raw_printf(p->out, ",");
2952 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2953 utf8_printf(p->out,"NULL");
2954 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2955 output_quoted_string(p->out, azArg[i]);
2956 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2957 utf8_printf(p->out,"%s", azArg[i]);
2958 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2959 char z[50];
2960 double r = sqlite3_column_double(p->pStmt, i);
2961 sqlite3_snprintf(50,z,"%!.20g", r);
2962 raw_printf(p->out, "%s", z);
2963 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2964 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2965 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2966 output_hex_blob(p->out, pBlob, nBlob);
2967 }else if( isNumber(azArg[i], 0) ){
2968 utf8_printf(p->out,"%s", azArg[i]);
2969 }else{
2970 output_quoted_string(p->out, azArg[i]);
2973 raw_printf(p->out,"\n");
2974 break;
2976 case MODE_Ascii: {
2977 if( p->cnt++==0 && p->showHeader ){
2978 for(i=0; i<nArg; i++){
2979 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2980 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2982 utf8_printf(p->out, "%s", p->rowSeparator);
2984 if( azArg==0 ) break;
2985 for(i=0; i<nArg; i++){
2986 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2987 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2989 utf8_printf(p->out, "%s", p->rowSeparator);
2990 break;
2993 return 0;
2997 ** This is the callback routine that the SQLite library
2998 ** invokes for each row of a query result.
3000 static int callback(void *pArg, int nArg, char **azArg, char **azCol){
3001 /* since we don't have type info, call the shell_callback with a NULL value */
3002 return shell_callback(pArg, nArg, azArg, azCol, NULL);
3006 ** This is the callback routine from sqlite3_exec() that appends all
3007 ** output onto the end of a ShellText object.
3009 static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
3010 ShellText *p = (ShellText*)pArg;
3011 int i;
3012 UNUSED_PARAMETER(az);
3013 if( azArg==0 ) return 0;
3014 if( p->n ) appendText(p, "|", 0);
3015 for(i=0; i<nArg; i++){
3016 if( i ) appendText(p, ",", 0);
3017 if( azArg[i] ) appendText(p, azArg[i], 0);
3019 return 0;
3023 ** Generate an appropriate SELFTEST table in the main database.
3025 static void createSelftestTable(ShellState *p){
3026 char *zErrMsg = 0;
3027 sqlite3_exec(p->db,
3028 "SAVEPOINT selftest_init;\n"
3029 "CREATE TABLE IF NOT EXISTS selftest(\n"
3030 " tno INTEGER PRIMARY KEY,\n" /* Test number */
3031 " op TEXT,\n" /* Operator: memo run */
3032 " cmd TEXT,\n" /* Command text */
3033 " ans TEXT\n" /* Desired answer */
3034 ");"
3035 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
3036 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
3037 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
3038 " 'memo','Tests generated by --init');\n"
3039 "INSERT INTO [_shell$self]\n"
3040 " SELECT 'run',\n"
3041 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
3042 "FROM sqlite_master ORDER BY 2'',224))',\n"
3043 " hex(sha3_query('SELECT type,name,tbl_name,sql "
3044 "FROM sqlite_master ORDER BY 2',224));\n"
3045 "INSERT INTO [_shell$self]\n"
3046 " SELECT 'run',"
3047 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
3048 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
3049 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
3050 " FROM (\n"
3051 " SELECT name FROM sqlite_master\n"
3052 " WHERE type='table'\n"
3053 " AND name<>'selftest'\n"
3054 " AND coalesce(rootpage,0)>0\n"
3055 " )\n"
3056 " ORDER BY name;\n"
3057 "INSERT INTO [_shell$self]\n"
3058 " VALUES('run','PRAGMA integrity_check','ok');\n"
3059 "INSERT INTO selftest(tno,op,cmd,ans)"
3060 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
3061 "DROP TABLE [_shell$self];"
3062 ,0,0,&zErrMsg);
3063 if( zErrMsg ){
3064 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
3065 sqlite3_free(zErrMsg);
3067 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
3072 ** Set the destination table field of the ShellState structure to
3073 ** the name of the table given. Escape any quote characters in the
3074 ** table name.
3076 static void set_table_name(ShellState *p, const char *zName){
3077 int i, n;
3078 char cQuote;
3079 char *z;
3081 if( p->zDestTable ){
3082 free(p->zDestTable);
3083 p->zDestTable = 0;
3085 if( zName==0 ) return;
3086 cQuote = quoteChar(zName);
3087 n = strlen30(zName);
3088 if( cQuote ) n += n+2;
3089 z = p->zDestTable = malloc( n+1 );
3090 if( z==0 ){
3091 raw_printf(stderr,"Error: out of memory\n");
3092 exit(1);
3094 n = 0;
3095 if( cQuote ) z[n++] = cQuote;
3096 for(i=0; zName[i]; i++){
3097 z[n++] = zName[i];
3098 if( zName[i]==cQuote ) z[n++] = cQuote;
3100 if( cQuote ) z[n++] = cQuote;
3101 z[n] = 0;
3106 ** Execute a query statement that will generate SQL output. Print
3107 ** the result columns, comma-separated, on a line and then add a
3108 ** semicolon terminator to the end of that line.
3110 ** If the number of columns is 1 and that column contains text "--"
3111 ** then write the semicolon on a separate line. That way, if a
3112 ** "--" comment occurs at the end of the statement, the comment
3113 ** won't consume the semicolon terminator.
3115 static int run_table_dump_query(
3116 ShellState *p, /* Query context */
3117 const char *zSelect, /* SELECT statement to extract content */
3118 const char *zFirstRow /* Print before first row, if not NULL */
3120 sqlite3_stmt *pSelect;
3121 int rc;
3122 int nResult;
3123 int i;
3124 const char *z;
3125 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
3126 if( rc!=SQLITE_OK || !pSelect ){
3127 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
3128 sqlite3_errmsg(p->db));
3129 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
3130 return rc;
3132 rc = sqlite3_step(pSelect);
3133 nResult = sqlite3_column_count(pSelect);
3134 while( rc==SQLITE_ROW ){
3135 if( zFirstRow ){
3136 utf8_printf(p->out, "%s", zFirstRow);
3137 zFirstRow = 0;
3139 z = (const char*)sqlite3_column_text(pSelect, 0);
3140 utf8_printf(p->out, "%s", z);
3141 for(i=1; i<nResult; i++){
3142 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
3144 if( z==0 ) z = "";
3145 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
3146 if( z[0] ){
3147 raw_printf(p->out, "\n;\n");
3148 }else{
3149 raw_printf(p->out, ";\n");
3151 rc = sqlite3_step(pSelect);
3153 rc = sqlite3_finalize(pSelect);
3154 if( rc!=SQLITE_OK ){
3155 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
3156 sqlite3_errmsg(p->db));
3157 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
3159 return rc;
3163 ** Allocate space and save off current error string.
3165 static char *save_err_msg(
3166 sqlite3 *db /* Database to query */
3168 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
3169 char *zErrMsg = sqlite3_malloc64(nErrMsg);
3170 if( zErrMsg ){
3171 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
3173 return zErrMsg;
3176 #ifdef __linux__
3178 ** Attempt to display I/O stats on Linux using /proc/PID/io
3180 static void displayLinuxIoStats(FILE *out){
3181 FILE *in;
3182 char z[200];
3183 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
3184 in = fopen(z, "rb");
3185 if( in==0 ) return;
3186 while( fgets(z, sizeof(z), in)!=0 ){
3187 static const struct {
3188 const char *zPattern;
3189 const char *zDesc;
3190 } aTrans[] = {
3191 { "rchar: ", "Bytes received by read():" },
3192 { "wchar: ", "Bytes sent to write():" },
3193 { "syscr: ", "Read() system calls:" },
3194 { "syscw: ", "Write() system calls:" },
3195 { "read_bytes: ", "Bytes read from storage:" },
3196 { "write_bytes: ", "Bytes written to storage:" },
3197 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
3199 int i;
3200 for(i=0; i<ArraySize(aTrans); i++){
3201 int n = (int)strlen(aTrans[i].zPattern);
3202 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
3203 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
3204 break;
3208 fclose(in);
3210 #endif
3213 ** Display a single line of status using 64-bit values.
3215 static void displayStatLine(
3216 ShellState *p, /* The shell context */
3217 char *zLabel, /* Label for this one line */
3218 char *zFormat, /* Format for the result */
3219 int iStatusCtrl, /* Which status to display */
3220 int bReset /* True to reset the stats */
3222 sqlite3_int64 iCur = -1;
3223 sqlite3_int64 iHiwtr = -1;
3224 int i, nPercent;
3225 char zLine[200];
3226 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
3227 for(i=0, nPercent=0; zFormat[i]; i++){
3228 if( zFormat[i]=='%' ) nPercent++;
3230 if( nPercent>1 ){
3231 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
3232 }else{
3233 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
3235 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
3239 ** Display memory stats.
3241 static int display_stats(
3242 sqlite3 *db, /* Database to query */
3243 ShellState *pArg, /* Pointer to ShellState */
3244 int bReset /* True to reset the stats */
3246 int iCur;
3247 int iHiwtr;
3249 if( pArg && pArg->out ){
3250 displayStatLine(pArg, "Memory Used:",
3251 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
3252 displayStatLine(pArg, "Number of Outstanding Allocations:",
3253 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
3254 if( pArg->shellFlgs & SHFLG_Pagecache ){
3255 displayStatLine(pArg, "Number of Pcache Pages Used:",
3256 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
3258 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
3259 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
3260 displayStatLine(pArg, "Largest Allocation:",
3261 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
3262 displayStatLine(pArg, "Largest Pcache Allocation:",
3263 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
3264 #ifdef YYTRACKMAXSTACKDEPTH
3265 displayStatLine(pArg, "Deepest Parser Stack:",
3266 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
3267 #endif
3270 if( pArg && pArg->out && db ){
3271 if( pArg->shellFlgs & SHFLG_Lookaside ){
3272 iHiwtr = iCur = -1;
3273 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
3274 &iCur, &iHiwtr, bReset);
3275 raw_printf(pArg->out,
3276 "Lookaside Slots Used: %d (max %d)\n",
3277 iCur, iHiwtr);
3278 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
3279 &iCur, &iHiwtr, bReset);
3280 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
3281 iHiwtr);
3282 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
3283 &iCur, &iHiwtr, bReset);
3284 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
3285 iHiwtr);
3286 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
3287 &iCur, &iHiwtr, bReset);
3288 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
3289 iHiwtr);
3291 iHiwtr = iCur = -1;
3292 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
3293 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
3294 iCur);
3295 iHiwtr = iCur = -1;
3296 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
3297 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
3298 iHiwtr = iCur = -1;
3299 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
3300 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
3301 iHiwtr = iCur = -1;
3302 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
3303 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
3304 iHiwtr = iCur = -1;
3305 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
3306 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
3307 iCur);
3308 iHiwtr = iCur = -1;
3309 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
3310 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
3311 iCur);
3314 if( pArg && pArg->out && db && pArg->pStmt ){
3315 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
3316 bReset);
3317 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
3318 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
3319 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
3320 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
3321 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
3322 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
3323 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
3326 #ifdef __linux__
3327 displayLinuxIoStats(pArg->out);
3328 #endif
3330 /* Do not remove this machine readable comment: extra-stats-output-here */
3332 return 0;
3336 ** Display scan stats.
3338 static void display_scanstats(
3339 sqlite3 *db, /* Database to query */
3340 ShellState *pArg /* Pointer to ShellState */
3342 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3343 UNUSED_PARAMETER(db);
3344 UNUSED_PARAMETER(pArg);
3345 #else
3346 int i, k, n, mx;
3347 raw_printf(pArg->out, "-------- scanstats --------\n");
3348 mx = 0;
3349 for(k=0; k<=mx; k++){
3350 double rEstLoop = 1.0;
3351 for(i=n=0; 1; i++){
3352 sqlite3_stmt *p = pArg->pStmt;
3353 sqlite3_int64 nLoop, nVisit;
3354 double rEst;
3355 int iSid;
3356 const char *zExplain;
3357 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
3358 break;
3360 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
3361 if( iSid>mx ) mx = iSid;
3362 if( iSid!=k ) continue;
3363 if( n==0 ){
3364 rEstLoop = (double)nLoop;
3365 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
3367 n++;
3368 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
3369 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
3370 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
3371 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
3372 rEstLoop *= rEst;
3373 raw_printf(pArg->out,
3374 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
3375 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
3379 raw_printf(pArg->out, "---------------------------\n");
3380 #endif
3384 ** Parameter azArray points to a zero-terminated array of strings. zStr
3385 ** points to a single nul-terminated string. Return non-zero if zStr
3386 ** is equal, according to strcmp(), to any of the strings in the array.
3387 ** Otherwise, return zero.
3389 static int str_in_array(const char *zStr, const char **azArray){
3390 int i;
3391 for(i=0; azArray[i]; i++){
3392 if( 0==strcmp(zStr, azArray[i]) ) return 1;
3394 return 0;
3398 ** If compiled statement pSql appears to be an EXPLAIN statement, allocate
3399 ** and populate the ShellState.aiIndent[] array with the number of
3400 ** spaces each opcode should be indented before it is output.
3402 ** The indenting rules are:
3404 ** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
3405 ** all opcodes that occur between the p2 jump destination and the opcode
3406 ** itself by 2 spaces.
3408 ** * For each "Goto", if the jump destination is earlier in the program
3409 ** and ends on one of:
3410 ** Yield SeekGt SeekLt RowSetRead Rewind
3411 ** or if the P1 parameter is one instead of zero,
3412 ** then indent all opcodes between the earlier instruction
3413 ** and "Goto" by 2 spaces.
3415 static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
3416 const char *zSql; /* The text of the SQL statement */
3417 const char *z; /* Used to check if this is an EXPLAIN */
3418 int *abYield = 0; /* True if op is an OP_Yield */
3419 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
3420 int iOp; /* Index of operation in p->aiIndent[] */
3422 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
3423 "NextIfOpen", "PrevIfOpen", 0 };
3424 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
3425 "Rewind", 0 };
3426 const char *azGoto[] = { "Goto", 0 };
3428 /* Try to figure out if this is really an EXPLAIN statement. If this
3429 ** cannot be verified, return early. */
3430 if( sqlite3_column_count(pSql)!=8 ){
3431 p->cMode = p->mode;
3432 return;
3434 zSql = sqlite3_sql(pSql);
3435 if( zSql==0 ) return;
3436 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
3437 if( sqlite3_strnicmp(z, "explain", 7) ){
3438 p->cMode = p->mode;
3439 return;
3442 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
3443 int i;
3444 int iAddr = sqlite3_column_int(pSql, 0);
3445 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
3447 /* Set p2 to the P2 field of the current opcode. Then, assuming that
3448 ** p2 is an instruction address, set variable p2op to the index of that
3449 ** instruction in the aiIndent[] array. p2 and p2op may be different if
3450 ** the current instruction is part of a sub-program generated by an
3451 ** SQL trigger or foreign key. */
3452 int p2 = sqlite3_column_int(pSql, 3);
3453 int p2op = (p2 + (iOp-iAddr));
3455 /* Grow the p->aiIndent array as required */
3456 if( iOp>=nAlloc ){
3457 if( iOp==0 ){
3458 /* Do further verfication that this is explain output. Abort if
3459 ** it is not */
3460 static const char *explainCols[] = {
3461 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
3462 int jj;
3463 for(jj=0; jj<ArraySize(explainCols); jj++){
3464 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
3465 p->cMode = p->mode;
3466 sqlite3_reset(pSql);
3467 return;
3471 nAlloc += 100;
3472 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
3473 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
3475 abYield[iOp] = str_in_array(zOp, azYield);
3476 p->aiIndent[iOp] = 0;
3477 p->nIndent = iOp+1;
3479 if( str_in_array(zOp, azNext) ){
3480 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3482 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
3483 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
3485 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
3489 p->iIndent = 0;
3490 sqlite3_free(abYield);
3491 sqlite3_reset(pSql);
3495 ** Free the array allocated by explain_data_prepare().
3497 static void explain_data_delete(ShellState *p){
3498 sqlite3_free(p->aiIndent);
3499 p->aiIndent = 0;
3500 p->nIndent = 0;
3501 p->iIndent = 0;
3505 ** Disable and restore .wheretrace and .selecttrace settings.
3507 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3508 extern int sqlite3SelectTrace;
3509 static int savedSelectTrace;
3510 #endif
3511 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3512 extern int sqlite3WhereTrace;
3513 static int savedWhereTrace;
3514 #endif
3515 static void disable_debug_trace_modes(void){
3516 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3517 savedSelectTrace = sqlite3SelectTrace;
3518 sqlite3SelectTrace = 0;
3519 #endif
3520 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3521 savedWhereTrace = sqlite3WhereTrace;
3522 sqlite3WhereTrace = 0;
3523 #endif
3525 static void restore_debug_trace_modes(void){
3526 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3527 sqlite3SelectTrace = savedSelectTrace;
3528 #endif
3529 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3530 sqlite3WhereTrace = savedWhereTrace;
3531 #endif
3535 ** Run a prepared statement
3537 static void exec_prepared_stmt(
3538 ShellState *pArg, /* Pointer to ShellState */
3539 sqlite3_stmt *pStmt, /* Statment to run */
3540 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
3542 int rc;
3544 /* perform the first step. this will tell us if we
3545 ** have a result set or not and how wide it is.
3547 rc = sqlite3_step(pStmt);
3548 /* if we have a result set... */
3549 if( SQLITE_ROW == rc ){
3550 /* if we have a callback... */
3551 if( xCallback ){
3552 /* allocate space for col name ptr, value ptr, and type */
3553 int nCol = sqlite3_column_count(pStmt);
3554 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
3555 if( !pData ){
3556 rc = SQLITE_NOMEM;
3557 }else{
3558 char **azCols = (char **)pData; /* Names of result columns */
3559 char **azVals = &azCols[nCol]; /* Results */
3560 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
3561 int i, x;
3562 assert(sizeof(int) <= sizeof(char *));
3563 /* save off ptrs to column names */
3564 for(i=0; i<nCol; i++){
3565 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
3568 /* extract the data and data types */
3569 for(i=0; i<nCol; i++){
3570 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
3571 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
3572 azVals[i] = "";
3573 }else{
3574 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
3576 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
3577 rc = SQLITE_NOMEM;
3578 break; /* from for */
3580 } /* end for */
3582 /* if data and types extracted successfully... */
3583 if( SQLITE_ROW == rc ){
3584 /* call the supplied callback with the result row data */
3585 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
3586 rc = SQLITE_ABORT;
3587 }else{
3588 rc = sqlite3_step(pStmt);
3591 } while( SQLITE_ROW == rc );
3592 sqlite3_free(pData);
3594 }else{
3596 rc = sqlite3_step(pStmt);
3597 } while( rc == SQLITE_ROW );
3603 ** Execute a statement or set of statements. Print
3604 ** any result rows/columns depending on the current mode
3605 ** set via the supplied callback.
3607 ** This is very similar to SQLite's built-in sqlite3_exec()
3608 ** function except it takes a slightly different callback
3609 ** and callback data argument.
3611 static int shell_exec(
3612 sqlite3 *db, /* An open database */
3613 const char *zSql, /* SQL to be evaluated */
3614 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
3615 /* (not the same as sqlite3_exec) */
3616 ShellState *pArg, /* Pointer to ShellState */
3617 char **pzErrMsg /* Error msg written here */
3619 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
3620 int rc = SQLITE_OK; /* Return Code */
3621 int rc2;
3622 const char *zLeftover; /* Tail of unprocessed SQL */
3624 if( pzErrMsg ){
3625 *pzErrMsg = NULL;
3628 while( zSql[0] && (SQLITE_OK == rc) ){
3629 static const char *zStmtSql;
3630 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
3631 if( SQLITE_OK != rc ){
3632 if( pzErrMsg ){
3633 *pzErrMsg = save_err_msg(db);
3635 }else{
3636 if( !pStmt ){
3637 /* this happens for a comment or white-space */
3638 zSql = zLeftover;
3639 while( IsSpace(zSql[0]) ) zSql++;
3640 continue;
3642 zStmtSql = sqlite3_sql(pStmt);
3643 if( zStmtSql==0 ) zStmtSql = "";
3644 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
3646 /* save off the prepared statment handle and reset row count */
3647 if( pArg ){
3648 pArg->pStmt = pStmt;
3649 pArg->cnt = 0;
3652 /* echo the sql statement if echo on */
3653 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
3654 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
3657 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
3658 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
3659 sqlite3_stmt *pExplain;
3660 char *zEQP;
3661 disable_debug_trace_modes();
3662 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
3663 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3664 if( rc==SQLITE_OK ){
3665 while( sqlite3_step(pExplain)==SQLITE_ROW ){
3666 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
3667 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
3668 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
3669 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
3672 sqlite3_finalize(pExplain);
3673 sqlite3_free(zEQP);
3674 if( pArg->autoEQP>=2 ){
3675 /* Also do an EXPLAIN for ".eqp full" mode */
3676 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
3677 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3678 if( rc==SQLITE_OK ){
3679 pArg->cMode = MODE_Explain;
3680 explain_data_prepare(pArg, pExplain);
3681 exec_prepared_stmt(pArg, pExplain, xCallback);
3682 explain_data_delete(pArg);
3684 sqlite3_finalize(pExplain);
3685 sqlite3_free(zEQP);
3687 restore_debug_trace_modes();
3690 if( pArg ){
3691 pArg->cMode = pArg->mode;
3692 if( pArg->autoExplain
3693 && sqlite3_column_count(pStmt)==8
3694 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
3696 pArg->cMode = MODE_Explain;
3699 /* If the shell is currently in ".explain" mode, gather the extra
3700 ** data required to add indents to the output.*/
3701 if( pArg->cMode==MODE_Explain ){
3702 explain_data_prepare(pArg, pStmt);
3706 exec_prepared_stmt(pArg, pStmt, xCallback);
3707 explain_data_delete(pArg);
3709 /* print usage stats if stats on */
3710 if( pArg && pArg->statsOn ){
3711 display_stats(db, pArg, 0);
3714 /* print loop-counters if required */
3715 if( pArg && pArg->scanstatsOn ){
3716 display_scanstats(db, pArg);
3719 /* Finalize the statement just executed. If this fails, save a
3720 ** copy of the error message. Otherwise, set zSql to point to the
3721 ** next statement to execute. */
3722 rc2 = sqlite3_finalize(pStmt);
3723 if( rc!=SQLITE_NOMEM ) rc = rc2;
3724 if( rc==SQLITE_OK ){
3725 zSql = zLeftover;
3726 while( IsSpace(zSql[0]) ) zSql++;
3727 }else if( pzErrMsg ){
3728 *pzErrMsg = save_err_msg(db);
3731 /* clear saved stmt handle */
3732 if( pArg ){
3733 pArg->pStmt = NULL;
3736 } /* end while */
3738 return rc;
3742 ** Release memory previously allocated by tableColumnList().
3744 static void freeColumnList(char **azCol){
3745 int i;
3746 for(i=1; azCol[i]; i++){
3747 sqlite3_free(azCol[i]);
3749 /* azCol[0] is a static string */
3750 sqlite3_free(azCol);
3754 ** Return a list of pointers to strings which are the names of all
3755 ** columns in table zTab. The memory to hold the names is dynamically
3756 ** allocated and must be released by the caller using a subsequent call
3757 ** to freeColumnList().
3759 ** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
3760 ** value that needs to be preserved, then azCol[0] is filled in with the
3761 ** name of the rowid column.
3763 ** The first regular column in the table is azCol[1]. The list is terminated
3764 ** by an entry with azCol[i]==0.
3766 static char **tableColumnList(ShellState *p, const char *zTab){
3767 char **azCol = 0;
3768 sqlite3_stmt *pStmt;
3769 char *zSql;
3770 int nCol = 0;
3771 int nAlloc = 0;
3772 int nPK = 0; /* Number of PRIMARY KEY columns seen */
3773 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
3774 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3775 int rc;
3777 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3778 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3779 sqlite3_free(zSql);
3780 if( rc ) return 0;
3781 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3782 if( nCol>=nAlloc-2 ){
3783 nAlloc = nAlloc*2 + nCol + 10;
3784 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
3785 if( azCol==0 ){
3786 raw_printf(stderr, "Error: out of memory\n");
3787 exit(1);
3790 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3791 if( sqlite3_column_int(pStmt, 5) ){
3792 nPK++;
3793 if( nPK==1
3794 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3795 "INTEGER")==0
3797 isIPK = 1;
3798 }else{
3799 isIPK = 0;
3803 sqlite3_finalize(pStmt);
3804 azCol[0] = 0;
3805 azCol[nCol+1] = 0;
3807 /* The decision of whether or not a rowid really needs to be preserved
3808 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
3809 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
3810 ** rowids on tables where the rowid is inaccessible because there are other
3811 ** columns in the table named "rowid", "_rowid_", and "oid".
3813 if( preserveRowid && isIPK ){
3814 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3815 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
3816 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3817 ** ROWID aliases. To distinguish these cases, check to see if
3818 ** there is a "pk" entry in "PRAGMA index_list". There will be
3819 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3821 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3822 " WHERE origin='pk'", zTab);
3823 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3824 sqlite3_free(zSql);
3825 if( rc ){
3826 freeColumnList(azCol);
3827 return 0;
3829 rc = sqlite3_step(pStmt);
3830 sqlite3_finalize(pStmt);
3831 preserveRowid = rc==SQLITE_ROW;
3833 if( preserveRowid ){
3834 /* Only preserve the rowid if we can find a name to use for the
3835 ** rowid */
3836 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3837 int i, j;
3838 for(j=0; j<3; j++){
3839 for(i=1; i<=nCol; i++){
3840 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3842 if( i>nCol ){
3843 /* At this point, we know that azRowid[j] is not the name of any
3844 ** ordinary column in the table. Verify that azRowid[j] is a valid
3845 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
3846 ** tables will fail this last check */
3847 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3848 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3849 break;
3853 return azCol;
3857 ** Toggle the reverse_unordered_selects setting.
3859 static void toggleSelectOrder(sqlite3 *db){
3860 sqlite3_stmt *pStmt = 0;
3861 int iSetting = 0;
3862 char zStmt[100];
3863 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3864 if( sqlite3_step(pStmt)==SQLITE_ROW ){
3865 iSetting = sqlite3_column_int(pStmt, 0);
3867 sqlite3_finalize(pStmt);
3868 sqlite3_snprintf(sizeof(zStmt), zStmt,
3869 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3870 sqlite3_exec(db, zStmt, 0, 0, 0);
3874 ** This is a different callback routine used for dumping the database.
3875 ** Each row received by this callback consists of a table name,
3876 ** the table type ("index" or "table") and SQL to create the table.
3877 ** This routine should print text sufficient to recreate the table.
3879 static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
3880 int rc;
3881 const char *zTable;
3882 const char *zType;
3883 const char *zSql;
3884 ShellState *p = (ShellState *)pArg;
3886 UNUSED_PARAMETER(azNotUsed);
3887 if( nArg!=3 || azArg==0 ) return 0;
3888 zTable = azArg[0];
3889 zType = azArg[1];
3890 zSql = azArg[2];
3892 if( strcmp(zTable, "sqlite_sequence")==0 ){
3893 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
3894 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
3895 raw_printf(p->out, "ANALYZE sqlite_master;\n");
3896 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3897 return 0;
3898 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3899 char *zIns;
3900 if( !p->writableSchema ){
3901 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
3902 p->writableSchema = 1;
3904 zIns = sqlite3_mprintf(
3905 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
3906 "VALUES('table','%q','%q',0,'%q');",
3907 zTable, zTable, zSql);
3908 utf8_printf(p->out, "%s\n", zIns);
3909 sqlite3_free(zIns);
3910 return 0;
3911 }else{
3912 printSchemaLine(p->out, zSql, ";\n");
3915 if( strcmp(zType, "table")==0 ){
3916 ShellText sSelect;
3917 ShellText sTable;
3918 char **azCol;
3919 int i;
3920 char *savedDestTable;
3921 int savedMode;
3923 azCol = tableColumnList(p, zTable);
3924 if( azCol==0 ){
3925 p->nErr++;
3926 return 0;
3929 /* Always quote the table name, even if it appears to be pure ascii,
3930 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
3931 initText(&sTable);
3932 appendText(&sTable, zTable, quoteChar(zTable));
3933 /* If preserving the rowid, add a column list after the table name.
3934 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3935 ** instead of the usual "INSERT INTO tab VALUES(...)".
3937 if( azCol[0] ){
3938 appendText(&sTable, "(", 0);
3939 appendText(&sTable, azCol[0], 0);
3940 for(i=1; azCol[i]; i++){
3941 appendText(&sTable, ",", 0);
3942 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
3944 appendText(&sTable, ")", 0);
3947 /* Build an appropriate SELECT statement */
3948 initText(&sSelect);
3949 appendText(&sSelect, "SELECT ", 0);
3950 if( azCol[0] ){
3951 appendText(&sSelect, azCol[0], 0);
3952 appendText(&sSelect, ",", 0);
3954 for(i=1; azCol[i]; i++){
3955 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
3956 if( azCol[i+1] ){
3957 appendText(&sSelect, ",", 0);
3960 freeColumnList(azCol);
3961 appendText(&sSelect, " FROM ", 0);
3962 appendText(&sSelect, zTable, quoteChar(zTable));
3964 savedDestTable = p->zDestTable;
3965 savedMode = p->mode;
3966 p->zDestTable = sTable.z;
3967 p->mode = p->cMode = MODE_Insert;
3968 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
3969 if( (rc&0xff)==SQLITE_CORRUPT ){
3970 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3971 toggleSelectOrder(p->db);
3972 shell_exec(p->db, sSelect.z, shell_callback, p, 0);
3973 toggleSelectOrder(p->db);
3975 p->zDestTable = savedDestTable;
3976 p->mode = savedMode;
3977 freeText(&sTable);
3978 freeText(&sSelect);
3979 if( rc ) p->nErr++;
3981 return 0;
3985 ** Run zQuery. Use dump_callback() as the callback routine so that
3986 ** the contents of the query are output as SQL statements.
3988 ** If we get a SQLITE_CORRUPT error, rerun the query after appending
3989 ** "ORDER BY rowid DESC" to the end.
3991 static int run_schema_dump_query(
3992 ShellState *p,
3993 const char *zQuery
3995 int rc;
3996 char *zErr = 0;
3997 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
3998 if( rc==SQLITE_CORRUPT ){
3999 char *zQ2;
4000 int len = strlen30(zQuery);
4001 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
4002 if( zErr ){
4003 utf8_printf(p->out, "/****** %s ******/\n", zErr);
4004 sqlite3_free(zErr);
4005 zErr = 0;
4007 zQ2 = malloc( len+100 );
4008 if( zQ2==0 ) return rc;
4009 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
4010 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
4011 if( rc ){
4012 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
4013 }else{
4014 rc = SQLITE_CORRUPT;
4016 sqlite3_free(zErr);
4017 free(zQ2);
4019 return rc;
4023 ** Text of a help message
4025 static char zHelp[] =
4026 #ifndef SQLITE_OMIT_AUTHORIZATION
4027 ".auth ON|OFF Show authorizer callbacks\n"
4028 #endif
4029 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
4030 ".bail on|off Stop after hitting an error. Default OFF\n"
4031 ".binary on|off Turn binary output on or off. Default OFF\n"
4032 ".cd DIRECTORY Change the working directory to DIRECTORY\n"
4033 ".changes on|off Show number of rows changed by SQL\n"
4034 ".check GLOB Fail if output since .testcase does not match\n"
4035 ".clone NEWDB Clone data into NEWDB from the existing database\n"
4036 ".databases List names and files of attached databases\n"
4037 ".dbinfo ?DB? Show status information about the database\n"
4038 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
4039 " If TABLE specified, only dump tables matching\n"
4040 " LIKE pattern TABLE.\n"
4041 ".echo on|off Turn command echo on or off\n"
4042 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
4043 ".exit Exit this program\n"
4044 /* Because explain mode comes on automatically now, the ".explain" mode
4045 ** is removed from the help screen. It is still supported for legacy, however */
4046 /*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/
4047 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
4048 ".headers on|off Turn display of headers on or off\n"
4049 ".help Show this message\n"
4050 ".import FILE TABLE Import data from FILE into TABLE\n"
4051 #ifndef SQLITE_OMIT_TEST_CONTROL
4052 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
4053 #endif
4054 ".indexes ?TABLE? Show names of all indexes\n"
4055 " If TABLE specified, only show indexes for tables\n"
4056 " matching LIKE pattern TABLE.\n"
4057 #ifdef SQLITE_ENABLE_IOTRACE
4058 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
4059 #endif
4060 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
4061 ".lint OPTIONS Report potential schema issues. Options:\n"
4062 " fkey-indexes Find missing foreign key indexes\n"
4063 #ifndef SQLITE_OMIT_LOAD_EXTENSION
4064 ".load FILE ?ENTRY? Load an extension library\n"
4065 #endif
4066 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
4067 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
4068 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
4069 " csv Comma-separated values\n"
4070 " column Left-aligned columns. (See .width)\n"
4071 " html HTML <table> code\n"
4072 " insert SQL insert statements for TABLE\n"
4073 " line One value per line\n"
4074 " list Values delimited by \"|\"\n"
4075 " quote Escape answers as for SQL\n"
4076 " tabs Tab-separated values\n"
4077 " tcl TCL list elements\n"
4078 ".nullvalue STRING Use STRING in place of NULL values\n"
4079 ".once FILENAME Output for the next SQL command only to FILENAME\n"
4080 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n"
4081 " The --new option starts with an empty file\n"
4082 ".output ?FILENAME? Send output to FILENAME or stdout\n"
4083 ".print STRING... Print literal STRING\n"
4084 ".prompt MAIN CONTINUE Replace the standard prompts\n"
4085 ".quit Exit this program\n"
4086 ".read FILENAME Execute SQL in FILENAME\n"
4087 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
4088 ".save FILE Write in-memory database into FILE\n"
4089 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
4090 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
4091 " Add --indent for pretty-printing\n"
4092 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
4093 ".separator COL ?ROW? Change the column separator and optionally the row\n"
4094 " separator for both the output mode and .import\n"
4095 #if defined(SQLITE_ENABLE_SESSION)
4096 ".session CMD ... Create or control sessions\n"
4097 #endif
4098 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
4099 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
4100 ".show Show the current values for various settings\n"
4101 ".stats ?on|off? Show stats or turn stats on or off\n"
4102 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
4103 ".tables ?TABLE? List names of tables\n"
4104 " If TABLE specified, only list tables matching\n"
4105 " LIKE pattern TABLE.\n"
4106 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
4107 ".timeout MS Try opening locked tables for MS milliseconds\n"
4108 ".timer on|off Turn SQL timer on or off\n"
4109 ".trace FILE|off Output each SQL statement as it is run\n"
4110 ".vfsinfo ?AUX? Information about the top-level VFS\n"
4111 ".vfslist List all available VFSes\n"
4112 ".vfsname ?AUX? Print the name of the VFS stack\n"
4113 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
4114 " Negative values right-justify\n"
4117 #if defined(SQLITE_ENABLE_SESSION)
4119 ** Print help information for the ".sessions" command
4121 void session_help(ShellState *p){
4122 raw_printf(p->out,
4123 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
4124 "If ?NAME? is omitted, the first defined session is used.\n"
4125 "Subcommands:\n"
4126 " attach TABLE Attach TABLE\n"
4127 " changeset FILE Write a changeset into FILE\n"
4128 " close Close one session\n"
4129 " enable ?BOOLEAN? Set or query the enable bit\n"
4130 " filter GLOB... Reject tables matching GLOBs\n"
4131 " indirect ?BOOLEAN? Mark or query the indirect status\n"
4132 " isempty Query whether the session is empty\n"
4133 " list List currently open session names\n"
4134 " open DB NAME Open a new session on DB\n"
4135 " patchset FILE Write a patchset into FILE\n"
4138 #endif
4141 /* Forward reference */
4142 static int process_input(ShellState *p, FILE *in);
4145 ** Read the content of file zName into memory obtained from sqlite3_malloc64()
4146 ** and return a pointer to the buffer. The caller is responsible for freeing
4147 ** the memory.
4149 ** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
4150 ** read.
4152 ** For convenience, a nul-terminator byte is always appended to the data read
4153 ** from the file before the buffer is returned. This byte is not included in
4154 ** the final value of (*pnByte), if applicable.
4156 ** NULL is returned if any error is encountered. The final value of *pnByte
4157 ** is undefined in this case.
4159 static char *readFile(const char *zName, int *pnByte){
4160 FILE *in = fopen(zName, "rb");
4161 long nIn;
4162 size_t nRead;
4163 char *pBuf;
4164 if( in==0 ) return 0;
4165 fseek(in, 0, SEEK_END);
4166 nIn = ftell(in);
4167 rewind(in);
4168 pBuf = sqlite3_malloc64( nIn+1 );
4169 if( pBuf==0 ) return 0;
4170 nRead = fread(pBuf, nIn, 1, in);
4171 fclose(in);
4172 if( nRead!=1 ){
4173 sqlite3_free(pBuf);
4174 return 0;
4176 pBuf[nIn] = 0;
4177 if( pnByte ) *pnByte = nIn;
4178 return pBuf;
4181 #if defined(SQLITE_ENABLE_SESSION)
4183 ** Close a single OpenSession object and release all of its associated
4184 ** resources.
4186 static void session_close(OpenSession *pSession){
4187 int i;
4188 sqlite3session_delete(pSession->p);
4189 sqlite3_free(pSession->zName);
4190 for(i=0; i<pSession->nFilter; i++){
4191 sqlite3_free(pSession->azFilter[i]);
4193 sqlite3_free(pSession->azFilter);
4194 memset(pSession, 0, sizeof(OpenSession));
4196 #endif
4199 ** Close all OpenSession objects and release all associated resources.
4201 #if defined(SQLITE_ENABLE_SESSION)
4202 static void session_close_all(ShellState *p){
4203 int i;
4204 for(i=0; i<p->nSession; i++){
4205 session_close(&p->aSession[i]);
4207 p->nSession = 0;
4209 #else
4210 # define session_close_all(X)
4211 #endif
4214 ** Implementation of the xFilter function for an open session. Omit
4215 ** any tables named by ".session filter" but let all other table through.
4217 #if defined(SQLITE_ENABLE_SESSION)
4218 static int session_filter(void *pCtx, const char *zTab){
4219 OpenSession *pSession = (OpenSession*)pCtx;
4220 int i;
4221 for(i=0; i<pSession->nFilter; i++){
4222 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
4224 return 1;
4226 #endif
4229 ** Make sure the database is open. If it is not, then open it. If
4230 ** the database fails to open, print an error message and exit.
4232 static void open_db(ShellState *p, int keepAlive){
4233 if( p->db==0 ){
4234 sqlite3_initialize();
4235 sqlite3_open(p->zDbFilename, &p->db);
4236 globalDb = p->db;
4237 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
4238 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
4239 p->zDbFilename, sqlite3_errmsg(p->db));
4240 if( keepAlive ) return;
4241 exit(1);
4243 #ifndef SQLITE_OMIT_LOAD_EXTENSION
4244 sqlite3_enable_load_extension(p->db, 1);
4245 #endif
4246 sqlite3_fileio_init(p->db, 0, 0);
4247 sqlite3_shathree_init(p->db, 0, 0);
4248 sqlite3_completion_init(p->db, 0, 0);
4249 sqlite3_create_function(p->db, "shell_add_schema", 2, SQLITE_UTF8, 0,
4250 shellAddSchemaName, 0, 0);
4254 #if HAVE_READLINE || HAVE_EDITLINE
4256 ** Readline completion callbacks
4258 static char *readline_completion_generator(const char *text, int state){
4259 static sqlite3_stmt *pStmt = 0;
4260 char *zRet;
4261 if( state==0 ){
4262 char *zSql;
4263 sqlite3_finalize(pStmt);
4264 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4265 " FROM completion(%Q) ORDER BY 1", text);
4266 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4267 sqlite3_free(zSql);
4269 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4270 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
4271 }else{
4272 sqlite3_finalize(pStmt);
4273 pStmt = 0;
4274 zRet = 0;
4276 return zRet;
4278 static char **readline_completion(const char *zText, int iStart, int iEnd){
4279 rl_attempted_completion_over = 1;
4280 return rl_completion_matches(zText, readline_completion_generator);
4283 #elif HAVE_LINENOISE
4285 ** Linenoise completion callback
4287 static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
4288 int nLine = (int)strlen(zLine);
4289 int i, iStart;
4290 sqlite3_stmt *pStmt = 0;
4291 char *zSql;
4292 char zBuf[1000];
4294 if( nLine>sizeof(zBuf)-30 ) return;
4295 if( zLine[0]=='.' ) return;
4296 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
4297 if( i==nLine-1 ) return;
4298 iStart = i+1;
4299 memcpy(zBuf, zLine, iStart);
4300 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
4301 " FROM completion(%Q,%Q) ORDER BY 1",
4302 &zLine[iStart], zLine);
4303 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
4304 sqlite3_free(zSql);
4305 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
4306 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4307 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
4308 int nCompletion = sqlite3_column_bytes(pStmt, 0);
4309 if( iStart+nCompletion < sizeof(zBuf)-1 ){
4310 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
4311 linenoiseAddCompletion(lc, zBuf);
4314 sqlite3_finalize(pStmt);
4316 #endif
4319 ** Do C-language style dequoting.
4321 ** \a -> alarm
4322 ** \b -> backspace
4323 ** \t -> tab
4324 ** \n -> newline
4325 ** \v -> vertical tab
4326 ** \f -> form feed
4327 ** \r -> carriage return
4328 ** \s -> space
4329 ** \" -> "
4330 ** \' -> '
4331 ** \\ -> backslash
4332 ** \NNN -> ascii character NNN in octal
4334 static void resolve_backslashes(char *z){
4335 int i, j;
4336 char c;
4337 while( *z && *z!='\\' ) z++;
4338 for(i=j=0; (c = z[i])!=0; i++, j++){
4339 if( c=='\\' && z[i+1]!=0 ){
4340 c = z[++i];
4341 if( c=='a' ){
4342 c = '\a';
4343 }else if( c=='b' ){
4344 c = '\b';
4345 }else if( c=='t' ){
4346 c = '\t';
4347 }else if( c=='n' ){
4348 c = '\n';
4349 }else if( c=='v' ){
4350 c = '\v';
4351 }else if( c=='f' ){
4352 c = '\f';
4353 }else if( c=='r' ){
4354 c = '\r';
4355 }else if( c=='"' ){
4356 c = '"';
4357 }else if( c=='\'' ){
4358 c = '\'';
4359 }else if( c=='\\' ){
4360 c = '\\';
4361 }else if( c>='0' && c<='7' ){
4362 c -= '0';
4363 if( z[i+1]>='0' && z[i+1]<='7' ){
4364 i++;
4365 c = (c<<3) + z[i] - '0';
4366 if( z[i+1]>='0' && z[i+1]<='7' ){
4367 i++;
4368 c = (c<<3) + z[i] - '0';
4373 z[j] = c;
4375 if( j<i ) z[j] = 0;
4379 ** Return the value of a hexadecimal digit. Return -1 if the input
4380 ** is not a hex digit.
4382 static int hexDigitValue(char c){
4383 if( c>='0' && c<='9' ) return c - '0';
4384 if( c>='a' && c<='f' ) return c - 'a' + 10;
4385 if( c>='A' && c<='F' ) return c - 'A' + 10;
4386 return -1;
4390 ** Interpret zArg as an integer value, possibly with suffixes.
4392 static sqlite3_int64 integerValue(const char *zArg){
4393 sqlite3_int64 v = 0;
4394 static const struct { char *zSuffix; int iMult; } aMult[] = {
4395 { "KiB", 1024 },
4396 { "MiB", 1024*1024 },
4397 { "GiB", 1024*1024*1024 },
4398 { "KB", 1000 },
4399 { "MB", 1000000 },
4400 { "GB", 1000000000 },
4401 { "K", 1000 },
4402 { "M", 1000000 },
4403 { "G", 1000000000 },
4405 int i;
4406 int isNeg = 0;
4407 if( zArg[0]=='-' ){
4408 isNeg = 1;
4409 zArg++;
4410 }else if( zArg[0]=='+' ){
4411 zArg++;
4413 if( zArg[0]=='0' && zArg[1]=='x' ){
4414 int x;
4415 zArg += 2;
4416 while( (x = hexDigitValue(zArg[0]))>=0 ){
4417 v = (v<<4) + x;
4418 zArg++;
4420 }else{
4421 while( IsDigit(zArg[0]) ){
4422 v = v*10 + zArg[0] - '0';
4423 zArg++;
4426 for(i=0; i<ArraySize(aMult); i++){
4427 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
4428 v *= aMult[i].iMult;
4429 break;
4432 return isNeg? -v : v;
4436 ** Interpret zArg as either an integer or a boolean value. Return 1 or 0
4437 ** for TRUE and FALSE. Return the integer value if appropriate.
4439 static int booleanValue(const char *zArg){
4440 int i;
4441 if( zArg[0]=='0' && zArg[1]=='x' ){
4442 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
4443 }else{
4444 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
4446 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
4447 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
4448 return 1;
4450 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
4451 return 0;
4453 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
4454 zArg);
4455 return 0;
4459 ** Set or clear a shell flag according to a boolean value.
4461 static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
4462 if( booleanValue(zArg) ){
4463 ShellSetFlag(p, mFlag);
4464 }else{
4465 ShellClearFlag(p, mFlag);
4470 ** Close an output file, assuming it is not stderr or stdout
4472 static void output_file_close(FILE *f){
4473 if( f && f!=stdout && f!=stderr ) fclose(f);
4477 ** Try to open an output file. The names "stdout" and "stderr" are
4478 ** recognized and do the right thing. NULL is returned if the output
4479 ** filename is "off".
4481 static FILE *output_file_open(const char *zFile){
4482 FILE *f;
4483 if( strcmp(zFile,"stdout")==0 ){
4484 f = stdout;
4485 }else if( strcmp(zFile, "stderr")==0 ){
4486 f = stderr;
4487 }else if( strcmp(zFile, "off")==0 ){
4488 f = 0;
4489 }else{
4490 f = fopen(zFile, "wb");
4491 if( f==0 ){
4492 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
4495 return f;
4498 #if !defined(SQLITE_UNTESTABLE)
4499 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
4501 ** A routine for handling output from sqlite3_trace().
4503 static int sql_trace_callback(
4504 unsigned mType,
4505 void *pArg,
4506 void *pP,
4507 void *pX
4509 FILE *f = (FILE*)pArg;
4510 UNUSED_PARAMETER(mType);
4511 UNUSED_PARAMETER(pP);
4512 if( f ){
4513 const char *z = (const char*)pX;
4514 int i = (int)strlen(z);
4515 while( i>0 && z[i-1]==';' ){ i--; }
4516 utf8_printf(f, "%.*s;\n", i, z);
4518 return 0;
4520 #endif
4521 #endif
4524 ** A no-op routine that runs with the ".breakpoint" doc-command. This is
4525 ** a useful spot to set a debugger breakpoint.
4527 static void test_breakpoint(void){
4528 static int nCall = 0;
4529 nCall++;
4533 ** An object used to read a CSV and other files for import.
4535 typedef struct ImportCtx ImportCtx;
4536 struct ImportCtx {
4537 const char *zFile; /* Name of the input file */
4538 FILE *in; /* Read the CSV text from this input stream */
4539 char *z; /* Accumulated text for a field */
4540 int n; /* Number of bytes in z */
4541 int nAlloc; /* Space allocated for z[] */
4542 int nLine; /* Current line number */
4543 int bNotFirst; /* True if one or more bytes already read */
4544 int cTerm; /* Character that terminated the most recent field */
4545 int cColSep; /* The column separator character. (Usually ",") */
4546 int cRowSep; /* The row separator character. (Usually "\n") */
4549 /* Append a single byte to z[] */
4550 static void import_append_char(ImportCtx *p, int c){
4551 if( p->n+1>=p->nAlloc ){
4552 p->nAlloc += p->nAlloc + 100;
4553 p->z = sqlite3_realloc64(p->z, p->nAlloc);
4554 if( p->z==0 ){
4555 raw_printf(stderr, "out of memory\n");
4556 exit(1);
4559 p->z[p->n++] = (char)c;
4562 /* Read a single field of CSV text. Compatible with rfc4180 and extended
4563 ** with the option of having a separator other than ",".
4565 ** + Input comes from p->in.
4566 ** + Store results in p->z of length p->n. Space to hold p->z comes
4567 ** from sqlite3_malloc64().
4568 ** + Use p->cSep as the column separator. The default is ",".
4569 ** + Use p->rSep as the row separator. The default is "\n".
4570 ** + Keep track of the line number in p->nLine.
4571 ** + Store the character that terminates the field in p->cTerm. Store
4572 ** EOF on end-of-file.
4573 ** + Report syntax errors on stderr
4575 static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
4576 int c;
4577 int cSep = p->cColSep;
4578 int rSep = p->cRowSep;
4579 p->n = 0;
4580 c = fgetc(p->in);
4581 if( c==EOF || seenInterrupt ){
4582 p->cTerm = EOF;
4583 return 0;
4585 if( c=='"' ){
4586 int pc, ppc;
4587 int startLine = p->nLine;
4588 int cQuote = c;
4589 pc = ppc = 0;
4590 while( 1 ){
4591 c = fgetc(p->in);
4592 if( c==rSep ) p->nLine++;
4593 if( c==cQuote ){
4594 if( pc==cQuote ){
4595 pc = 0;
4596 continue;
4599 if( (c==cSep && pc==cQuote)
4600 || (c==rSep && pc==cQuote)
4601 || (c==rSep && pc=='\r' && ppc==cQuote)
4602 || (c==EOF && pc==cQuote)
4604 do{ p->n--; }while( p->z[p->n]!=cQuote );
4605 p->cTerm = c;
4606 break;
4608 if( pc==cQuote && c!='\r' ){
4609 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
4610 p->zFile, p->nLine, cQuote);
4612 if( c==EOF ){
4613 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
4614 p->zFile, startLine, cQuote);
4615 p->cTerm = c;
4616 break;
4618 import_append_char(p, c);
4619 ppc = pc;
4620 pc = c;
4622 }else{
4623 /* If this is the first field being parsed and it begins with the
4624 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
4625 if( (c&0xff)==0xef && p->bNotFirst==0 ){
4626 import_append_char(p, c);
4627 c = fgetc(p->in);
4628 if( (c&0xff)==0xbb ){
4629 import_append_char(p, c);
4630 c = fgetc(p->in);
4631 if( (c&0xff)==0xbf ){
4632 p->bNotFirst = 1;
4633 p->n = 0;
4634 return csv_read_one_field(p);
4638 while( c!=EOF && c!=cSep && c!=rSep ){
4639 import_append_char(p, c);
4640 c = fgetc(p->in);
4642 if( c==rSep ){
4643 p->nLine++;
4644 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
4646 p->cTerm = c;
4648 if( p->z ) p->z[p->n] = 0;
4649 p->bNotFirst = 1;
4650 return p->z;
4653 /* Read a single field of ASCII delimited text.
4655 ** + Input comes from p->in.
4656 ** + Store results in p->z of length p->n. Space to hold p->z comes
4657 ** from sqlite3_malloc64().
4658 ** + Use p->cSep as the column separator. The default is "\x1F".
4659 ** + Use p->rSep as the row separator. The default is "\x1E".
4660 ** + Keep track of the row number in p->nLine.
4661 ** + Store the character that terminates the field in p->cTerm. Store
4662 ** EOF on end-of-file.
4663 ** + Report syntax errors on stderr
4665 static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
4666 int c;
4667 int cSep = p->cColSep;
4668 int rSep = p->cRowSep;
4669 p->n = 0;
4670 c = fgetc(p->in);
4671 if( c==EOF || seenInterrupt ){
4672 p->cTerm = EOF;
4673 return 0;
4675 while( c!=EOF && c!=cSep && c!=rSep ){
4676 import_append_char(p, c);
4677 c = fgetc(p->in);
4679 if( c==rSep ){
4680 p->nLine++;
4682 p->cTerm = c;
4683 if( p->z ) p->z[p->n] = 0;
4684 return p->z;
4688 ** Try to transfer data for table zTable. If an error is seen while
4689 ** moving forward, try to go backwards. The backwards movement won't
4690 ** work for WITHOUT ROWID tables.
4692 static void tryToCloneData(
4693 ShellState *p,
4694 sqlite3 *newDb,
4695 const char *zTable
4697 sqlite3_stmt *pQuery = 0;
4698 sqlite3_stmt *pInsert = 0;
4699 char *zQuery = 0;
4700 char *zInsert = 0;
4701 int rc;
4702 int i, j, n;
4703 int nTable = (int)strlen(zTable);
4704 int k = 0;
4705 int cnt = 0;
4706 const int spinRate = 10000;
4708 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
4709 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4710 if( rc ){
4711 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4712 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4713 zQuery);
4714 goto end_data_xfer;
4716 n = sqlite3_column_count(pQuery);
4717 zInsert = sqlite3_malloc64(200 + nTable + n*3);
4718 if( zInsert==0 ){
4719 raw_printf(stderr, "out of memory\n");
4720 goto end_data_xfer;
4722 sqlite3_snprintf(200+nTable,zInsert,
4723 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
4724 i = (int)strlen(zInsert);
4725 for(j=1; j<n; j++){
4726 memcpy(zInsert+i, ",?", 2);
4727 i += 2;
4729 memcpy(zInsert+i, ");", 3);
4730 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
4731 if( rc ){
4732 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4733 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
4734 zQuery);
4735 goto end_data_xfer;
4737 for(k=0; k<2; k++){
4738 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4739 for(i=0; i<n; i++){
4740 switch( sqlite3_column_type(pQuery, i) ){
4741 case SQLITE_NULL: {
4742 sqlite3_bind_null(pInsert, i+1);
4743 break;
4745 case SQLITE_INTEGER: {
4746 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
4747 break;
4749 case SQLITE_FLOAT: {
4750 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
4751 break;
4753 case SQLITE_TEXT: {
4754 sqlite3_bind_text(pInsert, i+1,
4755 (const char*)sqlite3_column_text(pQuery,i),
4756 -1, SQLITE_STATIC);
4757 break;
4759 case SQLITE_BLOB: {
4760 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
4761 sqlite3_column_bytes(pQuery,i),
4762 SQLITE_STATIC);
4763 break;
4766 } /* End for */
4767 rc = sqlite3_step(pInsert);
4768 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
4769 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
4770 sqlite3_errmsg(newDb));
4772 sqlite3_reset(pInsert);
4773 cnt++;
4774 if( (cnt%spinRate)==0 ){
4775 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
4776 fflush(stdout);
4778 } /* End while */
4779 if( rc==SQLITE_DONE ) break;
4780 sqlite3_finalize(pQuery);
4781 sqlite3_free(zQuery);
4782 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
4783 zTable);
4784 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4785 if( rc ){
4786 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
4787 break;
4789 } /* End for(k=0...) */
4791 end_data_xfer:
4792 sqlite3_finalize(pQuery);
4793 sqlite3_finalize(pInsert);
4794 sqlite3_free(zQuery);
4795 sqlite3_free(zInsert);
4800 ** Try to transfer all rows of the schema that match zWhere. For
4801 ** each row, invoke xForEach() on the object defined by that row.
4802 ** If an error is encountered while moving forward through the
4803 ** sqlite_master table, try again moving backwards.
4805 static void tryToCloneSchema(
4806 ShellState *p,
4807 sqlite3 *newDb,
4808 const char *zWhere,
4809 void (*xForEach)(ShellState*,sqlite3*,const char*)
4811 sqlite3_stmt *pQuery = 0;
4812 char *zQuery = 0;
4813 int rc;
4814 const unsigned char *zName;
4815 const unsigned char *zSql;
4816 char *zErrMsg = 0;
4818 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4819 " WHERE %s", zWhere);
4820 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4821 if( rc ){
4822 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4823 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4824 zQuery);
4825 goto end_schema_xfer;
4827 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4828 zName = sqlite3_column_text(pQuery, 0);
4829 zSql = sqlite3_column_text(pQuery, 1);
4830 printf("%s... ", zName); fflush(stdout);
4831 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4832 if( zErrMsg ){
4833 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4834 sqlite3_free(zErrMsg);
4835 zErrMsg = 0;
4837 if( xForEach ){
4838 xForEach(p, newDb, (const char*)zName);
4840 printf("done\n");
4842 if( rc!=SQLITE_DONE ){
4843 sqlite3_finalize(pQuery);
4844 sqlite3_free(zQuery);
4845 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4846 " WHERE %s ORDER BY rowid DESC", zWhere);
4847 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4848 if( rc ){
4849 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4850 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4851 zQuery);
4852 goto end_schema_xfer;
4854 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4855 zName = sqlite3_column_text(pQuery, 0);
4856 zSql = sqlite3_column_text(pQuery, 1);
4857 printf("%s... ", zName); fflush(stdout);
4858 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4859 if( zErrMsg ){
4860 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4861 sqlite3_free(zErrMsg);
4862 zErrMsg = 0;
4864 if( xForEach ){
4865 xForEach(p, newDb, (const char*)zName);
4867 printf("done\n");
4870 end_schema_xfer:
4871 sqlite3_finalize(pQuery);
4872 sqlite3_free(zQuery);
4876 ** Open a new database file named "zNewDb". Try to recover as much information
4877 ** as possible out of the main database (which might be corrupt) and write it
4878 ** into zNewDb.
4880 static void tryToClone(ShellState *p, const char *zNewDb){
4881 int rc;
4882 sqlite3 *newDb = 0;
4883 if( access(zNewDb,0)==0 ){
4884 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
4885 return;
4887 rc = sqlite3_open(zNewDb, &newDb);
4888 if( rc ){
4889 utf8_printf(stderr, "Cannot create output database: %s\n",
4890 sqlite3_errmsg(newDb));
4891 }else{
4892 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
4893 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
4894 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
4895 tryToCloneSchema(p, newDb, "type!='table'", 0);
4896 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
4897 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4899 sqlite3_close(newDb);
4903 ** Change the output file back to stdout
4905 static void output_reset(ShellState *p){
4906 if( p->outfile[0]=='|' ){
4907 #ifndef SQLITE_OMIT_POPEN
4908 pclose(p->out);
4909 #endif
4910 }else{
4911 output_file_close(p->out);
4913 p->outfile[0] = 0;
4914 p->out = stdout;
4918 ** Run an SQL command and return the single integer result.
4920 static int db_int(ShellState *p, const char *zSql){
4921 sqlite3_stmt *pStmt;
4922 int res = 0;
4923 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4924 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
4925 res = sqlite3_column_int(pStmt,0);
4927 sqlite3_finalize(pStmt);
4928 return res;
4932 ** Convert a 2-byte or 4-byte big-endian integer into a native integer
4934 static unsigned int get2byteInt(unsigned char *a){
4935 return (a[0]<<8) + a[1];
4937 static unsigned int get4byteInt(unsigned char *a){
4938 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
4942 ** Implementation of the ".info" command.
4944 ** Return 1 on error, 2 to exit, and 0 otherwise.
4946 static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
4947 static const struct { const char *zName; int ofst; } aField[] = {
4948 { "file change counter:", 24 },
4949 { "database page count:", 28 },
4950 { "freelist page count:", 36 },
4951 { "schema cookie:", 40 },
4952 { "schema format:", 44 },
4953 { "default cache size:", 48 },
4954 { "autovacuum top root:", 52 },
4955 { "incremental vacuum:", 64 },
4956 { "text encoding:", 56 },
4957 { "user version:", 60 },
4958 { "application id:", 68 },
4959 { "software version:", 96 },
4961 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4962 { "number of tables:",
4963 "SELECT count(*) FROM %s WHERE type='table'" },
4964 { "number of indexes:",
4965 "SELECT count(*) FROM %s WHERE type='index'" },
4966 { "number of triggers:",
4967 "SELECT count(*) FROM %s WHERE type='trigger'" },
4968 { "number of views:",
4969 "SELECT count(*) FROM %s WHERE type='view'" },
4970 { "schema size:",
4971 "SELECT total(length(sql)) FROM %s" },
4973 sqlite3_file *pFile = 0;
4974 int i;
4975 char *zSchemaTab;
4976 char *zDb = nArg>=2 ? azArg[1] : "main";
4977 unsigned char aHdr[100];
4978 open_db(p, 0);
4979 if( p->db==0 ) return 1;
4980 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
4981 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
4982 return 1;
4984 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
4985 if( i!=SQLITE_OK ){
4986 raw_printf(stderr, "unable to read database header\n");
4987 return 1;
4989 i = get2byteInt(aHdr+16);
4990 if( i==1 ) i = 65536;
4991 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4992 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4993 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
4994 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
4995 for(i=0; i<ArraySize(aField); i++){
4996 int ofst = aField[i].ofst;
4997 unsigned int val = get4byteInt(aHdr + ofst);
4998 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
4999 switch( ofst ){
5000 case 56: {
5001 if( val==1 ) raw_printf(p->out, " (utf8)");
5002 if( val==2 ) raw_printf(p->out, " (utf16le)");
5003 if( val==3 ) raw_printf(p->out, " (utf16be)");
5006 raw_printf(p->out, "\n");
5008 if( zDb==0 ){
5009 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
5010 }else if( strcmp(zDb,"temp")==0 ){
5011 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
5012 }else{
5013 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
5015 for(i=0; i<ArraySize(aQuery); i++){
5016 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
5017 int val = db_int(p, zSql);
5018 sqlite3_free(zSql);
5019 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
5021 sqlite3_free(zSchemaTab);
5022 return 0;
5026 ** Print the current sqlite3_errmsg() value to stderr and return 1.
5028 static int shellDatabaseError(sqlite3 *db){
5029 const char *zErr = sqlite3_errmsg(db);
5030 utf8_printf(stderr, "Error: %s\n", zErr);
5031 return 1;
5035 ** Print an out-of-memory message to stderr and return 1.
5037 static int shellNomemError(void){
5038 raw_printf(stderr, "Error: out of memory\n");
5039 return 1;
5043 ** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
5044 ** if they match and FALSE (0) if they do not match.
5046 ** Globbing rules:
5048 ** '*' Matches any sequence of zero or more characters.
5050 ** '?' Matches exactly one character.
5052 ** [...] Matches one character from the enclosed list of
5053 ** characters.
5055 ** [^...] Matches one character not in the enclosed list.
5057 ** '#' Matches any sequence of one or more digits with an
5058 ** optional + or - sign in front
5060 ** ' ' Any span of whitespace matches any other span of
5061 ** whitespace.
5063 ** Extra whitespace at the end of z[] is ignored.
5065 static int testcase_glob(const char *zGlob, const char *z){
5066 int c, c2;
5067 int invert;
5068 int seen;
5070 while( (c = (*(zGlob++)))!=0 ){
5071 if( IsSpace(c) ){
5072 if( !IsSpace(*z) ) return 0;
5073 while( IsSpace(*zGlob) ) zGlob++;
5074 while( IsSpace(*z) ) z++;
5075 }else if( c=='*' ){
5076 while( (c=(*(zGlob++))) == '*' || c=='?' ){
5077 if( c=='?' && (*(z++))==0 ) return 0;
5079 if( c==0 ){
5080 return 1;
5081 }else if( c=='[' ){
5082 while( *z && testcase_glob(zGlob-1,z)==0 ){
5083 z++;
5085 return (*z)!=0;
5087 while( (c2 = (*(z++)))!=0 ){
5088 while( c2!=c ){
5089 c2 = *(z++);
5090 if( c2==0 ) return 0;
5092 if( testcase_glob(zGlob,z) ) return 1;
5094 return 0;
5095 }else if( c=='?' ){
5096 if( (*(z++))==0 ) return 0;
5097 }else if( c=='[' ){
5098 int prior_c = 0;
5099 seen = 0;
5100 invert = 0;
5101 c = *(z++);
5102 if( c==0 ) return 0;
5103 c2 = *(zGlob++);
5104 if( c2=='^' ){
5105 invert = 1;
5106 c2 = *(zGlob++);
5108 if( c2==']' ){
5109 if( c==']' ) seen = 1;
5110 c2 = *(zGlob++);
5112 while( c2 && c2!=']' ){
5113 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
5114 c2 = *(zGlob++);
5115 if( c>=prior_c && c<=c2 ) seen = 1;
5116 prior_c = 0;
5117 }else{
5118 if( c==c2 ){
5119 seen = 1;
5121 prior_c = c2;
5123 c2 = *(zGlob++);
5125 if( c2==0 || (seen ^ invert)==0 ) return 0;
5126 }else if( c=='#' ){
5127 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
5128 if( !IsDigit(z[0]) ) return 0;
5129 z++;
5130 while( IsDigit(z[0]) ){ z++; }
5131 }else{
5132 if( c!=(*(z++)) ) return 0;
5135 while( IsSpace(*z) ){ z++; }
5136 return *z==0;
5141 ** Compare the string as a command-line option with either one or two
5142 ** initial "-" characters.
5144 static int optionMatch(const char *zStr, const char *zOpt){
5145 if( zStr[0]!='-' ) return 0;
5146 zStr++;
5147 if( zStr[0]=='-' ) zStr++;
5148 return strcmp(zStr, zOpt)==0;
5152 ** Delete a file.
5154 int shellDeleteFile(const char *zFilename){
5155 int rc;
5156 #ifdef _WIN32
5157 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
5158 rc = _wunlink(z);
5159 sqlite3_free(z);
5160 #else
5161 rc = unlink(zFilename);
5162 #endif
5163 return rc;
5168 ** The implementation of SQL scalar function fkey_collate_clause(), used
5169 ** by the ".lint fkey-indexes" command. This scalar function is always
5170 ** called with four arguments - the parent table name, the parent column name,
5171 ** the child table name and the child column name.
5173 ** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
5175 ** If either of the named tables or columns do not exist, this function
5176 ** returns an empty string. An empty string is also returned if both tables
5177 ** and columns exist but have the same default collation sequence. Or,
5178 ** if both exist but the default collation sequences are different, this
5179 ** function returns the string " COLLATE <parent-collation>", where
5180 ** <parent-collation> is the default collation sequence of the parent column.
5182 static void shellFkeyCollateClause(
5183 sqlite3_context *pCtx,
5184 int nVal,
5185 sqlite3_value **apVal
5187 sqlite3 *db = sqlite3_context_db_handle(pCtx);
5188 const char *zParent;
5189 const char *zParentCol;
5190 const char *zParentSeq;
5191 const char *zChild;
5192 const char *zChildCol;
5193 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
5194 int rc;
5196 assert( nVal==4 );
5197 zParent = (const char*)sqlite3_value_text(apVal[0]);
5198 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
5199 zChild = (const char*)sqlite3_value_text(apVal[2]);
5200 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
5202 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
5203 rc = sqlite3_table_column_metadata(
5204 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
5206 if( rc==SQLITE_OK ){
5207 rc = sqlite3_table_column_metadata(
5208 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
5212 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
5213 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
5214 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
5215 sqlite3_free(z);
5221 ** The implementation of dot-command ".lint fkey-indexes".
5223 static int lintFkeyIndexes(
5224 ShellState *pState, /* Current shell tool state */
5225 char **azArg, /* Array of arguments passed to dot command */
5226 int nArg /* Number of entries in azArg[] */
5228 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
5229 FILE *out = pState->out; /* Stream to write non-error output to */
5230 int bVerbose = 0; /* If -verbose is present */
5231 int bGroupByParent = 0; /* If -groupbyparent is present */
5232 int i; /* To iterate through azArg[] */
5233 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
5234 int rc; /* Return code */
5235 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
5238 ** This SELECT statement returns one row for each foreign key constraint
5239 ** in the schema of the main database. The column values are:
5241 ** 0. The text of an SQL statement similar to:
5243 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
5245 ** This is the same SELECT that the foreign keys implementation needs
5246 ** to run internally on child tables. If there is an index that can
5247 ** be used to optimize this query, then it can also be used by the FK
5248 ** implementation to optimize DELETE or UPDATE statements on the parent
5249 ** table.
5251 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
5252 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
5253 ** contains an index that can be used to optimize the query.
5255 ** 2. Human readable text that describes the child table and columns. e.g.
5257 ** "child_table(child_key1, child_key2)"
5259 ** 3. Human readable text that describes the parent table and columns. e.g.
5261 ** "parent_table(parent_key1, parent_key2)"
5263 ** 4. A full CREATE INDEX statement for an index that could be used to
5264 ** optimize DELETE or UPDATE statements on the parent table. e.g.
5266 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
5268 ** 5. The name of the parent table.
5270 ** These six values are used by the C logic below to generate the report.
5272 const char *zSql =
5273 "SELECT "
5274 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
5275 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
5276 " || fkey_collate_clause("
5277 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
5278 ", "
5279 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
5280 " || group_concat('*=?', ' AND ') || ')'"
5281 ", "
5282 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
5283 ", "
5284 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
5285 ", "
5286 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
5287 " || ' ON ' || quote(s.name) || '('"
5288 " || group_concat(quote(f.[from]) ||"
5289 " fkey_collate_clause("
5290 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
5291 " || ');'"
5292 ", "
5293 " f.[table] "
5294 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
5295 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
5296 "GROUP BY s.name, f.id "
5297 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
5299 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
5301 for(i=2; i<nArg; i++){
5302 int n = (int)strlen(azArg[i]);
5303 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
5304 bVerbose = 1;
5306 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
5307 bGroupByParent = 1;
5308 zIndent = " ";
5310 else{
5311 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
5312 azArg[0], azArg[1]
5314 return SQLITE_ERROR;
5318 /* Register the fkey_collate_clause() SQL function */
5319 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
5320 0, shellFkeyCollateClause, 0, 0
5324 if( rc==SQLITE_OK ){
5325 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
5327 if( rc==SQLITE_OK ){
5328 sqlite3_bind_int(pSql, 1, bGroupByParent);
5331 if( rc==SQLITE_OK ){
5332 int rc2;
5333 char *zPrev = 0;
5334 while( SQLITE_ROW==sqlite3_step(pSql) ){
5335 int res = -1;
5336 sqlite3_stmt *pExplain = 0;
5337 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
5338 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
5339 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
5340 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
5341 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
5342 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
5344 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
5345 if( rc!=SQLITE_OK ) break;
5346 if( SQLITE_ROW==sqlite3_step(pExplain) ){
5347 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
5348 res = (
5349 0==sqlite3_strglob(zGlob, zPlan)
5350 || 0==sqlite3_strglob(zGlobIPK, zPlan)
5353 rc = sqlite3_finalize(pExplain);
5354 if( rc!=SQLITE_OK ) break;
5356 if( res<0 ){
5357 raw_printf(stderr, "Error: internal error");
5358 break;
5359 }else{
5360 if( bGroupByParent
5361 && (bVerbose || res==0)
5362 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
5364 raw_printf(out, "-- Parent table %s\n", zParent);
5365 sqlite3_free(zPrev);
5366 zPrev = sqlite3_mprintf("%s", zParent);
5369 if( res==0 ){
5370 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
5371 }else if( bVerbose ){
5372 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
5373 zIndent, zFrom, zTarget
5378 sqlite3_free(zPrev);
5380 if( rc!=SQLITE_OK ){
5381 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5384 rc2 = sqlite3_finalize(pSql);
5385 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
5386 rc = rc2;
5387 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5389 }else{
5390 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
5393 return rc;
5397 ** Implementation of ".lint" dot command.
5399 static int lintDotCommand(
5400 ShellState *pState, /* Current shell tool state */
5401 char **azArg, /* Array of arguments passed to dot command */
5402 int nArg /* Number of entries in azArg[] */
5404 int n;
5405 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
5406 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
5407 return lintFkeyIndexes(pState, azArg, nArg);
5409 usage:
5410 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
5411 raw_printf(stderr, "Where sub-commands are:\n");
5412 raw_printf(stderr, " fkey-indexes\n");
5413 return SQLITE_ERROR;
5418 ** If an input line begins with "." then invoke this routine to
5419 ** process that line.
5421 ** Return 1 on error, 2 to exit, and 0 otherwise.
5423 static int do_meta_command(char *zLine, ShellState *p){
5424 int h = 1;
5425 int nArg = 0;
5426 int n, c;
5427 int rc = 0;
5428 char *azArg[50];
5430 /* Parse the input line into tokens.
5432 while( zLine[h] && nArg<ArraySize(azArg) ){
5433 while( IsSpace(zLine[h]) ){ h++; }
5434 if( zLine[h]==0 ) break;
5435 if( zLine[h]=='\'' || zLine[h]=='"' ){
5436 int delim = zLine[h++];
5437 azArg[nArg++] = &zLine[h];
5438 while( zLine[h] && zLine[h]!=delim ){
5439 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
5440 h++;
5442 if( zLine[h]==delim ){
5443 zLine[h++] = 0;
5445 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
5446 }else{
5447 azArg[nArg++] = &zLine[h];
5448 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
5449 if( zLine[h] ) zLine[h++] = 0;
5450 resolve_backslashes(azArg[nArg-1]);
5454 /* Process the input line.
5456 if( nArg==0 ) return 0; /* no tokens, no error */
5457 n = strlen30(azArg[0]);
5458 c = azArg[0][0];
5460 #ifndef SQLITE_OMIT_AUTHORIZATION
5461 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
5462 if( nArg!=2 ){
5463 raw_printf(stderr, "Usage: .auth ON|OFF\n");
5464 rc = 1;
5465 goto meta_command_exit;
5467 open_db(p, 0);
5468 if( booleanValue(azArg[1]) ){
5469 sqlite3_set_authorizer(p->db, shellAuth, p);
5470 }else{
5471 sqlite3_set_authorizer(p->db, 0, 0);
5473 }else
5474 #endif
5476 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
5477 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
5479 const char *zDestFile = 0;
5480 const char *zDb = 0;
5481 sqlite3 *pDest;
5482 sqlite3_backup *pBackup;
5483 int j;
5484 for(j=1; j<nArg; j++){
5485 const char *z = azArg[j];
5486 if( z[0]=='-' ){
5487 while( z[0]=='-' ) z++;
5488 /* No options to process at this time */
5490 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
5491 return 1;
5493 }else if( zDestFile==0 ){
5494 zDestFile = azArg[j];
5495 }else if( zDb==0 ){
5496 zDb = zDestFile;
5497 zDestFile = azArg[j];
5498 }else{
5499 raw_printf(stderr, "too many arguments to .backup\n");
5500 return 1;
5503 if( zDestFile==0 ){
5504 raw_printf(stderr, "missing FILENAME argument on .backup\n");
5505 return 1;
5507 if( zDb==0 ) zDb = "main";
5508 rc = sqlite3_open(zDestFile, &pDest);
5509 if( rc!=SQLITE_OK ){
5510 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
5511 sqlite3_close(pDest);
5512 return 1;
5514 open_db(p, 0);
5515 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
5516 if( pBackup==0 ){
5517 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
5518 sqlite3_close(pDest);
5519 return 1;
5521 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
5522 sqlite3_backup_finish(pBackup);
5523 if( rc==SQLITE_DONE ){
5524 rc = 0;
5525 }else{
5526 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
5527 rc = 1;
5529 sqlite3_close(pDest);
5530 }else
5532 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
5533 if( nArg==2 ){
5534 bail_on_error = booleanValue(azArg[1]);
5535 }else{
5536 raw_printf(stderr, "Usage: .bail on|off\n");
5537 rc = 1;
5539 }else
5541 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
5542 if( nArg==2 ){
5543 if( booleanValue(azArg[1]) ){
5544 setBinaryMode(p->out, 1);
5545 }else{
5546 setTextMode(p->out, 1);
5548 }else{
5549 raw_printf(stderr, "Usage: .binary on|off\n");
5550 rc = 1;
5552 }else
5554 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
5555 if( nArg==2 ){
5556 #if defined(_WIN32) || defined(WIN32)
5557 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
5558 rc = !SetCurrentDirectoryW(z);
5559 sqlite3_free(z);
5560 #else
5561 rc = chdir(azArg[1]);
5562 #endif
5563 if( rc ){
5564 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
5565 rc = 1;
5567 }else{
5568 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
5569 rc = 1;
5571 }else
5573 /* The undocumented ".breakpoint" command causes a call to the no-op
5574 ** routine named test_breakpoint().
5576 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
5577 test_breakpoint();
5578 }else
5580 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
5581 if( nArg==2 ){
5582 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
5583 }else{
5584 raw_printf(stderr, "Usage: .changes on|off\n");
5585 rc = 1;
5587 }else
5589 /* Cancel output redirection, if it is currently set (by .testcase)
5590 ** Then read the content of the testcase-out.txt file and compare against
5591 ** azArg[1]. If there are differences, report an error and exit.
5593 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
5594 char *zRes = 0;
5595 output_reset(p);
5596 if( nArg!=2 ){
5597 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
5598 rc = 2;
5599 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
5600 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
5601 rc = 2;
5602 }else if( testcase_glob(azArg[1],zRes)==0 ){
5603 utf8_printf(stderr,
5604 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
5605 p->zTestcase, azArg[1], zRes);
5606 rc = 2;
5607 }else{
5608 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
5609 p->nCheck++;
5611 sqlite3_free(zRes);
5612 }else
5614 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
5615 if( nArg==2 ){
5616 tryToClone(p, azArg[1]);
5617 }else{
5618 raw_printf(stderr, "Usage: .clone FILENAME\n");
5619 rc = 1;
5621 }else
5623 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
5624 ShellState data;
5625 char *zErrMsg = 0;
5626 open_db(p, 0);
5627 memcpy(&data, p, sizeof(data));
5628 data.showHeader = 0;
5629 data.cMode = data.mode = MODE_List;
5630 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
5631 data.cnt = 0;
5632 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
5633 callback, &data, &zErrMsg);
5634 if( zErrMsg ){
5635 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5636 sqlite3_free(zErrMsg);
5637 rc = 1;
5639 }else
5641 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
5642 rc = shell_dbinfo_command(p, nArg, azArg);
5643 }else
5645 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
5646 const char *zLike = 0;
5647 int i;
5648 int savedShowHeader = p->showHeader;
5649 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
5650 for(i=1; i<nArg; i++){
5651 if( azArg[i][0]=='-' ){
5652 const char *z = azArg[i]+1;
5653 if( z[0]=='-' ) z++;
5654 if( strcmp(z,"preserve-rowids")==0 ){
5655 #ifdef SQLITE_OMIT_VIRTUALTABLE
5656 raw_printf(stderr, "The --preserve-rowids option is not compatible"
5657 " with SQLITE_OMIT_VIRTUALTABLE\n");
5658 rc = 1;
5659 goto meta_command_exit;
5660 #else
5661 ShellSetFlag(p, SHFLG_PreserveRowid);
5662 #endif
5663 }else
5664 if( strcmp(z,"newlines")==0 ){
5665 ShellSetFlag(p, SHFLG_Newlines);
5666 }else
5668 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
5669 rc = 1;
5670 goto meta_command_exit;
5672 }else if( zLike ){
5673 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
5674 "?--newlines? ?LIKE-PATTERN?\n");
5675 rc = 1;
5676 goto meta_command_exit;
5677 }else{
5678 zLike = azArg[i];
5681 open_db(p, 0);
5682 /* When playing back a "dump", the content might appear in an order
5683 ** which causes immediate foreign key constraints to be violated.
5684 ** So disable foreign-key constraint enforcement to prevent problems. */
5685 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
5686 raw_printf(p->out, "BEGIN TRANSACTION;\n");
5687 p->writableSchema = 0;
5688 p->showHeader = 0;
5689 /* Set writable_schema=ON since doing so forces SQLite to initialize
5690 ** as much of the schema as it can even if the sqlite_master table is
5691 ** corrupt. */
5692 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
5693 p->nErr = 0;
5694 if( zLike==0 ){
5695 run_schema_dump_query(p,
5696 "SELECT name, type, sql FROM sqlite_master "
5697 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
5699 run_schema_dump_query(p,
5700 "SELECT name, type, sql FROM sqlite_master "
5701 "WHERE name=='sqlite_sequence'"
5703 run_table_dump_query(p,
5704 "SELECT sql FROM sqlite_master "
5705 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
5707 }else{
5708 char *zSql;
5709 zSql = sqlite3_mprintf(
5710 "SELECT name, type, sql FROM sqlite_master "
5711 "WHERE tbl_name LIKE %Q AND type=='table'"
5712 " AND sql NOT NULL", zLike);
5713 run_schema_dump_query(p,zSql);
5714 sqlite3_free(zSql);
5715 zSql = sqlite3_mprintf(
5716 "SELECT sql FROM sqlite_master "
5717 "WHERE sql NOT NULL"
5718 " AND type IN ('index','trigger','view')"
5719 " AND tbl_name LIKE %Q", zLike);
5720 run_table_dump_query(p, zSql, 0);
5721 sqlite3_free(zSql);
5723 if( p->writableSchema ){
5724 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
5725 p->writableSchema = 0;
5727 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5728 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
5729 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
5730 p->showHeader = savedShowHeader;
5731 }else
5733 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
5734 if( nArg==2 ){
5735 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
5736 }else{
5737 raw_printf(stderr, "Usage: .echo on|off\n");
5738 rc = 1;
5740 }else
5742 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
5743 if( nArg==2 ){
5744 if( strcmp(azArg[1],"full")==0 ){
5745 p->autoEQP = 2;
5746 }else{
5747 p->autoEQP = booleanValue(azArg[1]);
5749 }else{
5750 raw_printf(stderr, "Usage: .eqp on|off|full\n");
5751 rc = 1;
5753 }else
5755 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
5756 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
5757 rc = 2;
5758 }else
5760 /* The ".explain" command is automatic now. It is largely pointless. It
5761 ** retained purely for backwards compatibility */
5762 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
5763 int val = 1;
5764 if( nArg>=2 ){
5765 if( strcmp(azArg[1],"auto")==0 ){
5766 val = 99;
5767 }else{
5768 val = booleanValue(azArg[1]);
5771 if( val==1 && p->mode!=MODE_Explain ){
5772 p->normalMode = p->mode;
5773 p->mode = MODE_Explain;
5774 p->autoExplain = 0;
5775 }else if( val==0 ){
5776 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5777 p->autoExplain = 0;
5778 }else if( val==99 ){
5779 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5780 p->autoExplain = 1;
5782 }else
5784 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
5785 ShellState data;
5786 char *zErrMsg = 0;
5787 int doStats = 0;
5788 memcpy(&data, p, sizeof(data));
5789 data.showHeader = 0;
5790 data.cMode = data.mode = MODE_Semi;
5791 if( nArg==2 && optionMatch(azArg[1], "indent") ){
5792 data.cMode = data.mode = MODE_Pretty;
5793 nArg = 1;
5795 if( nArg!=1 ){
5796 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
5797 rc = 1;
5798 goto meta_command_exit;
5800 open_db(p, 0);
5801 rc = sqlite3_exec(p->db,
5802 "SELECT sql FROM"
5803 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
5804 " FROM sqlite_master UNION ALL"
5805 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
5806 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
5807 "ORDER BY rowid",
5808 callback, &data, &zErrMsg
5810 if( rc==SQLITE_OK ){
5811 sqlite3_stmt *pStmt;
5812 rc = sqlite3_prepare_v2(p->db,
5813 "SELECT rowid FROM sqlite_master"
5814 " WHERE name GLOB 'sqlite_stat[134]'",
5815 -1, &pStmt, 0);
5816 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
5817 sqlite3_finalize(pStmt);
5819 if( doStats==0 ){
5820 raw_printf(p->out, "/* No STAT tables available */\n");
5821 }else{
5822 raw_printf(p->out, "ANALYZE sqlite_master;\n");
5823 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
5824 callback, &data, &zErrMsg);
5825 data.cMode = data.mode = MODE_Insert;
5826 data.zDestTable = "sqlite_stat1";
5827 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
5828 shell_callback, &data,&zErrMsg);
5829 data.zDestTable = "sqlite_stat3";
5830 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
5831 shell_callback, &data,&zErrMsg);
5832 data.zDestTable = "sqlite_stat4";
5833 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
5834 shell_callback, &data, &zErrMsg);
5835 raw_printf(p->out, "ANALYZE sqlite_master;\n");
5837 }else
5839 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
5840 if( nArg==2 ){
5841 p->showHeader = booleanValue(azArg[1]);
5842 }else{
5843 raw_printf(stderr, "Usage: .headers on|off\n");
5844 rc = 1;
5846 }else
5848 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
5849 utf8_printf(p->out, "%s", zHelp);
5850 }else
5852 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
5853 char *zTable; /* Insert data into this table */
5854 char *zFile; /* Name of file to extra content from */
5855 sqlite3_stmt *pStmt = NULL; /* A statement */
5856 int nCol; /* Number of columns in the table */
5857 int nByte; /* Number of bytes in an SQL string */
5858 int i, j; /* Loop counters */
5859 int needCommit; /* True to COMMIT or ROLLBACK at end */
5860 int nSep; /* Number of bytes in p->colSeparator[] */
5861 char *zSql; /* An SQL statement */
5862 ImportCtx sCtx; /* Reader context */
5863 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
5864 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
5866 if( nArg!=3 ){
5867 raw_printf(stderr, "Usage: .import FILE TABLE\n");
5868 goto meta_command_exit;
5870 zFile = azArg[1];
5871 zTable = azArg[2];
5872 seenInterrupt = 0;
5873 memset(&sCtx, 0, sizeof(sCtx));
5874 open_db(p, 0);
5875 nSep = strlen30(p->colSeparator);
5876 if( nSep==0 ){
5877 raw_printf(stderr,
5878 "Error: non-null column separator required for import\n");
5879 return 1;
5881 if( nSep>1 ){
5882 raw_printf(stderr, "Error: multi-character column separators not allowed"
5883 " for import\n");
5884 return 1;
5886 nSep = strlen30(p->rowSeparator);
5887 if( nSep==0 ){
5888 raw_printf(stderr, "Error: non-null row separator required for import\n");
5889 return 1;
5891 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
5892 /* When importing CSV (only), if the row separator is set to the
5893 ** default output row separator, change it to the default input
5894 ** row separator. This avoids having to maintain different input
5895 ** and output row separators. */
5896 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
5897 nSep = strlen30(p->rowSeparator);
5899 if( nSep>1 ){
5900 raw_printf(stderr, "Error: multi-character row separators not allowed"
5901 " for import\n");
5902 return 1;
5904 sCtx.zFile = zFile;
5905 sCtx.nLine = 1;
5906 if( sCtx.zFile[0]=='|' ){
5907 #ifdef SQLITE_OMIT_POPEN
5908 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
5909 return 1;
5910 #else
5911 sCtx.in = popen(sCtx.zFile+1, "r");
5912 sCtx.zFile = "<pipe>";
5913 xCloser = pclose;
5914 #endif
5915 }else{
5916 sCtx.in = fopen(sCtx.zFile, "rb");
5917 xCloser = fclose;
5919 if( p->mode==MODE_Ascii ){
5920 xRead = ascii_read_one_field;
5921 }else{
5922 xRead = csv_read_one_field;
5924 if( sCtx.in==0 ){
5925 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
5926 return 1;
5928 sCtx.cColSep = p->colSeparator[0];
5929 sCtx.cRowSep = p->rowSeparator[0];
5930 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
5931 if( zSql==0 ){
5932 raw_printf(stderr, "Error: out of memory\n");
5933 xCloser(sCtx.in);
5934 return 1;
5936 nByte = strlen30(zSql);
5937 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5938 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
5939 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
5940 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
5941 char cSep = '(';
5942 while( xRead(&sCtx) ){
5943 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
5944 cSep = ',';
5945 if( sCtx.cTerm!=sCtx.cColSep ) break;
5947 if( cSep=='(' ){
5948 sqlite3_free(zCreate);
5949 sqlite3_free(sCtx.z);
5950 xCloser(sCtx.in);
5951 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
5952 return 1;
5954 zCreate = sqlite3_mprintf("%z\n)", zCreate);
5955 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
5956 sqlite3_free(zCreate);
5957 if( rc ){
5958 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
5959 sqlite3_errmsg(p->db));
5960 sqlite3_free(sCtx.z);
5961 xCloser(sCtx.in);
5962 return 1;
5964 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5966 sqlite3_free(zSql);
5967 if( rc ){
5968 if (pStmt) sqlite3_finalize(pStmt);
5969 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
5970 xCloser(sCtx.in);
5971 return 1;
5973 nCol = sqlite3_column_count(pStmt);
5974 sqlite3_finalize(pStmt);
5975 pStmt = 0;
5976 if( nCol==0 ) return 0; /* no columns, no error */
5977 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
5978 if( zSql==0 ){
5979 raw_printf(stderr, "Error: out of memory\n");
5980 xCloser(sCtx.in);
5981 return 1;
5983 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
5984 j = strlen30(zSql);
5985 for(i=1; i<nCol; i++){
5986 zSql[j++] = ',';
5987 zSql[j++] = '?';
5989 zSql[j++] = ')';
5990 zSql[j] = 0;
5991 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5992 sqlite3_free(zSql);
5993 if( rc ){
5994 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
5995 if (pStmt) sqlite3_finalize(pStmt);
5996 xCloser(sCtx.in);
5997 return 1;
5999 needCommit = sqlite3_get_autocommit(p->db);
6000 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
6002 int startLine = sCtx.nLine;
6003 for(i=0; i<nCol; i++){
6004 char *z = xRead(&sCtx);
6006 ** Did we reach end-of-file before finding any columns?
6007 ** If so, stop instead of NULL filling the remaining columns.
6009 if( z==0 && i==0 ) break;
6011 ** Did we reach end-of-file OR end-of-line before finding any
6012 ** columns in ASCII mode? If so, stop instead of NULL filling
6013 ** the remaining columns.
6015 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
6016 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
6017 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
6018 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6019 "filling the rest with NULL\n",
6020 sCtx.zFile, startLine, nCol, i+1);
6021 i += 2;
6022 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
6025 if( sCtx.cTerm==sCtx.cColSep ){
6027 xRead(&sCtx);
6028 i++;
6029 }while( sCtx.cTerm==sCtx.cColSep );
6030 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6031 "extras ignored\n",
6032 sCtx.zFile, startLine, nCol, i);
6034 if( i>=nCol ){
6035 sqlite3_step(pStmt);
6036 rc = sqlite3_reset(pStmt);
6037 if( rc!=SQLITE_OK ){
6038 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
6039 startLine, sqlite3_errmsg(p->db));
6042 }while( sCtx.cTerm!=EOF );
6044 xCloser(sCtx.in);
6045 sqlite3_free(sCtx.z);
6046 sqlite3_finalize(pStmt);
6047 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
6048 }else
6050 #ifndef SQLITE_UNTESTABLE
6051 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
6052 char *zSql;
6053 char *zCollist = 0;
6054 sqlite3_stmt *pStmt;
6055 int tnum = 0;
6056 int i;
6057 if( nArg!=3 ){
6058 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
6059 rc = 1;
6060 goto meta_command_exit;
6062 open_db(p, 0);
6063 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
6064 " WHERE name='%q' AND type='index'", azArg[1]);
6065 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6066 sqlite3_free(zSql);
6067 if( sqlite3_step(pStmt)==SQLITE_ROW ){
6068 tnum = sqlite3_column_int(pStmt, 0);
6070 sqlite3_finalize(pStmt);
6071 if( tnum==0 ){
6072 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
6073 rc = 1;
6074 goto meta_command_exit;
6076 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
6077 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6078 sqlite3_free(zSql);
6079 i = 0;
6080 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6081 char zLabel[20];
6082 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
6083 i++;
6084 if( zCol==0 ){
6085 if( sqlite3_column_int(pStmt,1)==-1 ){
6086 zCol = "_ROWID_";
6087 }else{
6088 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
6089 zCol = zLabel;
6092 if( zCollist==0 ){
6093 zCollist = sqlite3_mprintf("\"%w\"", zCol);
6094 }else{
6095 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
6098 sqlite3_finalize(pStmt);
6099 zSql = sqlite3_mprintf(
6100 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
6101 azArg[2], zCollist, zCollist);
6102 sqlite3_free(zCollist);
6103 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
6104 if( rc==SQLITE_OK ){
6105 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
6106 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
6107 if( rc ){
6108 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
6109 }else{
6110 utf8_printf(stdout, "%s;\n", zSql);
6111 raw_printf(stdout,
6112 "WARNING: writing to an imposter table will corrupt the index!\n"
6115 }else{
6116 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
6117 rc = 1;
6119 sqlite3_free(zSql);
6120 }else
6121 #endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
6123 #ifdef SQLITE_ENABLE_IOTRACE
6124 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
6125 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
6126 if( iotrace && iotrace!=stdout ) fclose(iotrace);
6127 iotrace = 0;
6128 if( nArg<2 ){
6129 sqlite3IoTrace = 0;
6130 }else if( strcmp(azArg[1], "-")==0 ){
6131 sqlite3IoTrace = iotracePrintf;
6132 iotrace = stdout;
6133 }else{
6134 iotrace = fopen(azArg[1], "w");
6135 if( iotrace==0 ){
6136 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
6137 sqlite3IoTrace = 0;
6138 rc = 1;
6139 }else{
6140 sqlite3IoTrace = iotracePrintf;
6143 }else
6144 #endif
6146 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
6147 static const struct {
6148 const char *zLimitName; /* Name of a limit */
6149 int limitCode; /* Integer code for that limit */
6150 } aLimit[] = {
6151 { "length", SQLITE_LIMIT_LENGTH },
6152 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
6153 { "column", SQLITE_LIMIT_COLUMN },
6154 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
6155 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
6156 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
6157 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
6158 { "attached", SQLITE_LIMIT_ATTACHED },
6159 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
6160 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
6161 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
6162 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
6164 int i, n2;
6165 open_db(p, 0);
6166 if( nArg==1 ){
6167 for(i=0; i<ArraySize(aLimit); i++){
6168 printf("%20s %d\n", aLimit[i].zLimitName,
6169 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
6171 }else if( nArg>3 ){
6172 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
6173 rc = 1;
6174 goto meta_command_exit;
6175 }else{
6176 int iLimit = -1;
6177 n2 = strlen30(azArg[1]);
6178 for(i=0; i<ArraySize(aLimit); i++){
6179 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
6180 if( iLimit<0 ){
6181 iLimit = i;
6182 }else{
6183 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
6184 rc = 1;
6185 goto meta_command_exit;
6189 if( iLimit<0 ){
6190 utf8_printf(stderr, "unknown limit: \"%s\"\n"
6191 "enter \".limits\" with no arguments for a list.\n",
6192 azArg[1]);
6193 rc = 1;
6194 goto meta_command_exit;
6196 if( nArg==3 ){
6197 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
6198 (int)integerValue(azArg[2]));
6200 printf("%20s %d\n", aLimit[iLimit].zLimitName,
6201 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
6203 }else
6205 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
6206 open_db(p, 0);
6207 lintDotCommand(p, azArg, nArg);
6208 }else
6210 #ifndef SQLITE_OMIT_LOAD_EXTENSION
6211 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
6212 const char *zFile, *zProc;
6213 char *zErrMsg = 0;
6214 if( nArg<2 ){
6215 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
6216 rc = 1;
6217 goto meta_command_exit;
6219 zFile = azArg[1];
6220 zProc = nArg>=3 ? azArg[2] : 0;
6221 open_db(p, 0);
6222 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
6223 if( rc!=SQLITE_OK ){
6224 utf8_printf(stderr, "Error: %s\n", zErrMsg);
6225 sqlite3_free(zErrMsg);
6226 rc = 1;
6228 }else
6229 #endif
6231 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
6232 if( nArg!=2 ){
6233 raw_printf(stderr, "Usage: .log FILENAME\n");
6234 rc = 1;
6235 }else{
6236 const char *zFile = azArg[1];
6237 output_file_close(p->pLog);
6238 p->pLog = output_file_open(zFile);
6240 }else
6242 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
6243 const char *zMode = nArg>=2 ? azArg[1] : "";
6244 int n2 = (int)strlen(zMode);
6245 int c2 = zMode[0];
6246 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
6247 p->mode = MODE_Line;
6248 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6249 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
6250 p->mode = MODE_Column;
6251 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6252 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
6253 p->mode = MODE_List;
6254 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
6255 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6256 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
6257 p->mode = MODE_Html;
6258 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
6259 p->mode = MODE_Tcl;
6260 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
6261 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6262 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
6263 p->mode = MODE_Csv;
6264 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
6265 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
6266 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
6267 p->mode = MODE_List;
6268 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
6269 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
6270 p->mode = MODE_Insert;
6271 set_table_name(p, nArg>=3 ? azArg[2] : "table");
6272 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
6273 p->mode = MODE_Quote;
6274 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
6275 p->mode = MODE_Ascii;
6276 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
6277 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
6278 }else if( nArg==1 ){
6279 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
6280 }else{
6281 raw_printf(stderr, "Error: mode should be one of: "
6282 "ascii column csv html insert line list quote tabs tcl\n");
6283 rc = 1;
6285 p->cMode = p->mode;
6286 }else
6288 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
6289 if( nArg==2 ){
6290 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
6291 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
6292 }else{
6293 raw_printf(stderr, "Usage: .nullvalue STRING\n");
6294 rc = 1;
6296 }else
6298 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
6299 char *zNewFilename; /* Name of the database file to open */
6300 int iName = 1; /* Index in azArg[] of the filename */
6301 int newFlag = 0; /* True to delete file before opening */
6302 /* Close the existing database */
6303 session_close_all(p);
6304 sqlite3_close(p->db);
6305 p->db = 0;
6306 p->zDbFilename = 0;
6307 sqlite3_free(p->zFreeOnClose);
6308 p->zFreeOnClose = 0;
6309 /* Check for command-line arguments */
6310 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
6311 const char *z = azArg[iName];
6312 if( optionMatch(z,"new") ){
6313 newFlag = 1;
6314 }else if( z[0]=='-' ){
6315 utf8_printf(stderr, "unknown option: %s\n", z);
6316 rc = 1;
6317 goto meta_command_exit;
6320 /* If a filename is specified, try to open it first */
6321 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
6322 if( zNewFilename ){
6323 if( newFlag ) shellDeleteFile(zNewFilename);
6324 p->zDbFilename = zNewFilename;
6325 open_db(p, 1);
6326 if( p->db==0 ){
6327 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
6328 sqlite3_free(zNewFilename);
6329 }else{
6330 p->zFreeOnClose = zNewFilename;
6333 if( p->db==0 ){
6334 /* As a fall-back open a TEMP database */
6335 p->zDbFilename = 0;
6336 open_db(p, 0);
6338 }else
6340 if( c=='o'
6341 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
6343 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
6344 if( nArg>2 ){
6345 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
6346 rc = 1;
6347 goto meta_command_exit;
6349 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
6350 if( nArg<2 ){
6351 raw_printf(stderr, "Usage: .once FILE\n");
6352 rc = 1;
6353 goto meta_command_exit;
6355 p->outCount = 2;
6356 }else{
6357 p->outCount = 0;
6359 output_reset(p);
6360 if( zFile[0]=='|' ){
6361 #ifdef SQLITE_OMIT_POPEN
6362 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
6363 rc = 1;
6364 p->out = stdout;
6365 #else
6366 p->out = popen(zFile + 1, "w");
6367 if( p->out==0 ){
6368 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
6369 p->out = stdout;
6370 rc = 1;
6371 }else{
6372 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6374 #endif
6375 }else{
6376 p->out = output_file_open(zFile);
6377 if( p->out==0 ){
6378 if( strcmp(zFile,"off")!=0 ){
6379 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
6381 p->out = stdout;
6382 rc = 1;
6383 } else {
6384 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6387 }else
6389 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
6390 int i;
6391 for(i=1; i<nArg; i++){
6392 if( i>1 ) raw_printf(p->out, " ");
6393 utf8_printf(p->out, "%s", azArg[i]);
6395 raw_printf(p->out, "\n");
6396 }else
6398 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
6399 if( nArg >= 2) {
6400 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
6402 if( nArg >= 3) {
6403 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
6405 }else
6407 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
6408 rc = 2;
6409 }else
6411 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
6412 FILE *alt;
6413 if( nArg!=2 ){
6414 raw_printf(stderr, "Usage: .read FILE\n");
6415 rc = 1;
6416 goto meta_command_exit;
6418 alt = fopen(azArg[1], "rb");
6419 if( alt==0 ){
6420 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
6421 rc = 1;
6422 }else{
6423 rc = process_input(p, alt);
6424 fclose(alt);
6426 }else
6428 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
6429 const char *zSrcFile;
6430 const char *zDb;
6431 sqlite3 *pSrc;
6432 sqlite3_backup *pBackup;
6433 int nTimeout = 0;
6435 if( nArg==2 ){
6436 zSrcFile = azArg[1];
6437 zDb = "main";
6438 }else if( nArg==3 ){
6439 zSrcFile = azArg[2];
6440 zDb = azArg[1];
6441 }else{
6442 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
6443 rc = 1;
6444 goto meta_command_exit;
6446 rc = sqlite3_open(zSrcFile, &pSrc);
6447 if( rc!=SQLITE_OK ){
6448 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
6449 sqlite3_close(pSrc);
6450 return 1;
6452 open_db(p, 0);
6453 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
6454 if( pBackup==0 ){
6455 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6456 sqlite3_close(pSrc);
6457 return 1;
6459 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
6460 || rc==SQLITE_BUSY ){
6461 if( rc==SQLITE_BUSY ){
6462 if( nTimeout++ >= 3 ) break;
6463 sqlite3_sleep(100);
6466 sqlite3_backup_finish(pBackup);
6467 if( rc==SQLITE_DONE ){
6468 rc = 0;
6469 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
6470 raw_printf(stderr, "Error: source database is busy\n");
6471 rc = 1;
6472 }else{
6473 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6474 rc = 1;
6476 sqlite3_close(pSrc);
6477 }else
6480 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
6481 if( nArg==2 ){
6482 p->scanstatsOn = booleanValue(azArg[1]);
6483 #ifndef SQLITE_ENABLE_STMT_SCANSTATUS
6484 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
6485 #endif
6486 }else{
6487 raw_printf(stderr, "Usage: .scanstats on|off\n");
6488 rc = 1;
6490 }else
6492 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
6493 ShellText sSelect;
6494 ShellState data;
6495 char *zErrMsg = 0;
6496 const char *zDiv = 0;
6497 int iSchema = 0;
6499 open_db(p, 0);
6500 memcpy(&data, p, sizeof(data));
6501 data.showHeader = 0;
6502 data.cMode = data.mode = MODE_Semi;
6503 initText(&sSelect);
6504 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
6505 data.cMode = data.mode = MODE_Pretty;
6506 nArg--;
6507 if( nArg==2 ) azArg[1] = azArg[2];
6509 if( nArg==2 && azArg[1][0]!='-' ){
6510 int i;
6511 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
6512 if( strcmp(azArg[1],"sqlite_master")==0 ){
6513 char *new_argv[2], *new_colv[2];
6514 new_argv[0] = "CREATE TABLE sqlite_master (\n"
6515 " type text,\n"
6516 " name text,\n"
6517 " tbl_name text,\n"
6518 " rootpage integer,\n"
6519 " sql text\n"
6520 ")";
6521 new_argv[1] = 0;
6522 new_colv[0] = "sql";
6523 new_colv[1] = 0;
6524 callback(&data, 1, new_argv, new_colv);
6525 rc = SQLITE_OK;
6526 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
6527 char *new_argv[2], *new_colv[2];
6528 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
6529 " type text,\n"
6530 " name text,\n"
6531 " tbl_name text,\n"
6532 " rootpage integer,\n"
6533 " sql text\n"
6534 ")";
6535 new_argv[1] = 0;
6536 new_colv[0] = "sql";
6537 new_colv[1] = 0;
6538 callback(&data, 1, new_argv, new_colv);
6539 rc = SQLITE_OK;
6540 }else{
6541 zDiv = "(";
6543 }else if( nArg==1 ){
6544 zDiv = "(";
6545 }else{
6546 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
6547 rc = 1;
6548 goto meta_command_exit;
6550 if( zDiv ){
6551 sqlite3_stmt *pStmt = 0;
6552 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
6553 -1, &pStmt, 0);
6554 if( rc ){
6555 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6556 sqlite3_finalize(pStmt);
6557 rc = 1;
6558 goto meta_command_exit;
6560 appendText(&sSelect, "SELECT sql FROM", 0);
6561 iSchema = 0;
6562 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6563 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
6564 char zScNum[30];
6565 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
6566 appendText(&sSelect, zDiv, 0);
6567 zDiv = " UNION ALL ";
6568 if( strcmp(zDb, "main")!=0 ){
6569 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
6570 appendText(&sSelect, zDb, '"');
6571 appendText(&sSelect, ") AS sql, type, tbl_name, name, rowid,", 0);
6572 appendText(&sSelect, zScNum, 0);
6573 appendText(&sSelect, " AS snum, ", 0);
6574 appendText(&sSelect, zDb, '\'');
6575 appendText(&sSelect, " AS sname FROM ", 0);
6576 appendText(&sSelect, zDb, '"');
6577 appendText(&sSelect, ".sqlite_master", 0);
6578 }else{
6579 appendText(&sSelect, "SELECT sql, type, tbl_name, name, rowid, ", 0);
6580 appendText(&sSelect, zScNum, 0);
6581 appendText(&sSelect, " AS snum, 'main' AS sname FROM sqlite_master",0);
6584 sqlite3_finalize(pStmt);
6585 appendText(&sSelect, ") WHERE ", 0);
6586 if( nArg>1 ){
6587 char *zQarg = sqlite3_mprintf("%Q", azArg[1]);
6588 if( strchr(azArg[1], '.') ){
6589 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
6590 }else{
6591 appendText(&sSelect, "lower(tbl_name)", 0);
6593 appendText(&sSelect, strchr(azArg[1], '*') ? " GLOB " : " LIKE ", 0);
6594 appendText(&sSelect, zQarg, 0);
6595 appendText(&sSelect, " AND ", 0);
6596 sqlite3_free(zQarg);
6598 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
6599 " ORDER BY snum, rowid", 0);
6600 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
6601 freeText(&sSelect);
6603 if( zErrMsg ){
6604 utf8_printf(stderr,"Error: %s\n", zErrMsg);
6605 sqlite3_free(zErrMsg);
6606 rc = 1;
6607 }else if( rc != SQLITE_OK ){
6608 raw_printf(stderr,"Error: querying schema information\n");
6609 rc = 1;
6610 }else{
6611 rc = 0;
6613 }else
6615 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
6616 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
6617 sqlite3SelectTrace = (int)integerValue(azArg[1]);
6618 }else
6619 #endif
6621 #if defined(SQLITE_ENABLE_SESSION)
6622 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
6623 OpenSession *pSession = &p->aSession[0];
6624 char **azCmd = &azArg[1];
6625 int iSes = 0;
6626 int nCmd = nArg - 1;
6627 int i;
6628 if( nArg<=1 ) goto session_syntax_error;
6629 open_db(p, 0);
6630 if( nArg>=3 ){
6631 for(iSes=0; iSes<p->nSession; iSes++){
6632 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
6634 if( iSes<p->nSession ){
6635 pSession = &p->aSession[iSes];
6636 azCmd++;
6637 nCmd--;
6638 }else{
6639 pSession = &p->aSession[0];
6640 iSes = 0;
6644 /* .session attach TABLE
6645 ** Invoke the sqlite3session_attach() interface to attach a particular
6646 ** table so that it is never filtered.
6648 if( strcmp(azCmd[0],"attach")==0 ){
6649 if( nCmd!=2 ) goto session_syntax_error;
6650 if( pSession->p==0 ){
6651 session_not_open:
6652 raw_printf(stderr, "ERROR: No sessions are open\n");
6653 }else{
6654 rc = sqlite3session_attach(pSession->p, azCmd[1]);
6655 if( rc ){
6656 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
6657 rc = 0;
6660 }else
6662 /* .session changeset FILE
6663 ** .session patchset FILE
6664 ** Write a changeset or patchset into a file. The file is overwritten.
6666 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
6667 FILE *out = 0;
6668 if( nCmd!=2 ) goto session_syntax_error;
6669 if( pSession->p==0 ) goto session_not_open;
6670 out = fopen(azCmd[1], "wb");
6671 if( out==0 ){
6672 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
6673 }else{
6674 int szChng;
6675 void *pChng;
6676 if( azCmd[0][0]=='c' ){
6677 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
6678 }else{
6679 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
6681 if( rc ){
6682 printf("Error: error code %d\n", rc);
6683 rc = 0;
6685 if( pChng
6686 && fwrite(pChng, szChng, 1, out)!=1 ){
6687 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
6688 szChng);
6690 sqlite3_free(pChng);
6691 fclose(out);
6693 }else
6695 /* .session close
6696 ** Close the identified session
6698 if( strcmp(azCmd[0], "close")==0 ){
6699 if( nCmd!=1 ) goto session_syntax_error;
6700 if( p->nSession ){
6701 session_close(pSession);
6702 p->aSession[iSes] = p->aSession[--p->nSession];
6704 }else
6706 /* .session enable ?BOOLEAN?
6707 ** Query or set the enable flag
6709 if( strcmp(azCmd[0], "enable")==0 ){
6710 int ii;
6711 if( nCmd>2 ) goto session_syntax_error;
6712 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6713 if( p->nSession ){
6714 ii = sqlite3session_enable(pSession->p, ii);
6715 utf8_printf(p->out, "session %s enable flag = %d\n",
6716 pSession->zName, ii);
6718 }else
6720 /* .session filter GLOB ....
6721 ** Set a list of GLOB patterns of table names to be excluded.
6723 if( strcmp(azCmd[0], "filter")==0 ){
6724 int ii, nByte;
6725 if( nCmd<2 ) goto session_syntax_error;
6726 if( p->nSession ){
6727 for(ii=0; ii<pSession->nFilter; ii++){
6728 sqlite3_free(pSession->azFilter[ii]);
6730 sqlite3_free(pSession->azFilter);
6731 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
6732 pSession->azFilter = sqlite3_malloc( nByte );
6733 if( pSession->azFilter==0 ){
6734 raw_printf(stderr, "Error: out or memory\n");
6735 exit(1);
6737 for(ii=1; ii<nCmd; ii++){
6738 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
6740 pSession->nFilter = ii-1;
6742 }else
6744 /* .session indirect ?BOOLEAN?
6745 ** Query or set the indirect flag
6747 if( strcmp(azCmd[0], "indirect")==0 ){
6748 int ii;
6749 if( nCmd>2 ) goto session_syntax_error;
6750 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6751 if( p->nSession ){
6752 ii = sqlite3session_indirect(pSession->p, ii);
6753 utf8_printf(p->out, "session %s indirect flag = %d\n",
6754 pSession->zName, ii);
6756 }else
6758 /* .session isempty
6759 ** Determine if the session is empty
6761 if( strcmp(azCmd[0], "isempty")==0 ){
6762 int ii;
6763 if( nCmd!=1 ) goto session_syntax_error;
6764 if( p->nSession ){
6765 ii = sqlite3session_isempty(pSession->p);
6766 utf8_printf(p->out, "session %s isempty flag = %d\n",
6767 pSession->zName, ii);
6769 }else
6771 /* .session list
6772 ** List all currently open sessions
6774 if( strcmp(azCmd[0],"list")==0 ){
6775 for(i=0; i<p->nSession; i++){
6776 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
6778 }else
6780 /* .session open DB NAME
6781 ** Open a new session called NAME on the attached database DB.
6782 ** DB is normally "main".
6784 if( strcmp(azCmd[0],"open")==0 ){
6785 char *zName;
6786 if( nCmd!=3 ) goto session_syntax_error;
6787 zName = azCmd[2];
6788 if( zName[0]==0 ) goto session_syntax_error;
6789 for(i=0; i<p->nSession; i++){
6790 if( strcmp(p->aSession[i].zName,zName)==0 ){
6791 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
6792 goto meta_command_exit;
6795 if( p->nSession>=ArraySize(p->aSession) ){
6796 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
6797 goto meta_command_exit;
6799 pSession = &p->aSession[p->nSession];
6800 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
6801 if( rc ){
6802 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
6803 rc = 0;
6804 goto meta_command_exit;
6806 pSession->nFilter = 0;
6807 sqlite3session_table_filter(pSession->p, session_filter, pSession);
6808 p->nSession++;
6809 pSession->zName = sqlite3_mprintf("%s", zName);
6810 }else
6811 /* If no command name matches, show a syntax error */
6812 session_syntax_error:
6813 session_help(p);
6814 }else
6815 #endif
6817 #ifdef SQLITE_DEBUG
6818 /* Undocumented commands for internal testing. Subject to change
6819 ** without notice. */
6820 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
6821 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
6822 int i, v;
6823 for(i=1; i<nArg; i++){
6824 v = booleanValue(azArg[i]);
6825 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
6828 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
6829 int i; sqlite3_int64 v;
6830 for(i=1; i<nArg; i++){
6831 char zBuf[200];
6832 v = integerValue(azArg[i]);
6833 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
6834 utf8_printf(p->out, "%s", zBuf);
6837 }else
6838 #endif
6840 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
6841 int bIsInit = 0; /* True to initialize the SELFTEST table */
6842 int bVerbose = 0; /* Verbose output */
6843 int bSelftestExists; /* True if SELFTEST already exists */
6844 int i, k; /* Loop counters */
6845 int nTest = 0; /* Number of tests runs */
6846 int nErr = 0; /* Number of errors seen */
6847 ShellText str; /* Answer for a query */
6848 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
6850 open_db(p,0);
6851 for(i=1; i<nArg; i++){
6852 const char *z = azArg[i];
6853 if( z[0]=='-' && z[1]=='-' ) z++;
6854 if( strcmp(z,"-init")==0 ){
6855 bIsInit = 1;
6856 }else
6857 if( strcmp(z,"-v")==0 ){
6858 bVerbose++;
6859 }else
6861 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
6862 azArg[i], azArg[0]);
6863 raw_printf(stderr, "Should be one of: --init -v\n");
6864 rc = 1;
6865 goto meta_command_exit;
6868 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
6869 != SQLITE_OK ){
6870 bSelftestExists = 0;
6871 }else{
6872 bSelftestExists = 1;
6874 if( bIsInit ){
6875 createSelftestTable(p);
6876 bSelftestExists = 1;
6878 initText(&str);
6879 appendText(&str, "x", 0);
6880 for(k=bSelftestExists; k>=0; k--){
6881 if( k==1 ){
6882 rc = sqlite3_prepare_v2(p->db,
6883 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
6884 -1, &pStmt, 0);
6885 }else{
6886 rc = sqlite3_prepare_v2(p->db,
6887 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
6888 " (1,'run','PRAGMA integrity_check','ok')",
6889 -1, &pStmt, 0);
6891 if( rc ){
6892 raw_printf(stderr, "Error querying the selftest table\n");
6893 rc = 1;
6894 sqlite3_finalize(pStmt);
6895 goto meta_command_exit;
6897 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
6898 int tno = sqlite3_column_int(pStmt, 0);
6899 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
6900 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
6901 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
6903 k = 0;
6904 if( bVerbose>0 ){
6905 char *zQuote = sqlite3_mprintf("%q", zSql);
6906 printf("%d: %s %s\n", tno, zOp, zSql);
6907 sqlite3_free(zQuote);
6909 if( strcmp(zOp,"memo")==0 ){
6910 utf8_printf(p->out, "%s\n", zSql);
6911 }else
6912 if( strcmp(zOp,"run")==0 ){
6913 char *zErrMsg = 0;
6914 str.n = 0;
6915 str.z[0] = 0;
6916 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
6917 nTest++;
6918 if( bVerbose ){
6919 utf8_printf(p->out, "Result: %s\n", str.z);
6921 if( rc || zErrMsg ){
6922 nErr++;
6923 rc = 1;
6924 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
6925 sqlite3_free(zErrMsg);
6926 }else if( strcmp(zAns,str.z)!=0 ){
6927 nErr++;
6928 rc = 1;
6929 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
6930 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
6932 }else
6934 utf8_printf(stderr,
6935 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
6936 rc = 1;
6937 break;
6939 } /* End loop over rows of content from SELFTEST */
6940 sqlite3_finalize(pStmt);
6941 } /* End loop over k */
6942 freeText(&str);
6943 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
6944 }else
6946 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
6947 if( nArg<2 || nArg>3 ){
6948 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
6949 rc = 1;
6951 if( nArg>=2 ){
6952 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
6953 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
6955 if( nArg>=3 ){
6956 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
6957 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
6959 }else
6961 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
6962 const char *zLike = 0; /* Which table to checksum. 0 means everything */
6963 int i; /* Loop counter */
6964 int bSchema = 0; /* Also hash the schema */
6965 int bSeparate = 0; /* Hash each table separately */
6966 int iSize = 224; /* Hash algorithm to use */
6967 int bDebug = 0; /* Only show the query that would have run */
6968 sqlite3_stmt *pStmt; /* For querying tables names */
6969 char *zSql; /* SQL to be run */
6970 char *zSep; /* Separator */
6971 ShellText sSql; /* Complete SQL for the query to run the hash */
6972 ShellText sQuery; /* Set of queries used to read all content */
6973 open_db(p, 0);
6974 for(i=1; i<nArg; i++){
6975 const char *z = azArg[i];
6976 if( z[0]=='-' ){
6977 z++;
6978 if( z[0]=='-' ) z++;
6979 if( strcmp(z,"schema")==0 ){
6980 bSchema = 1;
6981 }else
6982 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
6983 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
6985 iSize = atoi(&z[5]);
6986 }else
6987 if( strcmp(z,"debug")==0 ){
6988 bDebug = 1;
6989 }else
6991 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
6992 azArg[i], azArg[0]);
6993 raw_printf(stderr, "Should be one of: --schema"
6994 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
6995 rc = 1;
6996 goto meta_command_exit;
6998 }else if( zLike ){
6999 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
7000 rc = 1;
7001 goto meta_command_exit;
7002 }else{
7003 zLike = z;
7004 bSeparate = 1;
7005 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
7008 if( bSchema ){
7009 zSql = "SELECT lower(name) FROM sqlite_master"
7010 " WHERE type='table' AND coalesce(rootpage,0)>1"
7011 " UNION ALL SELECT 'sqlite_master'"
7012 " ORDER BY 1 collate nocase";
7013 }else{
7014 zSql = "SELECT lower(name) FROM sqlite_master"
7015 " WHERE type='table' AND coalesce(rootpage,0)>1"
7016 " AND name NOT LIKE 'sqlite_%'"
7017 " ORDER BY 1 collate nocase";
7019 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
7020 initText(&sQuery);
7021 initText(&sSql);
7022 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
7023 zSep = "VALUES(";
7024 while( SQLITE_ROW==sqlite3_step(pStmt) ){
7025 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
7026 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
7027 if( strncmp(zTab, "sqlite_",7)!=0 ){
7028 appendText(&sQuery,"SELECT * FROM ", 0);
7029 appendText(&sQuery,zTab,'"');
7030 appendText(&sQuery," NOT INDEXED;", 0);
7031 }else if( strcmp(zTab, "sqlite_master")==0 ){
7032 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
7033 " ORDER BY name;", 0);
7034 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
7035 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
7036 " ORDER BY name;", 0);
7037 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
7038 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
7039 " ORDER BY tbl,idx;", 0);
7040 }else if( strcmp(zTab, "sqlite_stat3")==0
7041 || strcmp(zTab, "sqlite_stat4")==0 ){
7042 appendText(&sQuery, "SELECT * FROM ", 0);
7043 appendText(&sQuery, zTab, 0);
7044 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
7046 appendText(&sSql, zSep, 0);
7047 appendText(&sSql, sQuery.z, '\'');
7048 sQuery.n = 0;
7049 appendText(&sSql, ",", 0);
7050 appendText(&sSql, zTab, '\'');
7051 zSep = "),(";
7053 sqlite3_finalize(pStmt);
7054 if( bSeparate ){
7055 zSql = sqlite3_mprintf(
7056 "%s))"
7057 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
7058 " FROM [sha3sum$query]",
7059 sSql.z, iSize);
7060 }else{
7061 zSql = sqlite3_mprintf(
7062 "%s))"
7063 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
7064 " FROM [sha3sum$query]",
7065 sSql.z, iSize);
7067 freeText(&sQuery);
7068 freeText(&sSql);
7069 if( bDebug ){
7070 utf8_printf(p->out, "%s\n", zSql);
7071 }else{
7072 shell_exec(p->db, zSql, shell_callback, p, 0);
7074 sqlite3_free(zSql);
7075 }else
7077 if( c=='s'
7078 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
7080 char *zCmd;
7081 int i, x;
7082 if( nArg<2 ){
7083 raw_printf(stderr, "Usage: .system COMMAND\n");
7084 rc = 1;
7085 goto meta_command_exit;
7087 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
7088 for(i=2; i<nArg; i++){
7089 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
7090 zCmd, azArg[i]);
7092 x = system(zCmd);
7093 sqlite3_free(zCmd);
7094 if( x ) raw_printf(stderr, "System command returns %d\n", x);
7095 }else
7097 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
7098 static const char *azBool[] = { "off", "on", "full", "unk" };
7099 int i;
7100 if( nArg!=1 ){
7101 raw_printf(stderr, "Usage: .show\n");
7102 rc = 1;
7103 goto meta_command_exit;
7105 utf8_printf(p->out, "%12.12s: %s\n","echo",
7106 azBool[ShellHasFlag(p, SHFLG_Echo)]);
7107 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
7108 utf8_printf(p->out, "%12.12s: %s\n","explain",
7109 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
7110 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
7111 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
7112 utf8_printf(p->out, "%12.12s: ", "nullvalue");
7113 output_c_string(p->out, p->nullValue);
7114 raw_printf(p->out, "\n");
7115 utf8_printf(p->out,"%12.12s: %s\n","output",
7116 strlen30(p->outfile) ? p->outfile : "stdout");
7117 utf8_printf(p->out,"%12.12s: ", "colseparator");
7118 output_c_string(p->out, p->colSeparator);
7119 raw_printf(p->out, "\n");
7120 utf8_printf(p->out,"%12.12s: ", "rowseparator");
7121 output_c_string(p->out, p->rowSeparator);
7122 raw_printf(p->out, "\n");
7123 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
7124 utf8_printf(p->out, "%12.12s: ", "width");
7125 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
7126 raw_printf(p->out, "%d ", p->colWidth[i]);
7128 raw_printf(p->out, "\n");
7129 utf8_printf(p->out, "%12.12s: %s\n", "filename",
7130 p->zDbFilename ? p->zDbFilename : "");
7131 }else
7133 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
7134 if( nArg==2 ){
7135 p->statsOn = booleanValue(azArg[1]);
7136 }else if( nArg==1 ){
7137 display_stats(p->db, p, 0);
7138 }else{
7139 raw_printf(stderr, "Usage: .stats ?on|off?\n");
7140 rc = 1;
7142 }else
7144 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
7145 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
7146 || strncmp(azArg[0], "indexes", n)==0) )
7148 sqlite3_stmt *pStmt;
7149 char **azResult;
7150 int nRow, nAlloc;
7151 int ii;
7152 ShellText s;
7153 initText(&s);
7154 open_db(p, 0);
7155 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
7156 if( rc ) return shellDatabaseError(p->db);
7158 if( nArg>2 && c=='i' ){
7159 /* It is an historical accident that the .indexes command shows an error
7160 ** when called with the wrong number of arguments whereas the .tables
7161 ** command does not. */
7162 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
7163 rc = 1;
7164 goto meta_command_exit;
7166 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
7167 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
7168 if( zDbName==0 ) continue;
7169 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
7170 if( sqlite3_stricmp(zDbName, "main")==0 ){
7171 appendText(&s, "SELECT name FROM ", 0);
7172 }else{
7173 appendText(&s, "SELECT ", 0);
7174 appendText(&s, zDbName, '\'');
7175 appendText(&s, "||'.'||name FROM ", 0);
7177 appendText(&s, zDbName, '"');
7178 appendText(&s, ".sqlite_master ", 0);
7179 if( c=='t' ){
7180 appendText(&s," WHERE type IN ('table','view')"
7181 " AND name NOT LIKE 'sqlite_%'"
7182 " AND name LIKE ?1", 0);
7183 }else{
7184 appendText(&s," WHERE type='index'"
7185 " AND tbl_name LIKE ?1", 0);
7188 rc = sqlite3_finalize(pStmt);
7189 appendText(&s, " ORDER BY 1", 0);
7190 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
7191 freeText(&s);
7192 if( rc ) return shellDatabaseError(p->db);
7194 /* Run the SQL statement prepared by the above block. Store the results
7195 ** as an array of nul-terminated strings in azResult[]. */
7196 nRow = nAlloc = 0;
7197 azResult = 0;
7198 if( nArg>1 ){
7199 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
7200 }else{
7201 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
7203 while( sqlite3_step(pStmt)==SQLITE_ROW ){
7204 if( nRow>=nAlloc ){
7205 char **azNew;
7206 int n2 = nAlloc*2 + 10;
7207 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
7208 if( azNew==0 ){
7209 rc = shellNomemError();
7210 break;
7212 nAlloc = n2;
7213 azResult = azNew;
7215 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
7216 if( 0==azResult[nRow] ){
7217 rc = shellNomemError();
7218 break;
7220 nRow++;
7222 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
7223 rc = shellDatabaseError(p->db);
7226 /* Pretty-print the contents of array azResult[] to the output */
7227 if( rc==0 && nRow>0 ){
7228 int len, maxlen = 0;
7229 int i, j;
7230 int nPrintCol, nPrintRow;
7231 for(i=0; i<nRow; i++){
7232 len = strlen30(azResult[i]);
7233 if( len>maxlen ) maxlen = len;
7235 nPrintCol = 80/(maxlen+2);
7236 if( nPrintCol<1 ) nPrintCol = 1;
7237 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
7238 for(i=0; i<nPrintRow; i++){
7239 for(j=i; j<nRow; j+=nPrintRow){
7240 char *zSp = j<nPrintRow ? "" : " ";
7241 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
7242 azResult[j] ? azResult[j]:"");
7244 raw_printf(p->out, "\n");
7248 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
7249 sqlite3_free(azResult);
7250 }else
7252 /* Begin redirecting output to the file "testcase-out.txt" */
7253 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
7254 output_reset(p);
7255 p->out = output_file_open("testcase-out.txt");
7256 if( p->out==0 ){
7257 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
7259 if( nArg>=2 ){
7260 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
7261 }else{
7262 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
7264 }else
7266 #ifndef SQLITE_UNTESTABLE
7267 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
7268 static const struct {
7269 const char *zCtrlName; /* Name of a test-control option */
7270 int ctrlCode; /* Integer code for that option */
7271 } aCtrl[] = {
7272 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
7273 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
7274 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
7275 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
7276 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
7277 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
7278 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
7279 { "assert", SQLITE_TESTCTRL_ASSERT },
7280 { "always", SQLITE_TESTCTRL_ALWAYS },
7281 { "reserve", SQLITE_TESTCTRL_RESERVE },
7282 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
7283 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
7284 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
7285 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
7286 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
7288 int testctrl = -1;
7289 int rc2 = 0;
7290 int i, n2;
7291 open_db(p, 0);
7293 /* convert testctrl text option to value. allow any unique prefix
7294 ** of the option name, or a numerical value. */
7295 n2 = strlen30(azArg[1]);
7296 for(i=0; i<ArraySize(aCtrl); i++){
7297 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
7298 if( testctrl<0 ){
7299 testctrl = aCtrl[i].ctrlCode;
7300 }else{
7301 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
7302 testctrl = -1;
7303 break;
7307 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
7308 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
7309 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
7310 }else{
7311 switch(testctrl){
7313 /* sqlite3_test_control(int, db, int) */
7314 case SQLITE_TESTCTRL_OPTIMIZATIONS:
7315 case SQLITE_TESTCTRL_RESERVE:
7316 if( nArg==3 ){
7317 int opt = (int)strtol(azArg[2], 0, 0);
7318 rc2 = sqlite3_test_control(testctrl, p->db, opt);
7319 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7320 } else {
7321 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
7322 azArg[1]);
7324 break;
7326 /* sqlite3_test_control(int) */
7327 case SQLITE_TESTCTRL_PRNG_SAVE:
7328 case SQLITE_TESTCTRL_PRNG_RESTORE:
7329 case SQLITE_TESTCTRL_PRNG_RESET:
7330 case SQLITE_TESTCTRL_BYTEORDER:
7331 if( nArg==2 ){
7332 rc2 = sqlite3_test_control(testctrl);
7333 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7334 } else {
7335 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
7336 azArg[1]);
7338 break;
7340 /* sqlite3_test_control(int, uint) */
7341 case SQLITE_TESTCTRL_PENDING_BYTE:
7342 if( nArg==3 ){
7343 unsigned int opt = (unsigned int)integerValue(azArg[2]);
7344 rc2 = sqlite3_test_control(testctrl, opt);
7345 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7346 } else {
7347 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
7348 " int option\n", azArg[1]);
7350 break;
7352 /* sqlite3_test_control(int, int) */
7353 case SQLITE_TESTCTRL_ASSERT:
7354 case SQLITE_TESTCTRL_ALWAYS:
7355 case SQLITE_TESTCTRL_NEVER_CORRUPT:
7356 if( nArg==3 ){
7357 int opt = booleanValue(azArg[2]);
7358 rc2 = sqlite3_test_control(testctrl, opt);
7359 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7360 } else {
7361 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
7362 azArg[1]);
7364 break;
7366 /* sqlite3_test_control(int, char *) */
7367 #ifdef SQLITE_N_KEYWORD
7368 case SQLITE_TESTCTRL_ISKEYWORD:
7369 if( nArg==3 ){
7370 const char *opt = azArg[2];
7371 rc2 = sqlite3_test_control(testctrl, opt);
7372 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7373 } else {
7374 utf8_printf(stderr,
7375 "Error: testctrl %s takes a single char * option\n",
7376 azArg[1]);
7378 break;
7379 #endif
7381 case SQLITE_TESTCTRL_IMPOSTER:
7382 if( nArg==5 ){
7383 rc2 = sqlite3_test_control(testctrl, p->db,
7384 azArg[2],
7385 integerValue(azArg[3]),
7386 integerValue(azArg[4]));
7387 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
7388 }else{
7389 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
7391 break;
7393 case SQLITE_TESTCTRL_BITVEC_TEST:
7394 case SQLITE_TESTCTRL_FAULT_INSTALL:
7395 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
7396 default:
7397 utf8_printf(stderr,
7398 "Error: CLI support for testctrl %s not implemented\n",
7399 azArg[1]);
7400 break;
7403 }else
7404 #endif /* !defined(SQLITE_UNTESTABLE) */
7406 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
7407 open_db(p, 0);
7408 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
7409 }else
7411 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
7412 if( nArg==2 ){
7413 enableTimer = booleanValue(azArg[1]);
7414 if( enableTimer && !HAS_TIMER ){
7415 raw_printf(stderr, "Error: timer not available on this system.\n");
7416 enableTimer = 0;
7418 }else{
7419 raw_printf(stderr, "Usage: .timer on|off\n");
7420 rc = 1;
7422 }else
7424 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
7425 open_db(p, 0);
7426 if( nArg!=2 ){
7427 raw_printf(stderr, "Usage: .trace FILE|off\n");
7428 rc = 1;
7429 goto meta_command_exit;
7431 output_file_close(p->traceOut);
7432 p->traceOut = output_file_open(azArg[1]);
7433 #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
7434 if( p->traceOut==0 ){
7435 sqlite3_trace_v2(p->db, 0, 0, 0);
7436 }else{
7437 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
7439 #endif
7440 }else
7442 #if SQLITE_USER_AUTHENTICATION
7443 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
7444 if( nArg<2 ){
7445 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
7446 rc = 1;
7447 goto meta_command_exit;
7449 open_db(p, 0);
7450 if( strcmp(azArg[1],"login")==0 ){
7451 if( nArg!=4 ){
7452 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
7453 rc = 1;
7454 goto meta_command_exit;
7456 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
7457 (int)strlen(azArg[3]));
7458 if( rc ){
7459 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
7460 rc = 1;
7462 }else if( strcmp(azArg[1],"add")==0 ){
7463 if( nArg!=5 ){
7464 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
7465 rc = 1;
7466 goto meta_command_exit;
7468 rc = sqlite3_user_add(p->db, azArg[2],
7469 azArg[3], (int)strlen(azArg[3]),
7470 booleanValue(azArg[4]));
7471 if( rc ){
7472 raw_printf(stderr, "User-Add failed: %d\n", rc);
7473 rc = 1;
7475 }else if( strcmp(azArg[1],"edit")==0 ){
7476 if( nArg!=5 ){
7477 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
7478 rc = 1;
7479 goto meta_command_exit;
7481 rc = sqlite3_user_change(p->db, azArg[2],
7482 azArg[3], (int)strlen(azArg[3]),
7483 booleanValue(azArg[4]));
7484 if( rc ){
7485 raw_printf(stderr, "User-Edit failed: %d\n", rc);
7486 rc = 1;
7488 }else if( strcmp(azArg[1],"delete")==0 ){
7489 if( nArg!=3 ){
7490 raw_printf(stderr, "Usage: .user delete USER\n");
7491 rc = 1;
7492 goto meta_command_exit;
7494 rc = sqlite3_user_delete(p->db, azArg[2]);
7495 if( rc ){
7496 raw_printf(stderr, "User-Delete failed: %d\n", rc);
7497 rc = 1;
7499 }else{
7500 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
7501 rc = 1;
7502 goto meta_command_exit;
7504 }else
7505 #endif /* SQLITE_USER_AUTHENTICATION */
7507 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
7508 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
7509 sqlite3_libversion(), sqlite3_sourceid());
7510 }else
7512 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
7513 const char *zDbName = nArg==2 ? azArg[1] : "main";
7514 sqlite3_vfs *pVfs = 0;
7515 if( p->db ){
7516 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
7517 if( pVfs ){
7518 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
7519 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7520 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7521 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7524 }else
7526 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
7527 sqlite3_vfs *pVfs;
7528 sqlite3_vfs *pCurrent = 0;
7529 if( p->db ){
7530 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
7532 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
7533 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
7534 pVfs==pCurrent ? " <--- CURRENT" : "");
7535 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7536 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7537 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7538 if( pVfs->pNext ){
7539 raw_printf(p->out, "-----------------------------------\n");
7542 }else
7544 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
7545 const char *zDbName = nArg==2 ? azArg[1] : "main";
7546 char *zVfsName = 0;
7547 if( p->db ){
7548 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
7549 if( zVfsName ){
7550 utf8_printf(p->out, "%s\n", zVfsName);
7551 sqlite3_free(zVfsName);
7554 }else
7556 #if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
7557 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
7558 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
7559 }else
7560 #endif
7562 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
7563 int j;
7564 assert( nArg<=ArraySize(azArg) );
7565 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
7566 p->colWidth[j-1] = (int)integerValue(azArg[j]);
7568 }else
7571 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
7572 " \"%s\". Enter \".help\" for help\n", azArg[0]);
7573 rc = 1;
7576 meta_command_exit:
7577 if( p->outCount ){
7578 p->outCount--;
7579 if( p->outCount==0 ) output_reset(p);
7581 return rc;
7585 ** Return TRUE if a semicolon occurs anywhere in the first N characters
7586 ** of string z[].
7588 static int line_contains_semicolon(const char *z, int N){
7589 int i;
7590 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
7591 return 0;
7595 ** Test to see if a line consists entirely of whitespace.
7597 static int _all_whitespace(const char *z){
7598 for(; *z; z++){
7599 if( IsSpace(z[0]) ) continue;
7600 if( *z=='/' && z[1]=='*' ){
7601 z += 2;
7602 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
7603 if( *z==0 ) return 0;
7604 z++;
7605 continue;
7607 if( *z=='-' && z[1]=='-' ){
7608 z += 2;
7609 while( *z && *z!='\n' ){ z++; }
7610 if( *z==0 ) return 1;
7611 continue;
7613 return 0;
7615 return 1;
7619 ** Return TRUE if the line typed in is an SQL command terminator other
7620 ** than a semi-colon. The SQL Server style "go" command is understood
7621 ** as is the Oracle "/".
7623 static int line_is_command_terminator(const char *zLine){
7624 while( IsSpace(zLine[0]) ){ zLine++; };
7625 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
7626 return 1; /* Oracle */
7628 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
7629 && _all_whitespace(&zLine[2]) ){
7630 return 1; /* SQL Server */
7632 return 0;
7636 ** Return true if zSql is a complete SQL statement. Return false if it
7637 ** ends in the middle of a string literal or C-style comment.
7639 static int line_is_complete(char *zSql, int nSql){
7640 int rc;
7641 if( zSql==0 ) return 1;
7642 zSql[nSql] = ';';
7643 zSql[nSql+1] = 0;
7644 rc = sqlite3_complete(zSql);
7645 zSql[nSql] = 0;
7646 return rc;
7650 ** Run a single line of SQL
7652 static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
7653 int rc;
7654 char *zErrMsg = 0;
7656 open_db(p, 0);
7657 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
7658 BEGIN_TIMER;
7659 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
7660 END_TIMER;
7661 if( rc || zErrMsg ){
7662 char zPrefix[100];
7663 if( in!=0 || !stdin_is_interactive ){
7664 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
7665 "Error: near line %d:", startline);
7666 }else{
7667 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
7669 if( zErrMsg!=0 ){
7670 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
7671 sqlite3_free(zErrMsg);
7672 zErrMsg = 0;
7673 }else{
7674 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
7676 return 1;
7677 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
7678 raw_printf(p->out, "changes: %3d total_changes: %d\n",
7679 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
7681 return 0;
7686 ** Read input from *in and process it. If *in==0 then input
7687 ** is interactive - the user is typing it it. Otherwise, input
7688 ** is coming from a file or device. A prompt is issued and history
7689 ** is saved only if input is interactive. An interrupt signal will
7690 ** cause this routine to exit immediately, unless input is interactive.
7692 ** Return the number of errors.
7694 static int process_input(ShellState *p, FILE *in){
7695 char *zLine = 0; /* A single input line */
7696 char *zSql = 0; /* Accumulated SQL text */
7697 int nLine; /* Length of current line */
7698 int nSql = 0; /* Bytes of zSql[] used */
7699 int nAlloc = 0; /* Allocated zSql[] space */
7700 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
7701 int rc; /* Error code */
7702 int errCnt = 0; /* Number of errors seen */
7703 int lineno = 0; /* Current line number */
7704 int startline = 0; /* Line number for start of current input */
7706 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
7707 fflush(p->out);
7708 zLine = one_input_line(in, zLine, nSql>0);
7709 if( zLine==0 ){
7710 /* End of input */
7711 if( in==0 && stdin_is_interactive ) printf("\n");
7712 break;
7714 if( seenInterrupt ){
7715 if( in!=0 ) break;
7716 seenInterrupt = 0;
7718 lineno++;
7719 if( nSql==0 && _all_whitespace(zLine) ){
7720 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
7721 continue;
7723 if( zLine && zLine[0]=='.' && nSql==0 ){
7724 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
7725 rc = do_meta_command(zLine, p);
7726 if( rc==2 ){ /* exit requested */
7727 break;
7728 }else if( rc ){
7729 errCnt++;
7731 continue;
7733 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
7734 memcpy(zLine,";",2);
7736 nLine = strlen30(zLine);
7737 if( nSql+nLine+2>=nAlloc ){
7738 nAlloc = nSql+nLine+100;
7739 zSql = realloc(zSql, nAlloc);
7740 if( zSql==0 ){
7741 raw_printf(stderr, "Error: out of memory\n");
7742 exit(1);
7745 nSqlPrior = nSql;
7746 if( nSql==0 ){
7747 int i;
7748 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
7749 assert( nAlloc>0 && zSql!=0 );
7750 memcpy(zSql, zLine+i, nLine+1-i);
7751 startline = lineno;
7752 nSql = nLine-i;
7753 }else{
7754 zSql[nSql++] = '\n';
7755 memcpy(zSql+nSql, zLine, nLine+1);
7756 nSql += nLine;
7758 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
7759 && sqlite3_complete(zSql) ){
7760 errCnt += runOneSqlLine(p, zSql, in, startline);
7761 nSql = 0;
7762 if( p->outCount ){
7763 output_reset(p);
7764 p->outCount = 0;
7766 }else if( nSql && _all_whitespace(zSql) ){
7767 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
7768 nSql = 0;
7771 if( nSql && !_all_whitespace(zSql) ){
7772 runOneSqlLine(p, zSql, in, startline);
7774 free(zSql);
7775 free(zLine);
7776 return errCnt>0;
7780 ** Return a pathname which is the user's home directory. A
7781 ** 0 return indicates an error of some kind.
7783 static char *find_home_dir(int clearFlag){
7784 static char *home_dir = NULL;
7785 if( clearFlag ){
7786 free(home_dir);
7787 home_dir = 0;
7788 return 0;
7790 if( home_dir ) return home_dir;
7792 #if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
7793 && !defined(__RTP__) && !defined(_WRS_KERNEL)
7795 struct passwd *pwent;
7796 uid_t uid = getuid();
7797 if( (pwent=getpwuid(uid)) != NULL) {
7798 home_dir = pwent->pw_dir;
7801 #endif
7803 #if defined(_WIN32_WCE)
7804 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
7806 home_dir = "/";
7807 #else
7809 #if defined(_WIN32) || defined(WIN32)
7810 if (!home_dir) {
7811 home_dir = getenv("USERPROFILE");
7813 #endif
7815 if (!home_dir) {
7816 home_dir = getenv("HOME");
7819 #if defined(_WIN32) || defined(WIN32)
7820 if (!home_dir) {
7821 char *zDrive, *zPath;
7822 int n;
7823 zDrive = getenv("HOMEDRIVE");
7824 zPath = getenv("HOMEPATH");
7825 if( zDrive && zPath ){
7826 n = strlen30(zDrive) + strlen30(zPath) + 1;
7827 home_dir = malloc( n );
7828 if( home_dir==0 ) return 0;
7829 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
7830 return home_dir;
7832 home_dir = "c:\\";
7834 #endif
7836 #endif /* !_WIN32_WCE */
7838 if( home_dir ){
7839 int n = strlen30(home_dir) + 1;
7840 char *z = malloc( n );
7841 if( z ) memcpy(z, home_dir, n);
7842 home_dir = z;
7845 return home_dir;
7849 ** Read input from the file given by sqliterc_override. Or if that
7850 ** parameter is NULL, take input from ~/.sqliterc
7852 ** Returns the number of errors.
7854 static void process_sqliterc(
7855 ShellState *p, /* Configuration data */
7856 const char *sqliterc_override /* Name of config file. NULL to use default */
7858 char *home_dir = NULL;
7859 const char *sqliterc = sqliterc_override;
7860 char *zBuf = 0;
7861 FILE *in = NULL;
7863 if (sqliterc == NULL) {
7864 home_dir = find_home_dir(0);
7865 if( home_dir==0 ){
7866 raw_printf(stderr, "-- warning: cannot find home directory;"
7867 " cannot read ~/.sqliterc\n");
7868 return;
7870 sqlite3_initialize();
7871 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
7872 sqliterc = zBuf;
7874 in = fopen(sqliterc,"rb");
7875 if( in ){
7876 if( stdin_is_interactive ){
7877 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
7879 process_input(p,in);
7880 fclose(in);
7882 sqlite3_free(zBuf);
7886 ** Show available command line options
7888 static const char zOptions[] =
7889 " -ascii set output mode to 'ascii'\n"
7890 " -bail stop after hitting an error\n"
7891 " -batch force batch I/O\n"
7892 " -column set output mode to 'column'\n"
7893 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
7894 " -csv set output mode to 'csv'\n"
7895 " -echo print commands before execution\n"
7896 " -init FILENAME read/process named file\n"
7897 " -[no]header turn headers on or off\n"
7898 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
7899 " -heap SIZE Size of heap for memsys3 or memsys5\n"
7900 #endif
7901 " -help show this message\n"
7902 " -html set output mode to HTML\n"
7903 " -interactive force interactive I/O\n"
7904 " -line set output mode to 'line'\n"
7905 " -list set output mode to 'list'\n"
7906 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
7907 " -mmap N default mmap size set to N\n"
7908 #ifdef SQLITE_ENABLE_MULTIPLEX
7909 " -multiplex enable the multiplexor VFS\n"
7910 #endif
7911 " -newline SEP set output row separator. Default: '\\n'\n"
7912 " -nullvalue TEXT set text string for NULL values. Default ''\n"
7913 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
7914 " -quote set output mode to 'quote'\n"
7915 " -separator SEP set output column separator. Default: '|'\n"
7916 " -stats print memory stats before each finalize\n"
7917 " -version show SQLite version\n"
7918 " -vfs NAME use NAME as the default VFS\n"
7919 #ifdef SQLITE_ENABLE_VFSTRACE
7920 " -vfstrace enable tracing of all VFS calls\n"
7921 #endif
7923 static void usage(int showDetail){
7924 utf8_printf(stderr,
7925 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
7926 "FILENAME is the name of an SQLite database. A new database is created\n"
7927 "if the file does not previously exist.\n", Argv0);
7928 if( showDetail ){
7929 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
7930 }else{
7931 raw_printf(stderr, "Use the -help option for additional information\n");
7933 exit(1);
7937 ** Initialize the state information in data
7939 static void main_init(ShellState *data) {
7940 memset(data, 0, sizeof(*data));
7941 data->normalMode = data->cMode = data->mode = MODE_List;
7942 data->autoExplain = 1;
7943 memcpy(data->colSeparator,SEP_Column, 2);
7944 memcpy(data->rowSeparator,SEP_Row, 2);
7945 data->showHeader = 0;
7946 data->shellFlgs = SHFLG_Lookaside;
7947 sqlite3_config(SQLITE_CONFIG_URI, 1);
7948 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
7949 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
7950 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
7951 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
7955 ** Output text to the console in a font that attracts extra attention.
7957 #ifdef _WIN32
7958 static void printBold(const char *zText){
7959 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
7960 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
7961 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
7962 SetConsoleTextAttribute(out,
7963 FOREGROUND_RED|FOREGROUND_INTENSITY
7965 printf("%s", zText);
7966 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
7968 #else
7969 static void printBold(const char *zText){
7970 printf("\033[1m%s\033[0m", zText);
7972 #endif
7975 ** Get the argument to an --option. Throw an error and die if no argument
7976 ** is available.
7978 static char *cmdline_option_value(int argc, char **argv, int i){
7979 if( i==argc ){
7980 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
7981 argv[0], argv[argc-1]);
7982 exit(1);
7984 return argv[i];
7987 #ifndef SQLITE_SHELL_IS_UTF8
7988 # if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
7989 # define SQLITE_SHELL_IS_UTF8 (0)
7990 # else
7991 # define SQLITE_SHELL_IS_UTF8 (1)
7992 # endif
7993 #endif
7995 #if SQLITE_SHELL_IS_UTF8
7996 int SQLITE_CDECL main(int argc, char **argv){
7997 #else
7998 int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
7999 char **argv;
8000 #endif
8001 char *zErrMsg = 0;
8002 ShellState data;
8003 const char *zInitFile = 0;
8004 int i;
8005 int rc = 0;
8006 int warnInmemoryDb = 0;
8007 int readStdin = 1;
8008 int nCmd = 0;
8009 char **azCmd = 0;
8011 setBinaryMode(stdin, 0);
8012 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
8013 stdin_is_interactive = isatty(0);
8014 stdout_is_console = isatty(1);
8016 #if USE_SYSTEM_SQLITE+0!=1
8017 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
8018 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
8019 sqlite3_sourceid(), SQLITE_SOURCE_ID);
8020 exit(1);
8022 #endif
8023 main_init(&data);
8024 #if !SQLITE_SHELL_IS_UTF8
8025 sqlite3_initialize();
8026 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
8027 if( argv==0 ){
8028 raw_printf(stderr, "out of memory\n");
8029 exit(1);
8031 for(i=0; i<argc; i++){
8032 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
8033 if( argv[i]==0 ){
8034 raw_printf(stderr, "out of memory\n");
8035 exit(1);
8038 #endif
8039 assert( argc>=1 && argv && argv[0] );
8040 Argv0 = argv[0];
8042 /* Make sure we have a valid signal handler early, before anything
8043 ** else is done.
8045 #ifdef SIGINT
8046 signal(SIGINT, interrupt_handler);
8047 #endif
8049 #ifdef SQLITE_SHELL_DBNAME_PROC
8051 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
8052 ** of a C-function that will provide the name of the database file. Use
8053 ** this compile-time option to embed this shell program in larger
8054 ** applications. */
8055 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
8056 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
8057 warnInmemoryDb = 0;
8059 #endif
8061 /* Do an initial pass through the command-line argument to locate
8062 ** the name of the database file, the name of the initialization file,
8063 ** the size of the alternative malloc heap,
8064 ** and the first command to execute.
8066 for(i=1; i<argc; i++){
8067 char *z;
8068 z = argv[i];
8069 if( z[0]!='-' ){
8070 if( data.zDbFilename==0 ){
8071 data.zDbFilename = z;
8072 }else{
8073 /* Excesss arguments are interpreted as SQL (or dot-commands) and
8074 ** mean that nothing is read from stdin */
8075 readStdin = 0;
8076 nCmd++;
8077 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
8078 if( azCmd==0 ){
8079 raw_printf(stderr, "out of memory\n");
8080 exit(1);
8082 azCmd[nCmd-1] = z;
8085 if( z[1]=='-' ) z++;
8086 if( strcmp(z,"-separator")==0
8087 || strcmp(z,"-nullvalue")==0
8088 || strcmp(z,"-newline")==0
8089 || strcmp(z,"-cmd")==0
8091 (void)cmdline_option_value(argc, argv, ++i);
8092 }else if( strcmp(z,"-init")==0 ){
8093 zInitFile = cmdline_option_value(argc, argv, ++i);
8094 }else if( strcmp(z,"-batch")==0 ){
8095 /* Need to check for batch mode here to so we can avoid printing
8096 ** informational messages (like from process_sqliterc) before
8097 ** we do the actual processing of arguments later in a second pass.
8099 stdin_is_interactive = 0;
8100 }else if( strcmp(z,"-heap")==0 ){
8101 #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
8102 const char *zSize;
8103 sqlite3_int64 szHeap;
8105 zSize = cmdline_option_value(argc, argv, ++i);
8106 szHeap = integerValue(zSize);
8107 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
8108 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
8109 #else
8110 (void)cmdline_option_value(argc, argv, ++i);
8111 #endif
8112 }else if( strcmp(z,"-pagecache")==0 ){
8113 int n, sz;
8114 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8115 if( sz>70000 ) sz = 70000;
8116 if( sz<0 ) sz = 0;
8117 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8118 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
8119 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
8120 data.shellFlgs |= SHFLG_Pagecache;
8121 }else if( strcmp(z,"-lookaside")==0 ){
8122 int n, sz;
8123 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8124 if( sz<0 ) sz = 0;
8125 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8126 if( n<0 ) n = 0;
8127 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
8128 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
8129 #ifdef SQLITE_ENABLE_VFSTRACE
8130 }else if( strcmp(z,"-vfstrace")==0 ){
8131 extern int vfstrace_register(
8132 const char *zTraceName,
8133 const char *zOldVfsName,
8134 int (*xOut)(const char*,void*),
8135 void *pOutArg,
8136 int makeDefault
8138 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
8139 #endif
8140 #ifdef SQLITE_ENABLE_MULTIPLEX
8141 }else if( strcmp(z,"-multiplex")==0 ){
8142 extern int sqlite3_multiple_initialize(const char*,int);
8143 sqlite3_multiplex_initialize(0, 1);
8144 #endif
8145 }else if( strcmp(z,"-mmap")==0 ){
8146 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8147 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
8148 }else if( strcmp(z,"-vfs")==0 ){
8149 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
8150 if( pVfs ){
8151 sqlite3_vfs_register(pVfs, 1);
8152 }else{
8153 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
8154 exit(1);
8158 if( data.zDbFilename==0 ){
8159 #ifndef SQLITE_OMIT_MEMORYDB
8160 data.zDbFilename = ":memory:";
8161 warnInmemoryDb = argc==1;
8162 #else
8163 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
8164 return 1;
8165 #endif
8167 data.out = stdout;
8169 /* Go ahead and open the database file if it already exists. If the
8170 ** file does not exist, delay opening it. This prevents empty database
8171 ** files from being created if a user mistypes the database name argument
8172 ** to the sqlite command-line tool.
8174 if( access(data.zDbFilename, 0)==0 ){
8175 open_db(&data, 0);
8178 /* Process the initialization file if there is one. If no -init option
8179 ** is given on the command line, look for a file named ~/.sqliterc and
8180 ** try to process it.
8182 process_sqliterc(&data,zInitFile);
8184 /* Make a second pass through the command-line argument and set
8185 ** options. This second pass is delayed until after the initialization
8186 ** file is processed so that the command-line arguments will override
8187 ** settings in the initialization file.
8189 for(i=1; i<argc; i++){
8190 char *z = argv[i];
8191 if( z[0]!='-' ) continue;
8192 if( z[1]=='-' ){ z++; }
8193 if( strcmp(z,"-init")==0 ){
8194 i++;
8195 }else if( strcmp(z,"-html")==0 ){
8196 data.mode = MODE_Html;
8197 }else if( strcmp(z,"-list")==0 ){
8198 data.mode = MODE_List;
8199 }else if( strcmp(z,"-quote")==0 ){
8200 data.mode = MODE_Quote;
8201 }else if( strcmp(z,"-line")==0 ){
8202 data.mode = MODE_Line;
8203 }else if( strcmp(z,"-column")==0 ){
8204 data.mode = MODE_Column;
8205 }else if( strcmp(z,"-csv")==0 ){
8206 data.mode = MODE_Csv;
8207 memcpy(data.colSeparator,",",2);
8208 }else if( strcmp(z,"-ascii")==0 ){
8209 data.mode = MODE_Ascii;
8210 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8211 SEP_Unit);
8212 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8213 SEP_Record);
8214 }else if( strcmp(z,"-separator")==0 ){
8215 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8216 "%s",cmdline_option_value(argc,argv,++i));
8217 }else if( strcmp(z,"-newline")==0 ){
8218 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8219 "%s",cmdline_option_value(argc,argv,++i));
8220 }else if( strcmp(z,"-nullvalue")==0 ){
8221 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
8222 "%s",cmdline_option_value(argc,argv,++i));
8223 }else if( strcmp(z,"-header")==0 ){
8224 data.showHeader = 1;
8225 }else if( strcmp(z,"-noheader")==0 ){
8226 data.showHeader = 0;
8227 }else if( strcmp(z,"-echo")==0 ){
8228 ShellSetFlag(&data, SHFLG_Echo);
8229 }else if( strcmp(z,"-eqp")==0 ){
8230 data.autoEQP = 1;
8231 }else if( strcmp(z,"-eqpfull")==0 ){
8232 data.autoEQP = 2;
8233 }else if( strcmp(z,"-stats")==0 ){
8234 data.statsOn = 1;
8235 }else if( strcmp(z,"-scanstats")==0 ){
8236 data.scanstatsOn = 1;
8237 }else if( strcmp(z,"-backslash")==0 ){
8238 /* Undocumented command-line option: -backslash
8239 ** Causes C-style backslash escapes to be evaluated in SQL statements
8240 ** prior to sending the SQL into SQLite. Useful for injecting
8241 ** crazy bytes in the middle of SQL statements for testing and debugging.
8243 ShellSetFlag(&data, SHFLG_Backslash);
8244 }else if( strcmp(z,"-bail")==0 ){
8245 bail_on_error = 1;
8246 }else if( strcmp(z,"-version")==0 ){
8247 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
8248 return 0;
8249 }else if( strcmp(z,"-interactive")==0 ){
8250 stdin_is_interactive = 1;
8251 }else if( strcmp(z,"-batch")==0 ){
8252 stdin_is_interactive = 0;
8253 }else if( strcmp(z,"-heap")==0 ){
8254 i++;
8255 }else if( strcmp(z,"-pagecache")==0 ){
8256 i+=2;
8257 }else if( strcmp(z,"-lookaside")==0 ){
8258 i+=2;
8259 }else if( strcmp(z,"-mmap")==0 ){
8260 i++;
8261 }else if( strcmp(z,"-vfs")==0 ){
8262 i++;
8263 #ifdef SQLITE_ENABLE_VFSTRACE
8264 }else if( strcmp(z,"-vfstrace")==0 ){
8265 i++;
8266 #endif
8267 #ifdef SQLITE_ENABLE_MULTIPLEX
8268 }else if( strcmp(z,"-multiplex")==0 ){
8269 i++;
8270 #endif
8271 }else if( strcmp(z,"-help")==0 ){
8272 usage(1);
8273 }else if( strcmp(z,"-cmd")==0 ){
8274 /* Run commands that follow -cmd first and separately from commands
8275 ** that simply appear on the command-line. This seems goofy. It would
8276 ** be better if all commands ran in the order that they appear. But
8277 ** we retain the goofy behavior for historical compatibility. */
8278 if( i==argc-1 ) break;
8279 z = cmdline_option_value(argc,argv,++i);
8280 if( z[0]=='.' ){
8281 rc = do_meta_command(z, &data);
8282 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
8283 }else{
8284 open_db(&data, 0);
8285 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
8286 if( zErrMsg!=0 ){
8287 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8288 if( bail_on_error ) return rc!=0 ? rc : 1;
8289 }else if( rc!=0 ){
8290 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
8291 if( bail_on_error ) return rc;
8294 }else{
8295 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
8296 raw_printf(stderr,"Use -help for a list of options.\n");
8297 return 1;
8299 data.cMode = data.mode;
8302 if( !readStdin ){
8303 /* Run all arguments that do not begin with '-' as if they were separate
8304 ** command-line inputs, except for the argToSkip argument which contains
8305 ** the database filename.
8307 for(i=0; i<nCmd; i++){
8308 if( azCmd[i][0]=='.' ){
8309 rc = do_meta_command(azCmd[i], &data);
8310 if( rc ) return rc==2 ? 0 : rc;
8311 }else{
8312 open_db(&data, 0);
8313 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
8314 if( zErrMsg!=0 ){
8315 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8316 return rc!=0 ? rc : 1;
8317 }else if( rc!=0 ){
8318 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
8319 return rc;
8323 free(azCmd);
8324 }else{
8325 /* Run commands received from standard input
8327 if( stdin_is_interactive ){
8328 char *zHome;
8329 char *zHistory = 0;
8330 int nHistory;
8331 printf(
8332 "SQLite version %s %.19s\n" /*extra-version-info*/
8333 "Enter \".help\" for usage hints.\n",
8334 sqlite3_libversion(), sqlite3_sourceid()
8336 if( warnInmemoryDb ){
8337 printf("Connected to a ");
8338 printBold("transient in-memory database");
8339 printf(".\nUse \".open FILENAME\" to reopen on a "
8340 "persistent database.\n");
8342 zHome = find_home_dir(0);
8343 if( zHome ){
8344 nHistory = strlen30(zHome) + 20;
8345 if( (zHistory = malloc(nHistory))!=0 ){
8346 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
8349 if( zHistory ){ shell_read_history(zHistory); }
8350 #if HAVE_READLINE || HAVE_EDITLINE
8351 rl_attempted_completion_function = readline_completion;
8352 #elif HAVE_LINENOISE
8353 linenoiseSetCompletionCallback(linenoise_completion);
8354 #endif
8355 rc = process_input(&data, 0);
8356 if( zHistory ){
8357 shell_stifle_history(2000);
8358 shell_write_history(zHistory);
8359 free(zHistory);
8361 }else{
8362 rc = process_input(&data, stdin);
8365 set_table_name(&data, 0);
8366 if( data.db ){
8367 session_close_all(&data);
8368 sqlite3_close(data.db);
8370 sqlite3_free(data.zFreeOnClose);
8371 find_home_dir(1);
8372 #if !SQLITE_SHELL_IS_UTF8
8373 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
8374 sqlite3_free(argv);
8375 #endif
8376 return rc;