blob: 4dac4a62d5fd47e802273e5e36bee516d330eea9 [file] [log] [blame]
drh2ce15c32017-07-11 13:34:40 +00001/*
2** 2001 September 15
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
14*/
15#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
16/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
20/*
21** Warning pragmas copied from msvc.h in the core.
22*/
23#if defined(_MSC_VER)
24#pragma warning(disable : 4054)
25#pragma warning(disable : 4055)
26#pragma warning(disable : 4100)
27#pragma warning(disable : 4127)
28#pragma warning(disable : 4130)
29#pragma warning(disable : 4152)
30#pragma warning(disable : 4189)
31#pragma warning(disable : 4206)
32#pragma warning(disable : 4210)
33#pragma warning(disable : 4232)
34#pragma warning(disable : 4244)
35#pragma warning(disable : 4305)
36#pragma warning(disable : 4306)
37#pragma warning(disable : 4702)
38#pragma warning(disable : 4706)
39#endif /* defined(_MSC_VER) */
40
41/*
42** No support for loadable extensions in VxWorks.
43*/
44#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
45# define SQLITE_OMIT_LOAD_EXTENSION 1
46#endif
47
48/*
49** Enable large-file support for fopen() and friends on unix.
50*/
51#ifndef SQLITE_DISABLE_LFS
52# define _LARGE_FILE 1
53# ifndef _FILE_OFFSET_BITS
54# define _FILE_OFFSET_BITS 64
55# endif
56# define _LARGEFILE_SOURCE 1
57#endif
58
59#include <stdlib.h>
60#include <string.h>
61#include <stdio.h>
62#include <assert.h>
63#include "sqlite3.h"
64#if SQLITE_USER_AUTHENTICATION
65# include "sqlite3userauth.h"
66#endif
67#include <ctype.h>
68#include <stdarg.h>
69
70#if !defined(_WIN32) && !defined(WIN32)
71# include <signal.h>
72# if !defined(__RTP__) && !defined(_WRS_KERNEL)
73# include <pwd.h>
74# endif
75# include <unistd.h>
76# include <sys/types.h>
77#endif
78
79#if HAVE_READLINE
80# include <readline/readline.h>
81# include <readline/history.h>
82#endif
83
84#if HAVE_EDITLINE
85# include <editline/readline.h>
86#endif
87
88#if HAVE_EDITLINE || HAVE_READLINE
89
90# define shell_add_history(X) add_history(X)
91# define shell_read_history(X) read_history(X)
92# define shell_write_history(X) write_history(X)
93# define shell_stifle_history(X) stifle_history(X)
94# define shell_readline(X) readline(X)
95
96#elif HAVE_LINENOISE
97
98# include "linenoise.h"
99# define shell_add_history(X) linenoiseHistoryAdd(X)
100# define shell_read_history(X) linenoiseHistoryLoad(X)
101# define shell_write_history(X) linenoiseHistorySave(X)
102# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
103# define shell_readline(X) linenoise(X)
104
105#else
106
107# define shell_read_history(X)
108# define shell_write_history(X)
109# define shell_stifle_history(X)
110
111# define SHELL_USE_LOCAL_GETLINE 1
112#endif
113
114
115#if defined(_WIN32) || defined(WIN32)
116# include <io.h>
117# include <fcntl.h>
118# define isatty(h) _isatty(h)
119# ifndef access
120# define access(f,m) _access((f),(m))
121# endif
122# undef popen
123# define popen _popen
124# undef pclose
125# define pclose _pclose
126#else
127 /* Make sure isatty() has a prototype. */
128 extern int isatty(int);
129
130# if !defined(__RTP__) && !defined(_WRS_KERNEL)
131 /* popen and pclose are not C89 functions and so are
132 ** sometimes omitted from the <stdio.h> header */
133 extern FILE *popen(const char*,const char*);
134 extern int pclose(FILE*);
135# else
136# define SQLITE_OMIT_POPEN 1
137# endif
138#endif
139
140#if defined(_WIN32_WCE)
141/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
142 * thus we always assume that we have a console. That can be
143 * overridden with the -batch command line option.
144 */
145#define isatty(x) 1
146#endif
147
148/* ctype macros that work with signed characters */
149#define IsSpace(X) isspace((unsigned char)X)
150#define IsDigit(X) isdigit((unsigned char)X)
151#define ToLower(X) (char)tolower((unsigned char)X)
152
153#if defined(_WIN32) || defined(WIN32)
154#include <windows.h>
155
156/* string conversion routines only needed on Win32 */
157extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
158extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
159extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
160extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
161#endif
162
163/* On Windows, we normally run with output mode of TEXT so that \n characters
164** are automatically translated into \r\n. However, this behavior needs
165** to be disabled in some cases (ex: when generating CSV output and when
166** rendering quoted strings that contain \n characters). The following
167** routines take care of that.
168*/
169#if defined(_WIN32) || defined(WIN32)
170static void setBinaryMode(FILE *file, int isOutput){
171 if( isOutput ) fflush(file);
172 _setmode(_fileno(file), _O_BINARY);
173}
174static void setTextMode(FILE *file, int isOutput){
175 if( isOutput ) fflush(file);
176 _setmode(_fileno(file), _O_TEXT);
177}
178#else
179# define setBinaryMode(X,Y)
180# define setTextMode(X,Y)
181#endif
182
183
184/* True if the timer is enabled */
185static int enableTimer = 0;
186
187/* Return the current wall-clock time */
188static sqlite3_int64 timeOfDay(void){
189 static sqlite3_vfs *clockVfs = 0;
190 sqlite3_int64 t;
191 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
192 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
193 clockVfs->xCurrentTimeInt64(clockVfs, &t);
194 }else{
195 double r;
196 clockVfs->xCurrentTime(clockVfs, &r);
197 t = (sqlite3_int64)(r*86400000.0);
198 }
199 return t;
200}
201
202#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
203#include <sys/time.h>
204#include <sys/resource.h>
205
206/* VxWorks does not support getrusage() as far as we can determine */
207#if defined(_WRS_KERNEL) || defined(__RTP__)
208struct rusage {
209 struct timeval ru_utime; /* user CPU time used */
210 struct timeval ru_stime; /* system CPU time used */
211};
212#define getrusage(A,B) memset(B,0,sizeof(*B))
213#endif
214
215/* Saved resource information for the beginning of an operation */
216static struct rusage sBegin; /* CPU time at start */
217static sqlite3_int64 iBegin; /* Wall-clock time at start */
218
219/*
220** Begin timing an operation
221*/
222static void beginTimer(void){
223 if( enableTimer ){
224 getrusage(RUSAGE_SELF, &sBegin);
225 iBegin = timeOfDay();
226 }
227}
228
229/* Return the difference of two time_structs in seconds */
230static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
231 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
232 (double)(pEnd->tv_sec - pStart->tv_sec);
233}
234
235/*
236** Print the timing results.
237*/
238static void endTimer(void){
239 if( enableTimer ){
240 sqlite3_int64 iEnd = timeOfDay();
241 struct rusage sEnd;
242 getrusage(RUSAGE_SELF, &sEnd);
243 printf("Run Time: real %.3f user %f sys %f\n",
244 (iEnd - iBegin)*0.001,
245 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
246 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
247 }
248}
249
250#define BEGIN_TIMER beginTimer()
251#define END_TIMER endTimer()
252#define HAS_TIMER 1
253
254#elif (defined(_WIN32) || defined(WIN32))
255
256/* Saved resource information for the beginning of an operation */
257static HANDLE hProcess;
258static FILETIME ftKernelBegin;
259static FILETIME ftUserBegin;
260static sqlite3_int64 ftWallBegin;
261typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
262 LPFILETIME, LPFILETIME);
263static GETPROCTIMES getProcessTimesAddr = NULL;
264
265/*
266** Check to see if we have timer support. Return 1 if necessary
267** support found (or found previously).
268*/
269static int hasTimer(void){
270 if( getProcessTimesAddr ){
271 return 1;
272 } else {
273 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
274 ** versions. See if the version we are running on has it, and if it
275 ** does, save off a pointer to it and the current process handle.
276 */
277 hProcess = GetCurrentProcess();
278 if( hProcess ){
279 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
280 if( NULL != hinstLib ){
281 getProcessTimesAddr =
282 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
283 if( NULL != getProcessTimesAddr ){
284 return 1;
285 }
286 FreeLibrary(hinstLib);
287 }
288 }
289 }
290 return 0;
291}
292
293/*
294** Begin timing an operation
295*/
296static void beginTimer(void){
297 if( enableTimer && getProcessTimesAddr ){
298 FILETIME ftCreation, ftExit;
299 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
300 &ftKernelBegin,&ftUserBegin);
301 ftWallBegin = timeOfDay();
302 }
303}
304
305/* Return the difference of two FILETIME structs in seconds */
306static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
307 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
308 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
309 return (double) ((i64End - i64Start) / 10000000.0);
310}
311
312/*
313** Print the timing results.
314*/
315static void endTimer(void){
316 if( enableTimer && getProcessTimesAddr){
317 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
318 sqlite3_int64 ftWallEnd = timeOfDay();
319 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
320 printf("Run Time: real %.3f user %f sys %f\n",
321 (ftWallEnd - ftWallBegin)*0.001,
322 timeDiff(&ftUserBegin, &ftUserEnd),
323 timeDiff(&ftKernelBegin, &ftKernelEnd));
324 }
325}
326
327#define BEGIN_TIMER beginTimer()
328#define END_TIMER endTimer()
329#define HAS_TIMER hasTimer()
330
331#else
332#define BEGIN_TIMER
333#define END_TIMER
334#define HAS_TIMER 0
335#endif
336
337/*
338** Used to prevent warnings about unused parameters
339*/
340#define UNUSED_PARAMETER(x) (void)(x)
341
342/*
343** If the following flag is set, then command execution stops
344** at an error if we are not interactive.
345*/
346static int bail_on_error = 0;
347
348/*
349** Threat stdin as an interactive input if the following variable
350** is true. Otherwise, assume stdin is connected to a file or pipe.
351*/
352static int stdin_is_interactive = 1;
353
354/*
355** On Windows systems we have to know if standard output is a console
356** in order to translate UTF-8 into MBCS. The following variable is
357** true if translation is required.
358*/
359static int stdout_is_console = 1;
360
361/*
362** The following is the open SQLite database. We make a pointer
363** to this database a static variable so that it can be accessed
364** by the SIGINT handler to interrupt database processing.
365*/
366static sqlite3 *globalDb = 0;
367
368/*
369** True if an interrupt (Control-C) has been received.
370*/
371static volatile int seenInterrupt = 0;
372
373/*
374** This is the name of our program. It is set in main(), used
375** in a number of other places, mostly for error messages.
376*/
377static char *Argv0;
378
379/*
380** Prompt strings. Initialized in main. Settable with
381** .prompt main continue
382*/
383static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
384static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
385
386/*
387** Render output like fprintf(). Except, if the output is going to the
388** console and if this is running on a Windows machine, translate the
389** output from UTF-8 into MBCS.
390*/
391#if defined(_WIN32) || defined(WIN32)
392void utf8_printf(FILE *out, const char *zFormat, ...){
393 va_list ap;
394 va_start(ap, zFormat);
395 if( stdout_is_console && (out==stdout || out==stderr) ){
396 char *z1 = sqlite3_vmprintf(zFormat, ap);
397 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
398 sqlite3_free(z1);
399 fputs(z2, out);
400 sqlite3_free(z2);
401 }else{
402 vfprintf(out, zFormat, ap);
403 }
404 va_end(ap);
405}
406#elif !defined(utf8_printf)
407# define utf8_printf fprintf
408#endif
409
410/*
411** Render output like fprintf(). This should not be used on anything that
412** includes string formatting (e.g. "%s").
413*/
414#if !defined(raw_printf)
415# define raw_printf fprintf
416#endif
417
418/*
419** Write I/O traces to the following stream.
420*/
421#ifdef SQLITE_ENABLE_IOTRACE
422static FILE *iotrace = 0;
423#endif
424
425/*
426** This routine works like printf in that its first argument is a
427** format string and subsequent arguments are values to be substituted
428** in place of % fields. The result of formatting this string
429** is written to iotrace.
430*/
431#ifdef SQLITE_ENABLE_IOTRACE
432static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
433 va_list ap;
434 char *z;
435 if( iotrace==0 ) return;
436 va_start(ap, zFormat);
437 z = sqlite3_vmprintf(zFormat, ap);
438 va_end(ap);
439 utf8_printf(iotrace, "%s", z);
440 sqlite3_free(z);
441}
442#endif
443
444/*
445** Output string zUtf to stream pOut as w characters. If w is negative,
446** then right-justify the text. W is the width in UTF-8 characters, not
447** in bytes. This is different from the %*.*s specification in printf
448** since with %*.*s the width is measured in bytes, not characters.
449*/
450static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
451 int i;
452 int n;
453 int aw = w<0 ? -w : w;
454 char zBuf[1000];
455 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
456 for(i=n=0; zUtf[i]; i++){
457 if( (zUtf[i]&0xc0)!=0x80 ){
458 n++;
459 if( n==aw ){
460 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
461 break;
462 }
463 }
464 }
465 if( n>=aw ){
466 utf8_printf(pOut, "%.*s", i, zUtf);
467 }else if( w<0 ){
468 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
469 }else{
470 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
471 }
472}
473
474
475/*
476** Determines if a string is a number of not.
477*/
478static int isNumber(const char *z, int *realnum){
479 if( *z=='-' || *z=='+' ) z++;
480 if( !IsDigit(*z) ){
481 return 0;
482 }
483 z++;
484 if( realnum ) *realnum = 0;
485 while( IsDigit(*z) ){ z++; }
486 if( *z=='.' ){
487 z++;
488 if( !IsDigit(*z) ) return 0;
489 while( IsDigit(*z) ){ z++; }
490 if( realnum ) *realnum = 1;
491 }
492 if( *z=='e' || *z=='E' ){
493 z++;
494 if( *z=='+' || *z=='-' ) z++;
495 if( !IsDigit(*z) ) return 0;
496 while( IsDigit(*z) ){ z++; }
497 if( realnum ) *realnum = 1;
498 }
499 return *z==0;
500}
501
502/*
503** Compute a string length that is limited to what can be stored in
504** lower 30 bits of a 32-bit signed integer.
505*/
506static int strlen30(const char *z){
507 const char *z2 = z;
508 while( *z2 ){ z2++; }
509 return 0x3fffffff & (int)(z2 - z);
510}
511
512/*
513** Return the length of a string in characters. Multibyte UTF8 characters
514** count as a single character.
515*/
516static int strlenChar(const char *z){
517 int n = 0;
518 while( *z ){
519 if( (0xc0&*(z++))!=0x80 ) n++;
520 }
521 return n;
522}
523
524/*
525** This routine reads a line of text from FILE in, stores
526** the text in memory obtained from malloc() and returns a pointer
527** to the text. NULL is returned at end of file, or if malloc()
528** fails.
529**
530** If zLine is not NULL then it is a malloced buffer returned from
531** a previous call to this routine that may be reused.
532*/
533static char *local_getline(char *zLine, FILE *in){
534 int nLine = zLine==0 ? 0 : 100;
535 int n = 0;
536
537 while( 1 ){
538 if( n+100>nLine ){
539 nLine = nLine*2 + 100;
540 zLine = realloc(zLine, nLine);
541 if( zLine==0 ) return 0;
542 }
543 if( fgets(&zLine[n], nLine - n, in)==0 ){
544 if( n==0 ){
545 free(zLine);
546 return 0;
547 }
548 zLine[n] = 0;
549 break;
550 }
551 while( zLine[n] ) n++;
552 if( n>0 && zLine[n-1]=='\n' ){
553 n--;
554 if( n>0 && zLine[n-1]=='\r' ) n--;
555 zLine[n] = 0;
556 break;
557 }
558 }
559#if defined(_WIN32) || defined(WIN32)
560 /* For interactive input on Windows systems, translate the
561 ** multi-byte characterset characters into UTF-8. */
562 if( stdin_is_interactive && in==stdin ){
563 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
564 if( zTrans ){
565 int nTrans = strlen30(zTrans)+1;
566 if( nTrans>nLine ){
567 zLine = realloc(zLine, nTrans);
568 if( zLine==0 ){
569 sqlite3_free(zTrans);
570 return 0;
571 }
572 }
573 memcpy(zLine, zTrans, nTrans);
574 sqlite3_free(zTrans);
575 }
576 }
577#endif /* defined(_WIN32) || defined(WIN32) */
578 return zLine;
579}
580
581/*
582** Retrieve a single line of input text.
583**
584** If in==0 then read from standard input and prompt before each line.
585** If isContinuation is true, then a continuation prompt is appropriate.
586** If isContinuation is zero, then the main prompt should be used.
587**
588** If zPrior is not NULL then it is a buffer from a prior call to this
589** routine that can be reused.
590**
591** The result is stored in space obtained from malloc() and must either
592** be freed by the caller or else passed back into this routine via the
593** zPrior argument for reuse.
594*/
595static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
596 char *zPrompt;
597 char *zResult;
598 if( in!=0 ){
599 zResult = local_getline(zPrior, in);
600 }else{
601 zPrompt = isContinuation ? continuePrompt : mainPrompt;
602#if SHELL_USE_LOCAL_GETLINE
603 printf("%s", zPrompt);
604 fflush(stdout);
605 zResult = local_getline(zPrior, stdin);
606#else
607 free(zPrior);
608 zResult = shell_readline(zPrompt);
609 if( zResult && *zResult ) shell_add_history(zResult);
610#endif
611 }
612 return zResult;
613}
614/*
615** A variable length string to which one can append text.
616*/
617typedef struct ShellText ShellText;
618struct ShellText {
619 char *z;
620 int n;
621 int nAlloc;
622};
623
624/*
625** Initialize and destroy a ShellText object
626*/
627static void initText(ShellText *p){
628 memset(p, 0, sizeof(*p));
629}
630static void freeText(ShellText *p){
631 free(p->z);
632 initText(p);
633}
634
635/* zIn is either a pointer to a NULL-terminated string in memory obtained
636** from malloc(), or a NULL pointer. The string pointed to by zAppend is
637** added to zIn, and the result returned in memory obtained from malloc().
638** zIn, if it was not NULL, is freed.
639**
640** If the third argument, quote, is not '\0', then it is used as a
641** quote character for zAppend.
642*/
643static void appendText(ShellText *p, char const *zAppend, char quote){
644 int len;
645 int i;
646 int nAppend = strlen30(zAppend);
647
648 len = nAppend+p->n+1;
649 if( quote ){
650 len += 2;
651 for(i=0; i<nAppend; i++){
652 if( zAppend[i]==quote ) len++;
653 }
654 }
655
656 if( p->n+len>=p->nAlloc ){
657 p->nAlloc = p->nAlloc*2 + len + 20;
658 p->z = realloc(p->z, p->nAlloc);
659 if( p->z==0 ){
660 memset(p, 0, sizeof(*p));
661 return;
662 }
663 }
664
665 if( quote ){
666 char *zCsr = p->z+p->n;
667 *zCsr++ = quote;
668 for(i=0; i<nAppend; i++){
669 *zCsr++ = zAppend[i];
670 if( zAppend[i]==quote ) *zCsr++ = quote;
671 }
672 *zCsr++ = quote;
673 p->n = (int)(zCsr - p->z);
674 *zCsr = '\0';
675 }else{
676 memcpy(p->z+p->n, zAppend, nAppend);
677 p->n += nAppend;
678 p->z[p->n] = '\0';
679 }
680}
681
682/*
683** Attempt to determine if identifier zName needs to be quoted, either
684** because it contains non-alphanumeric characters, or because it is an
685** SQLite keyword. Be conservative in this estimate: When in doubt assume
686** that quoting is required.
687**
688** Return '"' if quoting is required. Return 0 if no quoting is required.
689*/
690static char quoteChar(const char *zName){
691 /* All SQLite keywords, in alphabetical order */
692 static const char *azKeywords[] = {
693 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
694 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
695 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
696 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
697 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
698 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
699 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
700 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
701 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
702 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
703 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
704 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
705 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
706 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
707 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
708 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
709 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
710 "WITH", "WITHOUT",
711 };
712 int i, lwr, upr, mid, c;
713 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
714 for(i=0; zName[i]; i++){
715 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
716 }
717 lwr = 0;
718 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
719 while( lwr<=upr ){
720 mid = (lwr+upr)/2;
721 c = sqlite3_stricmp(azKeywords[mid], zName);
722 if( c==0 ) return '"';
723 if( c<0 ){
724 lwr = mid+1;
725 }else{
726 upr = mid-1;
727 }
728 }
729 return 0;
730}
731
732/*
733** SQL function: shell_add_schema(S,X)
734**
735** Add the schema name X to the CREATE statement in S and return the result.
736** Examples:
737**
738** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
739**
740** Also works on
741**
742** CREATE INDEX
743** CREATE UNIQUE INDEX
744** CREATE VIEW
745** CREATE TRIGGER
746** CREATE VIRTUAL TABLE
747**
748** This UDF is used by the .schema command to insert the schema name of
749** attached databases into the middle of the sqlite_master.sql field.
750*/
751static void shellAddSchemaName(
752 sqlite3_context *pCtx,
753 int nVal,
754 sqlite3_value **apVal
755){
756 static const char *aPrefix[] = {
757 "TABLE",
758 "INDEX",
759 "UNIQUE INDEX",
760 "VIEW",
761 "TRIGGER",
762 "VIRTUAL TABLE"
763 };
764 int i = 0;
765 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
766 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
767 assert( nVal==2 );
768 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
drh89997982017-07-11 18:11:33 +0000769 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
drh2ce15c32017-07-11 13:34:40 +0000770 int n = strlen30(aPrefix[i]);
771 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
772 char cQuote = quoteChar(zSchema);
773 char *z;
774 if( cQuote ){
775 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
776 }else{
777 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
778 }
779 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
780 return;
781 }
782 }
783 }
784 sqlite3_result_value(pCtx, apVal[0]);
785}
786
787/*
788** The source code for several run-time loadable extensions is inserted
789** below by the ../tool/mkshellc.tcl script. Before processing that included
790** code, we need to override some macros to make the included program code
791** work here in the middle of this regular program.
792*/
793#define SQLITE_EXTENSION_INIT1
drh89997982017-07-11 18:11:33 +0000794#define SQLITE_EXTENSION_INIT2(X) (void)(X)
drh2ce15c32017-07-11 13:34:40 +0000795
796INCLUDE ../ext/misc/shathree.c
797INCLUDE ../ext/misc/fileio.c
drh56eb09b2017-07-11 13:59:07 +0000798INCLUDE ../ext/misc/completion.c
drh2ce15c32017-07-11 13:34:40 +0000799
800#if defined(SQLITE_ENABLE_SESSION)
801/*
802** State information for a single open session
803*/
804typedef struct OpenSession OpenSession;
805struct OpenSession {
806 char *zName; /* Symbolic name for this session */
807 int nFilter; /* Number of xFilter rejection GLOB patterns */
808 char **azFilter; /* Array of xFilter rejection GLOB patterns */
809 sqlite3_session *p; /* The open session */
810};
811#endif
812
813/*
814** Shell output mode information from before ".explain on",
815** saved so that it can be restored by ".explain off"
816*/
817typedef struct SavedModeInfo SavedModeInfo;
818struct SavedModeInfo {
819 int valid; /* Is there legit data in here? */
820 int mode; /* Mode prior to ".explain on" */
821 int showHeader; /* The ".header" setting prior to ".explain on" */
822 int colWidth[100]; /* Column widths prior to ".explain on" */
823};
824
825/*
826** State information about the database connection is contained in an
827** instance of the following structure.
828*/
829typedef struct ShellState ShellState;
830struct ShellState {
831 sqlite3 *db; /* The database */
832 int autoExplain; /* Automatically turn on .explain mode */
833 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
834 int statsOn; /* True to display memory stats before each finalize */
835 int scanstatsOn; /* True to display scan stats before each finalize */
836 int outCount; /* Revert to stdout when reaching zero */
837 int cnt; /* Number of records displayed so far */
838 FILE *out; /* Write results here */
839 FILE *traceOut; /* Output for sqlite3_trace() */
840 int nErr; /* Number of errors seen */
841 int mode; /* An output mode setting */
842 int cMode; /* temporary output mode for the current query */
843 int normalMode; /* Output mode before ".explain on" */
844 int writableSchema; /* True if PRAGMA writable_schema=ON */
845 int showHeader; /* True to show column names in List or Column mode */
846 int nCheck; /* Number of ".check" commands run */
847 unsigned shellFlgs; /* Various flags */
848 char *zDestTable; /* Name of destination table when MODE_Insert */
849 char zTestcase[30]; /* Name of current test case */
850 char colSeparator[20]; /* Column separator character for several modes */
851 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
852 int colWidth[100]; /* Requested width of each column when in column mode*/
853 int actualWidth[100]; /* Actual width of each column */
854 char nullValue[20]; /* The text to print when a NULL comes back from
855 ** the database */
856 char outfile[FILENAME_MAX]; /* Filename for *out */
857 const char *zDbFilename; /* name of the database file */
858 char *zFreeOnClose; /* Filename to free when closing */
859 const char *zVfs; /* Name of VFS to use */
860 sqlite3_stmt *pStmt; /* Current statement if any. */
861 FILE *pLog; /* Write log output here */
862 int *aiIndent; /* Array of indents used in MODE_Explain */
863 int nIndent; /* Size of array aiIndent[] */
864 int iIndent; /* Index of current op in aiIndent[] */
865#if defined(SQLITE_ENABLE_SESSION)
866 int nSession; /* Number of active sessions */
867 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
868#endif
869};
870
871/*
872** These are the allowed shellFlgs values
873*/
874#define SHFLG_Scratch 0x00000001 /* The --scratch option is used */
875#define SHFLG_Pagecache 0x00000002 /* The --pagecache option is used */
876#define SHFLG_Lookaside 0x00000004 /* Lookaside memory is used */
877#define SHFLG_Backslash 0x00000008 /* The --backslash option is used */
878#define SHFLG_PreserveRowid 0x00000010 /* .dump preserves rowid values */
879#define SHFLG_Newlines 0x00000020 /* .dump --newline flag */
880#define SHFLG_CountChanges 0x00000040 /* .changes setting */
881#define SHFLG_Echo 0x00000080 /* .echo or --echo setting */
882
883/*
884** Macros for testing and setting shellFlgs
885*/
886#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
887#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
888#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
889
890/*
891** These are the allowed modes.
892*/
893#define MODE_Line 0 /* One column per line. Blank line between records */
894#define MODE_Column 1 /* One record per line in neat columns */
895#define MODE_List 2 /* One record per line with a separator */
896#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
897#define MODE_Html 4 /* Generate an XHTML table */
898#define MODE_Insert 5 /* Generate SQL "insert" statements */
899#define MODE_Quote 6 /* Quote values as for SQL */
900#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
901#define MODE_Csv 8 /* Quote strings, numbers are plain */
902#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
903#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
904#define MODE_Pretty 11 /* Pretty-print schemas */
905
906static const char *modeDescr[] = {
907 "line",
908 "column",
909 "list",
910 "semi",
911 "html",
912 "insert",
913 "quote",
914 "tcl",
915 "csv",
916 "explain",
917 "ascii",
918 "prettyprint",
919};
920
921/*
922** These are the column/row/line separators used by the various
923** import/export modes.
924*/
925#define SEP_Column "|"
926#define SEP_Row "\n"
927#define SEP_Tab "\t"
928#define SEP_Space " "
929#define SEP_Comma ","
930#define SEP_CrLf "\r\n"
931#define SEP_Unit "\x1F"
932#define SEP_Record "\x1E"
933
934/*
935** Number of elements in an array
936*/
937#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
938
939/*
940** A callback for the sqlite3_log() interface.
941*/
942static void shellLog(void *pArg, int iErrCode, const char *zMsg){
943 ShellState *p = (ShellState*)pArg;
944 if( p->pLog==0 ) return;
945 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
946 fflush(p->pLog);
947}
948
949/*
950** Output the given string as a hex-encoded blob (eg. X'1234' )
951*/
952static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
953 int i;
954 char *zBlob = (char *)pBlob;
955 raw_printf(out,"X'");
956 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
957 raw_printf(out,"'");
958}
959
960/*
961** Find a string that is not found anywhere in z[]. Return a pointer
962** to that string.
963**
964** Try to use zA and zB first. If both of those are already found in z[]
965** then make up some string and store it in the buffer zBuf.
966*/
967static const char *unused_string(
968 const char *z, /* Result must not appear anywhere in z */
969 const char *zA, const char *zB, /* Try these first */
970 char *zBuf /* Space to store a generated string */
971){
972 unsigned i = 0;
973 if( strstr(z, zA)==0 ) return zA;
974 if( strstr(z, zB)==0 ) return zB;
975 do{
976 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
977 }while( strstr(z,zBuf)!=0 );
978 return zBuf;
979}
980
981/*
982** Output the given string as a quoted string using SQL quoting conventions.
983**
984** See also: output_quoted_escaped_string()
985*/
986static void output_quoted_string(FILE *out, const char *z){
987 int i;
988 char c;
989 setBinaryMode(out, 1);
990 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
991 if( c==0 ){
992 utf8_printf(out,"'%s'",z);
993 }else{
994 raw_printf(out, "'");
995 while( *z ){
996 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
997 if( c=='\'' ) i++;
998 if( i ){
999 utf8_printf(out, "%.*s", i, z);
1000 z += i;
1001 }
1002 if( c=='\'' ){
1003 raw_printf(out, "'");
1004 continue;
1005 }
1006 if( c==0 ){
1007 break;
1008 }
1009 z++;
1010 }
1011 raw_printf(out, "'");
1012 }
1013 setTextMode(out, 1);
1014}
1015
1016/*
1017** Output the given string as a quoted string using SQL quoting conventions.
1018** Additionallly , escape the "\n" and "\r" characters so that they do not
1019** get corrupted by end-of-line translation facilities in some operating
1020** systems.
1021**
1022** This is like output_quoted_string() but with the addition of the \r\n
1023** escape mechanism.
1024*/
1025static void output_quoted_escaped_string(FILE *out, const char *z){
1026 int i;
1027 char c;
1028 setBinaryMode(out, 1);
1029 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1030 if( c==0 ){
1031 utf8_printf(out,"'%s'",z);
1032 }else{
1033 const char *zNL = 0;
1034 const char *zCR = 0;
1035 int nNL = 0;
1036 int nCR = 0;
1037 char zBuf1[20], zBuf2[20];
1038 for(i=0; z[i]; i++){
1039 if( z[i]=='\n' ) nNL++;
1040 if( z[i]=='\r' ) nCR++;
1041 }
1042 if( nNL ){
1043 raw_printf(out, "replace(");
1044 zNL = unused_string(z, "\\n", "\\012", zBuf1);
1045 }
1046 if( nCR ){
1047 raw_printf(out, "replace(");
1048 zCR = unused_string(z, "\\r", "\\015", zBuf2);
1049 }
1050 raw_printf(out, "'");
1051 while( *z ){
1052 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1053 if( c=='\'' ) i++;
1054 if( i ){
1055 utf8_printf(out, "%.*s", i, z);
1056 z += i;
1057 }
1058 if( c=='\'' ){
1059 raw_printf(out, "'");
1060 continue;
1061 }
1062 if( c==0 ){
1063 break;
1064 }
1065 z++;
1066 if( c=='\n' ){
1067 raw_printf(out, "%s", zNL);
1068 continue;
1069 }
1070 raw_printf(out, "%s", zCR);
1071 }
1072 raw_printf(out, "'");
1073 if( nCR ){
1074 raw_printf(out, ",'%s',char(13))", zCR);
1075 }
1076 if( nNL ){
1077 raw_printf(out, ",'%s',char(10))", zNL);
1078 }
1079 }
1080 setTextMode(out, 1);
1081}
1082
1083/*
1084** Output the given string as a quoted according to C or TCL quoting rules.
1085*/
1086static void output_c_string(FILE *out, const char *z){
1087 unsigned int c;
1088 fputc('"', out);
1089 while( (c = *(z++))!=0 ){
1090 if( c=='\\' ){
1091 fputc(c, out);
1092 fputc(c, out);
1093 }else if( c=='"' ){
1094 fputc('\\', out);
1095 fputc('"', out);
1096 }else if( c=='\t' ){
1097 fputc('\\', out);
1098 fputc('t', out);
1099 }else if( c=='\n' ){
1100 fputc('\\', out);
1101 fputc('n', out);
1102 }else if( c=='\r' ){
1103 fputc('\\', out);
1104 fputc('r', out);
1105 }else if( !isprint(c&0xff) ){
1106 raw_printf(out, "\\%03o", c&0xff);
1107 }else{
1108 fputc(c, out);
1109 }
1110 }
1111 fputc('"', out);
1112}
1113
1114/*
1115** Output the given string with characters that are special to
1116** HTML escaped.
1117*/
1118static void output_html_string(FILE *out, const char *z){
1119 int i;
1120 if( z==0 ) z = "";
1121 while( *z ){
1122 for(i=0; z[i]
1123 && z[i]!='<'
1124 && z[i]!='&'
1125 && z[i]!='>'
1126 && z[i]!='\"'
1127 && z[i]!='\'';
1128 i++){}
1129 if( i>0 ){
1130 utf8_printf(out,"%.*s",i,z);
1131 }
1132 if( z[i]=='<' ){
1133 raw_printf(out,"&lt;");
1134 }else if( z[i]=='&' ){
1135 raw_printf(out,"&amp;");
1136 }else if( z[i]=='>' ){
1137 raw_printf(out,"&gt;");
1138 }else if( z[i]=='\"' ){
1139 raw_printf(out,"&quot;");
1140 }else if( z[i]=='\'' ){
1141 raw_printf(out,"&#39;");
1142 }else{
1143 break;
1144 }
1145 z += i + 1;
1146 }
1147}
1148
1149/*
1150** If a field contains any character identified by a 1 in the following
1151** array, then the string must be quoted for CSV.
1152*/
1153static const char needCsvQuote[] = {
1154 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1155 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1156 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1162 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1163 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1164 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1165 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1166 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1167 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1168 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1169 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1170};
1171
1172/*
1173** Output a single term of CSV. Actually, p->colSeparator is used for
1174** the separator, which may or may not be a comma. p->nullValue is
1175** the null value. Strings are quoted if necessary. The separator
1176** is only issued if bSep is true.
1177*/
1178static void output_csv(ShellState *p, const char *z, int bSep){
1179 FILE *out = p->out;
1180 if( z==0 ){
1181 utf8_printf(out,"%s",p->nullValue);
1182 }else{
1183 int i;
1184 int nSep = strlen30(p->colSeparator);
1185 for(i=0; z[i]; i++){
1186 if( needCsvQuote[((unsigned char*)z)[i]]
1187 || (z[i]==p->colSeparator[0] &&
1188 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
1189 i = 0;
1190 break;
1191 }
1192 }
1193 if( i==0 ){
1194 putc('"', out);
1195 for(i=0; z[i]; i++){
1196 if( z[i]=='"' ) putc('"', out);
1197 putc(z[i], out);
1198 }
1199 putc('"', out);
1200 }else{
1201 utf8_printf(out, "%s", z);
1202 }
1203 }
1204 if( bSep ){
1205 utf8_printf(p->out, "%s", p->colSeparator);
1206 }
1207}
1208
1209#ifdef SIGINT
1210/*
1211** This routine runs when the user presses Ctrl-C
1212*/
1213static void interrupt_handler(int NotUsed){
1214 UNUSED_PARAMETER(NotUsed);
1215 seenInterrupt++;
1216 if( seenInterrupt>2 ) exit(1);
1217 if( globalDb ) sqlite3_interrupt(globalDb);
1218}
1219#endif
1220
1221#ifndef SQLITE_OMIT_AUTHORIZATION
1222/*
1223** When the ".auth ON" is set, the following authorizer callback is
1224** invoked. It always returns SQLITE_OK.
1225*/
1226static int shellAuth(
1227 void *pClientData,
1228 int op,
1229 const char *zA1,
1230 const char *zA2,
1231 const char *zA3,
1232 const char *zA4
1233){
1234 ShellState *p = (ShellState*)pClientData;
1235 static const char *azAction[] = { 0,
1236 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1237 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1238 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1239 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1240 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1241 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1242 "PRAGMA", "READ", "SELECT",
1243 "TRANSACTION", "UPDATE", "ATTACH",
1244 "DETACH", "ALTER_TABLE", "REINDEX",
1245 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1246 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1247 };
1248 int i;
1249 const char *az[4];
1250 az[0] = zA1;
1251 az[1] = zA2;
1252 az[2] = zA3;
1253 az[3] = zA4;
1254 utf8_printf(p->out, "authorizer: %s", azAction[op]);
1255 for(i=0; i<4; i++){
1256 raw_printf(p->out, " ");
1257 if( az[i] ){
1258 output_c_string(p->out, az[i]);
1259 }else{
1260 raw_printf(p->out, "NULL");
1261 }
1262 }
1263 raw_printf(p->out, "\n");
1264 return SQLITE_OK;
1265}
1266#endif
1267
1268/*
1269** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1270**
1271** This routine converts some CREATE TABLE statements for shadow tables
1272** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1273*/
1274static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1275 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1276 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1277 }else{
1278 utf8_printf(out, "%s%s", z, zTail);
1279 }
1280}
1281static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1282 char c = z[n];
1283 z[n] = 0;
1284 printSchemaLine(out, z, zTail);
1285 z[n] = c;
1286}
1287
1288/*
1289** This is the callback routine that the shell
1290** invokes for each row of a query result.
1291*/
1292static int shell_callback(
1293 void *pArg,
1294 int nArg, /* Number of result columns */
1295 char **azArg, /* Text of each result column */
1296 char **azCol, /* Column names */
1297 int *aiType /* Column types */
1298){
1299 int i;
1300 ShellState *p = (ShellState*)pArg;
1301
1302 switch( p->cMode ){
1303 case MODE_Line: {
1304 int w = 5;
1305 if( azArg==0 ) break;
1306 for(i=0; i<nArg; i++){
1307 int len = strlen30(azCol[i] ? azCol[i] : "");
1308 if( len>w ) w = len;
1309 }
1310 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
1311 for(i=0; i<nArg; i++){
1312 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
1313 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
1314 }
1315 break;
1316 }
1317 case MODE_Explain:
1318 case MODE_Column: {
1319 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1320 const int *colWidth;
1321 int showHdr;
1322 char *rowSep;
1323 if( p->cMode==MODE_Column ){
1324 colWidth = p->colWidth;
1325 showHdr = p->showHeader;
1326 rowSep = p->rowSeparator;
1327 }else{
1328 colWidth = aExplainWidths;
1329 showHdr = 1;
1330 rowSep = SEP_Row;
1331 }
1332 if( p->cnt++==0 ){
1333 for(i=0; i<nArg; i++){
1334 int w, n;
1335 if( i<ArraySize(p->colWidth) ){
1336 w = colWidth[i];
1337 }else{
1338 w = 0;
1339 }
1340 if( w==0 ){
1341 w = strlenChar(azCol[i] ? azCol[i] : "");
1342 if( w<10 ) w = 10;
1343 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
1344 if( w<n ) w = n;
1345 }
1346 if( i<ArraySize(p->actualWidth) ){
1347 p->actualWidth[i] = w;
1348 }
1349 if( showHdr ){
1350 utf8_width_print(p->out, w, azCol[i]);
1351 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1352 }
1353 }
1354 if( showHdr ){
1355 for(i=0; i<nArg; i++){
1356 int w;
1357 if( i<ArraySize(p->actualWidth) ){
1358 w = p->actualWidth[i];
1359 if( w<0 ) w = -w;
1360 }else{
1361 w = 10;
1362 }
1363 utf8_printf(p->out,"%-*.*s%s",w,w,
1364 "----------------------------------------------------------"
1365 "----------------------------------------------------------",
1366 i==nArg-1 ? rowSep : " ");
1367 }
1368 }
1369 }
1370 if( azArg==0 ) break;
1371 for(i=0; i<nArg; i++){
1372 int w;
1373 if( i<ArraySize(p->actualWidth) ){
1374 w = p->actualWidth[i];
1375 }else{
1376 w = 10;
1377 }
1378 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
1379 w = strlenChar(azArg[i]);
1380 }
1381 if( i==1 && p->aiIndent && p->pStmt ){
1382 if( p->iIndent<p->nIndent ){
1383 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
1384 }
1385 p->iIndent++;
1386 }
1387 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
1388 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1389 }
1390 break;
1391 }
1392 case MODE_Semi: { /* .schema and .fullschema output */
1393 printSchemaLine(p->out, azArg[0], ";\n");
1394 break;
1395 }
1396 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1397 char *z;
1398 int j;
1399 int nParen = 0;
1400 char cEnd = 0;
1401 char c;
1402 int nLine = 0;
1403 assert( nArg==1 );
1404 if( azArg[0]==0 ) break;
1405 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1406 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1407 ){
1408 utf8_printf(p->out, "%s;\n", azArg[0]);
1409 break;
1410 }
1411 z = sqlite3_mprintf("%s", azArg[0]);
1412 j = 0;
1413 for(i=0; IsSpace(z[i]); i++){}
1414 for(; (c = z[i])!=0; i++){
1415 if( IsSpace(c) ){
1416 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1417 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1418 j--;
1419 }
1420 z[j++] = c;
1421 }
1422 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1423 z[j] = 0;
1424 if( strlen30(z)>=79 ){
1425 for(i=j=0; (c = z[i])!=0; i++){
1426 if( c==cEnd ){
1427 cEnd = 0;
1428 }else if( c=='"' || c=='\'' || c=='`' ){
1429 cEnd = c;
1430 }else if( c=='[' ){
1431 cEnd = ']';
1432 }else if( c=='(' ){
1433 nParen++;
1434 }else if( c==')' ){
1435 nParen--;
1436 if( nLine>0 && nParen==0 && j>0 ){
1437 printSchemaLineN(p->out, z, j, "\n");
1438 j = 0;
1439 }
1440 }
1441 z[j++] = c;
1442 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1443 if( c=='\n' ) j--;
1444 printSchemaLineN(p->out, z, j, "\n ");
1445 j = 0;
1446 nLine++;
1447 while( IsSpace(z[i+1]) ){ i++; }
1448 }
1449 }
1450 z[j] = 0;
1451 }
1452 printSchemaLine(p->out, z, ";\n");
1453 sqlite3_free(z);
1454 break;
1455 }
1456 case MODE_List: {
1457 if( p->cnt++==0 && p->showHeader ){
1458 for(i=0; i<nArg; i++){
1459 utf8_printf(p->out,"%s%s",azCol[i],
1460 i==nArg-1 ? p->rowSeparator : p->colSeparator);
1461 }
1462 }
1463 if( azArg==0 ) break;
1464 for(i=0; i<nArg; i++){
1465 char *z = azArg[i];
1466 if( z==0 ) z = p->nullValue;
1467 utf8_printf(p->out, "%s", z);
1468 if( i<nArg-1 ){
1469 utf8_printf(p->out, "%s", p->colSeparator);
1470 }else{
1471 utf8_printf(p->out, "%s", p->rowSeparator);
1472 }
1473 }
1474 break;
1475 }
1476 case MODE_Html: {
1477 if( p->cnt++==0 && p->showHeader ){
1478 raw_printf(p->out,"<TR>");
1479 for(i=0; i<nArg; i++){
1480 raw_printf(p->out,"<TH>");
1481 output_html_string(p->out, azCol[i]);
1482 raw_printf(p->out,"</TH>\n");
1483 }
1484 raw_printf(p->out,"</TR>\n");
1485 }
1486 if( azArg==0 ) break;
1487 raw_printf(p->out,"<TR>");
1488 for(i=0; i<nArg; i++){
1489 raw_printf(p->out,"<TD>");
1490 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1491 raw_printf(p->out,"</TD>\n");
1492 }
1493 raw_printf(p->out,"</TR>\n");
1494 break;
1495 }
1496 case MODE_Tcl: {
1497 if( p->cnt++==0 && p->showHeader ){
1498 for(i=0; i<nArg; i++){
1499 output_c_string(p->out,azCol[i] ? azCol[i] : "");
1500 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1501 }
1502 utf8_printf(p->out, "%s", p->rowSeparator);
1503 }
1504 if( azArg==0 ) break;
1505 for(i=0; i<nArg; i++){
1506 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1507 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1508 }
1509 utf8_printf(p->out, "%s", p->rowSeparator);
1510 break;
1511 }
1512 case MODE_Csv: {
1513 setBinaryMode(p->out, 1);
1514 if( p->cnt++==0 && p->showHeader ){
1515 for(i=0; i<nArg; i++){
1516 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
1517 }
1518 utf8_printf(p->out, "%s", p->rowSeparator);
1519 }
1520 if( nArg>0 ){
1521 for(i=0; i<nArg; i++){
1522 output_csv(p, azArg[i], i<nArg-1);
1523 }
1524 utf8_printf(p->out, "%s", p->rowSeparator);
1525 }
1526 setTextMode(p->out, 1);
1527 break;
1528 }
1529 case MODE_Insert: {
1530 if( azArg==0 ) break;
1531 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
1532 if( p->showHeader ){
1533 raw_printf(p->out,"(");
1534 for(i=0; i<nArg; i++){
1535 if( i>0 ) raw_printf(p->out, ",");
1536 if( quoteChar(azCol[i]) ){
1537 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
1538 utf8_printf(p->out, "%s", z);
1539 sqlite3_free(z);
1540 }else{
1541 raw_printf(p->out, "%s", azCol[i]);
1542 }
1543 }
1544 raw_printf(p->out,")");
1545 }
1546 p->cnt++;
1547 for(i=0; i<nArg; i++){
1548 raw_printf(p->out, i>0 ? "," : " VALUES(");
1549 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1550 utf8_printf(p->out,"NULL");
1551 }else if( aiType && aiType[i]==SQLITE_TEXT ){
1552 if( ShellHasFlag(p, SHFLG_Newlines) ){
1553 output_quoted_string(p->out, azArg[i]);
1554 }else{
1555 output_quoted_escaped_string(p->out, azArg[i]);
1556 }
1557 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
1558 utf8_printf(p->out,"%s", azArg[i]);
1559 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
1560 char z[50];
1561 double r = sqlite3_column_double(p->pStmt, i);
1562 sqlite3_snprintf(50,z,"%!.20g", r);
1563 raw_printf(p->out, "%s", z);
1564 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1565 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1566 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1567 output_hex_blob(p->out, pBlob, nBlob);
1568 }else if( isNumber(azArg[i], 0) ){
1569 utf8_printf(p->out,"%s", azArg[i]);
1570 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
1571 output_quoted_string(p->out, azArg[i]);
1572 }else{
1573 output_quoted_escaped_string(p->out, azArg[i]);
1574 }
1575 }
1576 raw_printf(p->out,");\n");
1577 break;
1578 }
1579 case MODE_Quote: {
1580 if( azArg==0 ) break;
1581 if( p->cnt==0 && p->showHeader ){
1582 for(i=0; i<nArg; i++){
1583 if( i>0 ) raw_printf(p->out, ",");
1584 output_quoted_string(p->out, azCol[i]);
1585 }
1586 raw_printf(p->out,"\n");
1587 }
1588 p->cnt++;
1589 for(i=0; i<nArg; i++){
1590 if( i>0 ) raw_printf(p->out, ",");
1591 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
1592 utf8_printf(p->out,"NULL");
1593 }else if( aiType && aiType[i]==SQLITE_TEXT ){
1594 output_quoted_string(p->out, azArg[i]);
1595 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
1596 utf8_printf(p->out,"%s", azArg[i]);
1597 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
1598 char z[50];
1599 double r = sqlite3_column_double(p->pStmt, i);
1600 sqlite3_snprintf(50,z,"%!.20g", r);
1601 raw_printf(p->out, "%s", z);
1602 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1603 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1604 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1605 output_hex_blob(p->out, pBlob, nBlob);
1606 }else if( isNumber(azArg[i], 0) ){
1607 utf8_printf(p->out,"%s", azArg[i]);
1608 }else{
1609 output_quoted_string(p->out, azArg[i]);
1610 }
1611 }
1612 raw_printf(p->out,"\n");
1613 break;
1614 }
1615 case MODE_Ascii: {
1616 if( p->cnt++==0 && p->showHeader ){
1617 for(i=0; i<nArg; i++){
1618 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1619 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
1620 }
1621 utf8_printf(p->out, "%s", p->rowSeparator);
1622 }
1623 if( azArg==0 ) break;
1624 for(i=0; i<nArg; i++){
1625 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
1626 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
1627 }
1628 utf8_printf(p->out, "%s", p->rowSeparator);
1629 break;
1630 }
1631 }
1632 return 0;
1633}
1634
1635/*
1636** This is the callback routine that the SQLite library
1637** invokes for each row of a query result.
1638*/
1639static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1640 /* since we don't have type info, call the shell_callback with a NULL value */
1641 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1642}
1643
1644/*
1645** This is the callback routine from sqlite3_exec() that appends all
1646** output onto the end of a ShellText object.
1647*/
1648static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
1649 ShellText *p = (ShellText*)pArg;
1650 int i;
1651 UNUSED_PARAMETER(az);
1652 if( p->n ) appendText(p, "|", 0);
1653 for(i=0; i<nArg; i++){
1654 if( i ) appendText(p, ",", 0);
1655 if( azArg[i] ) appendText(p, azArg[i], 0);
1656 }
1657 return 0;
1658}
1659
1660/*
1661** Generate an appropriate SELFTEST table in the main database.
1662*/
1663static void createSelftestTable(ShellState *p){
1664 char *zErrMsg = 0;
1665 sqlite3_exec(p->db,
1666 "SAVEPOINT selftest_init;\n"
1667 "CREATE TABLE IF NOT EXISTS selftest(\n"
1668 " tno INTEGER PRIMARY KEY,\n" /* Test number */
1669 " op TEXT,\n" /* Operator: memo run */
1670 " cmd TEXT,\n" /* Command text */
1671 " ans TEXT\n" /* Desired answer */
1672 ");"
1673 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
1674 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
1675 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
1676 " 'memo','Tests generated by --init');\n"
1677 "INSERT INTO [_shell$self]\n"
1678 " SELECT 'run',\n"
1679 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
1680 "FROM sqlite_master ORDER BY 2'',224))',\n"
1681 " hex(sha3_query('SELECT type,name,tbl_name,sql "
1682 "FROM sqlite_master ORDER BY 2',224));\n"
1683 "INSERT INTO [_shell$self]\n"
1684 " SELECT 'run',"
1685 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
1686 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
1687 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
1688 " FROM (\n"
1689 " SELECT name FROM sqlite_master\n"
1690 " WHERE type='table'\n"
1691 " AND name<>'selftest'\n"
1692 " AND coalesce(rootpage,0)>0\n"
1693 " )\n"
1694 " ORDER BY name;\n"
1695 "INSERT INTO [_shell$self]\n"
1696 " VALUES('run','PRAGMA integrity_check','ok');\n"
1697 "INSERT INTO selftest(tno,op,cmd,ans)"
1698 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
1699 "DROP TABLE [_shell$self];"
1700 ,0,0,&zErrMsg);
1701 if( zErrMsg ){
1702 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
1703 sqlite3_free(zErrMsg);
1704 }
1705 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
1706}
1707
1708
1709/*
1710** Set the destination table field of the ShellState structure to
1711** the name of the table given. Escape any quote characters in the
1712** table name.
1713*/
1714static void set_table_name(ShellState *p, const char *zName){
1715 int i, n;
1716 int cQuote;
1717 char *z;
1718
1719 if( p->zDestTable ){
1720 free(p->zDestTable);
1721 p->zDestTable = 0;
1722 }
1723 if( zName==0 ) return;
1724 cQuote = quoteChar(zName);
1725 n = strlen30(zName);
1726 if( cQuote ) n += n+2;
1727 z = p->zDestTable = malloc( n+1 );
1728 if( z==0 ){
1729 raw_printf(stderr,"Error: out of memory\n");
1730 exit(1);
1731 }
1732 n = 0;
1733 if( cQuote ) z[n++] = cQuote;
1734 for(i=0; zName[i]; i++){
1735 z[n++] = zName[i];
1736 if( zName[i]==cQuote ) z[n++] = cQuote;
1737 }
1738 if( cQuote ) z[n++] = cQuote;
1739 z[n] = 0;
1740}
1741
1742
1743/*
1744** Execute a query statement that will generate SQL output. Print
1745** the result columns, comma-separated, on a line and then add a
1746** semicolon terminator to the end of that line.
1747**
1748** If the number of columns is 1 and that column contains text "--"
1749** then write the semicolon on a separate line. That way, if a
1750** "--" comment occurs at the end of the statement, the comment
1751** won't consume the semicolon terminator.
1752*/
1753static int run_table_dump_query(
1754 ShellState *p, /* Query context */
1755 const char *zSelect, /* SELECT statement to extract content */
1756 const char *zFirstRow /* Print before first row, if not NULL */
1757){
1758 sqlite3_stmt *pSelect;
1759 int rc;
1760 int nResult;
1761 int i;
1762 const char *z;
1763 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
1764 if( rc!=SQLITE_OK || !pSelect ){
1765 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1766 sqlite3_errmsg(p->db));
1767 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1768 return rc;
1769 }
1770 rc = sqlite3_step(pSelect);
1771 nResult = sqlite3_column_count(pSelect);
1772 while( rc==SQLITE_ROW ){
1773 if( zFirstRow ){
1774 utf8_printf(p->out, "%s", zFirstRow);
1775 zFirstRow = 0;
1776 }
1777 z = (const char*)sqlite3_column_text(pSelect, 0);
1778 utf8_printf(p->out, "%s", z);
1779 for(i=1; i<nResult; i++){
1780 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1781 }
1782 if( z==0 ) z = "";
1783 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1784 if( z[0] ){
1785 raw_printf(p->out, "\n;\n");
1786 }else{
1787 raw_printf(p->out, ";\n");
1788 }
1789 rc = sqlite3_step(pSelect);
1790 }
1791 rc = sqlite3_finalize(pSelect);
1792 if( rc!=SQLITE_OK ){
1793 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
1794 sqlite3_errmsg(p->db));
1795 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
1796 }
1797 return rc;
1798}
1799
1800/*
1801** Allocate space and save off current error string.
1802*/
1803static char *save_err_msg(
1804 sqlite3 *db /* Database to query */
1805){
1806 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1807 char *zErrMsg = sqlite3_malloc64(nErrMsg);
1808 if( zErrMsg ){
1809 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1810 }
1811 return zErrMsg;
1812}
1813
1814#ifdef __linux__
1815/*
1816** Attempt to display I/O stats on Linux using /proc/PID/io
1817*/
1818static void displayLinuxIoStats(FILE *out){
1819 FILE *in;
1820 char z[200];
1821 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
1822 in = fopen(z, "rb");
1823 if( in==0 ) return;
1824 while( fgets(z, sizeof(z), in)!=0 ){
1825 static const struct {
1826 const char *zPattern;
1827 const char *zDesc;
1828 } aTrans[] = {
1829 { "rchar: ", "Bytes received by read():" },
1830 { "wchar: ", "Bytes sent to write():" },
1831 { "syscr: ", "Read() system calls:" },
1832 { "syscw: ", "Write() system calls:" },
1833 { "read_bytes: ", "Bytes read from storage:" },
1834 { "write_bytes: ", "Bytes written to storage:" },
1835 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
1836 };
1837 int i;
1838 for(i=0; i<ArraySize(aTrans); i++){
1839 int n = (int)strlen(aTrans[i].zPattern);
1840 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
1841 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
1842 break;
1843 }
1844 }
1845 }
1846 fclose(in);
1847}
1848#endif
1849
1850/*
1851** Display a single line of status using 64-bit values.
1852*/
1853static void displayStatLine(
1854 ShellState *p, /* The shell context */
1855 char *zLabel, /* Label for this one line */
1856 char *zFormat, /* Format for the result */
1857 int iStatusCtrl, /* Which status to display */
1858 int bReset /* True to reset the stats */
1859){
1860 sqlite3_int64 iCur = -1;
1861 sqlite3_int64 iHiwtr = -1;
1862 int i, nPercent;
1863 char zLine[200];
1864 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
1865 for(i=0, nPercent=0; zFormat[i]; i++){
1866 if( zFormat[i]=='%' ) nPercent++;
1867 }
1868 if( nPercent>1 ){
1869 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
1870 }else{
1871 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
1872 }
1873 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
1874}
1875
1876/*
1877** Display memory stats.
1878*/
1879static int display_stats(
1880 sqlite3 *db, /* Database to query */
1881 ShellState *pArg, /* Pointer to ShellState */
1882 int bReset /* True to reset the stats */
1883){
1884 int iCur;
1885 int iHiwtr;
1886
1887 if( pArg && pArg->out ){
1888 displayStatLine(pArg, "Memory Used:",
1889 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
1890 displayStatLine(pArg, "Number of Outstanding Allocations:",
1891 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
1892 if( pArg->shellFlgs & SHFLG_Pagecache ){
1893 displayStatLine(pArg, "Number of Pcache Pages Used:",
1894 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
1895 }
1896 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
1897 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
1898 if( pArg->shellFlgs & SHFLG_Scratch ){
1899 displayStatLine(pArg, "Number of Scratch Allocations Used:",
1900 "%lld (max %lld)", SQLITE_STATUS_SCRATCH_USED, bReset);
1901 }
1902 displayStatLine(pArg, "Number of Scratch Overflow Bytes:",
1903 "%lld (max %lld) bytes", SQLITE_STATUS_SCRATCH_OVERFLOW, bReset);
1904 displayStatLine(pArg, "Largest Allocation:",
1905 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
1906 displayStatLine(pArg, "Largest Pcache Allocation:",
1907 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
1908 displayStatLine(pArg, "Largest Scratch Allocation:",
1909 "%lld bytes", SQLITE_STATUS_SCRATCH_SIZE, bReset);
1910#ifdef YYTRACKMAXSTACKDEPTH
1911 displayStatLine(pArg, "Deepest Parser Stack:",
1912 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
1913#endif
1914 }
1915
1916 if( pArg && pArg->out && db ){
1917 if( pArg->shellFlgs & SHFLG_Lookaside ){
1918 iHiwtr = iCur = -1;
1919 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1920 &iCur, &iHiwtr, bReset);
1921 raw_printf(pArg->out,
1922 "Lookaside Slots Used: %d (max %d)\n",
1923 iCur, iHiwtr);
1924 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1925 &iCur, &iHiwtr, bReset);
1926 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
1927 iHiwtr);
1928 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1929 &iCur, &iHiwtr, bReset);
1930 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
1931 iHiwtr);
1932 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1933 &iCur, &iHiwtr, bReset);
1934 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
1935 iHiwtr);
1936 }
1937 iHiwtr = iCur = -1;
1938 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
1939 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
1940 iCur);
1941 iHiwtr = iCur = -1;
1942 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1943 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
1944 iHiwtr = iCur = -1;
1945 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1946 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
1947 iHiwtr = iCur = -1;
1948 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1949 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
1950 iHiwtr = iCur = -1;
1951 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
1952 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
1953 iCur);
1954 iHiwtr = iCur = -1;
1955 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
1956 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
1957 iCur);
1958 }
1959
1960 if( pArg && pArg->out && db && pArg->pStmt ){
1961 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1962 bReset);
1963 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
1964 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1965 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
1966 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
1967 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
1968 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1969 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
1970 }
1971
1972#ifdef __linux__
1973 displayLinuxIoStats(pArg->out);
1974#endif
1975
1976 /* Do not remove this machine readable comment: extra-stats-output-here */
1977
1978 return 0;
1979}
1980
1981/*
1982** Display scan stats.
1983*/
1984static void display_scanstats(
1985 sqlite3 *db, /* Database to query */
1986 ShellState *pArg /* Pointer to ShellState */
1987){
1988#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
1989 UNUSED_PARAMETER(db);
1990 UNUSED_PARAMETER(pArg);
1991#else
1992 int i, k, n, mx;
1993 raw_printf(pArg->out, "-------- scanstats --------\n");
1994 mx = 0;
1995 for(k=0; k<=mx; k++){
1996 double rEstLoop = 1.0;
1997 for(i=n=0; 1; i++){
1998 sqlite3_stmt *p = pArg->pStmt;
1999 sqlite3_int64 nLoop, nVisit;
2000 double rEst;
2001 int iSid;
2002 const char *zExplain;
2003 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2004 break;
2005 }
2006 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2007 if( iSid>mx ) mx = iSid;
2008 if( iSid!=k ) continue;
2009 if( n==0 ){
2010 rEstLoop = (double)nLoop;
2011 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2012 }
2013 n++;
2014 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2015 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2016 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2017 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2018 rEstLoop *= rEst;
2019 raw_printf(pArg->out,
2020 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2021 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2022 );
2023 }
2024 }
2025 raw_printf(pArg->out, "---------------------------\n");
2026#endif
2027}
2028
2029/*
2030** Parameter azArray points to a zero-terminated array of strings. zStr
2031** points to a single nul-terminated string. Return non-zero if zStr
2032** is equal, according to strcmp(), to any of the strings in the array.
2033** Otherwise, return zero.
2034*/
2035static int str_in_array(const char *zStr, const char **azArray){
2036 int i;
2037 for(i=0; azArray[i]; i++){
2038 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2039 }
2040 return 0;
2041}
2042
2043/*
2044** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2045** and populate the ShellState.aiIndent[] array with the number of
2046** spaces each opcode should be indented before it is output.
2047**
2048** The indenting rules are:
2049**
2050** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2051** all opcodes that occur between the p2 jump destination and the opcode
2052** itself by 2 spaces.
2053**
2054** * For each "Goto", if the jump destination is earlier in the program
2055** and ends on one of:
2056** Yield SeekGt SeekLt RowSetRead Rewind
2057** or if the P1 parameter is one instead of zero,
2058** then indent all opcodes between the earlier instruction
2059** and "Goto" by 2 spaces.
2060*/
2061static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2062 const char *zSql; /* The text of the SQL statement */
2063 const char *z; /* Used to check if this is an EXPLAIN */
2064 int *abYield = 0; /* True if op is an OP_Yield */
2065 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
2066 int iOp; /* Index of operation in p->aiIndent[] */
2067
2068 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2069 "NextIfOpen", "PrevIfOpen", 0 };
2070 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2071 "Rewind", 0 };
2072 const char *azGoto[] = { "Goto", 0 };
2073
2074 /* Try to figure out if this is really an EXPLAIN statement. If this
2075 ** cannot be verified, return early. */
2076 if( sqlite3_column_count(pSql)!=8 ){
2077 p->cMode = p->mode;
2078 return;
2079 }
2080 zSql = sqlite3_sql(pSql);
2081 if( zSql==0 ) return;
2082 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2083 if( sqlite3_strnicmp(z, "explain", 7) ){
2084 p->cMode = p->mode;
2085 return;
2086 }
2087
2088 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2089 int i;
2090 int iAddr = sqlite3_column_int(pSql, 0);
2091 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2092
2093 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2094 ** p2 is an instruction address, set variable p2op to the index of that
2095 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2096 ** the current instruction is part of a sub-program generated by an
2097 ** SQL trigger or foreign key. */
2098 int p2 = sqlite3_column_int(pSql, 3);
2099 int p2op = (p2 + (iOp-iAddr));
2100
2101 /* Grow the p->aiIndent array as required */
2102 if( iOp>=nAlloc ){
2103 if( iOp==0 ){
2104 /* Do further verfication that this is explain output. Abort if
2105 ** it is not */
2106 static const char *explainCols[] = {
2107 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2108 int jj;
2109 for(jj=0; jj<ArraySize(explainCols); jj++){
2110 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2111 p->cMode = p->mode;
2112 sqlite3_reset(pSql);
2113 return;
2114 }
2115 }
2116 }
2117 nAlloc += 100;
2118 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2119 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
2120 }
2121 abYield[iOp] = str_in_array(zOp, azYield);
2122 p->aiIndent[iOp] = 0;
2123 p->nIndent = iOp+1;
2124
2125 if( str_in_array(zOp, azNext) ){
2126 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2127 }
2128 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2129 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2130 ){
2131 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2132 }
2133 }
2134
2135 p->iIndent = 0;
2136 sqlite3_free(abYield);
2137 sqlite3_reset(pSql);
2138}
2139
2140/*
2141** Free the array allocated by explain_data_prepare().
2142*/
2143static void explain_data_delete(ShellState *p){
2144 sqlite3_free(p->aiIndent);
2145 p->aiIndent = 0;
2146 p->nIndent = 0;
2147 p->iIndent = 0;
2148}
2149
2150/*
2151** Disable and restore .wheretrace and .selecttrace settings.
2152*/
2153#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2154extern int sqlite3SelectTrace;
2155static int savedSelectTrace;
2156#endif
2157#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2158extern int sqlite3WhereTrace;
2159static int savedWhereTrace;
2160#endif
2161static void disable_debug_trace_modes(void){
2162#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2163 savedSelectTrace = sqlite3SelectTrace;
2164 sqlite3SelectTrace = 0;
2165#endif
2166#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2167 savedWhereTrace = sqlite3WhereTrace;
2168 sqlite3WhereTrace = 0;
2169#endif
2170}
2171static void restore_debug_trace_modes(void){
2172#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2173 sqlite3SelectTrace = savedSelectTrace;
2174#endif
2175#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2176 sqlite3WhereTrace = savedWhereTrace;
2177#endif
2178}
2179
2180/*
2181** Run a prepared statement
2182*/
2183static void exec_prepared_stmt(
2184 ShellState *pArg, /* Pointer to ShellState */
2185 sqlite3_stmt *pStmt, /* Statment to run */
2186 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
2187){
2188 int rc;
2189
2190 /* perform the first step. this will tell us if we
2191 ** have a result set or not and how wide it is.
2192 */
2193 rc = sqlite3_step(pStmt);
2194 /* if we have a result set... */
2195 if( SQLITE_ROW == rc ){
2196 /* if we have a callback... */
2197 if( xCallback ){
2198 /* allocate space for col name ptr, value ptr, and type */
2199 int nCol = sqlite3_column_count(pStmt);
2200 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2201 if( !pData ){
2202 rc = SQLITE_NOMEM;
2203 }else{
2204 char **azCols = (char **)pData; /* Names of result columns */
2205 char **azVals = &azCols[nCol]; /* Results */
2206 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2207 int i, x;
2208 assert(sizeof(int) <= sizeof(char *));
2209 /* save off ptrs to column names */
2210 for(i=0; i<nCol; i++){
2211 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2212 }
2213 do{
2214 /* extract the data and data types */
2215 for(i=0; i<nCol; i++){
2216 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2217 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2218 azVals[i] = "";
2219 }else{
2220 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2221 }
2222 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2223 rc = SQLITE_NOMEM;
2224 break; /* from for */
2225 }
2226 } /* end for */
2227
2228 /* if data and types extracted successfully... */
2229 if( SQLITE_ROW == rc ){
2230 /* call the supplied callback with the result row data */
2231 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
2232 rc = SQLITE_ABORT;
2233 }else{
2234 rc = sqlite3_step(pStmt);
2235 }
2236 }
2237 } while( SQLITE_ROW == rc );
2238 sqlite3_free(pData);
2239 }
2240 }else{
2241 do{
2242 rc = sqlite3_step(pStmt);
2243 } while( rc == SQLITE_ROW );
2244 }
2245 }
2246}
2247
2248/*
2249** Execute a statement or set of statements. Print
2250** any result rows/columns depending on the current mode
2251** set via the supplied callback.
2252**
2253** This is very similar to SQLite's built-in sqlite3_exec()
2254** function except it takes a slightly different callback
2255** and callback data argument.
2256*/
2257static int shell_exec(
2258 sqlite3 *db, /* An open database */
2259 const char *zSql, /* SQL to be evaluated */
2260 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
2261 /* (not the same as sqlite3_exec) */
2262 ShellState *pArg, /* Pointer to ShellState */
2263 char **pzErrMsg /* Error msg written here */
2264){
2265 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2266 int rc = SQLITE_OK; /* Return Code */
2267 int rc2;
2268 const char *zLeftover; /* Tail of unprocessed SQL */
2269
2270 if( pzErrMsg ){
2271 *pzErrMsg = NULL;
2272 }
2273
2274 while( zSql[0] && (SQLITE_OK == rc) ){
2275 static const char *zStmtSql;
2276 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2277 if( SQLITE_OK != rc ){
2278 if( pzErrMsg ){
2279 *pzErrMsg = save_err_msg(db);
2280 }
2281 }else{
2282 if( !pStmt ){
2283 /* this happens for a comment or white-space */
2284 zSql = zLeftover;
2285 while( IsSpace(zSql[0]) ) zSql++;
2286 continue;
2287 }
2288 zStmtSql = sqlite3_sql(pStmt);
2289 if( zStmtSql==0 ) zStmtSql = "";
2290 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
2291
2292 /* save off the prepared statment handle and reset row count */
2293 if( pArg ){
2294 pArg->pStmt = pStmt;
2295 pArg->cnt = 0;
2296 }
2297
2298 /* echo the sql statement if echo on */
2299 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
2300 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
2301 }
2302
2303 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
2304 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
2305 sqlite3_stmt *pExplain;
2306 char *zEQP;
2307 disable_debug_trace_modes();
2308 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
2309 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2310 if( rc==SQLITE_OK ){
2311 while( sqlite3_step(pExplain)==SQLITE_ROW ){
2312 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
2313 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
2314 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
2315 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
2316 }
2317 }
2318 sqlite3_finalize(pExplain);
2319 sqlite3_free(zEQP);
2320 if( pArg->autoEQP>=2 ){
2321 /* Also do an EXPLAIN for ".eqp full" mode */
2322 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2323 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2324 if( rc==SQLITE_OK ){
2325 pArg->cMode = MODE_Explain;
2326 explain_data_prepare(pArg, pExplain);
2327 exec_prepared_stmt(pArg, pExplain, xCallback);
2328 explain_data_delete(pArg);
2329 }
2330 sqlite3_finalize(pExplain);
2331 sqlite3_free(zEQP);
2332 }
2333 restore_debug_trace_modes();
2334 }
2335
2336 if( pArg ){
2337 pArg->cMode = pArg->mode;
2338 if( pArg->autoExplain
2339 && sqlite3_column_count(pStmt)==8
2340 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
2341 ){
2342 pArg->cMode = MODE_Explain;
2343 }
2344
2345 /* If the shell is currently in ".explain" mode, gather the extra
2346 ** data required to add indents to the output.*/
2347 if( pArg->cMode==MODE_Explain ){
2348 explain_data_prepare(pArg, pStmt);
2349 }
2350 }
2351
2352 exec_prepared_stmt(pArg, pStmt, xCallback);
2353 explain_data_delete(pArg);
2354
2355 /* print usage stats if stats on */
2356 if( pArg && pArg->statsOn ){
2357 display_stats(db, pArg, 0);
2358 }
2359
2360 /* print loop-counters if required */
2361 if( pArg && pArg->scanstatsOn ){
2362 display_scanstats(db, pArg);
2363 }
2364
2365 /* Finalize the statement just executed. If this fails, save a
2366 ** copy of the error message. Otherwise, set zSql to point to the
2367 ** next statement to execute. */
2368 rc2 = sqlite3_finalize(pStmt);
2369 if( rc!=SQLITE_NOMEM ) rc = rc2;
2370 if( rc==SQLITE_OK ){
2371 zSql = zLeftover;
2372 while( IsSpace(zSql[0]) ) zSql++;
2373 }else if( pzErrMsg ){
2374 *pzErrMsg = save_err_msg(db);
2375 }
2376
2377 /* clear saved stmt handle */
2378 if( pArg ){
2379 pArg->pStmt = NULL;
2380 }
2381 }
2382 } /* end while */
2383
2384 return rc;
2385}
2386
2387/*
2388** Release memory previously allocated by tableColumnList().
2389*/
2390static void freeColumnList(char **azCol){
2391 int i;
2392 for(i=1; azCol[i]; i++){
2393 sqlite3_free(azCol[i]);
2394 }
2395 /* azCol[0] is a static string */
2396 sqlite3_free(azCol);
2397}
2398
2399/*
2400** Return a list of pointers to strings which are the names of all
2401** columns in table zTab. The memory to hold the names is dynamically
2402** allocated and must be released by the caller using a subsequent call
2403** to freeColumnList().
2404**
2405** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
2406** value that needs to be preserved, then azCol[0] is filled in with the
2407** name of the rowid column.
2408**
2409** The first regular column in the table is azCol[1]. The list is terminated
2410** by an entry with azCol[i]==0.
2411*/
2412static char **tableColumnList(ShellState *p, const char *zTab){
2413 char **azCol = 0;
2414 sqlite3_stmt *pStmt;
2415 char *zSql;
2416 int nCol = 0;
2417 int nAlloc = 0;
2418 int nPK = 0; /* Number of PRIMARY KEY columns seen */
2419 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
2420 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
2421 int rc;
2422
2423 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
2424 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2425 sqlite3_free(zSql);
2426 if( rc ) return 0;
2427 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2428 if( nCol>=nAlloc-2 ){
2429 nAlloc = nAlloc*2 + nCol + 10;
2430 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
2431 if( azCol==0 ){
2432 raw_printf(stderr, "Error: out of memory\n");
2433 exit(1);
2434 }
2435 }
2436 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
2437 if( sqlite3_column_int(pStmt, 5) ){
2438 nPK++;
2439 if( nPK==1
2440 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
2441 "INTEGER")==0
2442 ){
2443 isIPK = 1;
2444 }else{
2445 isIPK = 0;
2446 }
2447 }
2448 }
2449 sqlite3_finalize(pStmt);
2450 azCol[0] = 0;
2451 azCol[nCol+1] = 0;
2452
2453 /* The decision of whether or not a rowid really needs to be preserved
2454 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
2455 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
2456 ** rowids on tables where the rowid is inaccessible because there are other
2457 ** columns in the table named "rowid", "_rowid_", and "oid".
2458 */
2459 if( preserveRowid && isIPK ){
2460 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
2461 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
2462 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
2463 ** ROWID aliases. To distinguish these cases, check to see if
2464 ** there is a "pk" entry in "PRAGMA index_list". There will be
2465 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
2466 */
2467 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
2468 " WHERE origin='pk'", zTab);
2469 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2470 sqlite3_free(zSql);
2471 if( rc ){
2472 freeColumnList(azCol);
2473 return 0;
2474 }
2475 rc = sqlite3_step(pStmt);
2476 sqlite3_finalize(pStmt);
2477 preserveRowid = rc==SQLITE_ROW;
2478 }
2479 if( preserveRowid ){
2480 /* Only preserve the rowid if we can find a name to use for the
2481 ** rowid */
2482 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
2483 int i, j;
2484 for(j=0; j<3; j++){
2485 for(i=1; i<=nCol; i++){
2486 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
2487 }
2488 if( i>nCol ){
2489 /* At this point, we know that azRowid[j] is not the name of any
2490 ** ordinary column in the table. Verify that azRowid[j] is a valid
2491 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
2492 ** tables will fail this last check */
2493 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
2494 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
2495 break;
2496 }
2497 }
2498 }
2499 return azCol;
2500}
2501
2502/*
2503** Toggle the reverse_unordered_selects setting.
2504*/
2505static void toggleSelectOrder(sqlite3 *db){
2506 sqlite3_stmt *pStmt = 0;
2507 int iSetting = 0;
2508 char zStmt[100];
2509 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
2510 if( sqlite3_step(pStmt)==SQLITE_ROW ){
2511 iSetting = sqlite3_column_int(pStmt, 0);
2512 }
2513 sqlite3_finalize(pStmt);
2514 sqlite3_snprintf(sizeof(zStmt), zStmt,
2515 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
2516 sqlite3_exec(db, zStmt, 0, 0, 0);
2517}
2518
2519/*
2520** This is a different callback routine used for dumping the database.
2521** Each row received by this callback consists of a table name,
2522** the table type ("index" or "table") and SQL to create the table.
2523** This routine should print text sufficient to recreate the table.
2524*/
2525static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
2526 int rc;
2527 const char *zTable;
2528 const char *zType;
2529 const char *zSql;
2530 ShellState *p = (ShellState *)pArg;
2531
2532 UNUSED_PARAMETER(azNotUsed);
2533 if( nArg!=3 ) return 1;
2534 zTable = azArg[0];
2535 zType = azArg[1];
2536 zSql = azArg[2];
2537
2538 if( strcmp(zTable, "sqlite_sequence")==0 ){
2539 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
2540 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
2541 raw_printf(p->out, "ANALYZE sqlite_master;\n");
2542 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2543 return 0;
2544 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2545 char *zIns;
2546 if( !p->writableSchema ){
2547 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
2548 p->writableSchema = 1;
2549 }
2550 zIns = sqlite3_mprintf(
2551 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2552 "VALUES('table','%q','%q',0,'%q');",
2553 zTable, zTable, zSql);
2554 utf8_printf(p->out, "%s\n", zIns);
2555 sqlite3_free(zIns);
2556 return 0;
2557 }else{
2558 printSchemaLine(p->out, zSql, ";\n");
2559 }
2560
2561 if( strcmp(zType, "table")==0 ){
2562 ShellText sSelect;
2563 ShellText sTable;
2564 char **azCol;
2565 int i;
2566 char *savedDestTable;
2567 int savedMode;
2568
2569 azCol = tableColumnList(p, zTable);
2570 if( azCol==0 ){
2571 p->nErr++;
2572 return 0;
2573 }
2574
2575 /* Always quote the table name, even if it appears to be pure ascii,
2576 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
2577 initText(&sTable);
2578 appendText(&sTable, zTable, quoteChar(zTable));
2579 /* If preserving the rowid, add a column list after the table name.
2580 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
2581 ** instead of the usual "INSERT INTO tab VALUES(...)".
2582 */
2583 if( azCol[0] ){
2584 appendText(&sTable, "(", 0);
2585 appendText(&sTable, azCol[0], 0);
2586 for(i=1; azCol[i]; i++){
2587 appendText(&sTable, ",", 0);
2588 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
2589 }
2590 appendText(&sTable, ")", 0);
2591 }
2592
2593 /* Build an appropriate SELECT statement */
2594 initText(&sSelect);
2595 appendText(&sSelect, "SELECT ", 0);
2596 if( azCol[0] ){
2597 appendText(&sSelect, azCol[0], 0);
2598 appendText(&sSelect, ",", 0);
2599 }
2600 for(i=1; azCol[i]; i++){
2601 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
2602 if( azCol[i+1] ){
2603 appendText(&sSelect, ",", 0);
2604 }
2605 }
2606 freeColumnList(azCol);
2607 appendText(&sSelect, " FROM ", 0);
2608 appendText(&sSelect, zTable, quoteChar(zTable));
2609
2610 savedDestTable = p->zDestTable;
2611 savedMode = p->mode;
2612 p->zDestTable = sTable.z;
2613 p->mode = p->cMode = MODE_Insert;
2614 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
2615 if( (rc&0xff)==SQLITE_CORRUPT ){
2616 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
2617 toggleSelectOrder(p->db);
2618 shell_exec(p->db, sSelect.z, shell_callback, p, 0);
2619 toggleSelectOrder(p->db);
2620 }
2621 p->zDestTable = savedDestTable;
2622 p->mode = savedMode;
2623 freeText(&sTable);
2624 freeText(&sSelect);
2625 if( rc ) p->nErr++;
2626 }
2627 return 0;
2628}
2629
2630/*
2631** Run zQuery. Use dump_callback() as the callback routine so that
2632** the contents of the query are output as SQL statements.
2633**
2634** If we get a SQLITE_CORRUPT error, rerun the query after appending
2635** "ORDER BY rowid DESC" to the end.
2636*/
2637static int run_schema_dump_query(
2638 ShellState *p,
2639 const char *zQuery
2640){
2641 int rc;
2642 char *zErr = 0;
2643 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
2644 if( rc==SQLITE_CORRUPT ){
2645 char *zQ2;
2646 int len = strlen30(zQuery);
2647 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
2648 if( zErr ){
2649 utf8_printf(p->out, "/****** %s ******/\n", zErr);
2650 sqlite3_free(zErr);
2651 zErr = 0;
2652 }
2653 zQ2 = malloc( len+100 );
2654 if( zQ2==0 ) return rc;
2655 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
2656 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
2657 if( rc ){
2658 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
2659 }else{
2660 rc = SQLITE_CORRUPT;
2661 }
2662 sqlite3_free(zErr);
2663 free(zQ2);
2664 }
2665 return rc;
2666}
2667
2668/*
2669** Text of a help message
2670*/
2671static char zHelp[] =
2672#ifndef SQLITE_OMIT_AUTHORIZATION
2673 ".auth ON|OFF Show authorizer callbacks\n"
2674#endif
2675 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
2676 ".bail on|off Stop after hitting an error. Default OFF\n"
2677 ".binary on|off Turn binary output on or off. Default OFF\n"
2678 ".cd DIRECTORY Change the working directory to DIRECTORY\n"
2679 ".changes on|off Show number of rows changed by SQL\n"
2680 ".check GLOB Fail if output since .testcase does not match\n"
2681 ".clone NEWDB Clone data into NEWDB from the existing database\n"
2682 ".databases List names and files of attached databases\n"
2683 ".dbinfo ?DB? Show status information about the database\n"
2684 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
2685 " If TABLE specified, only dump tables matching\n"
2686 " LIKE pattern TABLE.\n"
2687 ".echo on|off Turn command echo on or off\n"
2688 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
2689 ".exit Exit this program\n"
2690/* Because explain mode comes on automatically now, the ".explain" mode
2691** is removed from the help screen. It is still supported for legacy, however */
2692/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/
2693 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
2694 ".headers on|off Turn display of headers on or off\n"
2695 ".help Show this message\n"
2696 ".import FILE TABLE Import data from FILE into TABLE\n"
2697#ifndef SQLITE_OMIT_TEST_CONTROL
2698 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
2699#endif
2700 ".indexes ?TABLE? Show names of all indexes\n"
2701 " If TABLE specified, only show indexes for tables\n"
2702 " matching LIKE pattern TABLE.\n"
2703#ifdef SQLITE_ENABLE_IOTRACE
2704 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
2705#endif
2706 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
2707 ".lint OPTIONS Report potential schema issues. Options:\n"
2708 " fkey-indexes Find missing foreign key indexes\n"
2709#ifndef SQLITE_OMIT_LOAD_EXTENSION
2710 ".load FILE ?ENTRY? Load an extension library\n"
2711#endif
2712 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
2713 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
2714 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
2715 " csv Comma-separated values\n"
2716 " column Left-aligned columns. (See .width)\n"
2717 " html HTML <table> code\n"
2718 " insert SQL insert statements for TABLE\n"
2719 " line One value per line\n"
2720 " list Values delimited by \"|\"\n"
2721 " quote Escape answers as for SQL\n"
2722 " tabs Tab-separated values\n"
2723 " tcl TCL list elements\n"
2724 ".nullvalue STRING Use STRING in place of NULL values\n"
2725 ".once FILENAME Output for the next SQL command only to FILENAME\n"
2726 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n"
2727 " The --new option starts with an empty file\n"
2728 ".output ?FILENAME? Send output to FILENAME or stdout\n"
2729 ".print STRING... Print literal STRING\n"
2730 ".prompt MAIN CONTINUE Replace the standard prompts\n"
2731 ".quit Exit this program\n"
2732 ".read FILENAME Execute SQL in FILENAME\n"
2733 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
2734 ".save FILE Write in-memory database into FILE\n"
2735 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
2736 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
2737 " Add --indent for pretty-printing\n"
2738 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
2739 ".separator COL ?ROW? Change the column separator and optionally the row\n"
2740 " separator for both the output mode and .import\n"
2741#if defined(SQLITE_ENABLE_SESSION)
2742 ".session CMD ... Create or control sessions\n"
2743#endif
2744 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
2745 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
2746 ".show Show the current values for various settings\n"
2747 ".stats ?on|off? Show stats or turn stats on or off\n"
2748 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
2749 ".tables ?TABLE? List names of tables\n"
2750 " If TABLE specified, only list tables matching\n"
2751 " LIKE pattern TABLE.\n"
2752 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
2753 ".timeout MS Try opening locked tables for MS milliseconds\n"
2754 ".timer on|off Turn SQL timer on or off\n"
2755 ".trace FILE|off Output each SQL statement as it is run\n"
2756 ".vfsinfo ?AUX? Information about the top-level VFS\n"
2757 ".vfslist List all available VFSes\n"
2758 ".vfsname ?AUX? Print the name of the VFS stack\n"
2759 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
2760 " Negative values right-justify\n"
2761;
2762
2763#if defined(SQLITE_ENABLE_SESSION)
2764/*
2765** Print help information for the ".sessions" command
2766*/
2767void session_help(ShellState *p){
2768 raw_printf(p->out,
2769 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
2770 "If ?NAME? is omitted, the first defined session is used.\n"
2771 "Subcommands:\n"
2772 " attach TABLE Attach TABLE\n"
2773 " changeset FILE Write a changeset into FILE\n"
2774 " close Close one session\n"
2775 " enable ?BOOLEAN? Set or query the enable bit\n"
2776 " filter GLOB... Reject tables matching GLOBs\n"
2777 " indirect ?BOOLEAN? Mark or query the indirect status\n"
2778 " isempty Query whether the session is empty\n"
2779 " list List currently open session names\n"
2780 " open DB NAME Open a new session on DB\n"
2781 " patchset FILE Write a patchset into FILE\n"
2782 );
2783}
2784#endif
2785
2786
2787/* Forward reference */
2788static int process_input(ShellState *p, FILE *in);
2789
2790/*
2791** Read the content of file zName into memory obtained from sqlite3_malloc64()
2792** and return a pointer to the buffer. The caller is responsible for freeing
2793** the memory.
2794**
2795** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
2796** read.
2797**
2798** For convenience, a nul-terminator byte is always appended to the data read
2799** from the file before the buffer is returned. This byte is not included in
2800** the final value of (*pnByte), if applicable.
2801**
2802** NULL is returned if any error is encountered. The final value of *pnByte
2803** is undefined in this case.
2804*/
2805static char *readFile(const char *zName, int *pnByte){
2806 FILE *in = fopen(zName, "rb");
2807 long nIn;
2808 size_t nRead;
2809 char *pBuf;
2810 if( in==0 ) return 0;
2811 fseek(in, 0, SEEK_END);
2812 nIn = ftell(in);
2813 rewind(in);
2814 pBuf = sqlite3_malloc64( nIn+1 );
2815 if( pBuf==0 ) return 0;
2816 nRead = fread(pBuf, nIn, 1, in);
2817 fclose(in);
2818 if( nRead!=1 ){
2819 sqlite3_free(pBuf);
2820 return 0;
2821 }
2822 pBuf[nIn] = 0;
2823 if( pnByte ) *pnByte = nIn;
2824 return pBuf;
2825}
2826
2827#if defined(SQLITE_ENABLE_SESSION)
2828/*
2829** Close a single OpenSession object and release all of its associated
2830** resources.
2831*/
2832static void session_close(OpenSession *pSession){
2833 int i;
2834 sqlite3session_delete(pSession->p);
2835 sqlite3_free(pSession->zName);
2836 for(i=0; i<pSession->nFilter; i++){
2837 sqlite3_free(pSession->azFilter[i]);
2838 }
2839 sqlite3_free(pSession->azFilter);
2840 memset(pSession, 0, sizeof(OpenSession));
2841}
2842#endif
2843
2844/*
2845** Close all OpenSession objects and release all associated resources.
2846*/
2847#if defined(SQLITE_ENABLE_SESSION)
2848static void session_close_all(ShellState *p){
2849 int i;
2850 for(i=0; i<p->nSession; i++){
2851 session_close(&p->aSession[i]);
2852 }
2853 p->nSession = 0;
2854}
2855#else
2856# define session_close_all(X)
2857#endif
2858
2859/*
2860** Implementation of the xFilter function for an open session. Omit
2861** any tables named by ".session filter" but let all other table through.
2862*/
2863#if defined(SQLITE_ENABLE_SESSION)
2864static int session_filter(void *pCtx, const char *zTab){
2865 OpenSession *pSession = (OpenSession*)pCtx;
2866 int i;
2867 for(i=0; i<pSession->nFilter; i++){
2868 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
2869 }
2870 return 1;
2871}
2872#endif
2873
2874/*
2875** Make sure the database is open. If it is not, then open it. If
2876** the database fails to open, print an error message and exit.
2877*/
2878static void open_db(ShellState *p, int keepAlive){
2879 if( p->db==0 ){
2880 sqlite3_initialize();
2881 sqlite3_open(p->zDbFilename, &p->db);
2882 globalDb = p->db;
2883 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
2884 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
2885 p->zDbFilename, sqlite3_errmsg(p->db));
2886 if( keepAlive ) return;
2887 exit(1);
2888 }
2889#ifndef SQLITE_OMIT_LOAD_EXTENSION
2890 sqlite3_enable_load_extension(p->db, 1);
2891#endif
2892 sqlite3_fileio_init(p->db, 0, 0);
2893 sqlite3_shathree_init(p->db, 0, 0);
drh56eb09b2017-07-11 13:59:07 +00002894 sqlite3_completion_init(p->db, 0, 0);
drh2ce15c32017-07-11 13:34:40 +00002895 sqlite3_create_function(p->db, "shell_add_schema", 2, SQLITE_UTF8, 0,
2896 shellAddSchemaName, 0, 0);
drh2ce15c32017-07-11 13:34:40 +00002897 }
2898}
2899
drh56eb09b2017-07-11 13:59:07 +00002900#if HAVE_READLINE || HAVE_EDITLINE
2901/*
2902** Readline completion callbacks
2903*/
2904static char *readline_completion_generator(const char *text, int state){
2905 static sqlite3_stmt *pStmt = 0;
2906 char *zRet;
2907 if( state==0 ){
2908 char *zSql;
drh56eb09b2017-07-11 13:59:07 +00002909 sqlite3_finalize(pStmt);
2910 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
2911 " FROM completion(%Q) ORDER BY 1", text);
2912 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
2913 sqlite3_free(zSql);
2914 }
2915 if( sqlite3_step(pStmt)==SQLITE_ROW ){
drh968d8712017-07-14 00:28:28 +00002916 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
drh56eb09b2017-07-11 13:59:07 +00002917 }else{
2918 sqlite3_finalize(pStmt);
2919 pStmt = 0;
2920 zRet = 0;
2921 }
2922 return zRet;
2923}
2924static char **readline_completion(const char *zText, int iStart, int iEnd){
2925 rl_attempted_completion_over = 1;
2926 return rl_completion_matches(zText, readline_completion_generator);
2927}
2928
2929#elif HAVE_LINENOISE
2930/*
2931** Linenoise completion callback
2932*/
2933static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
2934 int nLine = (int)strlen(zLine);
2935 int i, iStart;
2936 sqlite3_stmt *pStmt = 0;
2937 char *zSql;
2938 char zBuf[1000];
2939
2940 if( nLine>sizeof(zBuf)-30 ) return;
2941 if( zLine[0]=='.' ) return;
2942 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
2943 if( i==nLine-1 ) return;
2944 iStart = i+1;
2945 memcpy(zBuf, zLine, iStart);
2946 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
2947 " FROM completion(%Q,%Q) ORDER BY 1",
2948 &zLine[iStart], zLine);
2949 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
2950 sqlite3_free(zSql);
2951 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
2952 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2953 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
2954 int nCompletion = sqlite3_column_bytes(pStmt, 0);
2955 if( iStart+nCompletion < sizeof(zBuf)-1 ){
2956 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
2957 linenoiseAddCompletion(lc, zBuf);
2958 }
2959 }
2960 sqlite3_finalize(pStmt);
2961}
2962#endif
2963
drh2ce15c32017-07-11 13:34:40 +00002964/*
2965** Do C-language style dequoting.
2966**
2967** \a -> alarm
2968** \b -> backspace
2969** \t -> tab
2970** \n -> newline
2971** \v -> vertical tab
2972** \f -> form feed
2973** \r -> carriage return
2974** \s -> space
2975** \" -> "
2976** \' -> '
2977** \\ -> backslash
2978** \NNN -> ascii character NNN in octal
2979*/
2980static void resolve_backslashes(char *z){
2981 int i, j;
2982 char c;
2983 while( *z && *z!='\\' ) z++;
2984 for(i=j=0; (c = z[i])!=0; i++, j++){
2985 if( c=='\\' && z[i+1]!=0 ){
2986 c = z[++i];
2987 if( c=='a' ){
2988 c = '\a';
2989 }else if( c=='b' ){
2990 c = '\b';
2991 }else if( c=='t' ){
2992 c = '\t';
2993 }else if( c=='n' ){
2994 c = '\n';
2995 }else if( c=='v' ){
2996 c = '\v';
2997 }else if( c=='f' ){
2998 c = '\f';
2999 }else if( c=='r' ){
3000 c = '\r';
3001 }else if( c=='"' ){
3002 c = '"';
3003 }else if( c=='\'' ){
3004 c = '\'';
3005 }else if( c=='\\' ){
3006 c = '\\';
3007 }else if( c>='0' && c<='7' ){
3008 c -= '0';
3009 if( z[i+1]>='0' && z[i+1]<='7' ){
3010 i++;
3011 c = (c<<3) + z[i] - '0';
3012 if( z[i+1]>='0' && z[i+1]<='7' ){
3013 i++;
3014 c = (c<<3) + z[i] - '0';
3015 }
3016 }
3017 }
3018 }
3019 z[j] = c;
3020 }
3021 if( j<i ) z[j] = 0;
3022}
3023
3024/*
3025** Return the value of a hexadecimal digit. Return -1 if the input
3026** is not a hex digit.
3027*/
3028static int hexDigitValue(char c){
3029 if( c>='0' && c<='9' ) return c - '0';
3030 if( c>='a' && c<='f' ) return c - 'a' + 10;
3031 if( c>='A' && c<='F' ) return c - 'A' + 10;
3032 return -1;
3033}
3034
3035/*
3036** Interpret zArg as an integer value, possibly with suffixes.
3037*/
3038static sqlite3_int64 integerValue(const char *zArg){
3039 sqlite3_int64 v = 0;
3040 static const struct { char *zSuffix; int iMult; } aMult[] = {
3041 { "KiB", 1024 },
3042 { "MiB", 1024*1024 },
3043 { "GiB", 1024*1024*1024 },
3044 { "KB", 1000 },
3045 { "MB", 1000000 },
3046 { "GB", 1000000000 },
3047 { "K", 1000 },
3048 { "M", 1000000 },
3049 { "G", 1000000000 },
3050 };
3051 int i;
3052 int isNeg = 0;
3053 if( zArg[0]=='-' ){
3054 isNeg = 1;
3055 zArg++;
3056 }else if( zArg[0]=='+' ){
3057 zArg++;
3058 }
3059 if( zArg[0]=='0' && zArg[1]=='x' ){
3060 int x;
3061 zArg += 2;
3062 while( (x = hexDigitValue(zArg[0]))>=0 ){
3063 v = (v<<4) + x;
3064 zArg++;
3065 }
3066 }else{
3067 while( IsDigit(zArg[0]) ){
3068 v = v*10 + zArg[0] - '0';
3069 zArg++;
3070 }
3071 }
3072 for(i=0; i<ArraySize(aMult); i++){
3073 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
3074 v *= aMult[i].iMult;
3075 break;
3076 }
3077 }
3078 return isNeg? -v : v;
3079}
3080
3081/*
3082** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3083** for TRUE and FALSE. Return the integer value if appropriate.
3084*/
3085static int booleanValue(const char *zArg){
3086 int i;
3087 if( zArg[0]=='0' && zArg[1]=='x' ){
3088 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3089 }else{
3090 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3091 }
3092 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3093 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3094 return 1;
3095 }
3096 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3097 return 0;
3098 }
3099 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
3100 zArg);
3101 return 0;
3102}
3103
3104/*
3105** Set or clear a shell flag according to a boolean value.
3106*/
3107static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
3108 if( booleanValue(zArg) ){
3109 ShellSetFlag(p, mFlag);
3110 }else{
3111 ShellClearFlag(p, mFlag);
3112 }
3113}
3114
3115/*
3116** Close an output file, assuming it is not stderr or stdout
3117*/
3118static void output_file_close(FILE *f){
3119 if( f && f!=stdout && f!=stderr ) fclose(f);
3120}
3121
3122/*
3123** Try to open an output file. The names "stdout" and "stderr" are
3124** recognized and do the right thing. NULL is returned if the output
3125** filename is "off".
3126*/
3127static FILE *output_file_open(const char *zFile){
3128 FILE *f;
3129 if( strcmp(zFile,"stdout")==0 ){
3130 f = stdout;
3131 }else if( strcmp(zFile, "stderr")==0 ){
3132 f = stderr;
3133 }else if( strcmp(zFile, "off")==0 ){
3134 f = 0;
3135 }else{
3136 f = fopen(zFile, "wb");
3137 if( f==0 ){
3138 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
3139 }
3140 }
3141 return f;
3142}
3143
3144#if !defined(SQLITE_UNTESTABLE)
3145#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3146/*
3147** A routine for handling output from sqlite3_trace().
3148*/
3149static int sql_trace_callback(
3150 unsigned mType,
3151 void *pArg,
3152 void *pP,
3153 void *pX
3154){
3155 FILE *f = (FILE*)pArg;
3156 UNUSED_PARAMETER(mType);
3157 UNUSED_PARAMETER(pP);
3158 if( f ){
3159 const char *z = (const char*)pX;
3160 int i = (int)strlen(z);
3161 while( i>0 && z[i-1]==';' ){ i--; }
3162 utf8_printf(f, "%.*s;\n", i, z);
3163 }
3164 return 0;
3165}
3166#endif
3167#endif
3168
3169/*
3170** A no-op routine that runs with the ".breakpoint" doc-command. This is
3171** a useful spot to set a debugger breakpoint.
3172*/
3173static void test_breakpoint(void){
3174 static int nCall = 0;
3175 nCall++;
3176}
3177
3178/*
3179** An object used to read a CSV and other files for import.
3180*/
3181typedef struct ImportCtx ImportCtx;
3182struct ImportCtx {
3183 const char *zFile; /* Name of the input file */
3184 FILE *in; /* Read the CSV text from this input stream */
3185 char *z; /* Accumulated text for a field */
3186 int n; /* Number of bytes in z */
3187 int nAlloc; /* Space allocated for z[] */
3188 int nLine; /* Current line number */
3189 int bNotFirst; /* True if one or more bytes already read */
3190 int cTerm; /* Character that terminated the most recent field */
3191 int cColSep; /* The column separator character. (Usually ",") */
3192 int cRowSep; /* The row separator character. (Usually "\n") */
3193};
3194
3195/* Append a single byte to z[] */
3196static void import_append_char(ImportCtx *p, int c){
3197 if( p->n+1>=p->nAlloc ){
3198 p->nAlloc += p->nAlloc + 100;
3199 p->z = sqlite3_realloc64(p->z, p->nAlloc);
3200 if( p->z==0 ){
3201 raw_printf(stderr, "out of memory\n");
3202 exit(1);
3203 }
3204 }
3205 p->z[p->n++] = (char)c;
3206}
3207
3208/* Read a single field of CSV text. Compatible with rfc4180 and extended
3209** with the option of having a separator other than ",".
3210**
3211** + Input comes from p->in.
3212** + Store results in p->z of length p->n. Space to hold p->z comes
3213** from sqlite3_malloc64().
3214** + Use p->cSep as the column separator. The default is ",".
3215** + Use p->rSep as the row separator. The default is "\n".
3216** + Keep track of the line number in p->nLine.
3217** + Store the character that terminates the field in p->cTerm. Store
3218** EOF on end-of-file.
3219** + Report syntax errors on stderr
3220*/
3221static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
3222 int c;
3223 int cSep = p->cColSep;
3224 int rSep = p->cRowSep;
3225 p->n = 0;
3226 c = fgetc(p->in);
3227 if( c==EOF || seenInterrupt ){
3228 p->cTerm = EOF;
3229 return 0;
3230 }
3231 if( c=='"' ){
3232 int pc, ppc;
3233 int startLine = p->nLine;
3234 int cQuote = c;
3235 pc = ppc = 0;
3236 while( 1 ){
3237 c = fgetc(p->in);
3238 if( c==rSep ) p->nLine++;
3239 if( c==cQuote ){
3240 if( pc==cQuote ){
3241 pc = 0;
3242 continue;
3243 }
3244 }
3245 if( (c==cSep && pc==cQuote)
3246 || (c==rSep && pc==cQuote)
3247 || (c==rSep && pc=='\r' && ppc==cQuote)
3248 || (c==EOF && pc==cQuote)
3249 ){
3250 do{ p->n--; }while( p->z[p->n]!=cQuote );
3251 p->cTerm = c;
3252 break;
3253 }
3254 if( pc==cQuote && c!='\r' ){
3255 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
3256 p->zFile, p->nLine, cQuote);
3257 }
3258 if( c==EOF ){
3259 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
3260 p->zFile, startLine, cQuote);
3261 p->cTerm = c;
3262 break;
3263 }
3264 import_append_char(p, c);
3265 ppc = pc;
3266 pc = c;
3267 }
3268 }else{
3269 /* If this is the first field being parsed and it begins with the
3270 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
3271 if( (c&0xff)==0xef && p->bNotFirst==0 ){
3272 import_append_char(p, c);
3273 c = fgetc(p->in);
3274 if( (c&0xff)==0xbb ){
3275 import_append_char(p, c);
3276 c = fgetc(p->in);
3277 if( (c&0xff)==0xbf ){
3278 p->bNotFirst = 1;
3279 p->n = 0;
3280 return csv_read_one_field(p);
3281 }
3282 }
3283 }
3284 while( c!=EOF && c!=cSep && c!=rSep ){
3285 import_append_char(p, c);
3286 c = fgetc(p->in);
3287 }
3288 if( c==rSep ){
3289 p->nLine++;
3290 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
3291 }
3292 p->cTerm = c;
3293 }
3294 if( p->z ) p->z[p->n] = 0;
3295 p->bNotFirst = 1;
3296 return p->z;
3297}
3298
3299/* Read a single field of ASCII delimited text.
3300**
3301** + Input comes from p->in.
3302** + Store results in p->z of length p->n. Space to hold p->z comes
3303** from sqlite3_malloc64().
3304** + Use p->cSep as the column separator. The default is "\x1F".
3305** + Use p->rSep as the row separator. The default is "\x1E".
3306** + Keep track of the row number in p->nLine.
3307** + Store the character that terminates the field in p->cTerm. Store
3308** EOF on end-of-file.
3309** + Report syntax errors on stderr
3310*/
3311static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
3312 int c;
3313 int cSep = p->cColSep;
3314 int rSep = p->cRowSep;
3315 p->n = 0;
3316 c = fgetc(p->in);
3317 if( c==EOF || seenInterrupt ){
3318 p->cTerm = EOF;
3319 return 0;
3320 }
3321 while( c!=EOF && c!=cSep && c!=rSep ){
3322 import_append_char(p, c);
3323 c = fgetc(p->in);
3324 }
3325 if( c==rSep ){
3326 p->nLine++;
3327 }
3328 p->cTerm = c;
3329 if( p->z ) p->z[p->n] = 0;
3330 return p->z;
3331}
3332
3333/*
3334** Try to transfer data for table zTable. If an error is seen while
3335** moving forward, try to go backwards. The backwards movement won't
3336** work for WITHOUT ROWID tables.
3337*/
3338static void tryToCloneData(
3339 ShellState *p,
3340 sqlite3 *newDb,
3341 const char *zTable
3342){
3343 sqlite3_stmt *pQuery = 0;
3344 sqlite3_stmt *pInsert = 0;
3345 char *zQuery = 0;
3346 char *zInsert = 0;
3347 int rc;
3348 int i, j, n;
3349 int nTable = (int)strlen(zTable);
3350 int k = 0;
3351 int cnt = 0;
3352 const int spinRate = 10000;
3353
3354 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
3355 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3356 if( rc ){
3357 utf8_printf(stderr, "Error %d: %s on [%s]\n",
3358 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3359 zQuery);
3360 goto end_data_xfer;
3361 }
3362 n = sqlite3_column_count(pQuery);
3363 zInsert = sqlite3_malloc64(200 + nTable + n*3);
3364 if( zInsert==0 ){
3365 raw_printf(stderr, "out of memory\n");
3366 goto end_data_xfer;
3367 }
3368 sqlite3_snprintf(200+nTable,zInsert,
3369 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
3370 i = (int)strlen(zInsert);
3371 for(j=1; j<n; j++){
3372 memcpy(zInsert+i, ",?", 2);
3373 i += 2;
3374 }
3375 memcpy(zInsert+i, ");", 3);
3376 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
3377 if( rc ){
3378 utf8_printf(stderr, "Error %d: %s on [%s]\n",
3379 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
3380 zQuery);
3381 goto end_data_xfer;
3382 }
3383 for(k=0; k<2; k++){
3384 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3385 for(i=0; i<n; i++){
3386 switch( sqlite3_column_type(pQuery, i) ){
3387 case SQLITE_NULL: {
3388 sqlite3_bind_null(pInsert, i+1);
3389 break;
3390 }
3391 case SQLITE_INTEGER: {
3392 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
3393 break;
3394 }
3395 case SQLITE_FLOAT: {
3396 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
3397 break;
3398 }
3399 case SQLITE_TEXT: {
3400 sqlite3_bind_text(pInsert, i+1,
3401 (const char*)sqlite3_column_text(pQuery,i),
3402 -1, SQLITE_STATIC);
3403 break;
3404 }
3405 case SQLITE_BLOB: {
3406 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
3407 sqlite3_column_bytes(pQuery,i),
3408 SQLITE_STATIC);
3409 break;
3410 }
3411 }
3412 } /* End for */
3413 rc = sqlite3_step(pInsert);
3414 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
3415 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
3416 sqlite3_errmsg(newDb));
3417 }
3418 sqlite3_reset(pInsert);
3419 cnt++;
3420 if( (cnt%spinRate)==0 ){
3421 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
3422 fflush(stdout);
3423 }
3424 } /* End while */
3425 if( rc==SQLITE_DONE ) break;
3426 sqlite3_finalize(pQuery);
3427 sqlite3_free(zQuery);
3428 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
3429 zTable);
3430 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3431 if( rc ){
3432 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
3433 break;
3434 }
3435 } /* End for(k=0...) */
3436
3437end_data_xfer:
3438 sqlite3_finalize(pQuery);
3439 sqlite3_finalize(pInsert);
3440 sqlite3_free(zQuery);
3441 sqlite3_free(zInsert);
3442}
3443
3444
3445/*
3446** Try to transfer all rows of the schema that match zWhere. For
3447** each row, invoke xForEach() on the object defined by that row.
3448** If an error is encountered while moving forward through the
3449** sqlite_master table, try again moving backwards.
3450*/
3451static void tryToCloneSchema(
3452 ShellState *p,
3453 sqlite3 *newDb,
3454 const char *zWhere,
3455 void (*xForEach)(ShellState*,sqlite3*,const char*)
3456){
3457 sqlite3_stmt *pQuery = 0;
3458 char *zQuery = 0;
3459 int rc;
3460 const unsigned char *zName;
3461 const unsigned char *zSql;
3462 char *zErrMsg = 0;
3463
3464 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3465 " WHERE %s", zWhere);
3466 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3467 if( rc ){
3468 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
3469 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3470 zQuery);
3471 goto end_schema_xfer;
3472 }
3473 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3474 zName = sqlite3_column_text(pQuery, 0);
3475 zSql = sqlite3_column_text(pQuery, 1);
3476 printf("%s... ", zName); fflush(stdout);
3477 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3478 if( zErrMsg ){
3479 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
3480 sqlite3_free(zErrMsg);
3481 zErrMsg = 0;
3482 }
3483 if( xForEach ){
3484 xForEach(p, newDb, (const char*)zName);
3485 }
3486 printf("done\n");
3487 }
3488 if( rc!=SQLITE_DONE ){
3489 sqlite3_finalize(pQuery);
3490 sqlite3_free(zQuery);
3491 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3492 " WHERE %s ORDER BY rowid DESC", zWhere);
3493 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3494 if( rc ){
3495 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
3496 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3497 zQuery);
3498 goto end_schema_xfer;
3499 }
3500 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3501 zName = sqlite3_column_text(pQuery, 0);
3502 zSql = sqlite3_column_text(pQuery, 1);
3503 printf("%s... ", zName); fflush(stdout);
3504 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3505 if( zErrMsg ){
3506 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
3507 sqlite3_free(zErrMsg);
3508 zErrMsg = 0;
3509 }
3510 if( xForEach ){
3511 xForEach(p, newDb, (const char*)zName);
3512 }
3513 printf("done\n");
3514 }
3515 }
3516end_schema_xfer:
3517 sqlite3_finalize(pQuery);
3518 sqlite3_free(zQuery);
3519}
3520
3521/*
3522** Open a new database file named "zNewDb". Try to recover as much information
3523** as possible out of the main database (which might be corrupt) and write it
3524** into zNewDb.
3525*/
3526static void tryToClone(ShellState *p, const char *zNewDb){
3527 int rc;
3528 sqlite3 *newDb = 0;
3529 if( access(zNewDb,0)==0 ){
3530 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
3531 return;
3532 }
3533 rc = sqlite3_open(zNewDb, &newDb);
3534 if( rc ){
3535 utf8_printf(stderr, "Cannot create output database: %s\n",
3536 sqlite3_errmsg(newDb));
3537 }else{
3538 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
3539 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
3540 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
3541 tryToCloneSchema(p, newDb, "type!='table'", 0);
3542 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
3543 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
3544 }
3545 sqlite3_close(newDb);
3546}
3547
3548/*
3549** Change the output file back to stdout
3550*/
3551static void output_reset(ShellState *p){
3552 if( p->outfile[0]=='|' ){
3553#ifndef SQLITE_OMIT_POPEN
3554 pclose(p->out);
3555#endif
3556 }else{
3557 output_file_close(p->out);
3558 }
3559 p->outfile[0] = 0;
3560 p->out = stdout;
3561}
3562
3563/*
3564** Run an SQL command and return the single integer result.
3565*/
3566static int db_int(ShellState *p, const char *zSql){
3567 sqlite3_stmt *pStmt;
3568 int res = 0;
3569 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3570 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
3571 res = sqlite3_column_int(pStmt,0);
3572 }
3573 sqlite3_finalize(pStmt);
3574 return res;
3575}
3576
3577/*
3578** Convert a 2-byte or 4-byte big-endian integer into a native integer
3579*/
3580static unsigned int get2byteInt(unsigned char *a){
3581 return (a[0]<<8) + a[1];
3582}
3583static unsigned int get4byteInt(unsigned char *a){
3584 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
3585}
3586
3587/*
3588** Implementation of the ".info" command.
3589**
3590** Return 1 on error, 2 to exit, and 0 otherwise.
3591*/
3592static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
3593 static const struct { const char *zName; int ofst; } aField[] = {
3594 { "file change counter:", 24 },
3595 { "database page count:", 28 },
3596 { "freelist page count:", 36 },
3597 { "schema cookie:", 40 },
3598 { "schema format:", 44 },
3599 { "default cache size:", 48 },
3600 { "autovacuum top root:", 52 },
3601 { "incremental vacuum:", 64 },
3602 { "text encoding:", 56 },
3603 { "user version:", 60 },
3604 { "application id:", 68 },
3605 { "software version:", 96 },
3606 };
3607 static const struct { const char *zName; const char *zSql; } aQuery[] = {
3608 { "number of tables:",
3609 "SELECT count(*) FROM %s WHERE type='table'" },
3610 { "number of indexes:",
3611 "SELECT count(*) FROM %s WHERE type='index'" },
3612 { "number of triggers:",
3613 "SELECT count(*) FROM %s WHERE type='trigger'" },
3614 { "number of views:",
3615 "SELECT count(*) FROM %s WHERE type='view'" },
3616 { "schema size:",
3617 "SELECT total(length(sql)) FROM %s" },
3618 };
3619 sqlite3_file *pFile = 0;
3620 int i;
3621 char *zSchemaTab;
3622 char *zDb = nArg>=2 ? azArg[1] : "main";
3623 unsigned char aHdr[100];
3624 open_db(p, 0);
3625 if( p->db==0 ) return 1;
3626 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
3627 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
3628 return 1;
3629 }
3630 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
3631 if( i!=SQLITE_OK ){
3632 raw_printf(stderr, "unable to read database header\n");
3633 return 1;
3634 }
3635 i = get2byteInt(aHdr+16);
3636 if( i==1 ) i = 65536;
3637 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
3638 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
3639 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
3640 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
3641 for(i=0; i<ArraySize(aField); i++){
3642 int ofst = aField[i].ofst;
3643 unsigned int val = get4byteInt(aHdr + ofst);
3644 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
3645 switch( ofst ){
3646 case 56: {
3647 if( val==1 ) raw_printf(p->out, " (utf8)");
3648 if( val==2 ) raw_printf(p->out, " (utf16le)");
3649 if( val==3 ) raw_printf(p->out, " (utf16be)");
3650 }
3651 }
3652 raw_printf(p->out, "\n");
3653 }
3654 if( zDb==0 ){
3655 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
3656 }else if( strcmp(zDb,"temp")==0 ){
3657 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
3658 }else{
3659 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
3660 }
3661 for(i=0; i<ArraySize(aQuery); i++){
3662 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
3663 int val = db_int(p, zSql);
3664 sqlite3_free(zSql);
3665 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
3666 }
3667 sqlite3_free(zSchemaTab);
3668 return 0;
3669}
3670
3671/*
3672** Print the current sqlite3_errmsg() value to stderr and return 1.
3673*/
3674static int shellDatabaseError(sqlite3 *db){
3675 const char *zErr = sqlite3_errmsg(db);
3676 utf8_printf(stderr, "Error: %s\n", zErr);
3677 return 1;
3678}
3679
3680/*
3681** Print an out-of-memory message to stderr and return 1.
3682*/
3683static int shellNomemError(void){
3684 raw_printf(stderr, "Error: out of memory\n");
3685 return 1;
3686}
3687
3688/*
3689** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
3690** if they match and FALSE (0) if they do not match.
3691**
3692** Globbing rules:
3693**
3694** '*' Matches any sequence of zero or more characters.
3695**
3696** '?' Matches exactly one character.
3697**
3698** [...] Matches one character from the enclosed list of
3699** characters.
3700**
3701** [^...] Matches one character not in the enclosed list.
3702**
3703** '#' Matches any sequence of one or more digits with an
3704** optional + or - sign in front
3705**
3706** ' ' Any span of whitespace matches any other span of
3707** whitespace.
3708**
3709** Extra whitespace at the end of z[] is ignored.
3710*/
3711static int testcase_glob(const char *zGlob, const char *z){
3712 int c, c2;
3713 int invert;
3714 int seen;
3715
3716 while( (c = (*(zGlob++)))!=0 ){
3717 if( IsSpace(c) ){
3718 if( !IsSpace(*z) ) return 0;
3719 while( IsSpace(*zGlob) ) zGlob++;
3720 while( IsSpace(*z) ) z++;
3721 }else if( c=='*' ){
3722 while( (c=(*(zGlob++))) == '*' || c=='?' ){
3723 if( c=='?' && (*(z++))==0 ) return 0;
3724 }
3725 if( c==0 ){
3726 return 1;
3727 }else if( c=='[' ){
3728 while( *z && testcase_glob(zGlob-1,z)==0 ){
3729 z++;
3730 }
3731 return (*z)!=0;
3732 }
3733 while( (c2 = (*(z++)))!=0 ){
3734 while( c2!=c ){
3735 c2 = *(z++);
3736 if( c2==0 ) return 0;
3737 }
3738 if( testcase_glob(zGlob,z) ) return 1;
3739 }
3740 return 0;
3741 }else if( c=='?' ){
3742 if( (*(z++))==0 ) return 0;
3743 }else if( c=='[' ){
3744 int prior_c = 0;
3745 seen = 0;
3746 invert = 0;
3747 c = *(z++);
3748 if( c==0 ) return 0;
3749 c2 = *(zGlob++);
3750 if( c2=='^' ){
3751 invert = 1;
3752 c2 = *(zGlob++);
3753 }
3754 if( c2==']' ){
3755 if( c==']' ) seen = 1;
3756 c2 = *(zGlob++);
3757 }
3758 while( c2 && c2!=']' ){
3759 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
3760 c2 = *(zGlob++);
3761 if( c>=prior_c && c<=c2 ) seen = 1;
3762 prior_c = 0;
3763 }else{
3764 if( c==c2 ){
3765 seen = 1;
3766 }
3767 prior_c = c2;
3768 }
3769 c2 = *(zGlob++);
3770 }
3771 if( c2==0 || (seen ^ invert)==0 ) return 0;
3772 }else if( c=='#' ){
3773 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
3774 if( !IsDigit(z[0]) ) return 0;
3775 z++;
3776 while( IsDigit(z[0]) ){ z++; }
3777 }else{
3778 if( c!=(*(z++)) ) return 0;
3779 }
3780 }
3781 while( IsSpace(*z) ){ z++; }
3782 return *z==0;
3783}
3784
3785
3786/*
3787** Compare the string as a command-line option with either one or two
3788** initial "-" characters.
3789*/
3790static int optionMatch(const char *zStr, const char *zOpt){
3791 if( zStr[0]!='-' ) return 0;
3792 zStr++;
3793 if( zStr[0]=='-' ) zStr++;
3794 return strcmp(zStr, zOpt)==0;
3795}
3796
3797/*
3798** Delete a file.
3799*/
3800int shellDeleteFile(const char *zFilename){
3801 int rc;
3802#ifdef _WIN32
3803 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
3804 rc = _wunlink(z);
3805 sqlite3_free(z);
3806#else
3807 rc = unlink(zFilename);
3808#endif
3809 return rc;
3810}
3811
3812
3813/*
3814** The implementation of SQL scalar function fkey_collate_clause(), used
3815** by the ".lint fkey-indexes" command. This scalar function is always
3816** called with four arguments - the parent table name, the parent column name,
3817** the child table name and the child column name.
3818**
3819** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
3820**
3821** If either of the named tables or columns do not exist, this function
3822** returns an empty string. An empty string is also returned if both tables
3823** and columns exist but have the same default collation sequence. Or,
3824** if both exist but the default collation sequences are different, this
3825** function returns the string " COLLATE <parent-collation>", where
3826** <parent-collation> is the default collation sequence of the parent column.
3827*/
3828static void shellFkeyCollateClause(
3829 sqlite3_context *pCtx,
3830 int nVal,
3831 sqlite3_value **apVal
3832){
3833 sqlite3 *db = sqlite3_context_db_handle(pCtx);
3834 const char *zParent;
3835 const char *zParentCol;
3836 const char *zParentSeq;
3837 const char *zChild;
3838 const char *zChildCol;
3839 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
3840 int rc;
3841
3842 assert( nVal==4 );
3843 zParent = (const char*)sqlite3_value_text(apVal[0]);
3844 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
3845 zChild = (const char*)sqlite3_value_text(apVal[2]);
3846 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
3847
3848 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
3849 rc = sqlite3_table_column_metadata(
3850 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
3851 );
3852 if( rc==SQLITE_OK ){
3853 rc = sqlite3_table_column_metadata(
3854 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
3855 );
3856 }
3857
3858 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
3859 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
3860 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
3861 sqlite3_free(z);
3862 }
3863}
3864
3865
3866/*
3867** The implementation of dot-command ".lint fkey-indexes".
3868*/
3869static int lintFkeyIndexes(
3870 ShellState *pState, /* Current shell tool state */
3871 char **azArg, /* Array of arguments passed to dot command */
3872 int nArg /* Number of entries in azArg[] */
3873){
3874 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
3875 FILE *out = pState->out; /* Stream to write non-error output to */
3876 int bVerbose = 0; /* If -verbose is present */
3877 int bGroupByParent = 0; /* If -groupbyparent is present */
3878 int i; /* To iterate through azArg[] */
3879 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
3880 int rc; /* Return code */
3881 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
3882
3883 /*
3884 ** This SELECT statement returns one row for each foreign key constraint
3885 ** in the schema of the main database. The column values are:
3886 **
3887 ** 0. The text of an SQL statement similar to:
3888 **
3889 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
3890 **
3891 ** This is the same SELECT that the foreign keys implementation needs
3892 ** to run internally on child tables. If there is an index that can
3893 ** be used to optimize this query, then it can also be used by the FK
3894 ** implementation to optimize DELETE or UPDATE statements on the parent
3895 ** table.
3896 **
3897 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
3898 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
3899 ** contains an index that can be used to optimize the query.
3900 **
3901 ** 2. Human readable text that describes the child table and columns. e.g.
3902 **
3903 ** "child_table(child_key1, child_key2)"
3904 **
3905 ** 3. Human readable text that describes the parent table and columns. e.g.
3906 **
3907 ** "parent_table(parent_key1, parent_key2)"
3908 **
3909 ** 4. A full CREATE INDEX statement for an index that could be used to
3910 ** optimize DELETE or UPDATE statements on the parent table. e.g.
3911 **
3912 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
3913 **
3914 ** 5. The name of the parent table.
3915 **
3916 ** These six values are used by the C logic below to generate the report.
3917 */
3918 const char *zSql =
3919 "SELECT "
3920 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
3921 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
3922 " || fkey_collate_clause("
3923 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
3924 ", "
3925 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
3926 " || group_concat('*=?', ' AND ') || ')'"
3927 ", "
3928 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
3929 ", "
3930 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
3931 ", "
3932 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
3933 " || ' ON ' || quote(s.name) || '('"
3934 " || group_concat(quote(f.[from]) ||"
3935 " fkey_collate_clause("
3936 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
3937 " || ');'"
3938 ", "
3939 " f.[table] "
3940 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
3941 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
3942 "GROUP BY s.name, f.id "
3943 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
3944 ;
3945 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
3946
3947 for(i=2; i<nArg; i++){
3948 int n = (int)strlen(azArg[i]);
3949 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
3950 bVerbose = 1;
3951 }
3952 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
3953 bGroupByParent = 1;
3954 zIndent = " ";
3955 }
3956 else{
3957 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
3958 azArg[0], azArg[1]
3959 );
3960 return SQLITE_ERROR;
3961 }
3962 }
3963
3964 /* Register the fkey_collate_clause() SQL function */
3965 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
3966 0, shellFkeyCollateClause, 0, 0
3967 );
3968
3969
3970 if( rc==SQLITE_OK ){
3971 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
3972 }
3973 if( rc==SQLITE_OK ){
3974 sqlite3_bind_int(pSql, 1, bGroupByParent);
3975 }
3976
3977 if( rc==SQLITE_OK ){
3978 int rc2;
3979 char *zPrev = 0;
3980 while( SQLITE_ROW==sqlite3_step(pSql) ){
3981 int res = -1;
3982 sqlite3_stmt *pExplain = 0;
3983 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
3984 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
3985 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
3986 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
3987 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
3988 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
3989
3990 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
3991 if( rc!=SQLITE_OK ) break;
3992 if( SQLITE_ROW==sqlite3_step(pExplain) ){
3993 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
3994 res = (
3995 0==sqlite3_strglob(zGlob, zPlan)
3996 || 0==sqlite3_strglob(zGlobIPK, zPlan)
3997 );
3998 }
3999 rc = sqlite3_finalize(pExplain);
4000 if( rc!=SQLITE_OK ) break;
4001
4002 if( res<0 ){
4003 raw_printf(stderr, "Error: internal error");
4004 break;
4005 }else{
4006 if( bGroupByParent
4007 && (bVerbose || res==0)
4008 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4009 ){
4010 raw_printf(out, "-- Parent table %s\n", zParent);
4011 sqlite3_free(zPrev);
4012 zPrev = sqlite3_mprintf("%s", zParent);
4013 }
4014
4015 if( res==0 ){
4016 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4017 }else if( bVerbose ){
4018 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4019 zIndent, zFrom, zTarget
4020 );
4021 }
4022 }
4023 }
4024 sqlite3_free(zPrev);
4025
4026 if( rc!=SQLITE_OK ){
4027 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4028 }
4029
4030 rc2 = sqlite3_finalize(pSql);
4031 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4032 rc = rc2;
4033 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4034 }
4035 }else{
4036 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4037 }
4038
4039 return rc;
4040}
4041
4042/*
4043** Implementation of ".lint" dot command.
4044*/
4045static int lintDotCommand(
4046 ShellState *pState, /* Current shell tool state */
4047 char **azArg, /* Array of arguments passed to dot command */
4048 int nArg /* Number of entries in azArg[] */
4049){
4050 int n;
4051 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
4052 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4053 return lintFkeyIndexes(pState, azArg, nArg);
4054
4055 usage:
4056 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4057 raw_printf(stderr, "Where sub-commands are:\n");
4058 raw_printf(stderr, " fkey-indexes\n");
4059 return SQLITE_ERROR;
4060}
4061
4062
4063/*
4064** If an input line begins with "." then invoke this routine to
4065** process that line.
4066**
4067** Return 1 on error, 2 to exit, and 0 otherwise.
4068*/
4069static int do_meta_command(char *zLine, ShellState *p){
4070 int h = 1;
4071 int nArg = 0;
4072 int n, c;
4073 int rc = 0;
4074 char *azArg[50];
4075
4076 /* Parse the input line into tokens.
4077 */
4078 while( zLine[h] && nArg<ArraySize(azArg) ){
4079 while( IsSpace(zLine[h]) ){ h++; }
4080 if( zLine[h]==0 ) break;
4081 if( zLine[h]=='\'' || zLine[h]=='"' ){
4082 int delim = zLine[h++];
4083 azArg[nArg++] = &zLine[h];
4084 while( zLine[h] && zLine[h]!=delim ){
4085 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
4086 h++;
4087 }
4088 if( zLine[h]==delim ){
4089 zLine[h++] = 0;
4090 }
4091 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
4092 }else{
4093 azArg[nArg++] = &zLine[h];
4094 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
4095 if( zLine[h] ) zLine[h++] = 0;
4096 resolve_backslashes(azArg[nArg-1]);
4097 }
4098 }
4099
4100 /* Process the input line.
4101 */
4102 if( nArg==0 ) return 0; /* no tokens, no error */
4103 n = strlen30(azArg[0]);
4104 c = azArg[0][0];
4105
4106#ifndef SQLITE_OMIT_AUTHORIZATION
4107 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
4108 if( nArg!=2 ){
4109 raw_printf(stderr, "Usage: .auth ON|OFF\n");
4110 rc = 1;
4111 goto meta_command_exit;
4112 }
4113 open_db(p, 0);
4114 if( booleanValue(azArg[1]) ){
4115 sqlite3_set_authorizer(p->db, shellAuth, p);
4116 }else{
4117 sqlite3_set_authorizer(p->db, 0, 0);
4118 }
4119 }else
4120#endif
4121
4122 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
4123 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
4124 ){
4125 const char *zDestFile = 0;
4126 const char *zDb = 0;
4127 sqlite3 *pDest;
4128 sqlite3_backup *pBackup;
4129 int j;
4130 for(j=1; j<nArg; j++){
4131 const char *z = azArg[j];
4132 if( z[0]=='-' ){
4133 while( z[0]=='-' ) z++;
4134 /* No options to process at this time */
4135 {
4136 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
4137 return 1;
4138 }
4139 }else if( zDestFile==0 ){
4140 zDestFile = azArg[j];
4141 }else if( zDb==0 ){
4142 zDb = zDestFile;
4143 zDestFile = azArg[j];
4144 }else{
4145 raw_printf(stderr, "too many arguments to .backup\n");
4146 return 1;
4147 }
4148 }
4149 if( zDestFile==0 ){
4150 raw_printf(stderr, "missing FILENAME argument on .backup\n");
4151 return 1;
4152 }
4153 if( zDb==0 ) zDb = "main";
4154 rc = sqlite3_open(zDestFile, &pDest);
4155 if( rc!=SQLITE_OK ){
4156 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
4157 sqlite3_close(pDest);
4158 return 1;
4159 }
4160 open_db(p, 0);
4161 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
4162 if( pBackup==0 ){
4163 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
4164 sqlite3_close(pDest);
4165 return 1;
4166 }
4167 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
4168 sqlite3_backup_finish(pBackup);
4169 if( rc==SQLITE_DONE ){
4170 rc = 0;
4171 }else{
4172 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
4173 rc = 1;
4174 }
4175 sqlite3_close(pDest);
4176 }else
4177
4178 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
4179 if( nArg==2 ){
4180 bail_on_error = booleanValue(azArg[1]);
4181 }else{
4182 raw_printf(stderr, "Usage: .bail on|off\n");
4183 rc = 1;
4184 }
4185 }else
4186
4187 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
4188 if( nArg==2 ){
4189 if( booleanValue(azArg[1]) ){
4190 setBinaryMode(p->out, 1);
4191 }else{
4192 setTextMode(p->out, 1);
4193 }
4194 }else{
4195 raw_printf(stderr, "Usage: .binary on|off\n");
4196 rc = 1;
4197 }
4198 }else
4199
4200 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
4201 if( nArg==2 ){
4202#if defined(_WIN32) || defined(WIN32)
4203 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
4204 rc = !SetCurrentDirectoryW(z);
4205 sqlite3_free(z);
4206#else
4207 rc = chdir(azArg[1]);
4208#endif
4209 if( rc ){
4210 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
4211 rc = 1;
4212 }
4213 }else{
4214 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
4215 rc = 1;
4216 }
4217 }else
4218
4219 /* The undocumented ".breakpoint" command causes a call to the no-op
4220 ** routine named test_breakpoint().
4221 */
4222 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
4223 test_breakpoint();
4224 }else
4225
4226 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
4227 if( nArg==2 ){
4228 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
4229 }else{
4230 raw_printf(stderr, "Usage: .changes on|off\n");
4231 rc = 1;
4232 }
4233 }else
4234
4235 /* Cancel output redirection, if it is currently set (by .testcase)
4236 ** Then read the content of the testcase-out.txt file and compare against
4237 ** azArg[1]. If there are differences, report an error and exit.
4238 */
4239 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
4240 char *zRes = 0;
4241 output_reset(p);
4242 if( nArg!=2 ){
4243 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
4244 rc = 2;
4245 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
4246 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
4247 rc = 2;
4248 }else if( testcase_glob(azArg[1],zRes)==0 ){
4249 utf8_printf(stderr,
4250 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
4251 p->zTestcase, azArg[1], zRes);
4252 rc = 2;
4253 }else{
4254 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
4255 p->nCheck++;
4256 }
4257 sqlite3_free(zRes);
4258 }else
4259
4260 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
4261 if( nArg==2 ){
4262 tryToClone(p, azArg[1]);
4263 }else{
4264 raw_printf(stderr, "Usage: .clone FILENAME\n");
4265 rc = 1;
4266 }
4267 }else
4268
4269 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
4270 ShellState data;
4271 char *zErrMsg = 0;
4272 open_db(p, 0);
4273 memcpy(&data, p, sizeof(data));
4274 data.showHeader = 0;
4275 data.cMode = data.mode = MODE_List;
4276 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
4277 data.cnt = 0;
4278 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
4279 callback, &data, &zErrMsg);
4280 if( zErrMsg ){
4281 utf8_printf(stderr,"Error: %s\n", zErrMsg);
4282 sqlite3_free(zErrMsg);
4283 rc = 1;
4284 }
4285 }else
4286
4287 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
4288 rc = shell_dbinfo_command(p, nArg, azArg);
4289 }else
4290
4291 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
4292 const char *zLike = 0;
4293 int i;
4294 int savedShowHeader = p->showHeader;
4295 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
4296 for(i=1; i<nArg; i++){
4297 if( azArg[i][0]=='-' ){
4298 const char *z = azArg[i]+1;
4299 if( z[0]=='-' ) z++;
4300 if( strcmp(z,"preserve-rowids")==0 ){
4301#ifdef SQLITE_OMIT_VIRTUALTABLE
4302 raw_printf(stderr, "The --preserve-rowids option is not compatible"
4303 " with SQLITE_OMIT_VIRTUALTABLE\n");
4304 rc = 1;
4305 goto meta_command_exit;
4306#else
4307 ShellSetFlag(p, SHFLG_PreserveRowid);
4308#endif
4309 }else
4310 if( strcmp(z,"newlines")==0 ){
4311 ShellSetFlag(p, SHFLG_Newlines);
4312 }else
4313 {
4314 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
4315 rc = 1;
4316 goto meta_command_exit;
4317 }
4318 }else if( zLike ){
4319 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
4320 "?--newlines? ?LIKE-PATTERN?\n");
4321 rc = 1;
4322 goto meta_command_exit;
4323 }else{
4324 zLike = azArg[i];
4325 }
4326 }
4327 open_db(p, 0);
4328 /* When playing back a "dump", the content might appear in an order
4329 ** which causes immediate foreign key constraints to be violated.
4330 ** So disable foreign-key constraint enforcement to prevent problems. */
4331 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
4332 raw_printf(p->out, "BEGIN TRANSACTION;\n");
4333 p->writableSchema = 0;
4334 p->showHeader = 0;
4335 /* Set writable_schema=ON since doing so forces SQLite to initialize
4336 ** as much of the schema as it can even if the sqlite_master table is
4337 ** corrupt. */
4338 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
4339 p->nErr = 0;
4340 if( zLike==0 ){
4341 run_schema_dump_query(p,
4342 "SELECT name, type, sql FROM sqlite_master "
4343 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
4344 );
4345 run_schema_dump_query(p,
4346 "SELECT name, type, sql FROM sqlite_master "
4347 "WHERE name=='sqlite_sequence'"
4348 );
4349 run_table_dump_query(p,
4350 "SELECT sql FROM sqlite_master "
4351 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
4352 );
4353 }else{
4354 char *zSql;
4355 zSql = sqlite3_mprintf(
4356 "SELECT name, type, sql FROM sqlite_master "
4357 "WHERE tbl_name LIKE %Q AND type=='table'"
4358 " AND sql NOT NULL", zLike);
4359 run_schema_dump_query(p,zSql);
4360 sqlite3_free(zSql);
4361 zSql = sqlite3_mprintf(
4362 "SELECT sql FROM sqlite_master "
4363 "WHERE sql NOT NULL"
4364 " AND type IN ('index','trigger','view')"
4365 " AND tbl_name LIKE %Q", zLike);
4366 run_table_dump_query(p, zSql, 0);
4367 sqlite3_free(zSql);
4368 }
4369 if( p->writableSchema ){
4370 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
4371 p->writableSchema = 0;
4372 }
4373 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4374 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
4375 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
4376 p->showHeader = savedShowHeader;
4377 }else
4378
4379 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
4380 if( nArg==2 ){
4381 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
4382 }else{
4383 raw_printf(stderr, "Usage: .echo on|off\n");
4384 rc = 1;
4385 }
4386 }else
4387
4388 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
4389 if( nArg==2 ){
4390 if( strcmp(azArg[1],"full")==0 ){
4391 p->autoEQP = 2;
4392 }else{
4393 p->autoEQP = booleanValue(azArg[1]);
4394 }
4395 }else{
4396 raw_printf(stderr, "Usage: .eqp on|off|full\n");
4397 rc = 1;
4398 }
4399 }else
4400
4401 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
4402 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
4403 rc = 2;
4404 }else
4405
4406 /* The ".explain" command is automatic now. It is largely pointless. It
4407 ** retained purely for backwards compatibility */
4408 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
4409 int val = 1;
4410 if( nArg>=2 ){
4411 if( strcmp(azArg[1],"auto")==0 ){
4412 val = 99;
4413 }else{
4414 val = booleanValue(azArg[1]);
4415 }
4416 }
4417 if( val==1 && p->mode!=MODE_Explain ){
4418 p->normalMode = p->mode;
4419 p->mode = MODE_Explain;
4420 p->autoExplain = 0;
4421 }else if( val==0 ){
4422 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4423 p->autoExplain = 0;
4424 }else if( val==99 ){
4425 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4426 p->autoExplain = 1;
4427 }
4428 }else
4429
4430 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
4431 ShellState data;
4432 char *zErrMsg = 0;
4433 int doStats = 0;
4434 memcpy(&data, p, sizeof(data));
4435 data.showHeader = 0;
4436 data.cMode = data.mode = MODE_Semi;
4437 if( nArg==2 && optionMatch(azArg[1], "indent") ){
4438 data.cMode = data.mode = MODE_Pretty;
4439 nArg = 1;
4440 }
4441 if( nArg!=1 ){
4442 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
4443 rc = 1;
4444 goto meta_command_exit;
4445 }
4446 open_db(p, 0);
4447 rc = sqlite3_exec(p->db,
4448 "SELECT sql FROM"
4449 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4450 " FROM sqlite_master UNION ALL"
4451 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
4452 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
4453 "ORDER BY rowid",
4454 callback, &data, &zErrMsg
4455 );
4456 if( rc==SQLITE_OK ){
4457 sqlite3_stmt *pStmt;
4458 rc = sqlite3_prepare_v2(p->db,
4459 "SELECT rowid FROM sqlite_master"
4460 " WHERE name GLOB 'sqlite_stat[134]'",
4461 -1, &pStmt, 0);
4462 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
4463 sqlite3_finalize(pStmt);
4464 }
4465 if( doStats==0 ){
4466 raw_printf(p->out, "/* No STAT tables available */\n");
4467 }else{
4468 raw_printf(p->out, "ANALYZE sqlite_master;\n");
4469 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
4470 callback, &data, &zErrMsg);
4471 data.cMode = data.mode = MODE_Insert;
4472 data.zDestTable = "sqlite_stat1";
4473 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
4474 shell_callback, &data,&zErrMsg);
4475 data.zDestTable = "sqlite_stat3";
4476 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
4477 shell_callback, &data,&zErrMsg);
4478 data.zDestTable = "sqlite_stat4";
4479 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
4480 shell_callback, &data, &zErrMsg);
4481 raw_printf(p->out, "ANALYZE sqlite_master;\n");
4482 }
4483 }else
4484
4485 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
4486 if( nArg==2 ){
4487 p->showHeader = booleanValue(azArg[1]);
4488 }else{
4489 raw_printf(stderr, "Usage: .headers on|off\n");
4490 rc = 1;
4491 }
4492 }else
4493
4494 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
4495 utf8_printf(p->out, "%s", zHelp);
4496 }else
4497
4498 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
4499 char *zTable; /* Insert data into this table */
4500 char *zFile; /* Name of file to extra content from */
4501 sqlite3_stmt *pStmt = NULL; /* A statement */
4502 int nCol; /* Number of columns in the table */
4503 int nByte; /* Number of bytes in an SQL string */
4504 int i, j; /* Loop counters */
4505 int needCommit; /* True to COMMIT or ROLLBACK at end */
4506 int nSep; /* Number of bytes in p->colSeparator[] */
4507 char *zSql; /* An SQL statement */
4508 ImportCtx sCtx; /* Reader context */
4509 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
4510 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
4511
4512 if( nArg!=3 ){
4513 raw_printf(stderr, "Usage: .import FILE TABLE\n");
4514 goto meta_command_exit;
4515 }
4516 zFile = azArg[1];
4517 zTable = azArg[2];
4518 seenInterrupt = 0;
4519 memset(&sCtx, 0, sizeof(sCtx));
4520 open_db(p, 0);
4521 nSep = strlen30(p->colSeparator);
4522 if( nSep==0 ){
4523 raw_printf(stderr,
4524 "Error: non-null column separator required for import\n");
4525 return 1;
4526 }
4527 if( nSep>1 ){
4528 raw_printf(stderr, "Error: multi-character column separators not allowed"
4529 " for import\n");
4530 return 1;
4531 }
4532 nSep = strlen30(p->rowSeparator);
4533 if( nSep==0 ){
4534 raw_printf(stderr, "Error: non-null row separator required for import\n");
4535 return 1;
4536 }
4537 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
4538 /* When importing CSV (only), if the row separator is set to the
4539 ** default output row separator, change it to the default input
4540 ** row separator. This avoids having to maintain different input
4541 ** and output row separators. */
4542 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4543 nSep = strlen30(p->rowSeparator);
4544 }
4545 if( nSep>1 ){
4546 raw_printf(stderr, "Error: multi-character row separators not allowed"
4547 " for import\n");
4548 return 1;
4549 }
4550 sCtx.zFile = zFile;
4551 sCtx.nLine = 1;
4552 if( sCtx.zFile[0]=='|' ){
4553#ifdef SQLITE_OMIT_POPEN
4554 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
4555 return 1;
4556#else
4557 sCtx.in = popen(sCtx.zFile+1, "r");
4558 sCtx.zFile = "<pipe>";
4559 xCloser = pclose;
4560#endif
4561 }else{
4562 sCtx.in = fopen(sCtx.zFile, "rb");
4563 xCloser = fclose;
4564 }
4565 if( p->mode==MODE_Ascii ){
4566 xRead = ascii_read_one_field;
4567 }else{
4568 xRead = csv_read_one_field;
4569 }
4570 if( sCtx.in==0 ){
4571 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
4572 return 1;
4573 }
4574 sCtx.cColSep = p->colSeparator[0];
4575 sCtx.cRowSep = p->rowSeparator[0];
4576 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
4577 if( zSql==0 ){
4578 raw_printf(stderr, "Error: out of memory\n");
4579 xCloser(sCtx.in);
4580 return 1;
4581 }
4582 nByte = strlen30(zSql);
4583 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4584 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
4585 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
4586 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
4587 char cSep = '(';
4588 while( xRead(&sCtx) ){
4589 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
4590 cSep = ',';
4591 if( sCtx.cTerm!=sCtx.cColSep ) break;
4592 }
4593 if( cSep=='(' ){
4594 sqlite3_free(zCreate);
4595 sqlite3_free(sCtx.z);
4596 xCloser(sCtx.in);
4597 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
4598 return 1;
4599 }
4600 zCreate = sqlite3_mprintf("%z\n)", zCreate);
4601 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
4602 sqlite3_free(zCreate);
4603 if( rc ){
4604 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
4605 sqlite3_errmsg(p->db));
4606 sqlite3_free(sCtx.z);
4607 xCloser(sCtx.in);
4608 return 1;
4609 }
4610 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4611 }
4612 sqlite3_free(zSql);
4613 if( rc ){
4614 if (pStmt) sqlite3_finalize(pStmt);
4615 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
4616 xCloser(sCtx.in);
4617 return 1;
4618 }
4619 nCol = sqlite3_column_count(pStmt);
4620 sqlite3_finalize(pStmt);
4621 pStmt = 0;
4622 if( nCol==0 ) return 0; /* no columns, no error */
4623 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
4624 if( zSql==0 ){
4625 raw_printf(stderr, "Error: out of memory\n");
4626 xCloser(sCtx.in);
4627 return 1;
4628 }
4629 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
4630 j = strlen30(zSql);
4631 for(i=1; i<nCol; i++){
4632 zSql[j++] = ',';
4633 zSql[j++] = '?';
4634 }
4635 zSql[j++] = ')';
4636 zSql[j] = 0;
4637 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4638 sqlite3_free(zSql);
4639 if( rc ){
4640 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
4641 if (pStmt) sqlite3_finalize(pStmt);
4642 xCloser(sCtx.in);
4643 return 1;
4644 }
4645 needCommit = sqlite3_get_autocommit(p->db);
4646 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
4647 do{
4648 int startLine = sCtx.nLine;
4649 for(i=0; i<nCol; i++){
4650 char *z = xRead(&sCtx);
4651 /*
4652 ** Did we reach end-of-file before finding any columns?
4653 ** If so, stop instead of NULL filling the remaining columns.
4654 */
4655 if( z==0 && i==0 ) break;
4656 /*
4657 ** Did we reach end-of-file OR end-of-line before finding any
4658 ** columns in ASCII mode? If so, stop instead of NULL filling
4659 ** the remaining columns.
4660 */
4661 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
4662 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
4663 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
4664 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
4665 "filling the rest with NULL\n",
4666 sCtx.zFile, startLine, nCol, i+1);
4667 i += 2;
4668 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
4669 }
4670 }
4671 if( sCtx.cTerm==sCtx.cColSep ){
4672 do{
4673 xRead(&sCtx);
4674 i++;
4675 }while( sCtx.cTerm==sCtx.cColSep );
4676 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
4677 "extras ignored\n",
4678 sCtx.zFile, startLine, nCol, i);
4679 }
4680 if( i>=nCol ){
4681 sqlite3_step(pStmt);
4682 rc = sqlite3_reset(pStmt);
4683 if( rc!=SQLITE_OK ){
4684 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
4685 startLine, sqlite3_errmsg(p->db));
4686 }
4687 }
4688 }while( sCtx.cTerm!=EOF );
4689
4690 xCloser(sCtx.in);
4691 sqlite3_free(sCtx.z);
4692 sqlite3_finalize(pStmt);
4693 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
4694 }else
4695
4696#ifndef SQLITE_UNTESTABLE
4697 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
4698 char *zSql;
4699 char *zCollist = 0;
4700 sqlite3_stmt *pStmt;
4701 int tnum = 0;
4702 int i;
4703 if( nArg!=3 ){
4704 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
4705 rc = 1;
4706 goto meta_command_exit;
4707 }
4708 open_db(p, 0);
4709 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
4710 " WHERE name='%q' AND type='index'", azArg[1]);
4711 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4712 sqlite3_free(zSql);
4713 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4714 tnum = sqlite3_column_int(pStmt, 0);
4715 }
4716 sqlite3_finalize(pStmt);
4717 if( tnum==0 ){
4718 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
4719 rc = 1;
4720 goto meta_command_exit;
4721 }
4722 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
4723 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4724 sqlite3_free(zSql);
4725 i = 0;
4726 while( sqlite3_step(pStmt)==SQLITE_ROW ){
4727 char zLabel[20];
4728 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
4729 i++;
4730 if( zCol==0 ){
4731 if( sqlite3_column_int(pStmt,1)==-1 ){
4732 zCol = "_ROWID_";
4733 }else{
4734 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
4735 zCol = zLabel;
4736 }
4737 }
4738 if( zCollist==0 ){
4739 zCollist = sqlite3_mprintf("\"%w\"", zCol);
4740 }else{
4741 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
4742 }
4743 }
4744 sqlite3_finalize(pStmt);
4745 zSql = sqlite3_mprintf(
4746 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
4747 azArg[2], zCollist, zCollist);
4748 sqlite3_free(zCollist);
4749 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
4750 if( rc==SQLITE_OK ){
4751 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
4752 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
4753 if( rc ){
4754 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
4755 }else{
4756 utf8_printf(stdout, "%s;\n", zSql);
4757 raw_printf(stdout,
4758 "WARNING: writing to an imposter table will corrupt the index!\n"
4759 );
4760 }
4761 }else{
4762 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
4763 rc = 1;
4764 }
4765 sqlite3_free(zSql);
4766 }else
4767#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
4768
4769#ifdef SQLITE_ENABLE_IOTRACE
4770 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
4771 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
4772 if( iotrace && iotrace!=stdout ) fclose(iotrace);
4773 iotrace = 0;
4774 if( nArg<2 ){
4775 sqlite3IoTrace = 0;
4776 }else if( strcmp(azArg[1], "-")==0 ){
4777 sqlite3IoTrace = iotracePrintf;
4778 iotrace = stdout;
4779 }else{
4780 iotrace = fopen(azArg[1], "w");
4781 if( iotrace==0 ){
4782 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
4783 sqlite3IoTrace = 0;
4784 rc = 1;
4785 }else{
4786 sqlite3IoTrace = iotracePrintf;
4787 }
4788 }
4789 }else
4790#endif
4791
4792 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
4793 static const struct {
4794 const char *zLimitName; /* Name of a limit */
4795 int limitCode; /* Integer code for that limit */
4796 } aLimit[] = {
4797 { "length", SQLITE_LIMIT_LENGTH },
4798 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
4799 { "column", SQLITE_LIMIT_COLUMN },
4800 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
4801 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
4802 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
4803 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
4804 { "attached", SQLITE_LIMIT_ATTACHED },
4805 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
4806 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
4807 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
4808 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
4809 };
4810 int i, n2;
4811 open_db(p, 0);
4812 if( nArg==1 ){
4813 for(i=0; i<ArraySize(aLimit); i++){
4814 printf("%20s %d\n", aLimit[i].zLimitName,
4815 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
4816 }
4817 }else if( nArg>3 ){
4818 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
4819 rc = 1;
4820 goto meta_command_exit;
4821 }else{
4822 int iLimit = -1;
4823 n2 = strlen30(azArg[1]);
4824 for(i=0; i<ArraySize(aLimit); i++){
4825 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
4826 if( iLimit<0 ){
4827 iLimit = i;
4828 }else{
4829 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
4830 rc = 1;
4831 goto meta_command_exit;
4832 }
4833 }
4834 }
4835 if( iLimit<0 ){
4836 utf8_printf(stderr, "unknown limit: \"%s\"\n"
4837 "enter \".limits\" with no arguments for a list.\n",
4838 azArg[1]);
4839 rc = 1;
4840 goto meta_command_exit;
4841 }
4842 if( nArg==3 ){
4843 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
4844 (int)integerValue(azArg[2]));
4845 }
4846 printf("%20s %d\n", aLimit[iLimit].zLimitName,
4847 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
4848 }
4849 }else
4850
4851 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
4852 open_db(p, 0);
4853 lintDotCommand(p, azArg, nArg);
4854 }else
4855
4856#ifndef SQLITE_OMIT_LOAD_EXTENSION
4857 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
4858 const char *zFile, *zProc;
4859 char *zErrMsg = 0;
4860 if( nArg<2 ){
4861 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
4862 rc = 1;
4863 goto meta_command_exit;
4864 }
4865 zFile = azArg[1];
4866 zProc = nArg>=3 ? azArg[2] : 0;
4867 open_db(p, 0);
4868 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
4869 if( rc!=SQLITE_OK ){
4870 utf8_printf(stderr, "Error: %s\n", zErrMsg);
4871 sqlite3_free(zErrMsg);
4872 rc = 1;
4873 }
4874 }else
4875#endif
4876
4877 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
4878 if( nArg!=2 ){
4879 raw_printf(stderr, "Usage: .log FILENAME\n");
4880 rc = 1;
4881 }else{
4882 const char *zFile = azArg[1];
4883 output_file_close(p->pLog);
4884 p->pLog = output_file_open(zFile);
4885 }
4886 }else
4887
4888 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
4889 const char *zMode = nArg>=2 ? azArg[1] : "";
4890 int n2 = (int)strlen(zMode);
4891 int c2 = zMode[0];
4892 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
4893 p->mode = MODE_Line;
4894 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4895 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
4896 p->mode = MODE_Column;
4897 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4898 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
4899 p->mode = MODE_List;
4900 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
4901 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4902 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
4903 p->mode = MODE_Html;
4904 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
4905 p->mode = MODE_Tcl;
4906 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
4907 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4908 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
4909 p->mode = MODE_Csv;
4910 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
4911 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
4912 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
4913 p->mode = MODE_List;
4914 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
4915 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
4916 p->mode = MODE_Insert;
4917 set_table_name(p, nArg>=3 ? azArg[2] : "table");
4918 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
4919 p->mode = MODE_Quote;
4920 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
4921 p->mode = MODE_Ascii;
4922 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
4923 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
4924 }else if( nArg==1 ){
4925 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
4926 }else{
4927 raw_printf(stderr, "Error: mode should be one of: "
4928 "ascii column csv html insert line list quote tabs tcl\n");
4929 rc = 1;
4930 }
4931 p->cMode = p->mode;
4932 }else
4933
4934 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
4935 if( nArg==2 ){
4936 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
4937 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
4938 }else{
4939 raw_printf(stderr, "Usage: .nullvalue STRING\n");
4940 rc = 1;
4941 }
4942 }else
4943
4944 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
4945 char *zNewFilename; /* Name of the database file to open */
4946 int iName = 1; /* Index in azArg[] of the filename */
4947 int newFlag = 0; /* True to delete file before opening */
4948 /* Close the existing database */
4949 session_close_all(p);
4950 sqlite3_close(p->db);
4951 p->db = 0;
4952 p->zDbFilename = 0;
4953 sqlite3_free(p->zFreeOnClose);
4954 p->zFreeOnClose = 0;
4955 /* Check for command-line arguments */
4956 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
4957 const char *z = azArg[iName];
4958 if( optionMatch(z,"new") ){
4959 newFlag = 1;
4960 }else if( z[0]=='-' ){
4961 utf8_printf(stderr, "unknown option: %s\n", z);
4962 rc = 1;
4963 goto meta_command_exit;
4964 }
4965 }
4966 /* If a filename is specified, try to open it first */
4967 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
4968 if( zNewFilename ){
4969 if( newFlag ) shellDeleteFile(zNewFilename);
4970 p->zDbFilename = zNewFilename;
4971 open_db(p, 1);
4972 if( p->db==0 ){
4973 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
4974 sqlite3_free(zNewFilename);
4975 }else{
4976 p->zFreeOnClose = zNewFilename;
4977 }
4978 }
4979 if( p->db==0 ){
4980 /* As a fall-back open a TEMP database */
4981 p->zDbFilename = 0;
4982 open_db(p, 0);
4983 }
4984 }else
4985
4986 if( c=='o'
4987 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
4988 ){
4989 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
4990 if( nArg>2 ){
4991 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
4992 rc = 1;
4993 goto meta_command_exit;
4994 }
4995 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
4996 if( nArg<2 ){
4997 raw_printf(stderr, "Usage: .once FILE\n");
4998 rc = 1;
4999 goto meta_command_exit;
5000 }
5001 p->outCount = 2;
5002 }else{
5003 p->outCount = 0;
5004 }
5005 output_reset(p);
5006 if( zFile[0]=='|' ){
5007#ifdef SQLITE_OMIT_POPEN
5008 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
5009 rc = 1;
5010 p->out = stdout;
5011#else
5012 p->out = popen(zFile + 1, "w");
5013 if( p->out==0 ){
5014 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
5015 p->out = stdout;
5016 rc = 1;
5017 }else{
5018 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
5019 }
5020#endif
5021 }else{
5022 p->out = output_file_open(zFile);
5023 if( p->out==0 ){
5024 if( strcmp(zFile,"off")!=0 ){
5025 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
5026 }
5027 p->out = stdout;
5028 rc = 1;
5029 } else {
5030 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
5031 }
5032 }
5033 }else
5034
5035 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
5036 int i;
5037 for(i=1; i<nArg; i++){
5038 if( i>1 ) raw_printf(p->out, " ");
5039 utf8_printf(p->out, "%s", azArg[i]);
5040 }
5041 raw_printf(p->out, "\n");
5042 }else
5043
5044 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
5045 if( nArg >= 2) {
5046 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
5047 }
5048 if( nArg >= 3) {
5049 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
5050 }
5051 }else
5052
5053 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
5054 rc = 2;
5055 }else
5056
5057 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
5058 FILE *alt;
5059 if( nArg!=2 ){
5060 raw_printf(stderr, "Usage: .read FILE\n");
5061 rc = 1;
5062 goto meta_command_exit;
5063 }
5064 alt = fopen(azArg[1], "rb");
5065 if( alt==0 ){
5066 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
5067 rc = 1;
5068 }else{
5069 rc = process_input(p, alt);
5070 fclose(alt);
5071 }
5072 }else
5073
5074 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
5075 const char *zSrcFile;
5076 const char *zDb;
5077 sqlite3 *pSrc;
5078 sqlite3_backup *pBackup;
5079 int nTimeout = 0;
5080
5081 if( nArg==2 ){
5082 zSrcFile = azArg[1];
5083 zDb = "main";
5084 }else if( nArg==3 ){
5085 zSrcFile = azArg[2];
5086 zDb = azArg[1];
5087 }else{
5088 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
5089 rc = 1;
5090 goto meta_command_exit;
5091 }
5092 rc = sqlite3_open(zSrcFile, &pSrc);
5093 if( rc!=SQLITE_OK ){
5094 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
5095 sqlite3_close(pSrc);
5096 return 1;
5097 }
5098 open_db(p, 0);
5099 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
5100 if( pBackup==0 ){
5101 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
5102 sqlite3_close(pSrc);
5103 return 1;
5104 }
5105 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
5106 || rc==SQLITE_BUSY ){
5107 if( rc==SQLITE_BUSY ){
5108 if( nTimeout++ >= 3 ) break;
5109 sqlite3_sleep(100);
5110 }
5111 }
5112 sqlite3_backup_finish(pBackup);
5113 if( rc==SQLITE_DONE ){
5114 rc = 0;
5115 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
5116 raw_printf(stderr, "Error: source database is busy\n");
5117 rc = 1;
5118 }else{
5119 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
5120 rc = 1;
5121 }
5122 sqlite3_close(pSrc);
5123 }else
5124
5125
5126 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
5127 if( nArg==2 ){
5128 p->scanstatsOn = booleanValue(azArg[1]);
5129#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
5130 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
5131#endif
5132 }else{
5133 raw_printf(stderr, "Usage: .scanstats on|off\n");
5134 rc = 1;
5135 }
5136 }else
5137
5138 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
5139 ShellText sSelect;
5140 ShellState data;
5141 char *zErrMsg = 0;
5142 const char *zDiv = 0;
5143 int iSchema = 0;
5144
5145 open_db(p, 0);
5146 memcpy(&data, p, sizeof(data));
5147 data.showHeader = 0;
5148 data.cMode = data.mode = MODE_Semi;
5149 initText(&sSelect);
5150 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
5151 data.cMode = data.mode = MODE_Pretty;
5152 nArg--;
5153 if( nArg==2 ) azArg[1] = azArg[2];
5154 }
5155 if( nArg==2 && azArg[1][0]!='-' ){
5156 int i;
5157 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
5158 if( strcmp(azArg[1],"sqlite_master")==0 ){
5159 char *new_argv[2], *new_colv[2];
5160 new_argv[0] = "CREATE TABLE sqlite_master (\n"
5161 " type text,\n"
5162 " name text,\n"
5163 " tbl_name text,\n"
5164 " rootpage integer,\n"
5165 " sql text\n"
5166 ")";
5167 new_argv[1] = 0;
5168 new_colv[0] = "sql";
5169 new_colv[1] = 0;
5170 callback(&data, 1, new_argv, new_colv);
5171 rc = SQLITE_OK;
5172 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
5173 char *new_argv[2], *new_colv[2];
5174 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
5175 " type text,\n"
5176 " name text,\n"
5177 " tbl_name text,\n"
5178 " rootpage integer,\n"
5179 " sql text\n"
5180 ")";
5181 new_argv[1] = 0;
5182 new_colv[0] = "sql";
5183 new_colv[1] = 0;
5184 callback(&data, 1, new_argv, new_colv);
5185 rc = SQLITE_OK;
5186 }else{
5187 zDiv = "(";
5188 }
5189 }else if( nArg==1 ){
5190 zDiv = "(";
5191 }else{
5192 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
5193 rc = 1;
5194 goto meta_command_exit;
5195 }
5196 if( zDiv ){
5197 sqlite3_stmt *pStmt = 0;
5198 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
5199 -1, &pStmt, 0);
5200 if( rc ){
5201 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
5202 sqlite3_finalize(pStmt);
5203 rc = 1;
5204 goto meta_command_exit;
5205 }
5206 appendText(&sSelect, "SELECT sql FROM", 0);
5207 iSchema = 0;
5208 while( sqlite3_step(pStmt)==SQLITE_ROW ){
5209 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
5210 char zScNum[30];
5211 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
5212 appendText(&sSelect, zDiv, 0);
5213 zDiv = " UNION ALL ";
5214 if( strcmp(zDb, "main")!=0 ){
5215 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
5216 appendText(&sSelect, zDb, '"');
5217 appendText(&sSelect, ") AS sql, type, tbl_name, name, rowid,", 0);
5218 appendText(&sSelect, zScNum, 0);
5219 appendText(&sSelect, " AS snum, ", 0);
5220 appendText(&sSelect, zDb, '\'');
5221 appendText(&sSelect, " AS sname FROM ", 0);
5222 appendText(&sSelect, zDb, '"');
5223 appendText(&sSelect, ".sqlite_master", 0);
5224 }else{
5225 appendText(&sSelect, "SELECT sql, type, tbl_name, name, rowid, ", 0);
5226 appendText(&sSelect, zScNum, 0);
5227 appendText(&sSelect, " AS snum, 'main' AS sname FROM sqlite_master",0);
5228 }
5229 }
5230 sqlite3_finalize(pStmt);
5231 appendText(&sSelect, ") WHERE ", 0);
5232 if( nArg>1 ){
5233 char *zQarg = sqlite3_mprintf("%Q", azArg[1]);
5234 if( strchr(azArg[1], '.') ){
5235 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
5236 }else{
5237 appendText(&sSelect, "lower(tbl_name)", 0);
5238 }
5239 appendText(&sSelect, strchr(azArg[1], '*') ? " GLOB " : " LIKE ", 0);
5240 appendText(&sSelect, zQarg, 0);
5241 appendText(&sSelect, " AND ", 0);
5242 sqlite3_free(zQarg);
5243 }
5244 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
5245 " ORDER BY snum, rowid", 0);
5246 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
5247 freeText(&sSelect);
5248 }
5249 if( zErrMsg ){
5250 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5251 sqlite3_free(zErrMsg);
5252 rc = 1;
5253 }else if( rc != SQLITE_OK ){
5254 raw_printf(stderr,"Error: querying schema information\n");
5255 rc = 1;
5256 }else{
5257 rc = 0;
5258 }
5259 }else
5260
5261#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
5262 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
5263 sqlite3SelectTrace = (int)integerValue(azArg[1]);
5264 }else
5265#endif
5266
5267#if defined(SQLITE_ENABLE_SESSION)
5268 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
5269 OpenSession *pSession = &p->aSession[0];
5270 char **azCmd = &azArg[1];
5271 int iSes = 0;
5272 int nCmd = nArg - 1;
5273 int i;
5274 if( nArg<=1 ) goto session_syntax_error;
5275 open_db(p, 0);
5276 if( nArg>=3 ){
5277 for(iSes=0; iSes<p->nSession; iSes++){
5278 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
5279 }
5280 if( iSes<p->nSession ){
5281 pSession = &p->aSession[iSes];
5282 azCmd++;
5283 nCmd--;
5284 }else{
5285 pSession = &p->aSession[0];
5286 iSes = 0;
5287 }
5288 }
5289
5290 /* .session attach TABLE
5291 ** Invoke the sqlite3session_attach() interface to attach a particular
5292 ** table so that it is never filtered.
5293 */
5294 if( strcmp(azCmd[0],"attach")==0 ){
5295 if( nCmd!=2 ) goto session_syntax_error;
5296 if( pSession->p==0 ){
5297 session_not_open:
5298 raw_printf(stderr, "ERROR: No sessions are open\n");
5299 }else{
5300 rc = sqlite3session_attach(pSession->p, azCmd[1]);
5301 if( rc ){
5302 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
5303 rc = 0;
5304 }
5305 }
5306 }else
5307
5308 /* .session changeset FILE
5309 ** .session patchset FILE
5310 ** Write a changeset or patchset into a file. The file is overwritten.
5311 */
5312 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
5313 FILE *out = 0;
5314 if( nCmd!=2 ) goto session_syntax_error;
5315 if( pSession->p==0 ) goto session_not_open;
5316 out = fopen(azCmd[1], "wb");
5317 if( out==0 ){
5318 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
5319 }else{
5320 int szChng;
5321 void *pChng;
5322 if( azCmd[0][0]=='c' ){
5323 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
5324 }else{
5325 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
5326 }
5327 if( rc ){
5328 printf("Error: error code %d\n", rc);
5329 rc = 0;
5330 }
5331 if( pChng
5332 && fwrite(pChng, szChng, 1, out)!=1 ){
5333 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
5334 szChng);
5335 }
5336 sqlite3_free(pChng);
5337 fclose(out);
5338 }
5339 }else
5340
5341 /* .session close
5342 ** Close the identified session
5343 */
5344 if( strcmp(azCmd[0], "close")==0 ){
5345 if( nCmd!=1 ) goto session_syntax_error;
5346 if( p->nSession ){
5347 session_close(pSession);
5348 p->aSession[iSes] = p->aSession[--p->nSession];
5349 }
5350 }else
5351
5352 /* .session enable ?BOOLEAN?
5353 ** Query or set the enable flag
5354 */
5355 if( strcmp(azCmd[0], "enable")==0 ){
5356 int ii;
5357 if( nCmd>2 ) goto session_syntax_error;
5358 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5359 if( p->nSession ){
5360 ii = sqlite3session_enable(pSession->p, ii);
5361 utf8_printf(p->out, "session %s enable flag = %d\n",
5362 pSession->zName, ii);
5363 }
5364 }else
5365
5366 /* .session filter GLOB ....
5367 ** Set a list of GLOB patterns of table names to be excluded.
5368 */
5369 if( strcmp(azCmd[0], "filter")==0 ){
5370 int ii, nByte;
5371 if( nCmd<2 ) goto session_syntax_error;
5372 if( p->nSession ){
5373 for(ii=0; ii<pSession->nFilter; ii++){
5374 sqlite3_free(pSession->azFilter[ii]);
5375 }
5376 sqlite3_free(pSession->azFilter);
5377 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
5378 pSession->azFilter = sqlite3_malloc( nByte );
5379 if( pSession->azFilter==0 ){
5380 raw_printf(stderr, "Error: out or memory\n");
5381 exit(1);
5382 }
5383 for(ii=1; ii<nCmd; ii++){
5384 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
5385 }
5386 pSession->nFilter = ii-1;
5387 }
5388 }else
5389
5390 /* .session indirect ?BOOLEAN?
5391 ** Query or set the indirect flag
5392 */
5393 if( strcmp(azCmd[0], "indirect")==0 ){
5394 int ii;
5395 if( nCmd>2 ) goto session_syntax_error;
5396 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5397 if( p->nSession ){
5398 ii = sqlite3session_indirect(pSession->p, ii);
5399 utf8_printf(p->out, "session %s indirect flag = %d\n",
5400 pSession->zName, ii);
5401 }
5402 }else
5403
5404 /* .session isempty
5405 ** Determine if the session is empty
5406 */
5407 if( strcmp(azCmd[0], "isempty")==0 ){
5408 int ii;
5409 if( nCmd!=1 ) goto session_syntax_error;
5410 if( p->nSession ){
5411 ii = sqlite3session_isempty(pSession->p);
5412 utf8_printf(p->out, "session %s isempty flag = %d\n",
5413 pSession->zName, ii);
5414 }
5415 }else
5416
5417 /* .session list
5418 ** List all currently open sessions
5419 */
5420 if( strcmp(azCmd[0],"list")==0 ){
5421 for(i=0; i<p->nSession; i++){
5422 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
5423 }
5424 }else
5425
5426 /* .session open DB NAME
5427 ** Open a new session called NAME on the attached database DB.
5428 ** DB is normally "main".
5429 */
5430 if( strcmp(azCmd[0],"open")==0 ){
5431 char *zName;
5432 if( nCmd!=3 ) goto session_syntax_error;
5433 zName = azCmd[2];
5434 if( zName[0]==0 ) goto session_syntax_error;
5435 for(i=0; i<p->nSession; i++){
5436 if( strcmp(p->aSession[i].zName,zName)==0 ){
5437 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
5438 goto meta_command_exit;
5439 }
5440 }
5441 if( p->nSession>=ArraySize(p->aSession) ){
5442 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
5443 goto meta_command_exit;
5444 }
5445 pSession = &p->aSession[p->nSession];
5446 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
5447 if( rc ){
5448 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
5449 rc = 0;
5450 goto meta_command_exit;
5451 }
5452 pSession->nFilter = 0;
5453 sqlite3session_table_filter(pSession->p, session_filter, pSession);
5454 p->nSession++;
5455 pSession->zName = sqlite3_mprintf("%s", zName);
5456 }else
5457 /* If no command name matches, show a syntax error */
5458 session_syntax_error:
5459 session_help(p);
5460 }else
5461#endif
5462
5463#ifdef SQLITE_DEBUG
5464 /* Undocumented commands for internal testing. Subject to change
5465 ** without notice. */
5466 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
5467 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
5468 int i, v;
5469 for(i=1; i<nArg; i++){
5470 v = booleanValue(azArg[i]);
5471 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
5472 }
5473 }
5474 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
5475 int i; sqlite3_int64 v;
5476 for(i=1; i<nArg; i++){
5477 char zBuf[200];
5478 v = integerValue(azArg[i]);
5479 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
5480 utf8_printf(p->out, "%s", zBuf);
5481 }
5482 }
5483 }else
5484#endif
5485
5486 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
5487 int bIsInit = 0; /* True to initialize the SELFTEST table */
5488 int bVerbose = 0; /* Verbose output */
5489 int bSelftestExists; /* True if SELFTEST already exists */
5490 int i, k; /* Loop counters */
5491 int nTest = 0; /* Number of tests runs */
5492 int nErr = 0; /* Number of errors seen */
5493 ShellText str; /* Answer for a query */
5494 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
5495
5496 open_db(p,0);
5497 for(i=1; i<nArg; i++){
5498 const char *z = azArg[i];
5499 if( z[0]=='-' && z[1]=='-' ) z++;
5500 if( strcmp(z,"-init")==0 ){
5501 bIsInit = 1;
5502 }else
5503 if( strcmp(z,"-v")==0 ){
5504 bVerbose++;
5505 }else
5506 {
5507 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
5508 azArg[i], azArg[0]);
5509 raw_printf(stderr, "Should be one of: --init -v\n");
5510 rc = 1;
5511 goto meta_command_exit;
5512 }
5513 }
5514 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
5515 != SQLITE_OK ){
5516 bSelftestExists = 0;
5517 }else{
5518 bSelftestExists = 1;
5519 }
5520 if( bIsInit ){
5521 createSelftestTable(p);
5522 bSelftestExists = 1;
5523 }
5524 initText(&str);
5525 appendText(&str, "x", 0);
5526 for(k=bSelftestExists; k>=0; k--){
5527 if( k==1 ){
5528 rc = sqlite3_prepare_v2(p->db,
5529 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
5530 -1, &pStmt, 0);
5531 }else{
5532 rc = sqlite3_prepare_v2(p->db,
5533 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
5534 " (1,'run','PRAGMA integrity_check','ok')",
5535 -1, &pStmt, 0);
5536 }
5537 if( rc ){
5538 raw_printf(stderr, "Error querying the selftest table\n");
5539 rc = 1;
5540 sqlite3_finalize(pStmt);
5541 goto meta_command_exit;
5542 }
5543 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
5544 int tno = sqlite3_column_int(pStmt, 0);
5545 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
5546 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
5547 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
5548
5549 k = 0;
5550 if( bVerbose>0 ){
5551 char *zQuote = sqlite3_mprintf("%q", zSql);
5552 printf("%d: %s %s\n", tno, zOp, zSql);
5553 sqlite3_free(zQuote);
5554 }
5555 if( strcmp(zOp,"memo")==0 ){
5556 utf8_printf(p->out, "%s\n", zSql);
5557 }else
5558 if( strcmp(zOp,"run")==0 ){
5559 char *zErrMsg = 0;
5560 str.n = 0;
5561 str.z[0] = 0;
5562 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
5563 nTest++;
5564 if( bVerbose ){
5565 utf8_printf(p->out, "Result: %s\n", str.z);
5566 }
5567 if( rc || zErrMsg ){
5568 nErr++;
5569 rc = 1;
5570 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
5571 sqlite3_free(zErrMsg);
5572 }else if( strcmp(zAns,str.z)!=0 ){
5573 nErr++;
5574 rc = 1;
5575 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
5576 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
5577 }
5578 }else
5579 {
5580 utf8_printf(stderr,
5581 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
5582 rc = 1;
5583 break;
5584 }
5585 } /* End loop over rows of content from SELFTEST */
5586 sqlite3_finalize(pStmt);
5587 } /* End loop over k */
5588 freeText(&str);
5589 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
5590 }else
5591
5592 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
5593 if( nArg<2 || nArg>3 ){
5594 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
5595 rc = 1;
5596 }
5597 if( nArg>=2 ){
5598 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
5599 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
5600 }
5601 if( nArg>=3 ){
5602 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
5603 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
5604 }
5605 }else
5606
5607 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
5608 const char *zLike = 0; /* Which table to checksum. 0 means everything */
5609 int i; /* Loop counter */
5610 int bSchema = 0; /* Also hash the schema */
5611 int bSeparate = 0; /* Hash each table separately */
5612 int iSize = 224; /* Hash algorithm to use */
5613 int bDebug = 0; /* Only show the query that would have run */
5614 sqlite3_stmt *pStmt; /* For querying tables names */
5615 char *zSql; /* SQL to be run */
5616 char *zSep; /* Separator */
5617 ShellText sSql; /* Complete SQL for the query to run the hash */
5618 ShellText sQuery; /* Set of queries used to read all content */
5619 open_db(p, 0);
5620 for(i=1; i<nArg; i++){
5621 const char *z = azArg[i];
5622 if( z[0]=='-' ){
5623 z++;
5624 if( z[0]=='-' ) z++;
5625 if( strcmp(z,"schema")==0 ){
5626 bSchema = 1;
5627 }else
5628 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
5629 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
5630 ){
5631 iSize = atoi(&z[5]);
5632 }else
5633 if( strcmp(z,"debug")==0 ){
5634 bDebug = 1;
5635 }else
5636 {
5637 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
5638 azArg[i], azArg[0]);
5639 raw_printf(stderr, "Should be one of: --schema"
5640 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
5641 rc = 1;
5642 goto meta_command_exit;
5643 }
5644 }else if( zLike ){
5645 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
5646 rc = 1;
5647 goto meta_command_exit;
5648 }else{
5649 zLike = z;
5650 bSeparate = 1;
5651 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
5652 }
5653 }
5654 if( bSchema ){
5655 zSql = "SELECT lower(name) FROM sqlite_master"
5656 " WHERE type='table' AND coalesce(rootpage,0)>1"
5657 " UNION ALL SELECT 'sqlite_master'"
5658 " ORDER BY 1 collate nocase";
5659 }else{
5660 zSql = "SELECT lower(name) FROM sqlite_master"
5661 " WHERE type='table' AND coalesce(rootpage,0)>1"
5662 " AND name NOT LIKE 'sqlite_%'"
5663 " ORDER BY 1 collate nocase";
5664 }
5665 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5666 initText(&sQuery);
5667 initText(&sSql);
5668 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
5669 zSep = "VALUES(";
5670 while( SQLITE_ROW==sqlite3_step(pStmt) ){
5671 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
5672 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
5673 if( strncmp(zTab, "sqlite_",7)!=0 ){
5674 appendText(&sQuery,"SELECT * FROM ", 0);
5675 appendText(&sQuery,zTab,'"');
5676 appendText(&sQuery," NOT INDEXED;", 0);
5677 }else if( strcmp(zTab, "sqlite_master")==0 ){
5678 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
5679 " ORDER BY name;", 0);
5680 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
5681 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
5682 " ORDER BY name;", 0);
5683 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
5684 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
5685 " ORDER BY tbl,idx;", 0);
5686 }else if( strcmp(zTab, "sqlite_stat3")==0
5687 || strcmp(zTab, "sqlite_stat4")==0 ){
5688 appendText(&sQuery, "SELECT * FROM ", 0);
5689 appendText(&sQuery, zTab, 0);
5690 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
5691 }
5692 appendText(&sSql, zSep, 0);
5693 appendText(&sSql, sQuery.z, '\'');
5694 sQuery.n = 0;
5695 appendText(&sSql, ",", 0);
5696 appendText(&sSql, zTab, '\'');
5697 zSep = "),(";
5698 }
5699 sqlite3_finalize(pStmt);
5700 if( bSeparate ){
5701 zSql = sqlite3_mprintf(
5702 "%s))"
5703 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
5704 " FROM [sha3sum$query]",
5705 sSql.z, iSize);
5706 }else{
5707 zSql = sqlite3_mprintf(
5708 "%s))"
5709 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
5710 " FROM [sha3sum$query]",
5711 sSql.z, iSize);
5712 }
5713 freeText(&sQuery);
5714 freeText(&sSql);
5715 if( bDebug ){
5716 utf8_printf(p->out, "%s\n", zSql);
5717 }else{
5718 shell_exec(p->db, zSql, shell_callback, p, 0);
5719 }
5720 sqlite3_free(zSql);
5721 }else
5722
5723 if( c=='s'
5724 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
5725 ){
5726 char *zCmd;
5727 int i, x;
5728 if( nArg<2 ){
5729 raw_printf(stderr, "Usage: .system COMMAND\n");
5730 rc = 1;
5731 goto meta_command_exit;
5732 }
5733 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
5734 for(i=2; i<nArg; i++){
5735 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
5736 zCmd, azArg[i]);
5737 }
5738 x = system(zCmd);
5739 sqlite3_free(zCmd);
5740 if( x ) raw_printf(stderr, "System command returns %d\n", x);
5741 }else
5742
5743 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
5744 static const char *azBool[] = { "off", "on", "full", "unk" };
5745 int i;
5746 if( nArg!=1 ){
5747 raw_printf(stderr, "Usage: .show\n");
5748 rc = 1;
5749 goto meta_command_exit;
5750 }
5751 utf8_printf(p->out, "%12.12s: %s\n","echo",
5752 azBool[ShellHasFlag(p, SHFLG_Echo)]);
5753 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
5754 utf8_printf(p->out, "%12.12s: %s\n","explain",
5755 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
5756 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
5757 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
5758 utf8_printf(p->out, "%12.12s: ", "nullvalue");
5759 output_c_string(p->out, p->nullValue);
5760 raw_printf(p->out, "\n");
5761 utf8_printf(p->out,"%12.12s: %s\n","output",
5762 strlen30(p->outfile) ? p->outfile : "stdout");
5763 utf8_printf(p->out,"%12.12s: ", "colseparator");
5764 output_c_string(p->out, p->colSeparator);
5765 raw_printf(p->out, "\n");
5766 utf8_printf(p->out,"%12.12s: ", "rowseparator");
5767 output_c_string(p->out, p->rowSeparator);
5768 raw_printf(p->out, "\n");
5769 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
5770 utf8_printf(p->out, "%12.12s: ", "width");
5771 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
5772 raw_printf(p->out, "%d ", p->colWidth[i]);
5773 }
5774 raw_printf(p->out, "\n");
5775 utf8_printf(p->out, "%12.12s: %s\n", "filename",
5776 p->zDbFilename ? p->zDbFilename : "");
5777 }else
5778
5779 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
5780 if( nArg==2 ){
5781 p->statsOn = booleanValue(azArg[1]);
5782 }else if( nArg==1 ){
5783 display_stats(p->db, p, 0);
5784 }else{
5785 raw_printf(stderr, "Usage: .stats ?on|off?\n");
5786 rc = 1;
5787 }
5788 }else
5789
5790 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
5791 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
5792 || strncmp(azArg[0], "indexes", n)==0) )
5793 ){
5794 sqlite3_stmt *pStmt;
5795 char **azResult;
5796 int nRow, nAlloc;
5797 int ii;
5798 ShellText s;
5799 initText(&s);
5800 open_db(p, 0);
5801 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
5802 if( rc ) return shellDatabaseError(p->db);
5803
5804 if( nArg>2 && c=='i' ){
5805 /* It is an historical accident that the .indexes command shows an error
5806 ** when called with the wrong number of arguments whereas the .tables
5807 ** command does not. */
5808 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
5809 rc = 1;
5810 goto meta_command_exit;
5811 }
5812 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
5813 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
5814 if( zDbName==0 ) continue;
5815 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
5816 if( sqlite3_stricmp(zDbName, "main")==0 ){
5817 appendText(&s, "SELECT name FROM ", 0);
5818 }else{
5819 appendText(&s, "SELECT ", 0);
5820 appendText(&s, zDbName, '\'');
5821 appendText(&s, "||'.'||name FROM ", 0);
5822 }
5823 appendText(&s, zDbName, '"');
5824 appendText(&s, ".sqlite_master ", 0);
5825 if( c=='t' ){
5826 appendText(&s," WHERE type IN ('table','view')"
5827 " AND name NOT LIKE 'sqlite_%'"
5828 " AND name LIKE ?1", 0);
5829 }else{
5830 appendText(&s," WHERE type='index'"
5831 " AND tbl_name LIKE ?1", 0);
5832 }
5833 }
5834 rc = sqlite3_finalize(pStmt);
5835 appendText(&s, " ORDER BY 1", 0);
5836 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
5837 freeText(&s);
5838 if( rc ) return shellDatabaseError(p->db);
5839
5840 /* Run the SQL statement prepared by the above block. Store the results
5841 ** as an array of nul-terminated strings in azResult[]. */
5842 nRow = nAlloc = 0;
5843 azResult = 0;
5844 if( nArg>1 ){
5845 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
5846 }else{
5847 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
5848 }
5849 while( sqlite3_step(pStmt)==SQLITE_ROW ){
5850 if( nRow>=nAlloc ){
5851 char **azNew;
5852 int n2 = nAlloc*2 + 10;
5853 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
5854 if( azNew==0 ){
5855 rc = shellNomemError();
5856 break;
5857 }
5858 nAlloc = n2;
5859 azResult = azNew;
5860 }
5861 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
5862 if( 0==azResult[nRow] ){
5863 rc = shellNomemError();
5864 break;
5865 }
5866 nRow++;
5867 }
5868 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
5869 rc = shellDatabaseError(p->db);
5870 }
5871
5872 /* Pretty-print the contents of array azResult[] to the output */
5873 if( rc==0 && nRow>0 ){
5874 int len, maxlen = 0;
5875 int i, j;
5876 int nPrintCol, nPrintRow;
5877 for(i=0; i<nRow; i++){
5878 len = strlen30(azResult[i]);
5879 if( len>maxlen ) maxlen = len;
5880 }
5881 nPrintCol = 80/(maxlen+2);
5882 if( nPrintCol<1 ) nPrintCol = 1;
5883 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
5884 for(i=0; i<nPrintRow; i++){
5885 for(j=i; j<nRow; j+=nPrintRow){
5886 char *zSp = j<nPrintRow ? "" : " ";
5887 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
5888 azResult[j] ? azResult[j]:"");
5889 }
5890 raw_printf(p->out, "\n");
5891 }
5892 }
5893
5894 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
5895 sqlite3_free(azResult);
5896 }else
5897
5898 /* Begin redirecting output to the file "testcase-out.txt" */
5899 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
5900 output_reset(p);
5901 p->out = output_file_open("testcase-out.txt");
5902 if( p->out==0 ){
5903 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
5904 }
5905 if( nArg>=2 ){
5906 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
5907 }else{
5908 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
5909 }
5910 }else
5911
5912#ifndef SQLITE_UNTESTABLE
5913 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
5914 static const struct {
5915 const char *zCtrlName; /* Name of a test-control option */
5916 int ctrlCode; /* Integer code for that option */
5917 } aCtrl[] = {
5918 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
5919 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
5920 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
5921 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
5922 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
5923 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
5924 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
5925 { "assert", SQLITE_TESTCTRL_ASSERT },
5926 { "always", SQLITE_TESTCTRL_ALWAYS },
5927 { "reserve", SQLITE_TESTCTRL_RESERVE },
5928 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
5929 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
5930 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
5931 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
5932 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
5933 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
5934 };
5935 int testctrl = -1;
5936 int rc2 = 0;
5937 int i, n2;
5938 open_db(p, 0);
5939
5940 /* convert testctrl text option to value. allow any unique prefix
5941 ** of the option name, or a numerical value. */
5942 n2 = strlen30(azArg[1]);
5943 for(i=0; i<ArraySize(aCtrl); i++){
5944 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
5945 if( testctrl<0 ){
5946 testctrl = aCtrl[i].ctrlCode;
5947 }else{
5948 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
5949 testctrl = -1;
5950 break;
5951 }
5952 }
5953 }
5954 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
5955 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
5956 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
5957 }else{
5958 switch(testctrl){
5959
5960 /* sqlite3_test_control(int, db, int) */
5961 case SQLITE_TESTCTRL_OPTIMIZATIONS:
5962 case SQLITE_TESTCTRL_RESERVE:
5963 if( nArg==3 ){
5964 int opt = (int)strtol(azArg[2], 0, 0);
5965 rc2 = sqlite3_test_control(testctrl, p->db, opt);
5966 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
5967 } else {
5968 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
5969 azArg[1]);
5970 }
5971 break;
5972
5973 /* sqlite3_test_control(int) */
5974 case SQLITE_TESTCTRL_PRNG_SAVE:
5975 case SQLITE_TESTCTRL_PRNG_RESTORE:
5976 case SQLITE_TESTCTRL_PRNG_RESET:
5977 case SQLITE_TESTCTRL_BYTEORDER:
5978 if( nArg==2 ){
5979 rc2 = sqlite3_test_control(testctrl);
5980 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
5981 } else {
5982 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
5983 azArg[1]);
5984 }
5985 break;
5986
5987 /* sqlite3_test_control(int, uint) */
5988 case SQLITE_TESTCTRL_PENDING_BYTE:
5989 if( nArg==3 ){
5990 unsigned int opt = (unsigned int)integerValue(azArg[2]);
5991 rc2 = sqlite3_test_control(testctrl, opt);
5992 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
5993 } else {
5994 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
5995 " int option\n", azArg[1]);
5996 }
5997 break;
5998
5999 /* sqlite3_test_control(int, int) */
6000 case SQLITE_TESTCTRL_ASSERT:
6001 case SQLITE_TESTCTRL_ALWAYS:
6002 case SQLITE_TESTCTRL_NEVER_CORRUPT:
6003 if( nArg==3 ){
6004 int opt = booleanValue(azArg[2]);
6005 rc2 = sqlite3_test_control(testctrl, opt);
6006 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
6007 } else {
6008 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
6009 azArg[1]);
6010 }
6011 break;
6012
6013 /* sqlite3_test_control(int, char *) */
6014#ifdef SQLITE_N_KEYWORD
6015 case SQLITE_TESTCTRL_ISKEYWORD:
6016 if( nArg==3 ){
6017 const char *opt = azArg[2];
6018 rc2 = sqlite3_test_control(testctrl, opt);
6019 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
6020 } else {
6021 utf8_printf(stderr,
6022 "Error: testctrl %s takes a single char * option\n",
6023 azArg[1]);
6024 }
6025 break;
6026#endif
6027
6028 case SQLITE_TESTCTRL_IMPOSTER:
6029 if( nArg==5 ){
6030 rc2 = sqlite3_test_control(testctrl, p->db,
6031 azArg[2],
6032 integerValue(azArg[3]),
6033 integerValue(azArg[4]));
6034 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
6035 }else{
6036 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
6037 }
6038 break;
6039
6040 case SQLITE_TESTCTRL_BITVEC_TEST:
6041 case SQLITE_TESTCTRL_FAULT_INSTALL:
6042 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
6043 case SQLITE_TESTCTRL_SCRATCHMALLOC:
6044 default:
6045 utf8_printf(stderr,
6046 "Error: CLI support for testctrl %s not implemented\n",
6047 azArg[1]);
6048 break;
6049 }
6050 }
6051 }else
6052#endif /* !defined(SQLITE_UNTESTABLE) */
6053
6054 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
6055 open_db(p, 0);
6056 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
6057 }else
6058
6059 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
6060 if( nArg==2 ){
6061 enableTimer = booleanValue(azArg[1]);
6062 if( enableTimer && !HAS_TIMER ){
6063 raw_printf(stderr, "Error: timer not available on this system.\n");
6064 enableTimer = 0;
6065 }
6066 }else{
6067 raw_printf(stderr, "Usage: .timer on|off\n");
6068 rc = 1;
6069 }
6070 }else
6071
6072 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
6073 open_db(p, 0);
6074 if( nArg!=2 ){
6075 raw_printf(stderr, "Usage: .trace FILE|off\n");
6076 rc = 1;
6077 goto meta_command_exit;
6078 }
6079 output_file_close(p->traceOut);
6080 p->traceOut = output_file_open(azArg[1]);
6081#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
6082 if( p->traceOut==0 ){
6083 sqlite3_trace_v2(p->db, 0, 0, 0);
6084 }else{
6085 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
6086 }
6087#endif
6088 }else
6089
6090#if SQLITE_USER_AUTHENTICATION
6091 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
6092 if( nArg<2 ){
6093 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
6094 rc = 1;
6095 goto meta_command_exit;
6096 }
6097 open_db(p, 0);
6098 if( strcmp(azArg[1],"login")==0 ){
6099 if( nArg!=4 ){
6100 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
6101 rc = 1;
6102 goto meta_command_exit;
6103 }
6104 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
6105 (int)strlen(azArg[3]));
6106 if( rc ){
6107 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
6108 rc = 1;
6109 }
6110 }else if( strcmp(azArg[1],"add")==0 ){
6111 if( nArg!=5 ){
6112 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
6113 rc = 1;
6114 goto meta_command_exit;
6115 }
6116 rc = sqlite3_user_add(p->db, azArg[2],
6117 azArg[3], (int)strlen(azArg[3]),
6118 booleanValue(azArg[4]));
6119 if( rc ){
6120 raw_printf(stderr, "User-Add failed: %d\n", rc);
6121 rc = 1;
6122 }
6123 }else if( strcmp(azArg[1],"edit")==0 ){
6124 if( nArg!=5 ){
6125 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
6126 rc = 1;
6127 goto meta_command_exit;
6128 }
6129 rc = sqlite3_user_change(p->db, azArg[2],
6130 azArg[3], (int)strlen(azArg[3]),
6131 booleanValue(azArg[4]));
6132 if( rc ){
6133 raw_printf(stderr, "User-Edit failed: %d\n", rc);
6134 rc = 1;
6135 }
6136 }else if( strcmp(azArg[1],"delete")==0 ){
6137 if( nArg!=3 ){
6138 raw_printf(stderr, "Usage: .user delete USER\n");
6139 rc = 1;
6140 goto meta_command_exit;
6141 }
6142 rc = sqlite3_user_delete(p->db, azArg[2]);
6143 if( rc ){
6144 raw_printf(stderr, "User-Delete failed: %d\n", rc);
6145 rc = 1;
6146 }
6147 }else{
6148 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
6149 rc = 1;
6150 goto meta_command_exit;
6151 }
6152 }else
6153#endif /* SQLITE_USER_AUTHENTICATION */
6154
6155 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
6156 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
6157 sqlite3_libversion(), sqlite3_sourceid());
6158 }else
6159
6160 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
6161 const char *zDbName = nArg==2 ? azArg[1] : "main";
6162 sqlite3_vfs *pVfs = 0;
6163 if( p->db ){
6164 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
6165 if( pVfs ){
6166 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
6167 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6168 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6169 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6170 }
6171 }
6172 }else
6173
6174 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
6175 sqlite3_vfs *pVfs;
6176 sqlite3_vfs *pCurrent = 0;
6177 if( p->db ){
6178 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
6179 }
6180 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
6181 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
6182 pVfs==pCurrent ? " <--- CURRENT" : "");
6183 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6184 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6185 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6186 if( pVfs->pNext ){
6187 raw_printf(p->out, "-----------------------------------\n");
6188 }
6189 }
6190 }else
6191
6192 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
6193 const char *zDbName = nArg==2 ? azArg[1] : "main";
6194 char *zVfsName = 0;
6195 if( p->db ){
6196 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
6197 if( zVfsName ){
6198 utf8_printf(p->out, "%s\n", zVfsName);
6199 sqlite3_free(zVfsName);
6200 }
6201 }
6202 }else
6203
6204#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
6205 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
6206 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
6207 }else
6208#endif
6209
6210 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
6211 int j;
6212 assert( nArg<=ArraySize(azArg) );
6213 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
6214 p->colWidth[j-1] = (int)integerValue(azArg[j]);
6215 }
6216 }else
6217
6218 {
6219 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
6220 " \"%s\". Enter \".help\" for help\n", azArg[0]);
6221 rc = 1;
6222 }
6223
6224meta_command_exit:
6225 if( p->outCount ){
6226 p->outCount--;
6227 if( p->outCount==0 ) output_reset(p);
6228 }
6229 return rc;
6230}
6231
6232/*
6233** Return TRUE if a semicolon occurs anywhere in the first N characters
6234** of string z[].
6235*/
6236static int line_contains_semicolon(const char *z, int N){
6237 int i;
6238 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
6239 return 0;
6240}
6241
6242/*
6243** Test to see if a line consists entirely of whitespace.
6244*/
6245static int _all_whitespace(const char *z){
6246 for(; *z; z++){
6247 if( IsSpace(z[0]) ) continue;
6248 if( *z=='/' && z[1]=='*' ){
6249 z += 2;
6250 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
6251 if( *z==0 ) return 0;
6252 z++;
6253 continue;
6254 }
6255 if( *z=='-' && z[1]=='-' ){
6256 z += 2;
6257 while( *z && *z!='\n' ){ z++; }
6258 if( *z==0 ) return 1;
6259 continue;
6260 }
6261 return 0;
6262 }
6263 return 1;
6264}
6265
6266/*
6267** Return TRUE if the line typed in is an SQL command terminator other
6268** than a semi-colon. The SQL Server style "go" command is understood
6269** as is the Oracle "/".
6270*/
6271static int line_is_command_terminator(const char *zLine){
6272 while( IsSpace(zLine[0]) ){ zLine++; };
6273 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
6274 return 1; /* Oracle */
6275 }
6276 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
6277 && _all_whitespace(&zLine[2]) ){
6278 return 1; /* SQL Server */
6279 }
6280 return 0;
6281}
6282
6283/*
6284** Return true if zSql is a complete SQL statement. Return false if it
6285** ends in the middle of a string literal or C-style comment.
6286*/
6287static int line_is_complete(char *zSql, int nSql){
6288 int rc;
6289 if( zSql==0 ) return 1;
6290 zSql[nSql] = ';';
6291 zSql[nSql+1] = 0;
6292 rc = sqlite3_complete(zSql);
6293 zSql[nSql] = 0;
6294 return rc;
6295}
6296
6297/*
6298** Run a single line of SQL
6299*/
6300static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
6301 int rc;
6302 char *zErrMsg = 0;
6303
6304 open_db(p, 0);
6305 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
6306 BEGIN_TIMER;
6307 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
6308 END_TIMER;
6309 if( rc || zErrMsg ){
6310 char zPrefix[100];
6311 if( in!=0 || !stdin_is_interactive ){
6312 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
6313 "Error: near line %d:", startline);
6314 }else{
6315 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
6316 }
6317 if( zErrMsg!=0 ){
6318 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
6319 sqlite3_free(zErrMsg);
6320 zErrMsg = 0;
6321 }else{
6322 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
6323 }
6324 return 1;
6325 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
6326 raw_printf(p->out, "changes: %3d total_changes: %d\n",
6327 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
6328 }
6329 return 0;
6330}
6331
6332
6333/*
6334** Read input from *in and process it. If *in==0 then input
6335** is interactive - the user is typing it it. Otherwise, input
6336** is coming from a file or device. A prompt is issued and history
6337** is saved only if input is interactive. An interrupt signal will
6338** cause this routine to exit immediately, unless input is interactive.
6339**
6340** Return the number of errors.
6341*/
6342static int process_input(ShellState *p, FILE *in){
6343 char *zLine = 0; /* A single input line */
6344 char *zSql = 0; /* Accumulated SQL text */
6345 int nLine; /* Length of current line */
6346 int nSql = 0; /* Bytes of zSql[] used */
6347 int nAlloc = 0; /* Allocated zSql[] space */
6348 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
6349 int rc; /* Error code */
6350 int errCnt = 0; /* Number of errors seen */
6351 int lineno = 0; /* Current line number */
6352 int startline = 0; /* Line number for start of current input */
6353
6354 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
6355 fflush(p->out);
6356 zLine = one_input_line(in, zLine, nSql>0);
6357 if( zLine==0 ){
6358 /* End of input */
6359 if( in==0 && stdin_is_interactive ) printf("\n");
6360 break;
6361 }
6362 if( seenInterrupt ){
6363 if( in!=0 ) break;
6364 seenInterrupt = 0;
6365 }
6366 lineno++;
6367 if( nSql==0 && _all_whitespace(zLine) ){
6368 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
6369 continue;
6370 }
6371 if( zLine && zLine[0]=='.' && nSql==0 ){
6372 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
6373 rc = do_meta_command(zLine, p);
6374 if( rc==2 ){ /* exit requested */
6375 break;
6376 }else if( rc ){
6377 errCnt++;
6378 }
6379 continue;
6380 }
6381 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
6382 memcpy(zLine,";",2);
6383 }
6384 nLine = strlen30(zLine);
6385 if( nSql+nLine+2>=nAlloc ){
6386 nAlloc = nSql+nLine+100;
6387 zSql = realloc(zSql, nAlloc);
6388 if( zSql==0 ){
6389 raw_printf(stderr, "Error: out of memory\n");
6390 exit(1);
6391 }
6392 }
6393 nSqlPrior = nSql;
6394 if( nSql==0 ){
6395 int i;
6396 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
6397 assert( nAlloc>0 && zSql!=0 );
6398 memcpy(zSql, zLine+i, nLine+1-i);
6399 startline = lineno;
6400 nSql = nLine-i;
6401 }else{
6402 zSql[nSql++] = '\n';
6403 memcpy(zSql+nSql, zLine, nLine+1);
6404 nSql += nLine;
6405 }
6406 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
6407 && sqlite3_complete(zSql) ){
6408 errCnt += runOneSqlLine(p, zSql, in, startline);
6409 nSql = 0;
6410 if( p->outCount ){
6411 output_reset(p);
6412 p->outCount = 0;
6413 }
6414 }else if( nSql && _all_whitespace(zSql) ){
6415 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
6416 nSql = 0;
6417 }
6418 }
6419 if( nSql && !_all_whitespace(zSql) ){
6420 runOneSqlLine(p, zSql, in, startline);
6421 }
6422 free(zSql);
6423 free(zLine);
6424 return errCnt>0;
6425}
6426
6427/*
6428** Return a pathname which is the user's home directory. A
6429** 0 return indicates an error of some kind.
6430*/
6431static char *find_home_dir(int clearFlag){
6432 static char *home_dir = NULL;
6433 if( clearFlag ){
6434 free(home_dir);
6435 home_dir = 0;
6436 return 0;
6437 }
6438 if( home_dir ) return home_dir;
6439
6440#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
6441 && !defined(__RTP__) && !defined(_WRS_KERNEL)
6442 {
6443 struct passwd *pwent;
6444 uid_t uid = getuid();
6445 if( (pwent=getpwuid(uid)) != NULL) {
6446 home_dir = pwent->pw_dir;
6447 }
6448 }
6449#endif
6450
6451#if defined(_WIN32_WCE)
6452 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
6453 */
6454 home_dir = "/";
6455#else
6456
6457#if defined(_WIN32) || defined(WIN32)
6458 if (!home_dir) {
6459 home_dir = getenv("USERPROFILE");
6460 }
6461#endif
6462
6463 if (!home_dir) {
6464 home_dir = getenv("HOME");
6465 }
6466
6467#if defined(_WIN32) || defined(WIN32)
6468 if (!home_dir) {
6469 char *zDrive, *zPath;
6470 int n;
6471 zDrive = getenv("HOMEDRIVE");
6472 zPath = getenv("HOMEPATH");
6473 if( zDrive && zPath ){
6474 n = strlen30(zDrive) + strlen30(zPath) + 1;
6475 home_dir = malloc( n );
6476 if( home_dir==0 ) return 0;
6477 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
6478 return home_dir;
6479 }
6480 home_dir = "c:\\";
6481 }
6482#endif
6483
6484#endif /* !_WIN32_WCE */
6485
6486 if( home_dir ){
6487 int n = strlen30(home_dir) + 1;
6488 char *z = malloc( n );
6489 if( z ) memcpy(z, home_dir, n);
6490 home_dir = z;
6491 }
6492
6493 return home_dir;
6494}
6495
6496/*
6497** Read input from the file given by sqliterc_override. Or if that
6498** parameter is NULL, take input from ~/.sqliterc
6499**
6500** Returns the number of errors.
6501*/
6502static void process_sqliterc(
6503 ShellState *p, /* Configuration data */
6504 const char *sqliterc_override /* Name of config file. NULL to use default */
6505){
6506 char *home_dir = NULL;
6507 const char *sqliterc = sqliterc_override;
6508 char *zBuf = 0;
6509 FILE *in = NULL;
6510
6511 if (sqliterc == NULL) {
6512 home_dir = find_home_dir(0);
6513 if( home_dir==0 ){
6514 raw_printf(stderr, "-- warning: cannot find home directory;"
6515 " cannot read ~/.sqliterc\n");
6516 return;
6517 }
6518 sqlite3_initialize();
6519 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
6520 sqliterc = zBuf;
6521 }
6522 in = fopen(sqliterc,"rb");
6523 if( in ){
6524 if( stdin_is_interactive ){
6525 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
6526 }
6527 process_input(p,in);
6528 fclose(in);
6529 }
6530 sqlite3_free(zBuf);
6531}
6532
6533/*
6534** Show available command line options
6535*/
6536static const char zOptions[] =
6537 " -ascii set output mode to 'ascii'\n"
6538 " -bail stop after hitting an error\n"
6539 " -batch force batch I/O\n"
6540 " -column set output mode to 'column'\n"
6541 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
6542 " -csv set output mode to 'csv'\n"
6543 " -echo print commands before execution\n"
6544 " -init FILENAME read/process named file\n"
6545 " -[no]header turn headers on or off\n"
6546#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6547 " -heap SIZE Size of heap for memsys3 or memsys5\n"
6548#endif
6549 " -help show this message\n"
6550 " -html set output mode to HTML\n"
6551 " -interactive force interactive I/O\n"
6552 " -line set output mode to 'line'\n"
6553 " -list set output mode to 'list'\n"
6554 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
6555 " -mmap N default mmap size set to N\n"
6556#ifdef SQLITE_ENABLE_MULTIPLEX
6557 " -multiplex enable the multiplexor VFS\n"
6558#endif
6559 " -newline SEP set output row separator. Default: '\\n'\n"
6560 " -nullvalue TEXT set text string for NULL values. Default ''\n"
6561 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
6562 " -quote set output mode to 'quote'\n"
6563 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
6564 " -separator SEP set output column separator. Default: '|'\n"
6565 " -stats print memory stats before each finalize\n"
6566 " -version show SQLite version\n"
6567 " -vfs NAME use NAME as the default VFS\n"
6568#ifdef SQLITE_ENABLE_VFSTRACE
6569 " -vfstrace enable tracing of all VFS calls\n"
6570#endif
6571;
6572static void usage(int showDetail){
6573 utf8_printf(stderr,
6574 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
6575 "FILENAME is the name of an SQLite database. A new database is created\n"
6576 "if the file does not previously exist.\n", Argv0);
6577 if( showDetail ){
6578 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
6579 }else{
6580 raw_printf(stderr, "Use the -help option for additional information\n");
6581 }
6582 exit(1);
6583}
6584
6585/*
6586** Initialize the state information in data
6587*/
6588static void main_init(ShellState *data) {
6589 memset(data, 0, sizeof(*data));
6590 data->normalMode = data->cMode = data->mode = MODE_List;
6591 data->autoExplain = 1;
6592 memcpy(data->colSeparator,SEP_Column, 2);
6593 memcpy(data->rowSeparator,SEP_Row, 2);
6594 data->showHeader = 0;
6595 data->shellFlgs = SHFLG_Lookaside;
6596 sqlite3_config(SQLITE_CONFIG_URI, 1);
6597 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
6598 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
6599 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
6600 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
6601}
6602
6603/*
6604** Output text to the console in a font that attracts extra attention.
6605*/
6606#ifdef _WIN32
6607static void printBold(const char *zText){
6608 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
6609 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
6610 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
6611 SetConsoleTextAttribute(out,
6612 FOREGROUND_RED|FOREGROUND_INTENSITY
6613 );
6614 printf("%s", zText);
6615 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
6616}
6617#else
6618static void printBold(const char *zText){
6619 printf("\033[1m%s\033[0m", zText);
6620}
6621#endif
6622
6623/*
6624** Get the argument to an --option. Throw an error and die if no argument
6625** is available.
6626*/
6627static char *cmdline_option_value(int argc, char **argv, int i){
6628 if( i==argc ){
6629 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
6630 argv[0], argv[argc-1]);
6631 exit(1);
6632 }
6633 return argv[i];
6634}
6635
6636#ifndef SQLITE_SHELL_IS_UTF8
6637# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
6638# define SQLITE_SHELL_IS_UTF8 (0)
6639# else
6640# define SQLITE_SHELL_IS_UTF8 (1)
6641# endif
6642#endif
6643
6644#if SQLITE_SHELL_IS_UTF8
6645int SQLITE_CDECL main(int argc, char **argv){
6646#else
6647int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
6648 char **argv;
6649#endif
6650 char *zErrMsg = 0;
6651 ShellState data;
6652 const char *zInitFile = 0;
6653 int i;
6654 int rc = 0;
6655 int warnInmemoryDb = 0;
6656 int readStdin = 1;
6657 int nCmd = 0;
6658 char **azCmd = 0;
6659
6660 setBinaryMode(stdin, 0);
6661 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
6662 stdin_is_interactive = isatty(0);
6663 stdout_is_console = isatty(1);
6664
6665#if USE_SYSTEM_SQLITE+0!=1
6666 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
6667 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
6668 sqlite3_sourceid(), SQLITE_SOURCE_ID);
6669 exit(1);
6670 }
6671#endif
6672 main_init(&data);
6673#if !SQLITE_SHELL_IS_UTF8
6674 sqlite3_initialize();
6675 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
6676 if( argv==0 ){
6677 raw_printf(stderr, "out of memory\n");
6678 exit(1);
6679 }
6680 for(i=0; i<argc; i++){
6681 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
6682 if( argv[i]==0 ){
6683 raw_printf(stderr, "out of memory\n");
6684 exit(1);
6685 }
6686 }
6687#endif
6688 assert( argc>=1 && argv && argv[0] );
6689 Argv0 = argv[0];
6690
6691 /* Make sure we have a valid signal handler early, before anything
6692 ** else is done.
6693 */
6694#ifdef SIGINT
6695 signal(SIGINT, interrupt_handler);
6696#endif
6697
6698#ifdef SQLITE_SHELL_DBNAME_PROC
6699 {
6700 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
6701 ** of a C-function that will provide the name of the database file. Use
6702 ** this compile-time option to embed this shell program in larger
6703 ** applications. */
6704 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
6705 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
6706 warnInmemoryDb = 0;
6707 }
6708#endif
6709
6710 /* Do an initial pass through the command-line argument to locate
6711 ** the name of the database file, the name of the initialization file,
6712 ** the size of the alternative malloc heap,
6713 ** and the first command to execute.
6714 */
6715 for(i=1; i<argc; i++){
6716 char *z;
6717 z = argv[i];
6718 if( z[0]!='-' ){
6719 if( data.zDbFilename==0 ){
6720 data.zDbFilename = z;
6721 }else{
6722 /* Excesss arguments are interpreted as SQL (or dot-commands) and
6723 ** mean that nothing is read from stdin */
6724 readStdin = 0;
6725 nCmd++;
6726 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
6727 if( azCmd==0 ){
6728 raw_printf(stderr, "out of memory\n");
6729 exit(1);
6730 }
6731 azCmd[nCmd-1] = z;
6732 }
6733 }
6734 if( z[1]=='-' ) z++;
6735 if( strcmp(z,"-separator")==0
6736 || strcmp(z,"-nullvalue")==0
6737 || strcmp(z,"-newline")==0
6738 || strcmp(z,"-cmd")==0
6739 ){
6740 (void)cmdline_option_value(argc, argv, ++i);
6741 }else if( strcmp(z,"-init")==0 ){
6742 zInitFile = cmdline_option_value(argc, argv, ++i);
6743 }else if( strcmp(z,"-batch")==0 ){
6744 /* Need to check for batch mode here to so we can avoid printing
6745 ** informational messages (like from process_sqliterc) before
6746 ** we do the actual processing of arguments later in a second pass.
6747 */
6748 stdin_is_interactive = 0;
6749 }else if( strcmp(z,"-heap")==0 ){
6750#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6751 const char *zSize;
6752 sqlite3_int64 szHeap;
6753
6754 zSize = cmdline_option_value(argc, argv, ++i);
6755 szHeap = integerValue(zSize);
6756 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
6757 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
6758#else
6759 (void)cmdline_option_value(argc, argv, ++i);
6760#endif
6761 }else if( strcmp(z,"-scratch")==0 ){
6762 int n, sz;
6763 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
6764 if( sz>400000 ) sz = 400000;
6765 if( sz<2500 ) sz = 2500;
6766 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
6767 if( n>10 ) n = 10;
6768 if( n<1 ) n = 1;
6769 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
6770 data.shellFlgs |= SHFLG_Scratch;
6771 }else if( strcmp(z,"-pagecache")==0 ){
6772 int n, sz;
6773 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
6774 if( sz>70000 ) sz = 70000;
6775 if( sz<0 ) sz = 0;
6776 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
6777 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
6778 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
6779 data.shellFlgs |= SHFLG_Pagecache;
6780 }else if( strcmp(z,"-lookaside")==0 ){
6781 int n, sz;
6782 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
6783 if( sz<0 ) sz = 0;
6784 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
6785 if( n<0 ) n = 0;
6786 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
6787 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
6788#ifdef SQLITE_ENABLE_VFSTRACE
6789 }else if( strcmp(z,"-vfstrace")==0 ){
6790 extern int vfstrace_register(
6791 const char *zTraceName,
6792 const char *zOldVfsName,
6793 int (*xOut)(const char*,void*),
6794 void *pOutArg,
6795 int makeDefault
6796 );
6797 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
6798#endif
6799#ifdef SQLITE_ENABLE_MULTIPLEX
6800 }else if( strcmp(z,"-multiplex")==0 ){
6801 extern int sqlite3_multiple_initialize(const char*,int);
6802 sqlite3_multiplex_initialize(0, 1);
6803#endif
6804 }else if( strcmp(z,"-mmap")==0 ){
6805 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
6806 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
6807 }else if( strcmp(z,"-vfs")==0 ){
6808 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
6809 if( pVfs ){
6810 sqlite3_vfs_register(pVfs, 1);
6811 }else{
6812 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
6813 exit(1);
6814 }
6815 }
6816 }
6817 if( data.zDbFilename==0 ){
6818#ifndef SQLITE_OMIT_MEMORYDB
6819 data.zDbFilename = ":memory:";
6820 warnInmemoryDb = argc==1;
6821#else
6822 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
6823 return 1;
6824#endif
6825 }
6826 data.out = stdout;
6827
6828 /* Go ahead and open the database file if it already exists. If the
6829 ** file does not exist, delay opening it. This prevents empty database
6830 ** files from being created if a user mistypes the database name argument
6831 ** to the sqlite command-line tool.
6832 */
6833 if( access(data.zDbFilename, 0)==0 ){
6834 open_db(&data, 0);
6835 }
6836
6837 /* Process the initialization file if there is one. If no -init option
6838 ** is given on the command line, look for a file named ~/.sqliterc and
6839 ** try to process it.
6840 */
6841 process_sqliterc(&data,zInitFile);
6842
6843 /* Make a second pass through the command-line argument and set
6844 ** options. This second pass is delayed until after the initialization
6845 ** file is processed so that the command-line arguments will override
6846 ** settings in the initialization file.
6847 */
6848 for(i=1; i<argc; i++){
6849 char *z = argv[i];
6850 if( z[0]!='-' ) continue;
6851 if( z[1]=='-' ){ z++; }
6852 if( strcmp(z,"-init")==0 ){
6853 i++;
6854 }else if( strcmp(z,"-html")==0 ){
6855 data.mode = MODE_Html;
6856 }else if( strcmp(z,"-list")==0 ){
6857 data.mode = MODE_List;
6858 }else if( strcmp(z,"-quote")==0 ){
6859 data.mode = MODE_Quote;
6860 }else if( strcmp(z,"-line")==0 ){
6861 data.mode = MODE_Line;
6862 }else if( strcmp(z,"-column")==0 ){
6863 data.mode = MODE_Column;
6864 }else if( strcmp(z,"-csv")==0 ){
6865 data.mode = MODE_Csv;
6866 memcpy(data.colSeparator,",",2);
6867 }else if( strcmp(z,"-ascii")==0 ){
6868 data.mode = MODE_Ascii;
6869 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
6870 SEP_Unit);
6871 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
6872 SEP_Record);
6873 }else if( strcmp(z,"-separator")==0 ){
6874 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
6875 "%s",cmdline_option_value(argc,argv,++i));
6876 }else if( strcmp(z,"-newline")==0 ){
6877 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
6878 "%s",cmdline_option_value(argc,argv,++i));
6879 }else if( strcmp(z,"-nullvalue")==0 ){
6880 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
6881 "%s",cmdline_option_value(argc,argv,++i));
6882 }else if( strcmp(z,"-header")==0 ){
6883 data.showHeader = 1;
6884 }else if( strcmp(z,"-noheader")==0 ){
6885 data.showHeader = 0;
6886 }else if( strcmp(z,"-echo")==0 ){
6887 ShellSetFlag(&data, SHFLG_Echo);
6888 }else if( strcmp(z,"-eqp")==0 ){
6889 data.autoEQP = 1;
6890 }else if( strcmp(z,"-eqpfull")==0 ){
6891 data.autoEQP = 2;
6892 }else if( strcmp(z,"-stats")==0 ){
6893 data.statsOn = 1;
6894 }else if( strcmp(z,"-scanstats")==0 ){
6895 data.scanstatsOn = 1;
6896 }else if( strcmp(z,"-backslash")==0 ){
6897 /* Undocumented command-line option: -backslash
6898 ** Causes C-style backslash escapes to be evaluated in SQL statements
6899 ** prior to sending the SQL into SQLite. Useful for injecting
6900 ** crazy bytes in the middle of SQL statements for testing and debugging.
6901 */
6902 ShellSetFlag(&data, SHFLG_Backslash);
6903 }else if( strcmp(z,"-bail")==0 ){
6904 bail_on_error = 1;
6905 }else if( strcmp(z,"-version")==0 ){
6906 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
6907 return 0;
6908 }else if( strcmp(z,"-interactive")==0 ){
6909 stdin_is_interactive = 1;
6910 }else if( strcmp(z,"-batch")==0 ){
6911 stdin_is_interactive = 0;
6912 }else if( strcmp(z,"-heap")==0 ){
6913 i++;
6914 }else if( strcmp(z,"-scratch")==0 ){
6915 i+=2;
6916 }else if( strcmp(z,"-pagecache")==0 ){
6917 i+=2;
6918 }else if( strcmp(z,"-lookaside")==0 ){
6919 i+=2;
6920 }else if( strcmp(z,"-mmap")==0 ){
6921 i++;
6922 }else if( strcmp(z,"-vfs")==0 ){
6923 i++;
6924#ifdef SQLITE_ENABLE_VFSTRACE
6925 }else if( strcmp(z,"-vfstrace")==0 ){
6926 i++;
6927#endif
6928#ifdef SQLITE_ENABLE_MULTIPLEX
6929 }else if( strcmp(z,"-multiplex")==0 ){
6930 i++;
6931#endif
6932 }else if( strcmp(z,"-help")==0 ){
6933 usage(1);
6934 }else if( strcmp(z,"-cmd")==0 ){
6935 /* Run commands that follow -cmd first and separately from commands
6936 ** that simply appear on the command-line. This seems goofy. It would
6937 ** be better if all commands ran in the order that they appear. But
6938 ** we retain the goofy behavior for historical compatibility. */
6939 if( i==argc-1 ) break;
6940 z = cmdline_option_value(argc,argv,++i);
6941 if( z[0]=='.' ){
6942 rc = do_meta_command(z, &data);
6943 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
6944 }else{
6945 open_db(&data, 0);
6946 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
6947 if( zErrMsg!=0 ){
6948 utf8_printf(stderr,"Error: %s\n", zErrMsg);
6949 if( bail_on_error ) return rc!=0 ? rc : 1;
6950 }else if( rc!=0 ){
6951 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
6952 if( bail_on_error ) return rc;
6953 }
6954 }
6955 }else{
6956 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
6957 raw_printf(stderr,"Use -help for a list of options.\n");
6958 return 1;
6959 }
6960 data.cMode = data.mode;
6961 }
6962
6963 if( !readStdin ){
6964 /* Run all arguments that do not begin with '-' as if they were separate
6965 ** command-line inputs, except for the argToSkip argument which contains
6966 ** the database filename.
6967 */
6968 for(i=0; i<nCmd; i++){
6969 if( azCmd[i][0]=='.' ){
6970 rc = do_meta_command(azCmd[i], &data);
6971 if( rc ) return rc==2 ? 0 : rc;
6972 }else{
6973 open_db(&data, 0);
6974 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
6975 if( zErrMsg!=0 ){
6976 utf8_printf(stderr,"Error: %s\n", zErrMsg);
6977 return rc!=0 ? rc : 1;
6978 }else if( rc!=0 ){
6979 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
6980 return rc;
6981 }
6982 }
6983 }
6984 free(azCmd);
6985 }else{
6986 /* Run commands received from standard input
6987 */
6988 if( stdin_is_interactive ){
6989 char *zHome;
6990 char *zHistory = 0;
6991 int nHistory;
6992 printf(
6993 "SQLite version %s %.19s\n" /*extra-version-info*/
6994 "Enter \".help\" for usage hints.\n",
6995 sqlite3_libversion(), sqlite3_sourceid()
6996 );
6997 if( warnInmemoryDb ){
6998 printf("Connected to a ");
6999 printBold("transient in-memory database");
7000 printf(".\nUse \".open FILENAME\" to reopen on a "
7001 "persistent database.\n");
7002 }
7003 zHome = find_home_dir(0);
7004 if( zHome ){
7005 nHistory = strlen30(zHome) + 20;
7006 if( (zHistory = malloc(nHistory))!=0 ){
7007 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
7008 }
7009 }
7010 if( zHistory ){ shell_read_history(zHistory); }
drh56eb09b2017-07-11 13:59:07 +00007011#if HAVE_READLINE || HAVE_EDITLINE
7012 rl_attempted_completion_function = readline_completion;
7013#elif HAVE_LINENOISE
7014 linenoiseSetCompletionCallback(linenoise_completion);
7015#endif
drh2ce15c32017-07-11 13:34:40 +00007016 rc = process_input(&data, 0);
7017 if( zHistory ){
drh5a75dd82017-07-18 20:59:40 +00007018 shell_stifle_history(2000);
drh2ce15c32017-07-11 13:34:40 +00007019 shell_write_history(zHistory);
7020 free(zHistory);
7021 }
7022 }else{
7023 rc = process_input(&data, stdin);
7024 }
7025 }
7026 set_table_name(&data, 0);
7027 if( data.db ){
7028 session_close_all(&data);
7029 sqlite3_close(data.db);
7030 }
7031 sqlite3_free(data.zFreeOnClose);
7032 find_home_dir(1);
7033#if !SQLITE_SHELL_IS_UTF8
7034 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
7035 sqlite3_free(argv);
7036#endif
7037 return rc;
7038}