blob: b9d7cecbc70216489af18b3aa25c5e9f9e25373d [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"
drh1e506b52018-01-05 21:01:37 +000064typedef sqlite3_int64 i64;
65typedef sqlite3_uint64 u64;
drh1fa6d9f2018-01-06 21:46:01 +000066typedef unsigned char u8;
drh2ce15c32017-07-11 13:34:40 +000067#if SQLITE_USER_AUTHENTICATION
68# include "sqlite3userauth.h"
69#endif
70#include <ctype.h>
71#include <stdarg.h>
72
73#if !defined(_WIN32) && !defined(WIN32)
74# include <signal.h>
75# if !defined(__RTP__) && !defined(_WRS_KERNEL)
76# include <pwd.h>
77# endif
mistachkinacae8c32018-01-05 20:08:46 +000078#endif
mistachkin562f0c82018-01-09 00:28:24 +000079#if (!defined(_WIN32) && !defined(WIN32)) || defined(__MINGW32__)
drh2ce15c32017-07-11 13:34:40 +000080# include <unistd.h>
mistachkinacae8c32018-01-05 20:08:46 +000081# include <dirent.h>
mistachkin562f0c82018-01-09 00:28:24 +000082# if defined(__MINGW32__)
mistachkinacae8c32018-01-05 20:08:46 +000083# define DIRENT dirent
mistachkin2f74b3c2018-01-05 20:26:06 +000084# ifndef S_ISLNK
85# define S_ISLNK(mode) (0)
86# endif
mistachkinacae8c32018-01-05 20:08:46 +000087# endif
drh2ce15c32017-07-11 13:34:40 +000088#endif
mistachkindfdfd8c2018-01-04 22:46:08 +000089#include <sys/types.h>
90#include <sys/stat.h>
drh2ce15c32017-07-11 13:34:40 +000091
92#if HAVE_READLINE
93# include <readline/readline.h>
94# include <readline/history.h>
95#endif
96
97#if HAVE_EDITLINE
98# include <editline/readline.h>
99#endif
100
101#if HAVE_EDITLINE || HAVE_READLINE
102
103# define shell_add_history(X) add_history(X)
104# define shell_read_history(X) read_history(X)
105# define shell_write_history(X) write_history(X)
106# define shell_stifle_history(X) stifle_history(X)
107# define shell_readline(X) readline(X)
108
109#elif HAVE_LINENOISE
110
111# include "linenoise.h"
112# define shell_add_history(X) linenoiseHistoryAdd(X)
113# define shell_read_history(X) linenoiseHistoryLoad(X)
114# define shell_write_history(X) linenoiseHistorySave(X)
115# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
116# define shell_readline(X) linenoise(X)
117
118#else
119
120# define shell_read_history(X)
121# define shell_write_history(X)
122# define shell_stifle_history(X)
123
124# define SHELL_USE_LOCAL_GETLINE 1
125#endif
126
127
128#if defined(_WIN32) || defined(WIN32)
129# include <io.h>
130# include <fcntl.h>
131# define isatty(h) _isatty(h)
132# ifndef access
133# define access(f,m) _access((f),(m))
134# endif
mistachkince2052b2018-03-23 00:31:53 +0000135# ifndef unlink
136# define unlink _unlink
137# endif
drh2ce15c32017-07-11 13:34:40 +0000138# undef popen
139# define popen _popen
140# undef pclose
141# define pclose _pclose
142#else
143 /* Make sure isatty() has a prototype. */
144 extern int isatty(int);
145
146# if !defined(__RTP__) && !defined(_WRS_KERNEL)
147 /* popen and pclose are not C89 functions and so are
148 ** sometimes omitted from the <stdio.h> header */
149 extern FILE *popen(const char*,const char*);
150 extern int pclose(FILE*);
151# else
152# define SQLITE_OMIT_POPEN 1
153# endif
154#endif
155
156#if defined(_WIN32_WCE)
157/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
158 * thus we always assume that we have a console. That can be
159 * overridden with the -batch command line option.
160 */
161#define isatty(x) 1
162#endif
163
164/* ctype macros that work with signed characters */
165#define IsSpace(X) isspace((unsigned char)X)
166#define IsDigit(X) isdigit((unsigned char)X)
167#define ToLower(X) (char)tolower((unsigned char)X)
168
169#if defined(_WIN32) || defined(WIN32)
170#include <windows.h>
171
172/* string conversion routines only needed on Win32 */
173extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
174extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
175extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
176extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
177#endif
178
179/* On Windows, we normally run with output mode of TEXT so that \n characters
180** are automatically translated into \r\n. However, this behavior needs
181** to be disabled in some cases (ex: when generating CSV output and when
182** rendering quoted strings that contain \n characters). The following
183** routines take care of that.
184*/
185#if defined(_WIN32) || defined(WIN32)
186static void setBinaryMode(FILE *file, int isOutput){
187 if( isOutput ) fflush(file);
188 _setmode(_fileno(file), _O_BINARY);
189}
190static void setTextMode(FILE *file, int isOutput){
191 if( isOutput ) fflush(file);
192 _setmode(_fileno(file), _O_TEXT);
193}
194#else
195# define setBinaryMode(X,Y)
196# define setTextMode(X,Y)
197#endif
198
199
200/* True if the timer is enabled */
201static int enableTimer = 0;
202
203/* Return the current wall-clock time */
204static sqlite3_int64 timeOfDay(void){
205 static sqlite3_vfs *clockVfs = 0;
206 sqlite3_int64 t;
207 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
208 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
209 clockVfs->xCurrentTimeInt64(clockVfs, &t);
210 }else{
211 double r;
212 clockVfs->xCurrentTime(clockVfs, &r);
213 t = (sqlite3_int64)(r*86400000.0);
214 }
215 return t;
216}
217
218#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
219#include <sys/time.h>
220#include <sys/resource.h>
221
222/* VxWorks does not support getrusage() as far as we can determine */
223#if defined(_WRS_KERNEL) || defined(__RTP__)
224struct rusage {
225 struct timeval ru_utime; /* user CPU time used */
226 struct timeval ru_stime; /* system CPU time used */
227};
228#define getrusage(A,B) memset(B,0,sizeof(*B))
229#endif
230
231/* Saved resource information for the beginning of an operation */
232static struct rusage sBegin; /* CPU time at start */
233static sqlite3_int64 iBegin; /* Wall-clock time at start */
234
235/*
236** Begin timing an operation
237*/
238static void beginTimer(void){
239 if( enableTimer ){
240 getrusage(RUSAGE_SELF, &sBegin);
241 iBegin = timeOfDay();
242 }
243}
244
245/* Return the difference of two time_structs in seconds */
246static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
247 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
248 (double)(pEnd->tv_sec - pStart->tv_sec);
249}
250
251/*
252** Print the timing results.
253*/
254static void endTimer(void){
255 if( enableTimer ){
256 sqlite3_int64 iEnd = timeOfDay();
257 struct rusage sEnd;
258 getrusage(RUSAGE_SELF, &sEnd);
259 printf("Run Time: real %.3f user %f sys %f\n",
260 (iEnd - iBegin)*0.001,
261 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
262 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
263 }
264}
265
266#define BEGIN_TIMER beginTimer()
267#define END_TIMER endTimer()
268#define HAS_TIMER 1
269
270#elif (defined(_WIN32) || defined(WIN32))
271
272/* Saved resource information for the beginning of an operation */
273static HANDLE hProcess;
274static FILETIME ftKernelBegin;
275static FILETIME ftUserBegin;
276static sqlite3_int64 ftWallBegin;
277typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
278 LPFILETIME, LPFILETIME);
279static GETPROCTIMES getProcessTimesAddr = NULL;
280
281/*
282** Check to see if we have timer support. Return 1 if necessary
283** support found (or found previously).
284*/
285static int hasTimer(void){
286 if( getProcessTimesAddr ){
287 return 1;
288 } else {
289 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
290 ** versions. See if the version we are running on has it, and if it
291 ** does, save off a pointer to it and the current process handle.
292 */
293 hProcess = GetCurrentProcess();
294 if( hProcess ){
295 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
296 if( NULL != hinstLib ){
297 getProcessTimesAddr =
298 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
299 if( NULL != getProcessTimesAddr ){
300 return 1;
301 }
302 FreeLibrary(hinstLib);
303 }
304 }
305 }
306 return 0;
307}
308
309/*
310** Begin timing an operation
311*/
312static void beginTimer(void){
313 if( enableTimer && getProcessTimesAddr ){
314 FILETIME ftCreation, ftExit;
315 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
316 &ftKernelBegin,&ftUserBegin);
317 ftWallBegin = timeOfDay();
318 }
319}
320
321/* Return the difference of two FILETIME structs in seconds */
322static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
323 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
324 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
325 return (double) ((i64End - i64Start) / 10000000.0);
326}
327
328/*
329** Print the timing results.
330*/
331static void endTimer(void){
332 if( enableTimer && getProcessTimesAddr){
333 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
334 sqlite3_int64 ftWallEnd = timeOfDay();
335 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
336 printf("Run Time: real %.3f user %f sys %f\n",
337 (ftWallEnd - ftWallBegin)*0.001,
338 timeDiff(&ftUserBegin, &ftUserEnd),
339 timeDiff(&ftKernelBegin, &ftKernelEnd));
340 }
341}
342
343#define BEGIN_TIMER beginTimer()
344#define END_TIMER endTimer()
345#define HAS_TIMER hasTimer()
346
347#else
348#define BEGIN_TIMER
349#define END_TIMER
350#define HAS_TIMER 0
351#endif
352
353/*
354** Used to prevent warnings about unused parameters
355*/
356#define UNUSED_PARAMETER(x) (void)(x)
357
358/*
drh5af06982018-01-10 00:53:55 +0000359** Number of elements in an array
360*/
361#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
362
363/*
drh2ce15c32017-07-11 13:34:40 +0000364** If the following flag is set, then command execution stops
365** at an error if we are not interactive.
366*/
367static int bail_on_error = 0;
368
369/*
370** Threat stdin as an interactive input if the following variable
371** is true. Otherwise, assume stdin is connected to a file or pipe.
372*/
373static int stdin_is_interactive = 1;
374
375/*
376** On Windows systems we have to know if standard output is a console
377** in order to translate UTF-8 into MBCS. The following variable is
378** true if translation is required.
379*/
380static int stdout_is_console = 1;
381
382/*
383** The following is the open SQLite database. We make a pointer
384** to this database a static variable so that it can be accessed
385** by the SIGINT handler to interrupt database processing.
386*/
387static sqlite3 *globalDb = 0;
388
389/*
390** True if an interrupt (Control-C) has been received.
391*/
392static volatile int seenInterrupt = 0;
393
394/*
395** This is the name of our program. It is set in main(), used
396** in a number of other places, mostly for error messages.
397*/
398static char *Argv0;
399
400/*
401** Prompt strings. Initialized in main. Settable with
402** .prompt main continue
403*/
404static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
405static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
406
407/*
408** Render output like fprintf(). Except, if the output is going to the
409** console and if this is running on a Windows machine, translate the
410** output from UTF-8 into MBCS.
411*/
412#if defined(_WIN32) || defined(WIN32)
413void utf8_printf(FILE *out, const char *zFormat, ...){
414 va_list ap;
415 va_start(ap, zFormat);
416 if( stdout_is_console && (out==stdout || out==stderr) ){
417 char *z1 = sqlite3_vmprintf(zFormat, ap);
418 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
419 sqlite3_free(z1);
420 fputs(z2, out);
421 sqlite3_free(z2);
422 }else{
423 vfprintf(out, zFormat, ap);
424 }
425 va_end(ap);
426}
427#elif !defined(utf8_printf)
428# define utf8_printf fprintf
429#endif
430
431/*
432** Render output like fprintf(). This should not be used on anything that
433** includes string formatting (e.g. "%s").
434*/
435#if !defined(raw_printf)
436# define raw_printf fprintf
437#endif
438
drh4b5345c2018-04-24 13:07:40 +0000439/* Indicate out-of-memory and exit. */
440static void shell_out_of_memory(void){
441 raw_printf(stderr,"Error: out of memory\n");
442 exit(1);
443}
444
drh2ce15c32017-07-11 13:34:40 +0000445/*
446** Write I/O traces to the following stream.
447*/
448#ifdef SQLITE_ENABLE_IOTRACE
449static FILE *iotrace = 0;
450#endif
451
452/*
453** This routine works like printf in that its first argument is a
454** format string and subsequent arguments are values to be substituted
455** in place of % fields. The result of formatting this string
456** is written to iotrace.
457*/
458#ifdef SQLITE_ENABLE_IOTRACE
459static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
460 va_list ap;
461 char *z;
462 if( iotrace==0 ) return;
463 va_start(ap, zFormat);
464 z = sqlite3_vmprintf(zFormat, ap);
465 va_end(ap);
466 utf8_printf(iotrace, "%s", z);
467 sqlite3_free(z);
468}
469#endif
470
471/*
472** Output string zUtf to stream pOut as w characters. If w is negative,
473** then right-justify the text. W is the width in UTF-8 characters, not
474** in bytes. This is different from the %*.*s specification in printf
475** since with %*.*s the width is measured in bytes, not characters.
476*/
477static void utf8_width_print(FILE *pOut, int w, const char *zUtf){
478 int i;
479 int n;
480 int aw = w<0 ? -w : w;
481 char zBuf[1000];
482 if( aw>(int)sizeof(zBuf)/3 ) aw = (int)sizeof(zBuf)/3;
483 for(i=n=0; zUtf[i]; i++){
484 if( (zUtf[i]&0xc0)!=0x80 ){
485 n++;
486 if( n==aw ){
487 do{ i++; }while( (zUtf[i]&0xc0)==0x80 );
488 break;
489 }
490 }
491 }
492 if( n>=aw ){
493 utf8_printf(pOut, "%.*s", i, zUtf);
494 }else if( w<0 ){
495 utf8_printf(pOut, "%*s%s", aw-n, "", zUtf);
496 }else{
497 utf8_printf(pOut, "%s%*s", zUtf, aw-n, "");
498 }
499}
500
501
502/*
503** Determines if a string is a number of not.
504*/
505static int isNumber(const char *z, int *realnum){
506 if( *z=='-' || *z=='+' ) z++;
507 if( !IsDigit(*z) ){
508 return 0;
509 }
510 z++;
511 if( realnum ) *realnum = 0;
512 while( IsDigit(*z) ){ z++; }
513 if( *z=='.' ){
514 z++;
515 if( !IsDigit(*z) ) return 0;
516 while( IsDigit(*z) ){ z++; }
517 if( realnum ) *realnum = 1;
518 }
519 if( *z=='e' || *z=='E' ){
520 z++;
521 if( *z=='+' || *z=='-' ) z++;
522 if( !IsDigit(*z) ) return 0;
523 while( IsDigit(*z) ){ z++; }
524 if( realnum ) *realnum = 1;
525 }
526 return *z==0;
527}
528
529/*
530** Compute a string length that is limited to what can be stored in
531** lower 30 bits of a 32-bit signed integer.
532*/
533static int strlen30(const char *z){
534 const char *z2 = z;
535 while( *z2 ){ z2++; }
536 return 0x3fffffff & (int)(z2 - z);
537}
538
539/*
540** Return the length of a string in characters. Multibyte UTF8 characters
541** count as a single character.
542*/
543static int strlenChar(const char *z){
544 int n = 0;
545 while( *z ){
546 if( (0xc0&*(z++))!=0x80 ) n++;
547 }
548 return n;
549}
550
551/*
552** This routine reads a line of text from FILE in, stores
553** the text in memory obtained from malloc() and returns a pointer
554** to the text. NULL is returned at end of file, or if malloc()
555** fails.
556**
557** If zLine is not NULL then it is a malloced buffer returned from
558** a previous call to this routine that may be reused.
559*/
560static char *local_getline(char *zLine, FILE *in){
561 int nLine = zLine==0 ? 0 : 100;
562 int n = 0;
563
564 while( 1 ){
565 if( n+100>nLine ){
566 nLine = nLine*2 + 100;
567 zLine = realloc(zLine, nLine);
568 if( zLine==0 ) return 0;
569 }
570 if( fgets(&zLine[n], nLine - n, in)==0 ){
571 if( n==0 ){
572 free(zLine);
573 return 0;
574 }
575 zLine[n] = 0;
576 break;
577 }
578 while( zLine[n] ) n++;
579 if( n>0 && zLine[n-1]=='\n' ){
580 n--;
581 if( n>0 && zLine[n-1]=='\r' ) n--;
582 zLine[n] = 0;
583 break;
584 }
585 }
586#if defined(_WIN32) || defined(WIN32)
587 /* For interactive input on Windows systems, translate the
588 ** multi-byte characterset characters into UTF-8. */
589 if( stdin_is_interactive && in==stdin ){
590 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
591 if( zTrans ){
592 int nTrans = strlen30(zTrans)+1;
593 if( nTrans>nLine ){
594 zLine = realloc(zLine, nTrans);
595 if( zLine==0 ){
596 sqlite3_free(zTrans);
597 return 0;
598 }
599 }
600 memcpy(zLine, zTrans, nTrans);
601 sqlite3_free(zTrans);
602 }
603 }
604#endif /* defined(_WIN32) || defined(WIN32) */
605 return zLine;
606}
607
608/*
609** Retrieve a single line of input text.
610**
611** If in==0 then read from standard input and prompt before each line.
612** If isContinuation is true, then a continuation prompt is appropriate.
613** If isContinuation is zero, then the main prompt should be used.
614**
615** If zPrior is not NULL then it is a buffer from a prior call to this
616** routine that can be reused.
617**
618** The result is stored in space obtained from malloc() and must either
619** be freed by the caller or else passed back into this routine via the
620** zPrior argument for reuse.
621*/
622static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
623 char *zPrompt;
624 char *zResult;
625 if( in!=0 ){
626 zResult = local_getline(zPrior, in);
627 }else{
628 zPrompt = isContinuation ? continuePrompt : mainPrompt;
629#if SHELL_USE_LOCAL_GETLINE
630 printf("%s", zPrompt);
631 fflush(stdout);
632 zResult = local_getline(zPrior, stdin);
633#else
634 free(zPrior);
635 zResult = shell_readline(zPrompt);
636 if( zResult && *zResult ) shell_add_history(zResult);
637#endif
638 }
639 return zResult;
640}
drh5af06982018-01-10 00:53:55 +0000641
642
643/*
644** Return the value of a hexadecimal digit. Return -1 if the input
645** is not a hex digit.
646*/
647static int hexDigitValue(char c){
648 if( c>='0' && c<='9' ) return c - '0';
649 if( c>='a' && c<='f' ) return c - 'a' + 10;
650 if( c>='A' && c<='F' ) return c - 'A' + 10;
651 return -1;
652}
653
654/*
655** Interpret zArg as an integer value, possibly with suffixes.
656*/
657static sqlite3_int64 integerValue(const char *zArg){
658 sqlite3_int64 v = 0;
659 static const struct { char *zSuffix; int iMult; } aMult[] = {
660 { "KiB", 1024 },
661 { "MiB", 1024*1024 },
662 { "GiB", 1024*1024*1024 },
663 { "KB", 1000 },
664 { "MB", 1000000 },
665 { "GB", 1000000000 },
666 { "K", 1000 },
667 { "M", 1000000 },
668 { "G", 1000000000 },
669 };
670 int i;
671 int isNeg = 0;
672 if( zArg[0]=='-' ){
673 isNeg = 1;
674 zArg++;
675 }else if( zArg[0]=='+' ){
676 zArg++;
677 }
678 if( zArg[0]=='0' && zArg[1]=='x' ){
679 int x;
680 zArg += 2;
681 while( (x = hexDigitValue(zArg[0]))>=0 ){
682 v = (v<<4) + x;
683 zArg++;
684 }
685 }else{
686 while( IsDigit(zArg[0]) ){
687 v = v*10 + zArg[0] - '0';
688 zArg++;
689 }
690 }
691 for(i=0; i<ArraySize(aMult); i++){
692 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
693 v *= aMult[i].iMult;
694 break;
695 }
696 }
697 return isNeg? -v : v;
698}
699
drh2ce15c32017-07-11 13:34:40 +0000700/*
701** A variable length string to which one can append text.
702*/
703typedef struct ShellText ShellText;
704struct ShellText {
705 char *z;
706 int n;
707 int nAlloc;
708};
709
710/*
711** Initialize and destroy a ShellText object
712*/
713static void initText(ShellText *p){
714 memset(p, 0, sizeof(*p));
715}
716static void freeText(ShellText *p){
717 free(p->z);
718 initText(p);
719}
720
721/* zIn is either a pointer to a NULL-terminated string in memory obtained
722** from malloc(), or a NULL pointer. The string pointed to by zAppend is
723** added to zIn, and the result returned in memory obtained from malloc().
724** zIn, if it was not NULL, is freed.
725**
726** If the third argument, quote, is not '\0', then it is used as a
727** quote character for zAppend.
728*/
729static void appendText(ShellText *p, char const *zAppend, char quote){
730 int len;
731 int i;
732 int nAppend = strlen30(zAppend);
733
734 len = nAppend+p->n+1;
735 if( quote ){
736 len += 2;
737 for(i=0; i<nAppend; i++){
738 if( zAppend[i]==quote ) len++;
739 }
740 }
741
742 if( p->n+len>=p->nAlloc ){
743 p->nAlloc = p->nAlloc*2 + len + 20;
744 p->z = realloc(p->z, p->nAlloc);
745 if( p->z==0 ){
746 memset(p, 0, sizeof(*p));
747 return;
748 }
749 }
750
751 if( quote ){
752 char *zCsr = p->z+p->n;
753 *zCsr++ = quote;
754 for(i=0; i<nAppend; i++){
755 *zCsr++ = zAppend[i];
756 if( zAppend[i]==quote ) *zCsr++ = quote;
757 }
758 *zCsr++ = quote;
759 p->n = (int)(zCsr - p->z);
760 *zCsr = '\0';
761 }else{
762 memcpy(p->z+p->n, zAppend, nAppend);
763 p->n += nAppend;
764 p->z[p->n] = '\0';
765 }
766}
767
768/*
769** Attempt to determine if identifier zName needs to be quoted, either
770** because it contains non-alphanumeric characters, or because it is an
771** SQLite keyword. Be conservative in this estimate: When in doubt assume
772** that quoting is required.
773**
774** Return '"' if quoting is required. Return 0 if no quoting is required.
775*/
776static char quoteChar(const char *zName){
drhfc0ec3e2018-04-25 19:02:48 +0000777 int i;
drh2ce15c32017-07-11 13:34:40 +0000778 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
779 for(i=0; zName[i]; i++){
780 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
781 }
drhfc0ec3e2018-04-25 19:02:48 +0000782 return sqlite3_keyword_check(zName, i) ? '"' : 0;
drh2ce15c32017-07-11 13:34:40 +0000783}
784
785/*
drh667a2a22018-01-02 00:04:37 +0000786** Construct a fake object name and column list to describe the structure
787** of the view, virtual table, or table valued function zSchema.zName.
drhceba7922018-01-01 21:28:25 +0000788*/
drh667a2a22018-01-02 00:04:37 +0000789static char *shellFakeSchema(
drhceba7922018-01-01 21:28:25 +0000790 sqlite3 *db, /* The database connection containing the vtab */
791 const char *zSchema, /* Schema of the database holding the vtab */
792 const char *zName /* The name of the virtual table */
793){
794 sqlite3_stmt *pStmt = 0;
795 char *zSql;
drh1d315cf2018-01-01 21:49:43 +0000796 ShellText s;
797 char cQuote;
798 char *zDiv = "(";
drh667a2a22018-01-02 00:04:37 +0000799 int nRow = 0;
drhceba7922018-01-01 21:28:25 +0000800
drh1d315cf2018-01-01 21:49:43 +0000801 zSql = sqlite3_mprintf("PRAGMA \"%w\".table_info=%Q;",
802 zSchema ? zSchema : "main", zName);
drhceba7922018-01-01 21:28:25 +0000803 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
804 sqlite3_free(zSql);
drh1d315cf2018-01-01 21:49:43 +0000805 initText(&s);
806 if( zSchema ){
807 cQuote = quoteChar(zSchema);
808 if( cQuote && sqlite3_stricmp(zSchema,"temp")==0 ) cQuote = 0;
809 appendText(&s, zSchema, cQuote);
810 appendText(&s, ".", 0);
drhceba7922018-01-01 21:28:25 +0000811 }
drh1d315cf2018-01-01 21:49:43 +0000812 cQuote = quoteChar(zName);
813 appendText(&s, zName, cQuote);
814 while( sqlite3_step(pStmt)==SQLITE_ROW ){
815 const char *zCol = (const char*)sqlite3_column_text(pStmt, 1);
drh667a2a22018-01-02 00:04:37 +0000816 nRow++;
drh1d315cf2018-01-01 21:49:43 +0000817 appendText(&s, zDiv, 0);
818 zDiv = ",";
819 cQuote = quoteChar(zCol);
820 appendText(&s, zCol, cQuote);
821 }
822 appendText(&s, ")", 0);
drhceba7922018-01-01 21:28:25 +0000823 sqlite3_finalize(pStmt);
drh667a2a22018-01-02 00:04:37 +0000824 if( nRow==0 ){
825 freeText(&s);
826 s.z = 0;
827 }
drh1d315cf2018-01-01 21:49:43 +0000828 return s.z;
drhceba7922018-01-01 21:28:25 +0000829}
830
831/*
drh667a2a22018-01-02 00:04:37 +0000832** SQL function: shell_module_schema(X)
833**
834** Return a fake schema for the table-valued function or eponymous virtual
835** table X.
836*/
837static void shellModuleSchema(
838 sqlite3_context *pCtx,
839 int nVal,
840 sqlite3_value **apVal
841){
842 const char *zName = (const char*)sqlite3_value_text(apVal[0]);
843 char *zFake = shellFakeSchema(sqlite3_context_db_handle(pCtx), 0, zName);
drhb9685182018-01-17 13:15:23 +0000844 UNUSED_PARAMETER(nVal);
drh667a2a22018-01-02 00:04:37 +0000845 if( zFake ){
dandcfbff92018-01-08 17:05:32 +0000846 sqlite3_result_text(pCtx, sqlite3_mprintf("/* %s */", zFake),
drh667a2a22018-01-02 00:04:37 +0000847 -1, sqlite3_free);
dandcfbff92018-01-08 17:05:32 +0000848 free(zFake);
drh667a2a22018-01-02 00:04:37 +0000849 }
850}
851
852/*
drh2ce15c32017-07-11 13:34:40 +0000853** SQL function: shell_add_schema(S,X)
854**
855** Add the schema name X to the CREATE statement in S and return the result.
856** Examples:
857**
858** CREATE TABLE t1(x) -> CREATE TABLE xyz.t1(x);
859**
860** Also works on
861**
862** CREATE INDEX
863** CREATE UNIQUE INDEX
864** CREATE VIEW
865** CREATE TRIGGER
866** CREATE VIRTUAL TABLE
867**
868** This UDF is used by the .schema command to insert the schema name of
869** attached databases into the middle of the sqlite_master.sql field.
870*/
871static void shellAddSchemaName(
872 sqlite3_context *pCtx,
873 int nVal,
874 sqlite3_value **apVal
875){
876 static const char *aPrefix[] = {
877 "TABLE",
878 "INDEX",
879 "UNIQUE INDEX",
880 "VIEW",
881 "TRIGGER",
882 "VIRTUAL TABLE"
883 };
884 int i = 0;
885 const char *zIn = (const char*)sqlite3_value_text(apVal[0]);
886 const char *zSchema = (const char*)sqlite3_value_text(apVal[1]);
drh667a2a22018-01-02 00:04:37 +0000887 const char *zName = (const char*)sqlite3_value_text(apVal[2]);
drhceba7922018-01-01 21:28:25 +0000888 sqlite3 *db = sqlite3_context_db_handle(pCtx);
drhb9685182018-01-17 13:15:23 +0000889 UNUSED_PARAMETER(nVal);
drh2ce15c32017-07-11 13:34:40 +0000890 if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){
drh89997982017-07-11 18:11:33 +0000891 for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){
drh2ce15c32017-07-11 13:34:40 +0000892 int n = strlen30(aPrefix[i]);
893 if( strncmp(zIn+7, aPrefix[i], n)==0 && zIn[n+7]==' ' ){
drhceba7922018-01-01 21:28:25 +0000894 char *z = 0;
drh667a2a22018-01-02 00:04:37 +0000895 char *zFake = 0;
drhceba7922018-01-01 21:28:25 +0000896 if( zSchema ){
897 char cQuote = quoteChar(zSchema);
898 if( cQuote && sqlite3_stricmp(zSchema,"temp")!=0 ){
899 z = sqlite3_mprintf("%.*s \"%w\".%s", n+7, zIn, zSchema, zIn+n+8);
900 }else{
901 z = sqlite3_mprintf("%.*s %s.%s", n+7, zIn, zSchema, zIn+n+8);
902 }
drh2ce15c32017-07-11 13:34:40 +0000903 }
drh667a2a22018-01-02 00:04:37 +0000904 if( zName
905 && aPrefix[i][0]=='V'
906 && (zFake = shellFakeSchema(db, zSchema, zName))!=0
907 ){
908 if( z==0 ){
dandcfbff92018-01-08 17:05:32 +0000909 z = sqlite3_mprintf("%s\n/* %s */", zIn, zFake);
drh667a2a22018-01-02 00:04:37 +0000910 }else{
dandcfbff92018-01-08 17:05:32 +0000911 z = sqlite3_mprintf("%z\n/* %s */", z, zFake);
drh667a2a22018-01-02 00:04:37 +0000912 }
dandcfbff92018-01-08 17:05:32 +0000913 free(zFake);
drhceba7922018-01-01 21:28:25 +0000914 }
915 if( z ){
916 sqlite3_result_text(pCtx, z, -1, sqlite3_free);
917 return;
918 }
drh2ce15c32017-07-11 13:34:40 +0000919 }
920 }
921 }
922 sqlite3_result_value(pCtx, apVal[0]);
923}
924
925/*
926** The source code for several run-time loadable extensions is inserted
927** below by the ../tool/mkshellc.tcl script. Before processing that included
928** code, we need to override some macros to make the included program code
929** work here in the middle of this regular program.
930*/
931#define SQLITE_EXTENSION_INIT1
drh89997982017-07-11 18:11:33 +0000932#define SQLITE_EXTENSION_INIT2(X) (void)(X)
drh2ce15c32017-07-11 13:34:40 +0000933
mistachkinacae8c32018-01-05 20:08:46 +0000934#if defined(_WIN32) && defined(_MSC_VER)
drh03491a12018-01-07 21:58:17 +0000935INCLUDE test_windirent.h
mistachkindfdfd8c2018-01-04 22:46:08 +0000936INCLUDE test_windirent.c
937#define dirent DIRENT
mistachkindfdfd8c2018-01-04 22:46:08 +0000938#endif
drh2ce15c32017-07-11 13:34:40 +0000939INCLUDE ../ext/misc/shathree.c
940INCLUDE ../ext/misc/fileio.c
drh56eb09b2017-07-11 13:59:07 +0000941INCLUDE ../ext/misc/completion.c
drh8682e122018-01-07 20:38:10 +0000942INCLUDE ../ext/misc/appendvfs.c
dan72afc3c2017-12-05 18:32:40 +0000943#ifdef SQLITE_HAVE_ZLIB
dan9ebfaad2017-12-26 20:39:58 +0000944INCLUDE ../ext/misc/zipfile.c
dand1b51d42017-12-16 19:11:26 +0000945INCLUDE ../ext/misc/sqlar.c
dan72afc3c2017-12-05 18:32:40 +0000946#endif
dan43efc182017-12-19 17:42:13 +0000947INCLUDE ../ext/expert/sqlite3expert.h
948INCLUDE ../ext/expert/sqlite3expert.c
drh2ce15c32017-07-11 13:34:40 +0000949
950#if defined(SQLITE_ENABLE_SESSION)
951/*
952** State information for a single open session
953*/
954typedef struct OpenSession OpenSession;
955struct OpenSession {
956 char *zName; /* Symbolic name for this session */
957 int nFilter; /* Number of xFilter rejection GLOB patterns */
958 char **azFilter; /* Array of xFilter rejection GLOB patterns */
959 sqlite3_session *p; /* The open session */
960};
961#endif
962
963/*
964** Shell output mode information from before ".explain on",
965** saved so that it can be restored by ".explain off"
966*/
967typedef struct SavedModeInfo SavedModeInfo;
968struct SavedModeInfo {
969 int valid; /* Is there legit data in here? */
970 int mode; /* Mode prior to ".explain on" */
971 int showHeader; /* The ".header" setting prior to ".explain on" */
972 int colWidth[100]; /* Column widths prior to ".explain on" */
973};
974
dan43efc182017-12-19 17:42:13 +0000975typedef struct ExpertInfo ExpertInfo;
976struct ExpertInfo {
977 sqlite3expert *pExpert;
978 int bVerbose;
979};
980
drh4b5345c2018-04-24 13:07:40 +0000981/* A single line in the EQP output */
982typedef struct EQPGraphRow EQPGraphRow;
983struct EQPGraphRow {
drhe2ca99c2018-05-02 00:33:43 +0000984 int iEqpId; /* ID for this row */
985 int iParentId; /* ID of the parent row */
drh4b5345c2018-04-24 13:07:40 +0000986 EQPGraphRow *pNext; /* Next row in sequence */
987 char zText[1]; /* Text to display for this row */
988};
989
990/* All EQP output is collected into an instance of the following */
991typedef struct EQPGraph EQPGraph;
992struct EQPGraph {
993 EQPGraphRow *pRow; /* Linked list of all rows of the EQP output */
994 EQPGraphRow *pLast; /* Last element of the pRow list */
995 char zPrefix[100]; /* Graph prefix */
996};
997
drh2ce15c32017-07-11 13:34:40 +0000998/*
999** State information about the database connection is contained in an
1000** instance of the following structure.
1001*/
1002typedef struct ShellState ShellState;
1003struct ShellState {
1004 sqlite3 *db; /* The database */
drh1fa6d9f2018-01-06 21:46:01 +00001005 u8 autoExplain; /* Automatically turn on .explain mode */
1006 u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
drhe2ca99c2018-05-02 00:33:43 +00001007 u8 autoEQPtest; /* autoEQP is in test mode */
drh1fa6d9f2018-01-06 21:46:01 +00001008 u8 statsOn; /* True to display memory stats before each finalize */
1009 u8 scanstatsOn; /* True to display scan stats before each finalize */
1010 u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */
drh13c20932018-01-10 21:41:55 +00001011 u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */
drh4b5345c2018-04-24 13:07:40 +00001012 u8 nEqpLevel; /* Depth of the EQP output graph */
1013 unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */
drh2ce15c32017-07-11 13:34:40 +00001014 int outCount; /* Revert to stdout when reaching zero */
1015 int cnt; /* Number of records displayed so far */
1016 FILE *out; /* Write results here */
1017 FILE *traceOut; /* Output for sqlite3_trace() */
1018 int nErr; /* Number of errors seen */
1019 int mode; /* An output mode setting */
drh3c484e82018-01-10 22:27:21 +00001020 int modePrior; /* Saved mode */
drh2ce15c32017-07-11 13:34:40 +00001021 int cMode; /* temporary output mode for the current query */
1022 int normalMode; /* Output mode before ".explain on" */
1023 int writableSchema; /* True if PRAGMA writable_schema=ON */
1024 int showHeader; /* True to show column names in List or Column mode */
1025 int nCheck; /* Number of ".check" commands run */
1026 unsigned shellFlgs; /* Various flags */
1027 char *zDestTable; /* Name of destination table when MODE_Insert */
drh13c20932018-01-10 21:41:55 +00001028 char *zTempFile; /* Temporary file that might need deleting */
drh2ce15c32017-07-11 13:34:40 +00001029 char zTestcase[30]; /* Name of current test case */
1030 char colSeparator[20]; /* Column separator character for several modes */
1031 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drh3c484e82018-01-10 22:27:21 +00001032 char colSepPrior[20]; /* Saved column separator */
1033 char rowSepPrior[20]; /* Saved row separator */
drh2ce15c32017-07-11 13:34:40 +00001034 int colWidth[100]; /* Requested width of each column when in column mode*/
1035 int actualWidth[100]; /* Actual width of each column */
1036 char nullValue[20]; /* The text to print when a NULL comes back from
1037 ** the database */
1038 char outfile[FILENAME_MAX]; /* Filename for *out */
1039 const char *zDbFilename; /* name of the database file */
1040 char *zFreeOnClose; /* Filename to free when closing */
1041 const char *zVfs; /* Name of VFS to use */
1042 sqlite3_stmt *pStmt; /* Current statement if any. */
1043 FILE *pLog; /* Write log output here */
1044 int *aiIndent; /* Array of indents used in MODE_Explain */
1045 int nIndent; /* Size of array aiIndent[] */
1046 int iIndent; /* Index of current op in aiIndent[] */
drh4b5345c2018-04-24 13:07:40 +00001047 EQPGraph sGraph; /* Information for the graphical EXPLAIN QUERY PLAN */
drh2ce15c32017-07-11 13:34:40 +00001048#if defined(SQLITE_ENABLE_SESSION)
1049 int nSession; /* Number of active sessions */
1050 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1051#endif
dan43efc182017-12-19 17:42:13 +00001052 ExpertInfo expert; /* Valid if previous command was ".expert OPT..." */
drh2ce15c32017-07-11 13:34:40 +00001053};
1054
drh1fa6d9f2018-01-06 21:46:01 +00001055
drhada70452017-12-21 21:02:27 +00001056/* Allowed values for ShellState.autoEQP
1057*/
drhe2ca99c2018-05-02 00:33:43 +00001058#define AUTOEQP_off 0 /* Automatic EXPLAIN QUERY PLAN is off */
1059#define AUTOEQP_on 1 /* Automatic EQP is on */
1060#define AUTOEQP_trigger 2 /* On and also show plans for triggers */
1061#define AUTOEQP_full 3 /* Show full EXPLAIN */
drhada70452017-12-21 21:02:27 +00001062
drh1fa6d9f2018-01-06 21:46:01 +00001063/* Allowed values for ShellState.openMode
1064*/
1065#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */
1066#define SHELL_OPEN_NORMAL 1 /* Normal database file */
1067#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */
1068#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */
drhee269a62018-02-14 23:27:43 +00001069#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */
drh1fa6d9f2018-01-06 21:46:01 +00001070
drh2ce15c32017-07-11 13:34:40 +00001071/*
1072** These are the allowed shellFlgs values
1073*/
drhb2a0f752017-08-28 15:51:35 +00001074#define SHFLG_Pagecache 0x00000001 /* The --pagecache option is used */
1075#define SHFLG_Lookaside 0x00000002 /* Lookaside memory is used */
1076#define SHFLG_Backslash 0x00000004 /* The --backslash option is used */
1077#define SHFLG_PreserveRowid 0x00000008 /* .dump preserves rowid values */
1078#define SHFLG_Newlines 0x00000010 /* .dump --newline flag */
1079#define SHFLG_CountChanges 0x00000020 /* .changes setting */
1080#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
drh2ce15c32017-07-11 13:34:40 +00001081
1082/*
1083** Macros for testing and setting shellFlgs
1084*/
1085#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
1086#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
1087#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
1088
1089/*
1090** These are the allowed modes.
1091*/
1092#define MODE_Line 0 /* One column per line. Blank line between records */
1093#define MODE_Column 1 /* One record per line in neat columns */
1094#define MODE_List 2 /* One record per line with a separator */
1095#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1096#define MODE_Html 4 /* Generate an XHTML table */
1097#define MODE_Insert 5 /* Generate SQL "insert" statements */
1098#define MODE_Quote 6 /* Quote values as for SQL */
1099#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1100#define MODE_Csv 8 /* Quote strings, numbers are plain */
1101#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1102#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1103#define MODE_Pretty 11 /* Pretty-print schemas */
drh4b5345c2018-04-24 13:07:40 +00001104#define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */
drh2ce15c32017-07-11 13:34:40 +00001105
1106static const char *modeDescr[] = {
1107 "line",
1108 "column",
1109 "list",
1110 "semi",
1111 "html",
1112 "insert",
1113 "quote",
1114 "tcl",
1115 "csv",
1116 "explain",
1117 "ascii",
1118 "prettyprint",
drh4b5345c2018-04-24 13:07:40 +00001119 "eqp"
drh2ce15c32017-07-11 13:34:40 +00001120};
1121
1122/*
1123** These are the column/row/line separators used by the various
1124** import/export modes.
1125*/
1126#define SEP_Column "|"
1127#define SEP_Row "\n"
1128#define SEP_Tab "\t"
1129#define SEP_Space " "
1130#define SEP_Comma ","
1131#define SEP_CrLf "\r\n"
1132#define SEP_Unit "\x1F"
1133#define SEP_Record "\x1E"
1134
1135/*
drh2ce15c32017-07-11 13:34:40 +00001136** A callback for the sqlite3_log() interface.
1137*/
1138static void shellLog(void *pArg, int iErrCode, const char *zMsg){
1139 ShellState *p = (ShellState*)pArg;
1140 if( p->pLog==0 ) return;
1141 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
1142 fflush(p->pLog);
1143}
1144
1145/*
drh634c70f2018-01-10 16:50:18 +00001146** SQL function: shell_putsnl(X)
1147**
1148** Write the text X to the screen (or whatever output is being directed)
1149** adding a newline at the end, and then return X.
1150*/
1151static void shellPutsFunc(
1152 sqlite3_context *pCtx,
1153 int nVal,
1154 sqlite3_value **apVal
1155){
1156 ShellState *p = (ShellState*)sqlite3_user_data(pCtx);
drhb9685182018-01-17 13:15:23 +00001157 (void)nVal;
drh634c70f2018-01-10 16:50:18 +00001158 utf8_printf(p->out, "%s\n", sqlite3_value_text(apVal[0]));
1159 sqlite3_result_value(pCtx, apVal[0]);
1160}
1161
1162/*
drh97913132018-01-11 00:04:00 +00001163** SQL function: edit(VALUE)
1164** edit(VALUE,EDITOR)
1165**
1166** These steps:
1167**
1168** (1) Write VALUE into a temporary file.
1169** (2) Run program EDITOR on that temporary file.
1170** (3) Read the temporary file back and return its content as the result.
1171** (4) Delete the temporary file
1172**
1173** If the EDITOR argument is omitted, use the value in the VISUAL
1174** environment variable. If still there is no EDITOR, through an error.
1175**
1176** Also throw an error if the EDITOR program returns a non-zero exit code.
1177*/
drh04a28c32018-01-31 01:38:44 +00001178#ifndef SQLITE_NOHAVE_SYSTEM
drh97913132018-01-11 00:04:00 +00001179static void editFunc(
1180 sqlite3_context *context,
1181 int argc,
1182 sqlite3_value **argv
1183){
1184 const char *zEditor;
1185 char *zTempFile = 0;
1186 sqlite3 *db;
1187 char *zCmd = 0;
1188 int bBin;
1189 int rc;
1190 FILE *f = 0;
1191 sqlite3_int64 sz;
1192 sqlite3_int64 x;
1193 unsigned char *p = 0;
1194
1195 if( argc==2 ){
1196 zEditor = (const char*)sqlite3_value_text(argv[1]);
1197 }else{
1198 zEditor = getenv("VISUAL");
1199 }
1200 if( zEditor==0 ){
1201 sqlite3_result_error(context, "no editor for edit()", -1);
1202 return;
1203 }
1204 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1205 sqlite3_result_error(context, "NULL input to edit()", -1);
1206 return;
1207 }
1208 db = sqlite3_context_db_handle(context);
1209 zTempFile = 0;
1210 sqlite3_file_control(db, 0, SQLITE_FCNTL_TEMPFILENAME, &zTempFile);
1211 if( zTempFile==0 ){
1212 sqlite3_uint64 r = 0;
1213 sqlite3_randomness(sizeof(r), &r);
1214 zTempFile = sqlite3_mprintf("temp%llx", r);
1215 if( zTempFile==0 ){
1216 sqlite3_result_error_nomem(context);
1217 return;
1218 }
1219 }
1220 bBin = sqlite3_value_type(argv[0])==SQLITE_BLOB;
1221 f = fopen(zTempFile, bBin ? "wb" : "w");
1222 if( f==0 ){
1223 sqlite3_result_error(context, "edit() cannot open temp file", -1);
1224 goto edit_func_end;
1225 }
1226 sz = sqlite3_value_bytes(argv[0]);
1227 if( bBin ){
1228 x = fwrite(sqlite3_value_blob(argv[0]), 1, sz, f);
1229 }else{
1230 x = fwrite(sqlite3_value_text(argv[0]), 1, sz, f);
1231 }
1232 fclose(f);
1233 f = 0;
1234 if( x!=sz ){
1235 sqlite3_result_error(context, "edit() could not write the whole file", -1);
1236 goto edit_func_end;
1237 }
1238 zCmd = sqlite3_mprintf("%s \"%s\"", zEditor, zTempFile);
1239 if( zCmd==0 ){
1240 sqlite3_result_error_nomem(context);
1241 goto edit_func_end;
1242 }
1243 rc = system(zCmd);
1244 sqlite3_free(zCmd);
1245 if( rc ){
1246 sqlite3_result_error(context, "EDITOR returned non-zero", -1);
1247 goto edit_func_end;
1248 }
1249 f = fopen(zTempFile, bBin ? "rb" : "r");
1250 if( f==0 ){
1251 sqlite3_result_error(context,
1252 "edit() cannot reopen temp file after edit", -1);
1253 goto edit_func_end;
1254 }
1255 fseek(f, 0, SEEK_END);
1256 sz = ftell(f);
1257 rewind(f);
1258 p = sqlite3_malloc64( sz+(bBin==0) );
1259 if( p==0 ){
1260 sqlite3_result_error_nomem(context);
1261 goto edit_func_end;
1262 }
1263 if( bBin ){
1264 x = fread(p, 1, sz, f);
1265 }else{
1266 x = fread(p, 1, sz, f);
1267 p[sz] = 0;
1268 }
1269 fclose(f);
1270 f = 0;
1271 if( x!=sz ){
1272 sqlite3_result_error(context, "could not read back the whole file", -1);
1273 goto edit_func_end;
1274 }
1275 if( bBin ){
mistachkinb71aa092018-01-23 00:05:18 +00001276 sqlite3_result_blob64(context, p, sz, sqlite3_free);
drh97913132018-01-11 00:04:00 +00001277 }else{
mistachkinb71aa092018-01-23 00:05:18 +00001278 sqlite3_result_text64(context, (const char*)p, sz,
1279 sqlite3_free, SQLITE_UTF8);
drh97913132018-01-11 00:04:00 +00001280 }
1281 p = 0;
1282
1283edit_func_end:
1284 if( f ) fclose(f);
1285 unlink(zTempFile);
1286 sqlite3_free(zTempFile);
1287 sqlite3_free(p);
1288}
drh04a28c32018-01-31 01:38:44 +00001289#endif /* SQLITE_NOHAVE_SYSTEM */
drh97913132018-01-11 00:04:00 +00001290
1291/*
drh3c484e82018-01-10 22:27:21 +00001292** Save or restore the current output mode
1293*/
1294static void outputModePush(ShellState *p){
1295 p->modePrior = p->mode;
1296 memcpy(p->colSepPrior, p->colSeparator, sizeof(p->colSeparator));
1297 memcpy(p->rowSepPrior, p->rowSeparator, sizeof(p->rowSeparator));
1298}
1299static void outputModePop(ShellState *p){
1300 p->mode = p->modePrior;
1301 memcpy(p->colSeparator, p->colSepPrior, sizeof(p->colSeparator));
1302 memcpy(p->rowSeparator, p->rowSepPrior, sizeof(p->rowSeparator));
1303}
1304
1305/*
drh2ce15c32017-07-11 13:34:40 +00001306** Output the given string as a hex-encoded blob (eg. X'1234' )
1307*/
1308static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1309 int i;
1310 char *zBlob = (char *)pBlob;
1311 raw_printf(out,"X'");
1312 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1313 raw_printf(out,"'");
1314}
1315
1316/*
1317** Find a string that is not found anywhere in z[]. Return a pointer
1318** to that string.
1319**
1320** Try to use zA and zB first. If both of those are already found in z[]
1321** then make up some string and store it in the buffer zBuf.
1322*/
1323static const char *unused_string(
1324 const char *z, /* Result must not appear anywhere in z */
1325 const char *zA, const char *zB, /* Try these first */
1326 char *zBuf /* Space to store a generated string */
1327){
1328 unsigned i = 0;
1329 if( strstr(z, zA)==0 ) return zA;
1330 if( strstr(z, zB)==0 ) return zB;
1331 do{
1332 sqlite3_snprintf(20,zBuf,"(%s%u)", zA, i++);
1333 }while( strstr(z,zBuf)!=0 );
1334 return zBuf;
1335}
1336
1337/*
1338** Output the given string as a quoted string using SQL quoting conventions.
1339**
1340** See also: output_quoted_escaped_string()
1341*/
1342static void output_quoted_string(FILE *out, const char *z){
1343 int i;
1344 char c;
1345 setBinaryMode(out, 1);
1346 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1347 if( c==0 ){
1348 utf8_printf(out,"'%s'",z);
1349 }else{
1350 raw_printf(out, "'");
1351 while( *z ){
1352 for(i=0; (c = z[i])!=0 && c!='\''; i++){}
1353 if( c=='\'' ) i++;
1354 if( i ){
1355 utf8_printf(out, "%.*s", i, z);
1356 z += i;
1357 }
1358 if( c=='\'' ){
1359 raw_printf(out, "'");
1360 continue;
1361 }
1362 if( c==0 ){
1363 break;
1364 }
1365 z++;
1366 }
1367 raw_printf(out, "'");
1368 }
1369 setTextMode(out, 1);
1370}
1371
1372/*
1373** Output the given string as a quoted string using SQL quoting conventions.
1374** Additionallly , escape the "\n" and "\r" characters so that they do not
1375** get corrupted by end-of-line translation facilities in some operating
1376** systems.
1377**
1378** This is like output_quoted_string() but with the addition of the \r\n
1379** escape mechanism.
1380*/
1381static void output_quoted_escaped_string(FILE *out, const char *z){
1382 int i;
1383 char c;
1384 setBinaryMode(out, 1);
1385 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1386 if( c==0 ){
1387 utf8_printf(out,"'%s'",z);
1388 }else{
1389 const char *zNL = 0;
1390 const char *zCR = 0;
1391 int nNL = 0;
1392 int nCR = 0;
1393 char zBuf1[20], zBuf2[20];
1394 for(i=0; z[i]; i++){
1395 if( z[i]=='\n' ) nNL++;
1396 if( z[i]=='\r' ) nCR++;
1397 }
1398 if( nNL ){
1399 raw_printf(out, "replace(");
1400 zNL = unused_string(z, "\\n", "\\012", zBuf1);
1401 }
1402 if( nCR ){
1403 raw_printf(out, "replace(");
1404 zCR = unused_string(z, "\\r", "\\015", zBuf2);
1405 }
1406 raw_printf(out, "'");
1407 while( *z ){
1408 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1409 if( c=='\'' ) i++;
1410 if( i ){
1411 utf8_printf(out, "%.*s", i, z);
1412 z += i;
1413 }
1414 if( c=='\'' ){
1415 raw_printf(out, "'");
1416 continue;
1417 }
1418 if( c==0 ){
1419 break;
1420 }
1421 z++;
1422 if( c=='\n' ){
1423 raw_printf(out, "%s", zNL);
1424 continue;
1425 }
1426 raw_printf(out, "%s", zCR);
1427 }
1428 raw_printf(out, "'");
1429 if( nCR ){
1430 raw_printf(out, ",'%s',char(13))", zCR);
1431 }
1432 if( nNL ){
1433 raw_printf(out, ",'%s',char(10))", zNL);
1434 }
1435 }
1436 setTextMode(out, 1);
1437}
1438
1439/*
1440** Output the given string as a quoted according to C or TCL quoting rules.
1441*/
1442static void output_c_string(FILE *out, const char *z){
1443 unsigned int c;
1444 fputc('"', out);
1445 while( (c = *(z++))!=0 ){
1446 if( c=='\\' ){
1447 fputc(c, out);
1448 fputc(c, out);
1449 }else if( c=='"' ){
1450 fputc('\\', out);
1451 fputc('"', out);
1452 }else if( c=='\t' ){
1453 fputc('\\', out);
1454 fputc('t', out);
1455 }else if( c=='\n' ){
1456 fputc('\\', out);
1457 fputc('n', out);
1458 }else if( c=='\r' ){
1459 fputc('\\', out);
1460 fputc('r', out);
1461 }else if( !isprint(c&0xff) ){
1462 raw_printf(out, "\\%03o", c&0xff);
1463 }else{
1464 fputc(c, out);
1465 }
1466 }
1467 fputc('"', out);
1468}
1469
1470/*
1471** Output the given string with characters that are special to
1472** HTML escaped.
1473*/
1474static void output_html_string(FILE *out, const char *z){
1475 int i;
1476 if( z==0 ) z = "";
1477 while( *z ){
1478 for(i=0; z[i]
1479 && z[i]!='<'
1480 && z[i]!='&'
1481 && z[i]!='>'
1482 && z[i]!='\"'
1483 && z[i]!='\'';
1484 i++){}
1485 if( i>0 ){
1486 utf8_printf(out,"%.*s",i,z);
1487 }
1488 if( z[i]=='<' ){
1489 raw_printf(out,"&lt;");
1490 }else if( z[i]=='&' ){
1491 raw_printf(out,"&amp;");
1492 }else if( z[i]=='>' ){
1493 raw_printf(out,"&gt;");
1494 }else if( z[i]=='\"' ){
1495 raw_printf(out,"&quot;");
1496 }else if( z[i]=='\'' ){
1497 raw_printf(out,"&#39;");
1498 }else{
1499 break;
1500 }
1501 z += i + 1;
1502 }
1503}
1504
1505/*
1506** If a field contains any character identified by a 1 in the following
1507** array, then the string must be quoted for CSV.
1508*/
1509static const char needCsvQuote[] = {
1510 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1511 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1512 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1513 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1515 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1517 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1518 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1519 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1520 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1521 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1522 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1523 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1524 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1525 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1526};
1527
1528/*
1529** Output a single term of CSV. Actually, p->colSeparator is used for
1530** the separator, which may or may not be a comma. p->nullValue is
1531** the null value. Strings are quoted if necessary. The separator
1532** is only issued if bSep is true.
1533*/
1534static void output_csv(ShellState *p, const char *z, int bSep){
1535 FILE *out = p->out;
1536 if( z==0 ){
1537 utf8_printf(out,"%s",p->nullValue);
1538 }else{
1539 int i;
1540 int nSep = strlen30(p->colSeparator);
1541 for(i=0; z[i]; i++){
1542 if( needCsvQuote[((unsigned char*)z)[i]]
1543 || (z[i]==p->colSeparator[0] &&
1544 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
1545 i = 0;
1546 break;
1547 }
1548 }
1549 if( i==0 ){
drh9b7affc2017-11-26 02:14:18 +00001550 char *zQuoted = sqlite3_mprintf("\"%w\"", z);
1551 utf8_printf(out, "%s", zQuoted);
1552 sqlite3_free(zQuoted);
drh2ce15c32017-07-11 13:34:40 +00001553 }else{
1554 utf8_printf(out, "%s", z);
1555 }
1556 }
1557 if( bSep ){
1558 utf8_printf(p->out, "%s", p->colSeparator);
1559 }
1560}
1561
drh2ce15c32017-07-11 13:34:40 +00001562/*
1563** This routine runs when the user presses Ctrl-C
1564*/
1565static void interrupt_handler(int NotUsed){
1566 UNUSED_PARAMETER(NotUsed);
1567 seenInterrupt++;
1568 if( seenInterrupt>2 ) exit(1);
1569 if( globalDb ) sqlite3_interrupt(globalDb);
1570}
mistachkinb4bab902017-10-27 17:09:44 +00001571
1572#if (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
1573/*
1574** This routine runs for console events (e.g. Ctrl-C) on Win32
1575*/
1576static BOOL WINAPI ConsoleCtrlHandler(
1577 DWORD dwCtrlType /* One of the CTRL_*_EVENT constants */
1578){
1579 if( dwCtrlType==CTRL_C_EVENT ){
1580 interrupt_handler(0);
1581 return TRUE;
1582 }
1583 return FALSE;
1584}
drh2ce15c32017-07-11 13:34:40 +00001585#endif
1586
1587#ifndef SQLITE_OMIT_AUTHORIZATION
1588/*
1589** When the ".auth ON" is set, the following authorizer callback is
1590** invoked. It always returns SQLITE_OK.
1591*/
1592static int shellAuth(
1593 void *pClientData,
1594 int op,
1595 const char *zA1,
1596 const char *zA2,
1597 const char *zA3,
1598 const char *zA4
1599){
1600 ShellState *p = (ShellState*)pClientData;
1601 static const char *azAction[] = { 0,
1602 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1603 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1604 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1605 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1606 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1607 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1608 "PRAGMA", "READ", "SELECT",
1609 "TRANSACTION", "UPDATE", "ATTACH",
1610 "DETACH", "ALTER_TABLE", "REINDEX",
1611 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1612 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1613 };
1614 int i;
1615 const char *az[4];
1616 az[0] = zA1;
1617 az[1] = zA2;
1618 az[2] = zA3;
1619 az[3] = zA4;
1620 utf8_printf(p->out, "authorizer: %s", azAction[op]);
1621 for(i=0; i<4; i++){
1622 raw_printf(p->out, " ");
1623 if( az[i] ){
1624 output_c_string(p->out, az[i]);
1625 }else{
1626 raw_printf(p->out, "NULL");
1627 }
1628 }
1629 raw_printf(p->out, "\n");
1630 return SQLITE_OK;
1631}
1632#endif
1633
1634/*
1635** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1636**
1637** This routine converts some CREATE TABLE statements for shadow tables
1638** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1639*/
1640static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1641 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1642 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1643 }else{
1644 utf8_printf(out, "%s%s", z, zTail);
1645 }
1646}
1647static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1648 char c = z[n];
1649 z[n] = 0;
1650 printSchemaLine(out, z, zTail);
1651 z[n] = c;
1652}
1653
1654/*
drh11be81d2018-01-06 15:46:20 +00001655** Return true if string z[] has nothing but whitespace and comments to the
1656** end of the first line.
1657*/
1658static int wsToEol(const char *z){
1659 int i;
1660 for(i=0; z[i]; i++){
1661 if( z[i]=='\n' ) return 1;
1662 if( IsSpace(z[i]) ) continue;
1663 if( z[i]=='-' && z[i+1]=='-' ) return 1;
1664 return 0;
1665 }
1666 return 1;
1667}
drh4b5345c2018-04-24 13:07:40 +00001668
1669/*
1670** Add a new entry to the EXPLAIN QUERY PLAN data
1671*/
drhe2ca99c2018-05-02 00:33:43 +00001672static void eqp_append(ShellState *p, int iEqpId, int p2, const char *zText){
drh4b5345c2018-04-24 13:07:40 +00001673 EQPGraphRow *pNew;
1674 int nText = strlen30(zText);
drhe2ca99c2018-05-02 00:33:43 +00001675 if( p->autoEQPtest ){
1676 utf8_printf(p->out, "%d,%d,%s\n", iEqpId, p2, zText);
1677 }
drh4b5345c2018-04-24 13:07:40 +00001678 pNew = sqlite3_malloc64( sizeof(*pNew) + nText );
1679 if( pNew==0 ) shell_out_of_memory();
drhe2ca99c2018-05-02 00:33:43 +00001680 pNew->iEqpId = iEqpId;
1681 pNew->iParentId = p2;
drh4b5345c2018-04-24 13:07:40 +00001682 memcpy(pNew->zText, zText, nText+1);
1683 pNew->pNext = 0;
1684 if( p->sGraph.pLast ){
1685 p->sGraph.pLast->pNext = pNew;
1686 }else{
1687 p->sGraph.pRow = pNew;
1688 }
1689 p->sGraph.pLast = pNew;
1690}
1691
1692/*
1693** Free and reset the EXPLAIN QUERY PLAN data that has been collected
1694** in p->sGraph.
1695*/
1696static void eqp_reset(ShellState *p){
1697 EQPGraphRow *pRow, *pNext;
1698 for(pRow = p->sGraph.pRow; pRow; pRow = pNext){
1699 pNext = pRow->pNext;
1700 sqlite3_free(pRow);
1701 }
1702 memset(&p->sGraph, 0, sizeof(p->sGraph));
1703}
1704
drhe2ca99c2018-05-02 00:33:43 +00001705/* Return the next EXPLAIN QUERY PLAN line with iEqpId that occurs after
drh4b5345c2018-04-24 13:07:40 +00001706** pOld, or return the first such line if pOld is NULL
1707*/
drhe2ca99c2018-05-02 00:33:43 +00001708static EQPGraphRow *eqp_next_row(ShellState *p, int iEqpId, EQPGraphRow *pOld){
drh4b5345c2018-04-24 13:07:40 +00001709 EQPGraphRow *pRow = pOld ? pOld->pNext : p->sGraph.pRow;
drhe2ca99c2018-05-02 00:33:43 +00001710 while( pRow && pRow->iParentId!=iEqpId ) pRow = pRow->pNext;
drh4b5345c2018-04-24 13:07:40 +00001711 return pRow;
1712}
1713
drhe2ca99c2018-05-02 00:33:43 +00001714/* Render a single level of the graph that has iEqpId as its parent. Called
drh4b5345c2018-04-24 13:07:40 +00001715** recursively to render sublevels.
1716*/
drhe2ca99c2018-05-02 00:33:43 +00001717static void eqp_render_level(ShellState *p, int iEqpId){
drh4b5345c2018-04-24 13:07:40 +00001718 EQPGraphRow *pRow, *pNext;
drh4b5345c2018-04-24 13:07:40 +00001719 int n = strlen30(p->sGraph.zPrefix);
1720 char *z;
drhe2ca99c2018-05-02 00:33:43 +00001721 for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){
1722 pNext = eqp_next_row(p, iEqpId, pRow);
drh4b5345c2018-04-24 13:07:40 +00001723 z = pRow->zText;
1724 utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z);
drhe2188f02018-05-07 11:37:34 +00001725 if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){
drh4b5345c2018-04-24 13:07:40 +00001726 memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4);
drhe2ca99c2018-05-02 00:33:43 +00001727 eqp_render_level(p, pRow->iEqpId);
drh4b5345c2018-04-24 13:07:40 +00001728 p->sGraph.zPrefix[n] = 0;
1729 }
1730 }
1731}
1732
1733/*
1734** Display and reset the EXPLAIN QUERY PLAN data
1735*/
1736static void eqp_render(ShellState *p){
1737 EQPGraphRow *pRow = p->sGraph.pRow;
1738 if( pRow ){
1739 if( pRow->zText[0]=='-' ){
1740 if( pRow->pNext==0 ){
1741 eqp_reset(p);
1742 return;
1743 }
1744 utf8_printf(p->out, "%s\n", pRow->zText+3);
1745 p->sGraph.pRow = pRow->pNext;
1746 sqlite3_free(pRow);
1747 }else{
1748 utf8_printf(p->out, "QUERY PLAN\n");
1749 }
1750 p->sGraph.zPrefix[0] = 0;
1751 eqp_render_level(p, 0);
1752 eqp_reset(p);
1753 }
1754}
drh11be81d2018-01-06 15:46:20 +00001755
1756/*
drh2ce15c32017-07-11 13:34:40 +00001757** This is the callback routine that the shell
1758** invokes for each row of a query result.
1759*/
1760static int shell_callback(
1761 void *pArg,
1762 int nArg, /* Number of result columns */
1763 char **azArg, /* Text of each result column */
1764 char **azCol, /* Column names */
1765 int *aiType /* Column types */
1766){
1767 int i;
1768 ShellState *p = (ShellState*)pArg;
1769
drhb3c45232017-08-28 14:33:27 +00001770 if( azArg==0 ) return 0;
drh2ce15c32017-07-11 13:34:40 +00001771 switch( p->cMode ){
1772 case MODE_Line: {
1773 int w = 5;
1774 if( azArg==0 ) break;
1775 for(i=0; i<nArg; i++){
1776 int len = strlen30(azCol[i] ? azCol[i] : "");
1777 if( len>w ) w = len;
1778 }
1779 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
1780 for(i=0; i<nArg; i++){
1781 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
1782 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
1783 }
1784 break;
1785 }
1786 case MODE_Explain:
1787 case MODE_Column: {
1788 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1789 const int *colWidth;
1790 int showHdr;
1791 char *rowSep;
1792 if( p->cMode==MODE_Column ){
1793 colWidth = p->colWidth;
1794 showHdr = p->showHeader;
1795 rowSep = p->rowSeparator;
1796 }else{
1797 colWidth = aExplainWidths;
1798 showHdr = 1;
1799 rowSep = SEP_Row;
1800 }
1801 if( p->cnt++==0 ){
1802 for(i=0; i<nArg; i++){
1803 int w, n;
1804 if( i<ArraySize(p->colWidth) ){
1805 w = colWidth[i];
1806 }else{
1807 w = 0;
1808 }
1809 if( w==0 ){
1810 w = strlenChar(azCol[i] ? azCol[i] : "");
1811 if( w<10 ) w = 10;
1812 n = strlenChar(azArg && azArg[i] ? azArg[i] : p->nullValue);
1813 if( w<n ) w = n;
1814 }
1815 if( i<ArraySize(p->actualWidth) ){
1816 p->actualWidth[i] = w;
1817 }
1818 if( showHdr ){
1819 utf8_width_print(p->out, w, azCol[i]);
1820 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1821 }
1822 }
1823 if( showHdr ){
1824 for(i=0; i<nArg; i++){
1825 int w;
1826 if( i<ArraySize(p->actualWidth) ){
1827 w = p->actualWidth[i];
1828 if( w<0 ) w = -w;
1829 }else{
1830 w = 10;
1831 }
1832 utf8_printf(p->out,"%-*.*s%s",w,w,
1833 "----------------------------------------------------------"
1834 "----------------------------------------------------------",
1835 i==nArg-1 ? rowSep : " ");
1836 }
1837 }
1838 }
1839 if( azArg==0 ) break;
1840 for(i=0; i<nArg; i++){
1841 int w;
1842 if( i<ArraySize(p->actualWidth) ){
1843 w = p->actualWidth[i];
1844 }else{
1845 w = 10;
1846 }
1847 if( p->cMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){
1848 w = strlenChar(azArg[i]);
1849 }
1850 if( i==1 && p->aiIndent && p->pStmt ){
1851 if( p->iIndent<p->nIndent ){
1852 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
1853 }
1854 p->iIndent++;
1855 }
1856 utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue);
1857 utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " ");
1858 }
1859 break;
1860 }
1861 case MODE_Semi: { /* .schema and .fullschema output */
1862 printSchemaLine(p->out, azArg[0], ";\n");
1863 break;
1864 }
1865 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1866 char *z;
1867 int j;
1868 int nParen = 0;
1869 char cEnd = 0;
1870 char c;
1871 int nLine = 0;
1872 assert( nArg==1 );
1873 if( azArg[0]==0 ) break;
1874 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1875 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1876 ){
1877 utf8_printf(p->out, "%s;\n", azArg[0]);
1878 break;
1879 }
1880 z = sqlite3_mprintf("%s", azArg[0]);
1881 j = 0;
1882 for(i=0; IsSpace(z[i]); i++){}
1883 for(; (c = z[i])!=0; i++){
1884 if( IsSpace(c) ){
drhc3cbd672017-10-05 19:12:10 +00001885 if( z[j-1]=='\r' ) z[j-1] = '\n';
drh2ce15c32017-07-11 13:34:40 +00001886 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1887 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1888 j--;
1889 }
1890 z[j++] = c;
1891 }
1892 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1893 z[j] = 0;
1894 if( strlen30(z)>=79 ){
drh11be81d2018-01-06 15:46:20 +00001895 for(i=j=0; (c = z[i])!=0; i++){ /* Copy changes from z[i] back to z[j] */
drh2ce15c32017-07-11 13:34:40 +00001896 if( c==cEnd ){
1897 cEnd = 0;
1898 }else if( c=='"' || c=='\'' || c=='`' ){
1899 cEnd = c;
1900 }else if( c=='[' ){
1901 cEnd = ']';
drh11be81d2018-01-06 15:46:20 +00001902 }else if( c=='-' && z[i+1]=='-' ){
1903 cEnd = '\n';
drh2ce15c32017-07-11 13:34:40 +00001904 }else if( c=='(' ){
1905 nParen++;
1906 }else if( c==')' ){
1907 nParen--;
1908 if( nLine>0 && nParen==0 && j>0 ){
1909 printSchemaLineN(p->out, z, j, "\n");
1910 j = 0;
1911 }
1912 }
1913 z[j++] = c;
drh11be81d2018-01-06 15:46:20 +00001914 if( nParen==1 && cEnd==0
1915 && (c=='(' || c=='\n' || (c==',' && !wsToEol(z+i+1)))
1916 ){
drh2ce15c32017-07-11 13:34:40 +00001917 if( c=='\n' ) j--;
1918 printSchemaLineN(p->out, z, j, "\n ");
1919 j = 0;
1920 nLine++;
1921 while( IsSpace(z[i+1]) ){ i++; }
1922 }
1923 }
1924 z[j] = 0;
1925 }
1926 printSchemaLine(p->out, z, ";\n");
1927 sqlite3_free(z);
1928 break;
1929 }
1930 case MODE_List: {
1931 if( p->cnt++==0 && p->showHeader ){
1932 for(i=0; i<nArg; i++){
1933 utf8_printf(p->out,"%s%s",azCol[i],
1934 i==nArg-1 ? p->rowSeparator : p->colSeparator);
1935 }
1936 }
1937 if( azArg==0 ) break;
1938 for(i=0; i<nArg; i++){
1939 char *z = azArg[i];
1940 if( z==0 ) z = p->nullValue;
1941 utf8_printf(p->out, "%s", z);
1942 if( i<nArg-1 ){
1943 utf8_printf(p->out, "%s", p->colSeparator);
1944 }else{
1945 utf8_printf(p->out, "%s", p->rowSeparator);
1946 }
1947 }
1948 break;
1949 }
1950 case MODE_Html: {
1951 if( p->cnt++==0 && p->showHeader ){
1952 raw_printf(p->out,"<TR>");
1953 for(i=0; i<nArg; i++){
1954 raw_printf(p->out,"<TH>");
1955 output_html_string(p->out, azCol[i]);
1956 raw_printf(p->out,"</TH>\n");
1957 }
1958 raw_printf(p->out,"</TR>\n");
1959 }
1960 if( azArg==0 ) break;
1961 raw_printf(p->out,"<TR>");
1962 for(i=0; i<nArg; i++){
1963 raw_printf(p->out,"<TD>");
1964 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1965 raw_printf(p->out,"</TD>\n");
1966 }
1967 raw_printf(p->out,"</TR>\n");
1968 break;
1969 }
1970 case MODE_Tcl: {
1971 if( p->cnt++==0 && p->showHeader ){
1972 for(i=0; i<nArg; i++){
1973 output_c_string(p->out,azCol[i] ? azCol[i] : "");
1974 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1975 }
1976 utf8_printf(p->out, "%s", p->rowSeparator);
1977 }
1978 if( azArg==0 ) break;
1979 for(i=0; i<nArg; i++){
1980 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
1981 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
1982 }
1983 utf8_printf(p->out, "%s", p->rowSeparator);
1984 break;
1985 }
1986 case MODE_Csv: {
1987 setBinaryMode(p->out, 1);
1988 if( p->cnt++==0 && p->showHeader ){
1989 for(i=0; i<nArg; i++){
1990 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
1991 }
1992 utf8_printf(p->out, "%s", p->rowSeparator);
1993 }
1994 if( nArg>0 ){
1995 for(i=0; i<nArg; i++){
1996 output_csv(p, azArg[i], i<nArg-1);
1997 }
1998 utf8_printf(p->out, "%s", p->rowSeparator);
1999 }
2000 setTextMode(p->out, 1);
2001 break;
2002 }
2003 case MODE_Insert: {
2004 if( azArg==0 ) break;
2005 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
2006 if( p->showHeader ){
2007 raw_printf(p->out,"(");
2008 for(i=0; i<nArg; i++){
2009 if( i>0 ) raw_printf(p->out, ",");
2010 if( quoteChar(azCol[i]) ){
2011 char *z = sqlite3_mprintf("\"%w\"", azCol[i]);
2012 utf8_printf(p->out, "%s", z);
2013 sqlite3_free(z);
2014 }else{
2015 raw_printf(p->out, "%s", azCol[i]);
2016 }
2017 }
2018 raw_printf(p->out,")");
2019 }
2020 p->cnt++;
2021 for(i=0; i<nArg; i++){
2022 raw_printf(p->out, i>0 ? "," : " VALUES(");
2023 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2024 utf8_printf(p->out,"NULL");
2025 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2026 if( ShellHasFlag(p, SHFLG_Newlines) ){
2027 output_quoted_string(p->out, azArg[i]);
2028 }else{
2029 output_quoted_escaped_string(p->out, azArg[i]);
2030 }
2031 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2032 utf8_printf(p->out,"%s", azArg[i]);
2033 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2034 char z[50];
2035 double r = sqlite3_column_double(p->pStmt, i);
2036 sqlite3_snprintf(50,z,"%!.20g", r);
2037 raw_printf(p->out, "%s", z);
2038 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2039 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2040 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2041 output_hex_blob(p->out, pBlob, nBlob);
2042 }else if( isNumber(azArg[i], 0) ){
2043 utf8_printf(p->out,"%s", azArg[i]);
2044 }else if( ShellHasFlag(p, SHFLG_Newlines) ){
2045 output_quoted_string(p->out, azArg[i]);
2046 }else{
2047 output_quoted_escaped_string(p->out, azArg[i]);
2048 }
2049 }
2050 raw_printf(p->out,");\n");
2051 break;
2052 }
2053 case MODE_Quote: {
2054 if( azArg==0 ) break;
2055 if( p->cnt==0 && p->showHeader ){
2056 for(i=0; i<nArg; i++){
2057 if( i>0 ) raw_printf(p->out, ",");
2058 output_quoted_string(p->out, azCol[i]);
2059 }
2060 raw_printf(p->out,"\n");
2061 }
2062 p->cnt++;
2063 for(i=0; i<nArg; i++){
2064 if( i>0 ) raw_printf(p->out, ",");
2065 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
2066 utf8_printf(p->out,"NULL");
2067 }else if( aiType && aiType[i]==SQLITE_TEXT ){
2068 output_quoted_string(p->out, azArg[i]);
2069 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
2070 utf8_printf(p->out,"%s", azArg[i]);
2071 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2072 char z[50];
2073 double r = sqlite3_column_double(p->pStmt, i);
2074 sqlite3_snprintf(50,z,"%!.20g", r);
2075 raw_printf(p->out, "%s", z);
2076 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2077 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2078 int nBlob = sqlite3_column_bytes(p->pStmt, i);
2079 output_hex_blob(p->out, pBlob, nBlob);
2080 }else if( isNumber(azArg[i], 0) ){
2081 utf8_printf(p->out,"%s", azArg[i]);
2082 }else{
2083 output_quoted_string(p->out, azArg[i]);
2084 }
2085 }
2086 raw_printf(p->out,"\n");
2087 break;
2088 }
2089 case MODE_Ascii: {
2090 if( p->cnt++==0 && p->showHeader ){
2091 for(i=0; i<nArg; i++){
2092 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2093 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
2094 }
2095 utf8_printf(p->out, "%s", p->rowSeparator);
2096 }
2097 if( azArg==0 ) break;
2098 for(i=0; i<nArg; i++){
2099 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2100 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
2101 }
2102 utf8_printf(p->out, "%s", p->rowSeparator);
2103 break;
2104 }
drh4b5345c2018-04-24 13:07:40 +00002105 case MODE_EQP: {
drhe2ca99c2018-05-02 00:33:43 +00002106 eqp_append(p, atoi(azArg[0]), atoi(azArg[1]), azArg[3]);
drh4b5345c2018-04-24 13:07:40 +00002107 break;
2108 }
drh2ce15c32017-07-11 13:34:40 +00002109 }
2110 return 0;
2111}
2112
2113/*
2114** This is the callback routine that the SQLite library
2115** invokes for each row of a query result.
2116*/
2117static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2118 /* since we don't have type info, call the shell_callback with a NULL value */
2119 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2120}
2121
2122/*
2123** This is the callback routine from sqlite3_exec() that appends all
2124** output onto the end of a ShellText object.
2125*/
2126static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2127 ShellText *p = (ShellText*)pArg;
2128 int i;
2129 UNUSED_PARAMETER(az);
drhb3c45232017-08-28 14:33:27 +00002130 if( azArg==0 ) return 0;
drh2ce15c32017-07-11 13:34:40 +00002131 if( p->n ) appendText(p, "|", 0);
2132 for(i=0; i<nArg; i++){
2133 if( i ) appendText(p, ",", 0);
2134 if( azArg[i] ) appendText(p, azArg[i], 0);
2135 }
2136 return 0;
2137}
2138
2139/*
2140** Generate an appropriate SELFTEST table in the main database.
2141*/
2142static void createSelftestTable(ShellState *p){
2143 char *zErrMsg = 0;
2144 sqlite3_exec(p->db,
2145 "SAVEPOINT selftest_init;\n"
2146 "CREATE TABLE IF NOT EXISTS selftest(\n"
2147 " tno INTEGER PRIMARY KEY,\n" /* Test number */
2148 " op TEXT,\n" /* Operator: memo run */
2149 " cmd TEXT,\n" /* Command text */
2150 " ans TEXT\n" /* Desired answer */
2151 ");"
2152 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2153 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2154 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2155 " 'memo','Tests generated by --init');\n"
2156 "INSERT INTO [_shell$self]\n"
2157 " SELECT 'run',\n"
2158 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2159 "FROM sqlite_master ORDER BY 2'',224))',\n"
2160 " hex(sha3_query('SELECT type,name,tbl_name,sql "
2161 "FROM sqlite_master ORDER BY 2',224));\n"
2162 "INSERT INTO [_shell$self]\n"
2163 " SELECT 'run',"
2164 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2165 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2166 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2167 " FROM (\n"
2168 " SELECT name FROM sqlite_master\n"
2169 " WHERE type='table'\n"
2170 " AND name<>'selftest'\n"
2171 " AND coalesce(rootpage,0)>0\n"
2172 " )\n"
2173 " ORDER BY name;\n"
2174 "INSERT INTO [_shell$self]\n"
2175 " VALUES('run','PRAGMA integrity_check','ok');\n"
2176 "INSERT INTO selftest(tno,op,cmd,ans)"
2177 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2178 "DROP TABLE [_shell$self];"
2179 ,0,0,&zErrMsg);
2180 if( zErrMsg ){
2181 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2182 sqlite3_free(zErrMsg);
2183 }
2184 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
2185}
2186
2187
2188/*
2189** Set the destination table field of the ShellState structure to
2190** the name of the table given. Escape any quote characters in the
2191** table name.
2192*/
2193static void set_table_name(ShellState *p, const char *zName){
2194 int i, n;
mistachkin2158a0c2017-09-09 00:51:36 +00002195 char cQuote;
drh2ce15c32017-07-11 13:34:40 +00002196 char *z;
2197
2198 if( p->zDestTable ){
2199 free(p->zDestTable);
2200 p->zDestTable = 0;
2201 }
2202 if( zName==0 ) return;
2203 cQuote = quoteChar(zName);
2204 n = strlen30(zName);
2205 if( cQuote ) n += n+2;
2206 z = p->zDestTable = malloc( n+1 );
drh4b5345c2018-04-24 13:07:40 +00002207 if( z==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00002208 n = 0;
2209 if( cQuote ) z[n++] = cQuote;
2210 for(i=0; zName[i]; i++){
2211 z[n++] = zName[i];
2212 if( zName[i]==cQuote ) z[n++] = cQuote;
2213 }
2214 if( cQuote ) z[n++] = cQuote;
2215 z[n] = 0;
2216}
2217
2218
2219/*
2220** Execute a query statement that will generate SQL output. Print
2221** the result columns, comma-separated, on a line and then add a
2222** semicolon terminator to the end of that line.
2223**
2224** If the number of columns is 1 and that column contains text "--"
2225** then write the semicolon on a separate line. That way, if a
2226** "--" comment occurs at the end of the statement, the comment
2227** won't consume the semicolon terminator.
2228*/
2229static int run_table_dump_query(
2230 ShellState *p, /* Query context */
2231 const char *zSelect, /* SELECT statement to extract content */
2232 const char *zFirstRow /* Print before first row, if not NULL */
2233){
2234 sqlite3_stmt *pSelect;
2235 int rc;
2236 int nResult;
2237 int i;
2238 const char *z;
2239 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
2240 if( rc!=SQLITE_OK || !pSelect ){
2241 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2242 sqlite3_errmsg(p->db));
2243 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2244 return rc;
2245 }
2246 rc = sqlite3_step(pSelect);
2247 nResult = sqlite3_column_count(pSelect);
2248 while( rc==SQLITE_ROW ){
2249 if( zFirstRow ){
2250 utf8_printf(p->out, "%s", zFirstRow);
2251 zFirstRow = 0;
2252 }
2253 z = (const char*)sqlite3_column_text(pSelect, 0);
2254 utf8_printf(p->out, "%s", z);
2255 for(i=1; i<nResult; i++){
2256 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
2257 }
2258 if( z==0 ) z = "";
2259 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2260 if( z[0] ){
2261 raw_printf(p->out, "\n;\n");
2262 }else{
2263 raw_printf(p->out, ";\n");
2264 }
2265 rc = sqlite3_step(pSelect);
2266 }
2267 rc = sqlite3_finalize(pSelect);
2268 if( rc!=SQLITE_OK ){
2269 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2270 sqlite3_errmsg(p->db));
2271 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
2272 }
2273 return rc;
2274}
2275
2276/*
2277** Allocate space and save off current error string.
2278*/
2279static char *save_err_msg(
2280 sqlite3 *db /* Database to query */
2281){
2282 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
2283 char *zErrMsg = sqlite3_malloc64(nErrMsg);
2284 if( zErrMsg ){
2285 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2286 }
2287 return zErrMsg;
2288}
2289
2290#ifdef __linux__
2291/*
2292** Attempt to display I/O stats on Linux using /proc/PID/io
2293*/
2294static void displayLinuxIoStats(FILE *out){
2295 FILE *in;
2296 char z[200];
2297 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2298 in = fopen(z, "rb");
2299 if( in==0 ) return;
2300 while( fgets(z, sizeof(z), in)!=0 ){
2301 static const struct {
2302 const char *zPattern;
2303 const char *zDesc;
2304 } aTrans[] = {
2305 { "rchar: ", "Bytes received by read():" },
2306 { "wchar: ", "Bytes sent to write():" },
2307 { "syscr: ", "Read() system calls:" },
2308 { "syscw: ", "Write() system calls:" },
2309 { "read_bytes: ", "Bytes read from storage:" },
2310 { "write_bytes: ", "Bytes written to storage:" },
2311 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
2312 };
2313 int i;
2314 for(i=0; i<ArraySize(aTrans); i++){
drhaf2770f2018-01-05 14:55:43 +00002315 int n = strlen30(aTrans[i].zPattern);
drh2ce15c32017-07-11 13:34:40 +00002316 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
2317 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
2318 break;
2319 }
2320 }
2321 }
2322 fclose(in);
2323}
2324#endif
2325
2326/*
2327** Display a single line of status using 64-bit values.
2328*/
2329static void displayStatLine(
2330 ShellState *p, /* The shell context */
2331 char *zLabel, /* Label for this one line */
2332 char *zFormat, /* Format for the result */
2333 int iStatusCtrl, /* Which status to display */
2334 int bReset /* True to reset the stats */
2335){
2336 sqlite3_int64 iCur = -1;
2337 sqlite3_int64 iHiwtr = -1;
2338 int i, nPercent;
2339 char zLine[200];
2340 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2341 for(i=0, nPercent=0; zFormat[i]; i++){
2342 if( zFormat[i]=='%' ) nPercent++;
2343 }
2344 if( nPercent>1 ){
2345 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2346 }else{
2347 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2348 }
2349 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2350}
2351
2352/*
2353** Display memory stats.
2354*/
2355static int display_stats(
2356 sqlite3 *db, /* Database to query */
2357 ShellState *pArg, /* Pointer to ShellState */
2358 int bReset /* True to reset the stats */
2359){
2360 int iCur;
2361 int iHiwtr;
drh393344f2018-03-09 16:37:05 +00002362 FILE *out;
2363 if( pArg==0 || pArg->out==0 ) return 0;
2364 out = pArg->out;
drh2ce15c32017-07-11 13:34:40 +00002365
drh393344f2018-03-09 16:37:05 +00002366 if( pArg->pStmt && (pArg->statsOn & 2) ){
2367 int nCol, i, x;
2368 sqlite3_stmt *pStmt = pArg->pStmt;
2369 char z[100];
2370 nCol = sqlite3_column_count(pStmt);
2371 raw_printf(out, "%-36s %d\n", "Number of output columns:", nCol);
2372 for(i=0; i<nCol; i++){
2373 sqlite3_snprintf(sizeof(z),z,"Column %d %nname:", i, &x);
2374 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_name(pStmt,i));
drh929cce82018-03-17 16:26:36 +00002375#ifndef SQLITE_OMIT_DECLTYPE
drh393344f2018-03-09 16:37:05 +00002376 sqlite3_snprintf(30, z+x, "declared type:");
2377 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_decltype(pStmt, i));
drh929cce82018-03-17 16:26:36 +00002378#endif
2379#ifdef SQLITE_ENABLE_COLUMN_METADATA
drh393344f2018-03-09 16:37:05 +00002380 sqlite3_snprintf(30, z+x, "database name:");
2381 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_database_name(pStmt,i));
2382 sqlite3_snprintf(30, z+x, "table name:");
2383 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_table_name(pStmt,i));
2384 sqlite3_snprintf(30, z+x, "origin name:");
2385 utf8_printf(out, "%-36s %s\n", z, sqlite3_column_origin_name(pStmt,i));
drh929cce82018-03-17 16:26:36 +00002386#endif
drh2ce15c32017-07-11 13:34:40 +00002387 }
drh929cce82018-03-17 16:26:36 +00002388 }
drh2ce15c32017-07-11 13:34:40 +00002389
drh393344f2018-03-09 16:37:05 +00002390 displayStatLine(pArg, "Memory Used:",
2391 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2392 displayStatLine(pArg, "Number of Outstanding Allocations:",
2393 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
2394 if( pArg->shellFlgs & SHFLG_Pagecache ){
2395 displayStatLine(pArg, "Number of Pcache Pages Used:",
2396 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
2397 }
2398 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2399 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
2400 displayStatLine(pArg, "Largest Allocation:",
2401 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2402 displayStatLine(pArg, "Largest Pcache Allocation:",
2403 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2404#ifdef YYTRACKMAXSTACKDEPTH
2405 displayStatLine(pArg, "Deepest Parser Stack:",
2406 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
2407#endif
2408
2409 if( db ){
drh2ce15c32017-07-11 13:34:40 +00002410 if( pArg->shellFlgs & SHFLG_Lookaside ){
2411 iHiwtr = iCur = -1;
2412 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2413 &iCur, &iHiwtr, bReset);
2414 raw_printf(pArg->out,
2415 "Lookaside Slots Used: %d (max %d)\n",
2416 iCur, iHiwtr);
2417 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2418 &iCur, &iHiwtr, bReset);
2419 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2420 iHiwtr);
2421 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2422 &iCur, &iHiwtr, bReset);
2423 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2424 iHiwtr);
2425 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2426 &iCur, &iHiwtr, bReset);
2427 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2428 iHiwtr);
2429 }
2430 iHiwtr = iCur = -1;
2431 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
2432 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2433 iCur);
2434 iHiwtr = iCur = -1;
2435 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
2436 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
2437 iHiwtr = iCur = -1;
2438 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
2439 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
2440 iHiwtr = iCur = -1;
2441 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
2442 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
2443 iHiwtr = iCur = -1;
drhffc78a42018-03-14 14:53:50 +00002444 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_SPILL, &iCur, &iHiwtr, 1);
2445 raw_printf(pArg->out, "Page cache spills: %d\n", iCur);
2446 iHiwtr = iCur = -1;
drh2ce15c32017-07-11 13:34:40 +00002447 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
2448 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
2449 iCur);
2450 iHiwtr = iCur = -1;
2451 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
2452 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
2453 iCur);
2454 }
2455
drh393344f2018-03-09 16:37:05 +00002456 if( pArg->pStmt ){
drh2ce15c32017-07-11 13:34:40 +00002457 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2458 bReset);
2459 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
2460 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
2461 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
2462 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
2463 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
2464 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
2465 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
drh393344f2018-03-09 16:37:05 +00002466 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE, bReset);
2467 raw_printf(pArg->out, "Reprepare operations: %d\n", iCur);
2468 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset);
2469 raw_printf(pArg->out, "Number of times run: %d\n", iCur);
2470 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_MEMUSED, bReset);
2471 raw_printf(pArg->out, "Memory used by prepared stmt: %d\n", iCur);
drh2ce15c32017-07-11 13:34:40 +00002472 }
2473
2474#ifdef __linux__
2475 displayLinuxIoStats(pArg->out);
2476#endif
2477
2478 /* Do not remove this machine readable comment: extra-stats-output-here */
2479
2480 return 0;
2481}
2482
2483/*
2484** Display scan stats.
2485*/
2486static void display_scanstats(
2487 sqlite3 *db, /* Database to query */
2488 ShellState *pArg /* Pointer to ShellState */
2489){
2490#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2491 UNUSED_PARAMETER(db);
2492 UNUSED_PARAMETER(pArg);
2493#else
2494 int i, k, n, mx;
2495 raw_printf(pArg->out, "-------- scanstats --------\n");
2496 mx = 0;
2497 for(k=0; k<=mx; k++){
2498 double rEstLoop = 1.0;
2499 for(i=n=0; 1; i++){
2500 sqlite3_stmt *p = pArg->pStmt;
2501 sqlite3_int64 nLoop, nVisit;
2502 double rEst;
2503 int iSid;
2504 const char *zExplain;
2505 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2506 break;
2507 }
2508 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
2509 if( iSid>mx ) mx = iSid;
2510 if( iSid!=k ) continue;
2511 if( n==0 ){
2512 rEstLoop = (double)nLoop;
2513 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
2514 }
2515 n++;
2516 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2517 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2518 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
2519 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
2520 rEstLoop *= rEst;
2521 raw_printf(pArg->out,
2522 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
2523 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
2524 );
2525 }
2526 }
2527 raw_printf(pArg->out, "---------------------------\n");
2528#endif
2529}
2530
2531/*
2532** Parameter azArray points to a zero-terminated array of strings. zStr
2533** points to a single nul-terminated string. Return non-zero if zStr
2534** is equal, according to strcmp(), to any of the strings in the array.
2535** Otherwise, return zero.
2536*/
2537static int str_in_array(const char *zStr, const char **azArray){
2538 int i;
2539 for(i=0; azArray[i]; i++){
2540 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2541 }
2542 return 0;
2543}
2544
2545/*
2546** If compiled statement pSql appears to be an EXPLAIN statement, allocate
2547** and populate the ShellState.aiIndent[] array with the number of
2548** spaces each opcode should be indented before it is output.
2549**
2550** The indenting rules are:
2551**
2552** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2553** all opcodes that occur between the p2 jump destination and the opcode
2554** itself by 2 spaces.
2555**
2556** * For each "Goto", if the jump destination is earlier in the program
2557** and ends on one of:
2558** Yield SeekGt SeekLt RowSetRead Rewind
2559** or if the P1 parameter is one instead of zero,
2560** then indent all opcodes between the earlier instruction
2561** and "Goto" by 2 spaces.
2562*/
2563static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
2564 const char *zSql; /* The text of the SQL statement */
2565 const char *z; /* Used to check if this is an EXPLAIN */
2566 int *abYield = 0; /* True if op is an OP_Yield */
2567 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
2568 int iOp; /* Index of operation in p->aiIndent[] */
2569
2570 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2571 "NextIfOpen", "PrevIfOpen", 0 };
2572 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2573 "Rewind", 0 };
2574 const char *azGoto[] = { "Goto", 0 };
2575
2576 /* Try to figure out if this is really an EXPLAIN statement. If this
2577 ** cannot be verified, return early. */
2578 if( sqlite3_column_count(pSql)!=8 ){
2579 p->cMode = p->mode;
2580 return;
2581 }
2582 zSql = sqlite3_sql(pSql);
2583 if( zSql==0 ) return;
2584 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
2585 if( sqlite3_strnicmp(z, "explain", 7) ){
2586 p->cMode = p->mode;
2587 return;
2588 }
2589
2590 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2591 int i;
2592 int iAddr = sqlite3_column_int(pSql, 0);
2593 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
2594
2595 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2596 ** p2 is an instruction address, set variable p2op to the index of that
2597 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2598 ** the current instruction is part of a sub-program generated by an
2599 ** SQL trigger or foreign key. */
2600 int p2 = sqlite3_column_int(pSql, 3);
2601 int p2op = (p2 + (iOp-iAddr));
2602
2603 /* Grow the p->aiIndent array as required */
2604 if( iOp>=nAlloc ){
2605 if( iOp==0 ){
2606 /* Do further verfication that this is explain output. Abort if
2607 ** it is not */
2608 static const char *explainCols[] = {
2609 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2610 int jj;
2611 for(jj=0; jj<ArraySize(explainCols); jj++){
2612 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2613 p->cMode = p->mode;
2614 sqlite3_reset(pSql);
2615 return;
2616 }
2617 }
2618 }
2619 nAlloc += 100;
2620 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2621 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
2622 }
2623 abYield[iOp] = str_in_array(zOp, azYield);
2624 p->aiIndent[iOp] = 0;
2625 p->nIndent = iOp+1;
2626
2627 if( str_in_array(zOp, azNext) ){
2628 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2629 }
2630 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2631 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2632 ){
2633 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
2634 }
2635 }
2636
2637 p->iIndent = 0;
2638 sqlite3_free(abYield);
2639 sqlite3_reset(pSql);
2640}
2641
2642/*
2643** Free the array allocated by explain_data_prepare().
2644*/
2645static void explain_data_delete(ShellState *p){
2646 sqlite3_free(p->aiIndent);
2647 p->aiIndent = 0;
2648 p->nIndent = 0;
2649 p->iIndent = 0;
2650}
2651
2652/*
2653** Disable and restore .wheretrace and .selecttrace settings.
2654*/
2655#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2656extern int sqlite3SelectTrace;
2657static int savedSelectTrace;
2658#endif
2659#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2660extern int sqlite3WhereTrace;
2661static int savedWhereTrace;
2662#endif
2663static void disable_debug_trace_modes(void){
2664#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2665 savedSelectTrace = sqlite3SelectTrace;
2666 sqlite3SelectTrace = 0;
2667#endif
2668#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2669 savedWhereTrace = sqlite3WhereTrace;
2670 sqlite3WhereTrace = 0;
2671#endif
2672}
2673static void restore_debug_trace_modes(void){
2674#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2675 sqlite3SelectTrace = savedSelectTrace;
2676#endif
2677#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2678 sqlite3WhereTrace = savedWhereTrace;
2679#endif
2680}
2681
2682/*
2683** Run a prepared statement
2684*/
2685static void exec_prepared_stmt(
2686 ShellState *pArg, /* Pointer to ShellState */
drha10b9992018-03-09 15:24:33 +00002687 sqlite3_stmt *pStmt /* Statment to run */
drh2ce15c32017-07-11 13:34:40 +00002688){
2689 int rc;
2690
2691 /* perform the first step. this will tell us if we
2692 ** have a result set or not and how wide it is.
2693 */
2694 rc = sqlite3_step(pStmt);
2695 /* if we have a result set... */
2696 if( SQLITE_ROW == rc ){
drha10b9992018-03-09 15:24:33 +00002697 /* allocate space for col name ptr, value ptr, and type */
2698 int nCol = sqlite3_column_count(pStmt);
2699 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2700 if( !pData ){
2701 rc = SQLITE_NOMEM;
drh2ce15c32017-07-11 13:34:40 +00002702 }else{
drha10b9992018-03-09 15:24:33 +00002703 char **azCols = (char **)pData; /* Names of result columns */
2704 char **azVals = &azCols[nCol]; /* Results */
2705 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2706 int i, x;
2707 assert(sizeof(int) <= sizeof(char *));
2708 /* save off ptrs to column names */
2709 for(i=0; i<nCol; i++){
2710 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2711 }
drh2ce15c32017-07-11 13:34:40 +00002712 do{
drha10b9992018-03-09 15:24:33 +00002713 /* extract the data and data types */
2714 for(i=0; i<nCol; i++){
2715 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2716 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2717 azVals[i] = "";
2718 }else{
2719 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2720 }
2721 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2722 rc = SQLITE_NOMEM;
2723 break; /* from for */
2724 }
2725 } /* end for */
2726
2727 /* if data and types extracted successfully... */
2728 if( SQLITE_ROW == rc ){
2729 /* call the supplied callback with the result row data */
2730 if( shell_callback(pArg, nCol, azVals, azCols, aiTypes) ){
2731 rc = SQLITE_ABORT;
2732 }else{
2733 rc = sqlite3_step(pStmt);
2734 }
2735 }
2736 } while( SQLITE_ROW == rc );
2737 sqlite3_free(pData);
drh2ce15c32017-07-11 13:34:40 +00002738 }
2739 }
2740}
2741
dan6b046be2018-01-09 15:25:55 +00002742#ifndef SQLITE_OMIT_VIRTUALTABLE
drh2ce15c32017-07-11 13:34:40 +00002743/*
dan43efc182017-12-19 17:42:13 +00002744** This function is called to process SQL if the previous shell command
2745** was ".expert". It passes the SQL in the second argument directly to
2746** the sqlite3expert object.
2747**
2748** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
2749** code. In this case, (*pzErr) may be set to point to a buffer containing
2750** an English language error message. It is the responsibility of the
2751** caller to eventually free this buffer using sqlite3_free().
2752*/
2753static int expertHandleSQL(
2754 ShellState *pState,
2755 const char *zSql,
2756 char **pzErr
2757){
2758 assert( pState->expert.pExpert );
2759 assert( pzErr==0 || *pzErr==0 );
2760 return sqlite3_expert_sql(pState->expert.pExpert, zSql, pzErr);
2761}
2762
2763/*
2764** This function is called either to silently clean up the object
2765** created by the ".expert" command (if bCancel==1), or to generate a
2766** report from it and then clean it up (if bCancel==0).
2767**
2768** If successful, SQLITE_OK is returned. Otherwise, an SQLite error
2769** code. In this case, (*pzErr) may be set to point to a buffer containing
2770** an English language error message. It is the responsibility of the
2771** caller to eventually free this buffer using sqlite3_free().
2772*/
2773static int expertFinish(
2774 ShellState *pState,
2775 int bCancel,
2776 char **pzErr
2777){
2778 int rc = SQLITE_OK;
2779 sqlite3expert *p = pState->expert.pExpert;
2780 assert( p );
2781 assert( bCancel || pzErr==0 || *pzErr==0 );
2782 if( bCancel==0 ){
2783 FILE *out = pState->out;
2784 int bVerbose = pState->expert.bVerbose;
2785
2786 rc = sqlite3_expert_analyze(p, pzErr);
2787 if( rc==SQLITE_OK ){
2788 int nQuery = sqlite3_expert_count(p);
2789 int i;
2790
2791 if( bVerbose ){
2792 const char *zCand = sqlite3_expert_report(p,0,EXPERT_REPORT_CANDIDATES);
2793 raw_printf(out, "-- Candidates -----------------------------\n");
2794 raw_printf(out, "%s\n", zCand);
2795 }
2796 for(i=0; i<nQuery; i++){
2797 const char *zSql = sqlite3_expert_report(p, i, EXPERT_REPORT_SQL);
2798 const char *zIdx = sqlite3_expert_report(p, i, EXPERT_REPORT_INDEXES);
2799 const char *zEQP = sqlite3_expert_report(p, i, EXPERT_REPORT_PLAN);
2800 if( zIdx==0 ) zIdx = "(no new indexes)\n";
2801 if( bVerbose ){
2802 raw_printf(out, "-- Query %d --------------------------------\n",i+1);
2803 raw_printf(out, "%s\n\n", zSql);
2804 }
2805 raw_printf(out, "%s\n", zIdx);
2806 raw_printf(out, "%s\n", zEQP);
2807 }
2808 }
2809 }
2810 sqlite3_expert_destroy(p);
2811 pState->expert.pExpert = 0;
2812 return rc;
2813}
2814
dan6b046be2018-01-09 15:25:55 +00002815/*
2816** Implementation of ".expert" dot command.
2817*/
2818static int expertDotCommand(
2819 ShellState *pState, /* Current shell tool state */
2820 char **azArg, /* Array of arguments passed to dot command */
2821 int nArg /* Number of entries in azArg[] */
2822){
2823 int rc = SQLITE_OK;
2824 char *zErr = 0;
2825 int i;
2826 int iSample = 0;
2827
2828 assert( pState->expert.pExpert==0 );
2829 memset(&pState->expert, 0, sizeof(ExpertInfo));
2830
2831 for(i=1; rc==SQLITE_OK && i<nArg; i++){
2832 char *z = azArg[i];
2833 int n;
2834 if( z[0]=='-' && z[1]=='-' ) z++;
2835 n = strlen30(z);
2836 if( n>=2 && 0==strncmp(z, "-verbose", n) ){
2837 pState->expert.bVerbose = 1;
2838 }
2839 else if( n>=2 && 0==strncmp(z, "-sample", n) ){
2840 if( i==(nArg-1) ){
2841 raw_printf(stderr, "option requires an argument: %s\n", z);
2842 rc = SQLITE_ERROR;
2843 }else{
2844 iSample = (int)integerValue(azArg[++i]);
2845 if( iSample<0 || iSample>100 ){
2846 raw_printf(stderr, "value out of range: %s\n", azArg[i]);
2847 rc = SQLITE_ERROR;
2848 }
2849 }
2850 }
2851 else{
2852 raw_printf(stderr, "unknown option: %s\n", z);
2853 rc = SQLITE_ERROR;
2854 }
2855 }
2856
2857 if( rc==SQLITE_OK ){
2858 pState->expert.pExpert = sqlite3_expert_new(pState->db, &zErr);
2859 if( pState->expert.pExpert==0 ){
2860 raw_printf(stderr, "sqlite3_expert_new: %s\n", zErr);
2861 rc = SQLITE_ERROR;
2862 }else{
2863 sqlite3_expert_config(
2864 pState->expert.pExpert, EXPERT_CONFIG_SAMPLE, iSample
2865 );
2866 }
2867 }
2868
2869 return rc;
2870}
2871#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
dan43efc182017-12-19 17:42:13 +00002872
2873/*
drh2ce15c32017-07-11 13:34:40 +00002874** Execute a statement or set of statements. Print
2875** any result rows/columns depending on the current mode
2876** set via the supplied callback.
2877**
2878** This is very similar to SQLite's built-in sqlite3_exec()
2879** function except it takes a slightly different callback
2880** and callback data argument.
2881*/
2882static int shell_exec(
drh2ce15c32017-07-11 13:34:40 +00002883 ShellState *pArg, /* Pointer to ShellState */
drha10b9992018-03-09 15:24:33 +00002884 const char *zSql, /* SQL to be evaluated */
drh2ce15c32017-07-11 13:34:40 +00002885 char **pzErrMsg /* Error msg written here */
2886){
2887 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2888 int rc = SQLITE_OK; /* Return Code */
2889 int rc2;
2890 const char *zLeftover; /* Tail of unprocessed SQL */
drha10b9992018-03-09 15:24:33 +00002891 sqlite3 *db = pArg->db;
drh2ce15c32017-07-11 13:34:40 +00002892
2893 if( pzErrMsg ){
2894 *pzErrMsg = NULL;
2895 }
2896
dan6b046be2018-01-09 15:25:55 +00002897#ifndef SQLITE_OMIT_VIRTUALTABLE
dan43efc182017-12-19 17:42:13 +00002898 if( pArg->expert.pExpert ){
2899 rc = expertHandleSQL(pArg, zSql, pzErrMsg);
2900 return expertFinish(pArg, (rc!=SQLITE_OK), pzErrMsg);
2901 }
dan6b046be2018-01-09 15:25:55 +00002902#endif
dan43efc182017-12-19 17:42:13 +00002903
drh2ce15c32017-07-11 13:34:40 +00002904 while( zSql[0] && (SQLITE_OK == rc) ){
2905 static const char *zStmtSql;
2906 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2907 if( SQLITE_OK != rc ){
2908 if( pzErrMsg ){
2909 *pzErrMsg = save_err_msg(db);
2910 }
2911 }else{
2912 if( !pStmt ){
2913 /* this happens for a comment or white-space */
2914 zSql = zLeftover;
2915 while( IsSpace(zSql[0]) ) zSql++;
2916 continue;
2917 }
2918 zStmtSql = sqlite3_sql(pStmt);
2919 if( zStmtSql==0 ) zStmtSql = "";
2920 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
2921
2922 /* save off the prepared statment handle and reset row count */
2923 if( pArg ){
2924 pArg->pStmt = pStmt;
2925 pArg->cnt = 0;
2926 }
2927
2928 /* echo the sql statement if echo on */
2929 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
2930 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
2931 }
2932
2933 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
2934 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
2935 sqlite3_stmt *pExplain;
2936 char *zEQP;
drhada70452017-12-21 21:02:27 +00002937 int triggerEQP = 0;
drh2ce15c32017-07-11 13:34:40 +00002938 disable_debug_trace_modes();
drhada70452017-12-21 21:02:27 +00002939 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, -1, &triggerEQP);
2940 if( pArg->autoEQP>=AUTOEQP_trigger ){
2941 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 1, 0);
2942 }
drh2ce15c32017-07-11 13:34:40 +00002943 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
2944 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2945 if( rc==SQLITE_OK ){
2946 while( sqlite3_step(pExplain)==SQLITE_ROW ){
drh4b5345c2018-04-24 13:07:40 +00002947 const char *zEQPLine = (const char*)sqlite3_column_text(pExplain,3);
drhe2ca99c2018-05-02 00:33:43 +00002948 int iEqpId = sqlite3_column_int(pExplain, 0);
2949 int iParentId = sqlite3_column_int(pExplain, 1);
drh4b5345c2018-04-24 13:07:40 +00002950 if( zEQPLine[0]=='-' ) eqp_render(pArg);
drhe2ca99c2018-05-02 00:33:43 +00002951 eqp_append(pArg, iEqpId, iParentId, zEQPLine);
drh2ce15c32017-07-11 13:34:40 +00002952 }
drh4b5345c2018-04-24 13:07:40 +00002953 eqp_render(pArg);
drh2ce15c32017-07-11 13:34:40 +00002954 }
2955 sqlite3_finalize(pExplain);
2956 sqlite3_free(zEQP);
drhada70452017-12-21 21:02:27 +00002957 if( pArg->autoEQP>=AUTOEQP_full ){
drh2ce15c32017-07-11 13:34:40 +00002958 /* Also do an EXPLAIN for ".eqp full" mode */
2959 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2960 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2961 if( rc==SQLITE_OK ){
2962 pArg->cMode = MODE_Explain;
2963 explain_data_prepare(pArg, pExplain);
drha10b9992018-03-09 15:24:33 +00002964 exec_prepared_stmt(pArg, pExplain);
drh2ce15c32017-07-11 13:34:40 +00002965 explain_data_delete(pArg);
2966 }
2967 sqlite3_finalize(pExplain);
2968 sqlite3_free(zEQP);
2969 }
drh51efe092018-03-20 12:04:38 +00002970 if( pArg->autoEQP>=AUTOEQP_trigger && triggerEQP==0 ){
2971 sqlite3_db_config(db, SQLITE_DBCONFIG_TRIGGER_EQP, 0, 0);
2972 /* Reprepare pStmt before reactiving trace modes */
2973 sqlite3_finalize(pStmt);
2974 sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
2975 }
drh2ce15c32017-07-11 13:34:40 +00002976 restore_debug_trace_modes();
2977 }
2978
2979 if( pArg ){
2980 pArg->cMode = pArg->mode;
drh4b5345c2018-04-24 13:07:40 +00002981 if( pArg->autoExplain ){
2982 if( sqlite3_column_count(pStmt)==8
2983 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
2984 ){
2985 pArg->cMode = MODE_Explain;
2986 }
2987 if( sqlite3_column_count(pStmt)==4
2988 && sqlite3_strlike("EXPLAIN QUERY PLAN%", zStmtSql,0)==0 ){
2989 pArg->cMode = MODE_EQP;
2990 }
drh2ce15c32017-07-11 13:34:40 +00002991 }
2992
2993 /* If the shell is currently in ".explain" mode, gather the extra
2994 ** data required to add indents to the output.*/
2995 if( pArg->cMode==MODE_Explain ){
2996 explain_data_prepare(pArg, pStmt);
2997 }
2998 }
2999
drha10b9992018-03-09 15:24:33 +00003000 exec_prepared_stmt(pArg, pStmt);
drh2ce15c32017-07-11 13:34:40 +00003001 explain_data_delete(pArg);
drh4b5345c2018-04-24 13:07:40 +00003002 eqp_render(pArg);
drh2ce15c32017-07-11 13:34:40 +00003003
3004 /* print usage stats if stats on */
3005 if( pArg && pArg->statsOn ){
3006 display_stats(db, pArg, 0);
3007 }
3008
3009 /* print loop-counters if required */
3010 if( pArg && pArg->scanstatsOn ){
3011 display_scanstats(db, pArg);
3012 }
3013
3014 /* Finalize the statement just executed. If this fails, save a
3015 ** copy of the error message. Otherwise, set zSql to point to the
3016 ** next statement to execute. */
3017 rc2 = sqlite3_finalize(pStmt);
3018 if( rc!=SQLITE_NOMEM ) rc = rc2;
3019 if( rc==SQLITE_OK ){
3020 zSql = zLeftover;
3021 while( IsSpace(zSql[0]) ) zSql++;
3022 }else if( pzErrMsg ){
3023 *pzErrMsg = save_err_msg(db);
3024 }
3025
3026 /* clear saved stmt handle */
3027 if( pArg ){
3028 pArg->pStmt = NULL;
3029 }
3030 }
3031 } /* end while */
3032
3033 return rc;
3034}
3035
3036/*
3037** Release memory previously allocated by tableColumnList().
3038*/
3039static void freeColumnList(char **azCol){
3040 int i;
3041 for(i=1; azCol[i]; i++){
3042 sqlite3_free(azCol[i]);
3043 }
3044 /* azCol[0] is a static string */
3045 sqlite3_free(azCol);
3046}
3047
3048/*
3049** Return a list of pointers to strings which are the names of all
3050** columns in table zTab. The memory to hold the names is dynamically
3051** allocated and must be released by the caller using a subsequent call
3052** to freeColumnList().
3053**
3054** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
3055** value that needs to be preserved, then azCol[0] is filled in with the
3056** name of the rowid column.
3057**
3058** The first regular column in the table is azCol[1]. The list is terminated
3059** by an entry with azCol[i]==0.
3060*/
3061static char **tableColumnList(ShellState *p, const char *zTab){
3062 char **azCol = 0;
3063 sqlite3_stmt *pStmt;
3064 char *zSql;
3065 int nCol = 0;
3066 int nAlloc = 0;
3067 int nPK = 0; /* Number of PRIMARY KEY columns seen */
3068 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
3069 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
3070 int rc;
3071
3072 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
3073 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3074 sqlite3_free(zSql);
3075 if( rc ) return 0;
3076 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3077 if( nCol>=nAlloc-2 ){
3078 nAlloc = nAlloc*2 + nCol + 10;
3079 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
drh4b5345c2018-04-24 13:07:40 +00003080 if( azCol==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00003081 }
3082 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
3083 if( sqlite3_column_int(pStmt, 5) ){
3084 nPK++;
3085 if( nPK==1
3086 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
3087 "INTEGER")==0
3088 ){
3089 isIPK = 1;
3090 }else{
3091 isIPK = 0;
3092 }
3093 }
3094 }
3095 sqlite3_finalize(pStmt);
drh4c6cddc2017-10-12 10:28:30 +00003096 if( azCol==0 ) return 0;
drh2ce15c32017-07-11 13:34:40 +00003097 azCol[0] = 0;
3098 azCol[nCol+1] = 0;
3099
3100 /* The decision of whether or not a rowid really needs to be preserved
3101 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
3102 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
3103 ** rowids on tables where the rowid is inaccessible because there are other
3104 ** columns in the table named "rowid", "_rowid_", and "oid".
3105 */
3106 if( preserveRowid && isIPK ){
3107 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
3108 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
3109 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
3110 ** ROWID aliases. To distinguish these cases, check to see if
3111 ** there is a "pk" entry in "PRAGMA index_list". There will be
3112 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
3113 */
3114 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
3115 " WHERE origin='pk'", zTab);
3116 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3117 sqlite3_free(zSql);
3118 if( rc ){
3119 freeColumnList(azCol);
3120 return 0;
3121 }
3122 rc = sqlite3_step(pStmt);
3123 sqlite3_finalize(pStmt);
3124 preserveRowid = rc==SQLITE_ROW;
3125 }
3126 if( preserveRowid ){
3127 /* Only preserve the rowid if we can find a name to use for the
3128 ** rowid */
3129 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
3130 int i, j;
3131 for(j=0; j<3; j++){
3132 for(i=1; i<=nCol; i++){
3133 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
3134 }
3135 if( i>nCol ){
3136 /* At this point, we know that azRowid[j] is not the name of any
3137 ** ordinary column in the table. Verify that azRowid[j] is a valid
3138 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
3139 ** tables will fail this last check */
3140 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
3141 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
3142 break;
3143 }
3144 }
3145 }
3146 return azCol;
3147}
3148
3149/*
3150** Toggle the reverse_unordered_selects setting.
3151*/
3152static void toggleSelectOrder(sqlite3 *db){
3153 sqlite3_stmt *pStmt = 0;
3154 int iSetting = 0;
3155 char zStmt[100];
3156 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
3157 if( sqlite3_step(pStmt)==SQLITE_ROW ){
3158 iSetting = sqlite3_column_int(pStmt, 0);
3159 }
3160 sqlite3_finalize(pStmt);
3161 sqlite3_snprintf(sizeof(zStmt), zStmt,
3162 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
3163 sqlite3_exec(db, zStmt, 0, 0, 0);
3164}
3165
3166/*
3167** This is a different callback routine used for dumping the database.
3168** Each row received by this callback consists of a table name,
3169** the table type ("index" or "table") and SQL to create the table.
3170** This routine should print text sufficient to recreate the table.
3171*/
3172static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){
3173 int rc;
3174 const char *zTable;
3175 const char *zType;
3176 const char *zSql;
3177 ShellState *p = (ShellState *)pArg;
3178
3179 UNUSED_PARAMETER(azNotUsed);
drhb3c45232017-08-28 14:33:27 +00003180 if( nArg!=3 || azArg==0 ) return 0;
drh2ce15c32017-07-11 13:34:40 +00003181 zTable = azArg[0];
3182 zType = azArg[1];
3183 zSql = azArg[2];
3184
3185 if( strcmp(zTable, "sqlite_sequence")==0 ){
3186 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
3187 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
3188 raw_printf(p->out, "ANALYZE sqlite_master;\n");
3189 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
3190 return 0;
3191 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
3192 char *zIns;
3193 if( !p->writableSchema ){
3194 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
3195 p->writableSchema = 1;
3196 }
3197 zIns = sqlite3_mprintf(
3198 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
3199 "VALUES('table','%q','%q',0,'%q');",
3200 zTable, zTable, zSql);
3201 utf8_printf(p->out, "%s\n", zIns);
3202 sqlite3_free(zIns);
3203 return 0;
3204 }else{
3205 printSchemaLine(p->out, zSql, ";\n");
3206 }
3207
3208 if( strcmp(zType, "table")==0 ){
3209 ShellText sSelect;
3210 ShellText sTable;
3211 char **azCol;
3212 int i;
3213 char *savedDestTable;
3214 int savedMode;
3215
3216 azCol = tableColumnList(p, zTable);
3217 if( azCol==0 ){
3218 p->nErr++;
3219 return 0;
3220 }
3221
3222 /* Always quote the table name, even if it appears to be pure ascii,
3223 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
3224 initText(&sTable);
3225 appendText(&sTable, zTable, quoteChar(zTable));
3226 /* If preserving the rowid, add a column list after the table name.
3227 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3228 ** instead of the usual "INSERT INTO tab VALUES(...)".
3229 */
3230 if( azCol[0] ){
3231 appendText(&sTable, "(", 0);
3232 appendText(&sTable, azCol[0], 0);
3233 for(i=1; azCol[i]; i++){
3234 appendText(&sTable, ",", 0);
3235 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
3236 }
3237 appendText(&sTable, ")", 0);
3238 }
3239
3240 /* Build an appropriate SELECT statement */
3241 initText(&sSelect);
3242 appendText(&sSelect, "SELECT ", 0);
3243 if( azCol[0] ){
3244 appendText(&sSelect, azCol[0], 0);
3245 appendText(&sSelect, ",", 0);
3246 }
3247 for(i=1; azCol[i]; i++){
3248 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
3249 if( azCol[i+1] ){
3250 appendText(&sSelect, ",", 0);
3251 }
3252 }
3253 freeColumnList(azCol);
3254 appendText(&sSelect, " FROM ", 0);
3255 appendText(&sSelect, zTable, quoteChar(zTable));
3256
3257 savedDestTable = p->zDestTable;
3258 savedMode = p->mode;
3259 p->zDestTable = sTable.z;
3260 p->mode = p->cMode = MODE_Insert;
drha10b9992018-03-09 15:24:33 +00003261 rc = shell_exec(p, sSelect.z, 0);
drh2ce15c32017-07-11 13:34:40 +00003262 if( (rc&0xff)==SQLITE_CORRUPT ){
3263 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3264 toggleSelectOrder(p->db);
drha10b9992018-03-09 15:24:33 +00003265 shell_exec(p, sSelect.z, 0);
drh2ce15c32017-07-11 13:34:40 +00003266 toggleSelectOrder(p->db);
3267 }
3268 p->zDestTable = savedDestTable;
3269 p->mode = savedMode;
3270 freeText(&sTable);
3271 freeText(&sSelect);
3272 if( rc ) p->nErr++;
3273 }
3274 return 0;
3275}
3276
3277/*
3278** Run zQuery. Use dump_callback() as the callback routine so that
3279** the contents of the query are output as SQL statements.
3280**
3281** If we get a SQLITE_CORRUPT error, rerun the query after appending
3282** "ORDER BY rowid DESC" to the end.
3283*/
3284static int run_schema_dump_query(
3285 ShellState *p,
3286 const char *zQuery
3287){
3288 int rc;
3289 char *zErr = 0;
3290 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
3291 if( rc==SQLITE_CORRUPT ){
3292 char *zQ2;
3293 int len = strlen30(zQuery);
3294 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3295 if( zErr ){
3296 utf8_printf(p->out, "/****** %s ******/\n", zErr);
3297 sqlite3_free(zErr);
3298 zErr = 0;
3299 }
3300 zQ2 = malloc( len+100 );
3301 if( zQ2==0 ) return rc;
3302 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
3303 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3304 if( rc ){
3305 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
3306 }else{
3307 rc = SQLITE_CORRUPT;
3308 }
3309 sqlite3_free(zErr);
3310 free(zQ2);
3311 }
3312 return rc;
3313}
3314
3315/*
3316** Text of a help message
3317*/
3318static char zHelp[] =
drhe37c0e12018-01-06 19:19:50 +00003319#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
3320 ".archive ... Manage SQL archives: \".archive --help\" for details\n"
3321#endif
drh2ce15c32017-07-11 13:34:40 +00003322#ifndef SQLITE_OMIT_AUTHORIZATION
3323 ".auth ON|OFF Show authorizer callbacks\n"
3324#endif
3325 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drh69ed38a2018-05-14 00:23:08 +00003326 " Add \"--append\" to open using appendvfs.\n"
drh2ce15c32017-07-11 13:34:40 +00003327 ".bail on|off Stop after hitting an error. Default OFF\n"
3328 ".binary on|off Turn binary output on or off. Default OFF\n"
3329 ".cd DIRECTORY Change the working directory to DIRECTORY\n"
3330 ".changes on|off Show number of rows changed by SQL\n"
3331 ".check GLOB Fail if output since .testcase does not match\n"
3332 ".clone NEWDB Clone data into NEWDB from the existing database\n"
3333 ".databases List names and files of attached databases\n"
drh7df01192018-04-28 12:43:16 +00003334 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options\n"
drh2ce15c32017-07-11 13:34:40 +00003335 ".dbinfo ?DB? Show status information about the database\n"
3336 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
3337 " If TABLE specified, only dump tables matching\n"
3338 " LIKE pattern TABLE.\n"
3339 ".echo on|off Turn command echo on or off\n"
3340 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh13c20932018-01-10 21:41:55 +00003341 ".excel Display the output of next command in a spreadsheet\n"
drh2ce15c32017-07-11 13:34:40 +00003342 ".exit Exit this program\n"
dan2e1ea572017-12-21 18:55:24 +00003343 ".expert EXPERIMENTAL. Suggest indexes for specified queries\n"
drh2ce15c32017-07-11 13:34:40 +00003344/* Because explain mode comes on automatically now, the ".explain" mode
3345** is removed from the help screen. It is still supported for legacy, however */
3346/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/
3347 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
3348 ".headers on|off Turn display of headers on or off\n"
3349 ".help Show this message\n"
3350 ".import FILE TABLE Import data from FILE into TABLE\n"
3351#ifndef SQLITE_OMIT_TEST_CONTROL
3352 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3353#endif
3354 ".indexes ?TABLE? Show names of all indexes\n"
3355 " If TABLE specified, only show indexes for tables\n"
3356 " matching LIKE pattern TABLE.\n"
3357#ifdef SQLITE_ENABLE_IOTRACE
3358 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3359#endif
3360 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
3361 ".lint OPTIONS Report potential schema issues. Options:\n"
3362 " fkey-indexes Find missing foreign key indexes\n"
3363#ifndef SQLITE_OMIT_LOAD_EXTENSION
3364 ".load FILE ?ENTRY? Load an extension library\n"
3365#endif
3366 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
3367 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
3368 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
3369 " csv Comma-separated values\n"
3370 " column Left-aligned columns. (See .width)\n"
3371 " html HTML <table> code\n"
3372 " insert SQL insert statements for TABLE\n"
3373 " line One value per line\n"
3374 " list Values delimited by \"|\"\n"
3375 " quote Escape answers as for SQL\n"
3376 " tabs Tab-separated values\n"
3377 " tcl TCL list elements\n"
3378 ".nullvalue STRING Use STRING in place of NULL values\n"
drh536c3452018-01-11 00:38:39 +00003379 ".once (-e|-x|FILE) Output for the next SQL command only to FILE\n"
3380 " or invoke system text editor (-e) or spreadsheet (-x)\n"
3381 " on the output.\n"
drh2ce15c32017-07-11 13:34:40 +00003382 ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n"
3383 " The --new option starts with an empty file\n"
drhee269a62018-02-14 23:27:43 +00003384 " Other options: --readonly --append --zip\n"
drh536c3452018-01-11 00:38:39 +00003385 ".output ?FILE? Send output to FILE or stdout\n"
drh2ce15c32017-07-11 13:34:40 +00003386 ".print STRING... Print literal STRING\n"
3387 ".prompt MAIN CONTINUE Replace the standard prompts\n"
3388 ".quit Exit this program\n"
3389 ".read FILENAME Execute SQL in FILENAME\n"
3390 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
3391 ".save FILE Write in-memory database into FILE\n"
3392 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
3393 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3394 " Add --indent for pretty-printing\n"
3395 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
3396 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3397 " separator for both the output mode and .import\n"
3398#if defined(SQLITE_ENABLE_SESSION)
3399 ".session CMD ... Create or control sessions\n"
3400#endif
3401 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh04a28c32018-01-31 01:38:44 +00003402#ifndef SQLITE_NOHAVE_SYSTEM
drh2ce15c32017-07-11 13:34:40 +00003403 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drh04a28c32018-01-31 01:38:44 +00003404#endif
drh2ce15c32017-07-11 13:34:40 +00003405 ".show Show the current values for various settings\n"
3406 ".stats ?on|off? Show stats or turn stats on or off\n"
drh04a28c32018-01-31 01:38:44 +00003407#ifndef SQLITE_NOHAVE_SYSTEM
drh2ce15c32017-07-11 13:34:40 +00003408 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
drh04a28c32018-01-31 01:38:44 +00003409#endif
drh2ce15c32017-07-11 13:34:40 +00003410 ".tables ?TABLE? List names of tables\n"
3411 " If TABLE specified, only list tables matching\n"
3412 " LIKE pattern TABLE.\n"
3413 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
3414 ".timeout MS Try opening locked tables for MS milliseconds\n"
3415 ".timer on|off Turn SQL timer on or off\n"
3416 ".trace FILE|off Output each SQL statement as it is run\n"
3417 ".vfsinfo ?AUX? Information about the top-level VFS\n"
3418 ".vfslist List all available VFSes\n"
3419 ".vfsname ?AUX? Print the name of the VFS stack\n"
3420 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
3421 " Negative values right-justify\n"
3422;
3423
3424#if defined(SQLITE_ENABLE_SESSION)
3425/*
3426** Print help information for the ".sessions" command
3427*/
3428void session_help(ShellState *p){
3429 raw_printf(p->out,
3430 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3431 "If ?NAME? is omitted, the first defined session is used.\n"
3432 "Subcommands:\n"
3433 " attach TABLE Attach TABLE\n"
3434 " changeset FILE Write a changeset into FILE\n"
3435 " close Close one session\n"
3436 " enable ?BOOLEAN? Set or query the enable bit\n"
3437 " filter GLOB... Reject tables matching GLOBs\n"
3438 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3439 " isempty Query whether the session is empty\n"
3440 " list List currently open session names\n"
3441 " open DB NAME Open a new session on DB\n"
3442 " patchset FILE Write a patchset into FILE\n"
3443 );
3444}
3445#endif
3446
3447
3448/* Forward reference */
3449static int process_input(ShellState *p, FILE *in);
3450
3451/*
3452** Read the content of file zName into memory obtained from sqlite3_malloc64()
3453** and return a pointer to the buffer. The caller is responsible for freeing
3454** the memory.
3455**
3456** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3457** read.
3458**
3459** For convenience, a nul-terminator byte is always appended to the data read
3460** from the file before the buffer is returned. This byte is not included in
3461** the final value of (*pnByte), if applicable.
3462**
3463** NULL is returned if any error is encountered. The final value of *pnByte
3464** is undefined in this case.
3465*/
3466static char *readFile(const char *zName, int *pnByte){
3467 FILE *in = fopen(zName, "rb");
3468 long nIn;
3469 size_t nRead;
3470 char *pBuf;
3471 if( in==0 ) return 0;
3472 fseek(in, 0, SEEK_END);
3473 nIn = ftell(in);
3474 rewind(in);
3475 pBuf = sqlite3_malloc64( nIn+1 );
3476 if( pBuf==0 ) return 0;
3477 nRead = fread(pBuf, nIn, 1, in);
3478 fclose(in);
3479 if( nRead!=1 ){
3480 sqlite3_free(pBuf);
3481 return 0;
3482 }
3483 pBuf[nIn] = 0;
3484 if( pnByte ) *pnByte = nIn;
3485 return pBuf;
3486}
3487
3488#if defined(SQLITE_ENABLE_SESSION)
3489/*
3490** Close a single OpenSession object and release all of its associated
3491** resources.
3492*/
3493static void session_close(OpenSession *pSession){
3494 int i;
3495 sqlite3session_delete(pSession->p);
3496 sqlite3_free(pSession->zName);
3497 for(i=0; i<pSession->nFilter; i++){
3498 sqlite3_free(pSession->azFilter[i]);
3499 }
3500 sqlite3_free(pSession->azFilter);
3501 memset(pSession, 0, sizeof(OpenSession));
3502}
3503#endif
3504
3505/*
3506** Close all OpenSession objects and release all associated resources.
3507*/
3508#if defined(SQLITE_ENABLE_SESSION)
3509static void session_close_all(ShellState *p){
3510 int i;
3511 for(i=0; i<p->nSession; i++){
3512 session_close(&p->aSession[i]);
3513 }
3514 p->nSession = 0;
3515}
3516#else
3517# define session_close_all(X)
3518#endif
3519
3520/*
3521** Implementation of the xFilter function for an open session. Omit
3522** any tables named by ".session filter" but let all other table through.
3523*/
3524#if defined(SQLITE_ENABLE_SESSION)
3525static int session_filter(void *pCtx, const char *zTab){
3526 OpenSession *pSession = (OpenSession*)pCtx;
3527 int i;
3528 for(i=0; i<pSession->nFilter; i++){
3529 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3530 }
3531 return 1;
3532}
3533#endif
3534
3535/*
drh1fa6d9f2018-01-06 21:46:01 +00003536** Try to deduce the type of file for zName based on its content. Return
3537** one of the SHELL_OPEN_* constants.
drh1bf208c2018-03-09 21:54:01 +00003538**
3539** If the file does not exist or is empty but its name looks like a ZIP
3540** archive and the dfltZip flag is true, then assume it is a ZIP archive.
3541** Otherwise, assume an ordinary database regardless of the filename if
3542** the type cannot be determined from content.
drh1fa6d9f2018-01-06 21:46:01 +00003543*/
drhfc97c1c2018-05-14 00:41:12 +00003544int deduceDatabaseType(const char *zName, int dfltZip){
drh1fa6d9f2018-01-06 21:46:01 +00003545 FILE *f = fopen(zName, "rb");
3546 size_t n;
3547 int rc = SHELL_OPEN_UNSPEC;
3548 char zBuf[100];
drh1bf208c2018-03-09 21:54:01 +00003549 if( f==0 ){
drhbe4ccb22018-05-17 20:04:24 +00003550 if( dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
3551 return SHELL_OPEN_ZIPFILE;
3552 }else{
3553 return SHELL_OPEN_NORMAL;
3554 }
drh1bf208c2018-03-09 21:54:01 +00003555 }
drh1fa6d9f2018-01-06 21:46:01 +00003556 fseek(f, -25, SEEK_END);
3557 n = fread(zBuf, 25, 1, f);
3558 if( n==1 && memcmp(zBuf, "Start-Of-SQLite3-", 17)==0 ){
3559 rc = SHELL_OPEN_APPENDVFS;
3560 }else{
3561 fseek(f, -22, SEEK_END);
3562 n = fread(zBuf, 22, 1, f);
3563 if( n==1 && zBuf[0]==0x50 && zBuf[1]==0x4b && zBuf[2]==0x05
3564 && zBuf[3]==0x06 ){
3565 rc = SHELL_OPEN_ZIPFILE;
drh1bf208c2018-03-09 21:54:01 +00003566 }else if( n==0 && dfltZip && sqlite3_strlike("%.zip",zName,0)==0 ){
mistachkina3926f42018-05-14 12:23:04 +00003567 rc = SHELL_OPEN_ZIPFILE;
drh1fa6d9f2018-01-06 21:46:01 +00003568 }
3569 }
3570 fclose(f);
3571 return rc;
3572}
3573
drhbe4ccb22018-05-17 20:04:24 +00003574/* Flags for open_db().
3575**
3576** The default behavior of open_db() is to exit(1) if the database fails to
3577** open. The OPEN_DB_KEEPALIVE flag changes that so that it prints an error
3578** but still returns without calling exit.
3579**
3580** The OPEN_DB_ZIPFILE flag causes open_db() to prefer to open files as a
3581** ZIP archive if the file does not exist or is empty and its name matches
3582** the *.zip pattern.
3583*/
3584#define OPEN_DB_KEEPALIVE 0x001 /* Return after error if true */
3585#define OPEN_DB_ZIPFILE 0x002 /* Open as ZIP if name matches *.zip */
3586
drh1fa6d9f2018-01-06 21:46:01 +00003587/*
drh2ce15c32017-07-11 13:34:40 +00003588** Make sure the database is open. If it is not, then open it. If
3589** the database fails to open, print an error message and exit.
3590*/
drhbe4ccb22018-05-17 20:04:24 +00003591static void open_db(ShellState *p, int openFlags){
drh2ce15c32017-07-11 13:34:40 +00003592 if( p->db==0 ){
drhf2072d12018-05-11 15:10:11 +00003593 if( p->openMode==SHELL_OPEN_UNSPEC ){
3594 if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){
3595 p->openMode = SHELL_OPEN_NORMAL;
drhbe4ccb22018-05-17 20:04:24 +00003596 }else{
3597 p->openMode = (u8)deduceDatabaseType(p->zDbFilename,
3598 (openFlags & OPEN_DB_ZIPFILE)!=0);
drhf2072d12018-05-11 15:10:11 +00003599 }
drh1fa6d9f2018-01-06 21:46:01 +00003600 }
3601 switch( p->openMode ){
3602 case SHELL_OPEN_APPENDVFS: {
3603 sqlite3_open_v2(p->zDbFilename, &p->db,
3604 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs");
3605 break;
3606 }
3607 case SHELL_OPEN_ZIPFILE: {
3608 sqlite3_open(":memory:", &p->db);
3609 break;
3610 }
drhee269a62018-02-14 23:27:43 +00003611 case SHELL_OPEN_READONLY: {
3612 sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0);
3613 break;
3614 }
drh1fa6d9f2018-01-06 21:46:01 +00003615 case SHELL_OPEN_UNSPEC:
3616 case SHELL_OPEN_NORMAL: {
3617 sqlite3_open(p->zDbFilename, &p->db);
3618 break;
3619 }
3620 }
drh2ce15c32017-07-11 13:34:40 +00003621 globalDb = p->db;
3622 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
3623 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
3624 p->zDbFilename, sqlite3_errmsg(p->db));
drhbe4ccb22018-05-17 20:04:24 +00003625 if( openFlags & OPEN_DB_KEEPALIVE ) return;
drh2ce15c32017-07-11 13:34:40 +00003626 exit(1);
3627 }
3628#ifndef SQLITE_OMIT_LOAD_EXTENSION
3629 sqlite3_enable_load_extension(p->db, 1);
3630#endif
3631 sqlite3_fileio_init(p->db, 0, 0);
3632 sqlite3_shathree_init(p->db, 0, 0);
drh56eb09b2017-07-11 13:59:07 +00003633 sqlite3_completion_init(p->db, 0, 0);
dan72afc3c2017-12-05 18:32:40 +00003634#ifdef SQLITE_HAVE_ZLIB
dan9ebfaad2017-12-26 20:39:58 +00003635 sqlite3_zipfile_init(p->db, 0, 0);
dand1b51d42017-12-16 19:11:26 +00003636 sqlite3_sqlar_init(p->db, 0, 0);
dan72afc3c2017-12-05 18:32:40 +00003637#endif
drhceba7922018-01-01 21:28:25 +00003638 sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
drh2ce15c32017-07-11 13:34:40 +00003639 shellAddSchemaName, 0, 0);
drh667a2a22018-01-02 00:04:37 +00003640 sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
3641 shellModuleSchema, 0, 0);
drh634c70f2018-01-10 16:50:18 +00003642 sqlite3_create_function(p->db, "shell_putsnl", 1, SQLITE_UTF8, p,
3643 shellPutsFunc, 0, 0);
drh04a28c32018-01-31 01:38:44 +00003644#ifndef SQLITE_NOHAVE_SYSTEM
drh97913132018-01-11 00:04:00 +00003645 sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0,
3646 editFunc, 0, 0);
3647 sqlite3_create_function(p->db, "edit", 2, SQLITE_UTF8, 0,
3648 editFunc, 0, 0);
drh04a28c32018-01-31 01:38:44 +00003649#endif
drh1fa6d9f2018-01-06 21:46:01 +00003650 if( p->openMode==SHELL_OPEN_ZIPFILE ){
3651 char *zSql = sqlite3_mprintf(
3652 "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename);
3653 sqlite3_exec(p->db, zSql, 0, 0, 0);
3654 sqlite3_free(zSql);
3655 }
drh2ce15c32017-07-11 13:34:40 +00003656 }
3657}
3658
drh9e804032018-05-18 17:11:50 +00003659/*
3660** Attempt to close the databaes connection. Report errors.
3661*/
3662void close_db(sqlite3 *db){
3663 int rc = sqlite3_close(db);
3664 if( rc ){
3665 utf8_printf(stderr, "Error: sqlite3_close() returns %d: %s\n",
3666 rc, sqlite3_errmsg(db));
3667 }
3668}
3669
drh56eb09b2017-07-11 13:59:07 +00003670#if HAVE_READLINE || HAVE_EDITLINE
3671/*
3672** Readline completion callbacks
3673*/
3674static char *readline_completion_generator(const char *text, int state){
3675 static sqlite3_stmt *pStmt = 0;
3676 char *zRet;
3677 if( state==0 ){
3678 char *zSql;
drh56eb09b2017-07-11 13:59:07 +00003679 sqlite3_finalize(pStmt);
3680 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
3681 " FROM completion(%Q) ORDER BY 1", text);
3682 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
3683 sqlite3_free(zSql);
3684 }
3685 if( sqlite3_step(pStmt)==SQLITE_ROW ){
drh968d8712017-07-14 00:28:28 +00003686 zRet = strdup((const char*)sqlite3_column_text(pStmt, 0));
drh56eb09b2017-07-11 13:59:07 +00003687 }else{
3688 sqlite3_finalize(pStmt);
3689 pStmt = 0;
3690 zRet = 0;
3691 }
3692 return zRet;
3693}
3694static char **readline_completion(const char *zText, int iStart, int iEnd){
3695 rl_attempted_completion_over = 1;
3696 return rl_completion_matches(zText, readline_completion_generator);
3697}
3698
3699#elif HAVE_LINENOISE
3700/*
3701** Linenoise completion callback
3702*/
3703static void linenoise_completion(const char *zLine, linenoiseCompletions *lc){
drhaf2770f2018-01-05 14:55:43 +00003704 int nLine = strlen30(zLine);
drh56eb09b2017-07-11 13:59:07 +00003705 int i, iStart;
3706 sqlite3_stmt *pStmt = 0;
3707 char *zSql;
3708 char zBuf[1000];
3709
3710 if( nLine>sizeof(zBuf)-30 ) return;
drh1615c372018-05-12 23:56:22 +00003711 if( zLine[0]=='.' || zLine[0]=='#') return;
drh56eb09b2017-07-11 13:59:07 +00003712 for(i=nLine-1; i>=0 && (isalnum(zLine[i]) || zLine[i]=='_'); i--){}
3713 if( i==nLine-1 ) return;
3714 iStart = i+1;
3715 memcpy(zBuf, zLine, iStart);
3716 zSql = sqlite3_mprintf("SELECT DISTINCT candidate COLLATE nocase"
3717 " FROM completion(%Q,%Q) ORDER BY 1",
3718 &zLine[iStart], zLine);
3719 sqlite3_prepare_v2(globalDb, zSql, -1, &pStmt, 0);
3720 sqlite3_free(zSql);
3721 sqlite3_exec(globalDb, "PRAGMA page_count", 0, 0, 0); /* Load the schema */
3722 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3723 const char *zCompletion = (const char*)sqlite3_column_text(pStmt, 0);
3724 int nCompletion = sqlite3_column_bytes(pStmt, 0);
3725 if( iStart+nCompletion < sizeof(zBuf)-1 ){
3726 memcpy(zBuf+iStart, zCompletion, nCompletion+1);
3727 linenoiseAddCompletion(lc, zBuf);
3728 }
3729 }
3730 sqlite3_finalize(pStmt);
3731}
3732#endif
3733
drh2ce15c32017-07-11 13:34:40 +00003734/*
3735** Do C-language style dequoting.
3736**
3737** \a -> alarm
3738** \b -> backspace
3739** \t -> tab
3740** \n -> newline
3741** \v -> vertical tab
3742** \f -> form feed
3743** \r -> carriage return
3744** \s -> space
3745** \" -> "
3746** \' -> '
3747** \\ -> backslash
3748** \NNN -> ascii character NNN in octal
3749*/
3750static void resolve_backslashes(char *z){
3751 int i, j;
3752 char c;
3753 while( *z && *z!='\\' ) z++;
3754 for(i=j=0; (c = z[i])!=0; i++, j++){
3755 if( c=='\\' && z[i+1]!=0 ){
3756 c = z[++i];
3757 if( c=='a' ){
3758 c = '\a';
3759 }else if( c=='b' ){
3760 c = '\b';
3761 }else if( c=='t' ){
3762 c = '\t';
3763 }else if( c=='n' ){
3764 c = '\n';
3765 }else if( c=='v' ){
3766 c = '\v';
3767 }else if( c=='f' ){
3768 c = '\f';
3769 }else if( c=='r' ){
3770 c = '\r';
3771 }else if( c=='"' ){
3772 c = '"';
3773 }else if( c=='\'' ){
3774 c = '\'';
3775 }else if( c=='\\' ){
3776 c = '\\';
3777 }else if( c>='0' && c<='7' ){
3778 c -= '0';
3779 if( z[i+1]>='0' && z[i+1]<='7' ){
3780 i++;
3781 c = (c<<3) + z[i] - '0';
3782 if( z[i+1]>='0' && z[i+1]<='7' ){
3783 i++;
3784 c = (c<<3) + z[i] - '0';
3785 }
3786 }
3787 }
3788 }
3789 z[j] = c;
3790 }
3791 if( j<i ) z[j] = 0;
3792}
3793
3794/*
drh2ce15c32017-07-11 13:34:40 +00003795** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3796** for TRUE and FALSE. Return the integer value if appropriate.
3797*/
3798static int booleanValue(const char *zArg){
3799 int i;
3800 if( zArg[0]=='0' && zArg[1]=='x' ){
3801 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3802 }else{
3803 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3804 }
3805 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3806 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3807 return 1;
3808 }
3809 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3810 return 0;
3811 }
3812 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
3813 zArg);
3814 return 0;
3815}
3816
3817/*
3818** Set or clear a shell flag according to a boolean value.
3819*/
3820static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
3821 if( booleanValue(zArg) ){
3822 ShellSetFlag(p, mFlag);
3823 }else{
3824 ShellClearFlag(p, mFlag);
3825 }
3826}
3827
3828/*
3829** Close an output file, assuming it is not stderr or stdout
3830*/
3831static void output_file_close(FILE *f){
3832 if( f && f!=stdout && f!=stderr ) fclose(f);
3833}
3834
3835/*
3836** Try to open an output file. The names "stdout" and "stderr" are
3837** recognized and do the right thing. NULL is returned if the output
3838** filename is "off".
3839*/
drha92a01a2018-01-10 22:15:37 +00003840static FILE *output_file_open(const char *zFile, int bTextMode){
drh2ce15c32017-07-11 13:34:40 +00003841 FILE *f;
3842 if( strcmp(zFile,"stdout")==0 ){
3843 f = stdout;
3844 }else if( strcmp(zFile, "stderr")==0 ){
3845 f = stderr;
3846 }else if( strcmp(zFile, "off")==0 ){
3847 f = 0;
3848 }else{
drha92a01a2018-01-10 22:15:37 +00003849 f = fopen(zFile, bTextMode ? "w" : "wb");
drh2ce15c32017-07-11 13:34:40 +00003850 if( f==0 ){
3851 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
3852 }
3853 }
3854 return f;
3855}
3856
drh2ce15c32017-07-11 13:34:40 +00003857#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
3858/*
3859** A routine for handling output from sqlite3_trace().
3860*/
3861static int sql_trace_callback(
3862 unsigned mType,
3863 void *pArg,
3864 void *pP,
3865 void *pX
3866){
3867 FILE *f = (FILE*)pArg;
3868 UNUSED_PARAMETER(mType);
3869 UNUSED_PARAMETER(pP);
3870 if( f ){
3871 const char *z = (const char*)pX;
drhaf2770f2018-01-05 14:55:43 +00003872 int i = strlen30(z);
drh2ce15c32017-07-11 13:34:40 +00003873 while( i>0 && z[i-1]==';' ){ i--; }
3874 utf8_printf(f, "%.*s;\n", i, z);
3875 }
3876 return 0;
3877}
3878#endif
drh2ce15c32017-07-11 13:34:40 +00003879
3880/*
3881** A no-op routine that runs with the ".breakpoint" doc-command. This is
3882** a useful spot to set a debugger breakpoint.
3883*/
3884static void test_breakpoint(void){
3885 static int nCall = 0;
3886 nCall++;
3887}
3888
3889/*
3890** An object used to read a CSV and other files for import.
3891*/
3892typedef struct ImportCtx ImportCtx;
3893struct ImportCtx {
3894 const char *zFile; /* Name of the input file */
3895 FILE *in; /* Read the CSV text from this input stream */
3896 char *z; /* Accumulated text for a field */
3897 int n; /* Number of bytes in z */
3898 int nAlloc; /* Space allocated for z[] */
3899 int nLine; /* Current line number */
3900 int bNotFirst; /* True if one or more bytes already read */
3901 int cTerm; /* Character that terminated the most recent field */
3902 int cColSep; /* The column separator character. (Usually ",") */
3903 int cRowSep; /* The row separator character. (Usually "\n") */
3904};
3905
3906/* Append a single byte to z[] */
3907static void import_append_char(ImportCtx *p, int c){
3908 if( p->n+1>=p->nAlloc ){
3909 p->nAlloc += p->nAlloc + 100;
3910 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drh4b5345c2018-04-24 13:07:40 +00003911 if( p->z==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00003912 }
3913 p->z[p->n++] = (char)c;
3914}
3915
3916/* Read a single field of CSV text. Compatible with rfc4180 and extended
3917** with the option of having a separator other than ",".
3918**
3919** + Input comes from p->in.
3920** + Store results in p->z of length p->n. Space to hold p->z comes
3921** from sqlite3_malloc64().
3922** + Use p->cSep as the column separator. The default is ",".
3923** + Use p->rSep as the row separator. The default is "\n".
3924** + Keep track of the line number in p->nLine.
3925** + Store the character that terminates the field in p->cTerm. Store
3926** EOF on end-of-file.
3927** + Report syntax errors on stderr
3928*/
3929static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
3930 int c;
3931 int cSep = p->cColSep;
3932 int rSep = p->cRowSep;
3933 p->n = 0;
3934 c = fgetc(p->in);
3935 if( c==EOF || seenInterrupt ){
3936 p->cTerm = EOF;
3937 return 0;
3938 }
3939 if( c=='"' ){
3940 int pc, ppc;
3941 int startLine = p->nLine;
3942 int cQuote = c;
3943 pc = ppc = 0;
3944 while( 1 ){
3945 c = fgetc(p->in);
3946 if( c==rSep ) p->nLine++;
3947 if( c==cQuote ){
3948 if( pc==cQuote ){
3949 pc = 0;
3950 continue;
3951 }
3952 }
3953 if( (c==cSep && pc==cQuote)
3954 || (c==rSep && pc==cQuote)
3955 || (c==rSep && pc=='\r' && ppc==cQuote)
3956 || (c==EOF && pc==cQuote)
3957 ){
3958 do{ p->n--; }while( p->z[p->n]!=cQuote );
3959 p->cTerm = c;
3960 break;
3961 }
3962 if( pc==cQuote && c!='\r' ){
3963 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
3964 p->zFile, p->nLine, cQuote);
3965 }
3966 if( c==EOF ){
3967 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
3968 p->zFile, startLine, cQuote);
3969 p->cTerm = c;
3970 break;
3971 }
3972 import_append_char(p, c);
3973 ppc = pc;
3974 pc = c;
3975 }
3976 }else{
3977 /* If this is the first field being parsed and it begins with the
3978 ** UTF-8 BOM (0xEF BB BF) then skip the BOM */
3979 if( (c&0xff)==0xef && p->bNotFirst==0 ){
3980 import_append_char(p, c);
3981 c = fgetc(p->in);
3982 if( (c&0xff)==0xbb ){
3983 import_append_char(p, c);
3984 c = fgetc(p->in);
3985 if( (c&0xff)==0xbf ){
3986 p->bNotFirst = 1;
3987 p->n = 0;
3988 return csv_read_one_field(p);
3989 }
3990 }
3991 }
3992 while( c!=EOF && c!=cSep && c!=rSep ){
3993 import_append_char(p, c);
3994 c = fgetc(p->in);
3995 }
3996 if( c==rSep ){
3997 p->nLine++;
3998 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
3999 }
4000 p->cTerm = c;
4001 }
4002 if( p->z ) p->z[p->n] = 0;
4003 p->bNotFirst = 1;
4004 return p->z;
4005}
4006
4007/* Read a single field of ASCII delimited text.
4008**
4009** + Input comes from p->in.
4010** + Store results in p->z of length p->n. Space to hold p->z comes
4011** from sqlite3_malloc64().
4012** + Use p->cSep as the column separator. The default is "\x1F".
4013** + Use p->rSep as the row separator. The default is "\x1E".
4014** + Keep track of the row number in p->nLine.
4015** + Store the character that terminates the field in p->cTerm. Store
4016** EOF on end-of-file.
4017** + Report syntax errors on stderr
4018*/
4019static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
4020 int c;
4021 int cSep = p->cColSep;
4022 int rSep = p->cRowSep;
4023 p->n = 0;
4024 c = fgetc(p->in);
4025 if( c==EOF || seenInterrupt ){
4026 p->cTerm = EOF;
4027 return 0;
4028 }
4029 while( c!=EOF && c!=cSep && c!=rSep ){
4030 import_append_char(p, c);
4031 c = fgetc(p->in);
4032 }
4033 if( c==rSep ){
4034 p->nLine++;
4035 }
4036 p->cTerm = c;
4037 if( p->z ) p->z[p->n] = 0;
4038 return p->z;
4039}
4040
4041/*
4042** Try to transfer data for table zTable. If an error is seen while
4043** moving forward, try to go backwards. The backwards movement won't
4044** work for WITHOUT ROWID tables.
4045*/
4046static void tryToCloneData(
4047 ShellState *p,
4048 sqlite3 *newDb,
4049 const char *zTable
4050){
4051 sqlite3_stmt *pQuery = 0;
4052 sqlite3_stmt *pInsert = 0;
4053 char *zQuery = 0;
4054 char *zInsert = 0;
4055 int rc;
4056 int i, j, n;
drhaf2770f2018-01-05 14:55:43 +00004057 int nTable = strlen30(zTable);
drh2ce15c32017-07-11 13:34:40 +00004058 int k = 0;
4059 int cnt = 0;
4060 const int spinRate = 10000;
4061
4062 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
4063 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4064 if( rc ){
4065 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4066 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4067 zQuery);
4068 goto end_data_xfer;
4069 }
4070 n = sqlite3_column_count(pQuery);
4071 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh4b5345c2018-04-24 13:07:40 +00004072 if( zInsert==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00004073 sqlite3_snprintf(200+nTable,zInsert,
4074 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
drhaf2770f2018-01-05 14:55:43 +00004075 i = strlen30(zInsert);
drh2ce15c32017-07-11 13:34:40 +00004076 for(j=1; j<n; j++){
4077 memcpy(zInsert+i, ",?", 2);
4078 i += 2;
4079 }
4080 memcpy(zInsert+i, ");", 3);
4081 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
4082 if( rc ){
4083 utf8_printf(stderr, "Error %d: %s on [%s]\n",
4084 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
4085 zQuery);
4086 goto end_data_xfer;
4087 }
4088 for(k=0; k<2; k++){
4089 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4090 for(i=0; i<n; i++){
4091 switch( sqlite3_column_type(pQuery, i) ){
4092 case SQLITE_NULL: {
4093 sqlite3_bind_null(pInsert, i+1);
4094 break;
4095 }
4096 case SQLITE_INTEGER: {
4097 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
4098 break;
4099 }
4100 case SQLITE_FLOAT: {
4101 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
4102 break;
4103 }
4104 case SQLITE_TEXT: {
4105 sqlite3_bind_text(pInsert, i+1,
4106 (const char*)sqlite3_column_text(pQuery,i),
4107 -1, SQLITE_STATIC);
4108 break;
4109 }
4110 case SQLITE_BLOB: {
4111 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
4112 sqlite3_column_bytes(pQuery,i),
4113 SQLITE_STATIC);
4114 break;
4115 }
4116 }
4117 } /* End for */
4118 rc = sqlite3_step(pInsert);
4119 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
4120 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
4121 sqlite3_errmsg(newDb));
4122 }
4123 sqlite3_reset(pInsert);
4124 cnt++;
4125 if( (cnt%spinRate)==0 ){
4126 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
4127 fflush(stdout);
4128 }
4129 } /* End while */
4130 if( rc==SQLITE_DONE ) break;
4131 sqlite3_finalize(pQuery);
4132 sqlite3_free(zQuery);
4133 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
4134 zTable);
4135 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4136 if( rc ){
4137 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
4138 break;
4139 }
4140 } /* End for(k=0...) */
4141
4142end_data_xfer:
4143 sqlite3_finalize(pQuery);
4144 sqlite3_finalize(pInsert);
4145 sqlite3_free(zQuery);
4146 sqlite3_free(zInsert);
4147}
4148
4149
4150/*
4151** Try to transfer all rows of the schema that match zWhere. For
4152** each row, invoke xForEach() on the object defined by that row.
4153** If an error is encountered while moving forward through the
4154** sqlite_master table, try again moving backwards.
4155*/
4156static void tryToCloneSchema(
4157 ShellState *p,
4158 sqlite3 *newDb,
4159 const char *zWhere,
4160 void (*xForEach)(ShellState*,sqlite3*,const char*)
4161){
4162 sqlite3_stmt *pQuery = 0;
4163 char *zQuery = 0;
4164 int rc;
4165 const unsigned char *zName;
4166 const unsigned char *zSql;
4167 char *zErrMsg = 0;
4168
4169 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4170 " WHERE %s", zWhere);
4171 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4172 if( rc ){
4173 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4174 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4175 zQuery);
4176 goto end_schema_xfer;
4177 }
4178 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4179 zName = sqlite3_column_text(pQuery, 0);
4180 zSql = sqlite3_column_text(pQuery, 1);
4181 printf("%s... ", zName); fflush(stdout);
4182 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4183 if( zErrMsg ){
4184 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4185 sqlite3_free(zErrMsg);
4186 zErrMsg = 0;
4187 }
4188 if( xForEach ){
4189 xForEach(p, newDb, (const char*)zName);
4190 }
4191 printf("done\n");
4192 }
4193 if( rc!=SQLITE_DONE ){
4194 sqlite3_finalize(pQuery);
4195 sqlite3_free(zQuery);
4196 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
4197 " WHERE %s ORDER BY rowid DESC", zWhere);
4198 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
4199 if( rc ){
4200 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
4201 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
4202 zQuery);
4203 goto end_schema_xfer;
4204 }
4205 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
4206 zName = sqlite3_column_text(pQuery, 0);
4207 zSql = sqlite3_column_text(pQuery, 1);
4208 printf("%s... ", zName); fflush(stdout);
4209 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
4210 if( zErrMsg ){
4211 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
4212 sqlite3_free(zErrMsg);
4213 zErrMsg = 0;
4214 }
4215 if( xForEach ){
4216 xForEach(p, newDb, (const char*)zName);
4217 }
4218 printf("done\n");
4219 }
4220 }
4221end_schema_xfer:
4222 sqlite3_finalize(pQuery);
4223 sqlite3_free(zQuery);
4224}
4225
4226/*
4227** Open a new database file named "zNewDb". Try to recover as much information
4228** as possible out of the main database (which might be corrupt) and write it
4229** into zNewDb.
4230*/
4231static void tryToClone(ShellState *p, const char *zNewDb){
4232 int rc;
4233 sqlite3 *newDb = 0;
4234 if( access(zNewDb,0)==0 ){
4235 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
4236 return;
4237 }
4238 rc = sqlite3_open(zNewDb, &newDb);
4239 if( rc ){
4240 utf8_printf(stderr, "Cannot create output database: %s\n",
4241 sqlite3_errmsg(newDb));
4242 }else{
4243 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
4244 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
4245 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
4246 tryToCloneSchema(p, newDb, "type!='table'", 0);
4247 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
4248 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4249 }
drh9e804032018-05-18 17:11:50 +00004250 close_db(newDb);
drh2ce15c32017-07-11 13:34:40 +00004251}
4252
4253/*
drh13c20932018-01-10 21:41:55 +00004254** Change the output file back to stdout.
4255**
4256** If the p->doXdgOpen flag is set, that means the output was being
4257** redirected to a temporary file named by p->zTempFile. In that case,
4258** launch start/open/xdg-open on that temporary file.
drh2ce15c32017-07-11 13:34:40 +00004259*/
4260static void output_reset(ShellState *p){
4261 if( p->outfile[0]=='|' ){
4262#ifndef SQLITE_OMIT_POPEN
4263 pclose(p->out);
4264#endif
4265 }else{
4266 output_file_close(p->out);
drh04a28c32018-01-31 01:38:44 +00004267#ifndef SQLITE_NOHAVE_SYSTEM
drh13c20932018-01-10 21:41:55 +00004268 if( p->doXdgOpen ){
4269 const char *zXdgOpenCmd =
4270#if defined(_WIN32)
4271 "start";
4272#elif defined(__APPLE__)
4273 "open";
4274#else
4275 "xdg-open";
4276#endif
4277 char *zCmd;
4278 zCmd = sqlite3_mprintf("%s %s", zXdgOpenCmd, p->zTempFile);
drha92a01a2018-01-10 22:15:37 +00004279 if( system(zCmd) ){
4280 utf8_printf(stderr, "Failed: [%s]\n", zCmd);
4281 }
drh13c20932018-01-10 21:41:55 +00004282 sqlite3_free(zCmd);
drh3c484e82018-01-10 22:27:21 +00004283 outputModePop(p);
drh13c20932018-01-10 21:41:55 +00004284 p->doXdgOpen = 0;
4285 }
drh04a28c32018-01-31 01:38:44 +00004286#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
drh2ce15c32017-07-11 13:34:40 +00004287 }
4288 p->outfile[0] = 0;
4289 p->out = stdout;
4290}
4291
4292/*
4293** Run an SQL command and return the single integer result.
4294*/
4295static int db_int(ShellState *p, const char *zSql){
4296 sqlite3_stmt *pStmt;
4297 int res = 0;
4298 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4299 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
4300 res = sqlite3_column_int(pStmt,0);
4301 }
4302 sqlite3_finalize(pStmt);
4303 return res;
4304}
4305
4306/*
4307** Convert a 2-byte or 4-byte big-endian integer into a native integer
4308*/
4309static unsigned int get2byteInt(unsigned char *a){
4310 return (a[0]<<8) + a[1];
4311}
4312static unsigned int get4byteInt(unsigned char *a){
4313 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
4314}
4315
4316/*
4317** Implementation of the ".info" command.
4318**
4319** Return 1 on error, 2 to exit, and 0 otherwise.
4320*/
4321static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
4322 static const struct { const char *zName; int ofst; } aField[] = {
4323 { "file change counter:", 24 },
4324 { "database page count:", 28 },
4325 { "freelist page count:", 36 },
4326 { "schema cookie:", 40 },
4327 { "schema format:", 44 },
4328 { "default cache size:", 48 },
4329 { "autovacuum top root:", 52 },
4330 { "incremental vacuum:", 64 },
4331 { "text encoding:", 56 },
4332 { "user version:", 60 },
4333 { "application id:", 68 },
4334 { "software version:", 96 },
4335 };
4336 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4337 { "number of tables:",
4338 "SELECT count(*) FROM %s WHERE type='table'" },
4339 { "number of indexes:",
4340 "SELECT count(*) FROM %s WHERE type='index'" },
4341 { "number of triggers:",
4342 "SELECT count(*) FROM %s WHERE type='trigger'" },
4343 { "number of views:",
4344 "SELECT count(*) FROM %s WHERE type='view'" },
4345 { "schema size:",
4346 "SELECT total(length(sql)) FROM %s" },
4347 };
drh2ce15c32017-07-11 13:34:40 +00004348 int i;
4349 char *zSchemaTab;
4350 char *zDb = nArg>=2 ? azArg[1] : "main";
drh512e6c32017-10-11 17:51:08 +00004351 sqlite3_stmt *pStmt = 0;
drh2ce15c32017-07-11 13:34:40 +00004352 unsigned char aHdr[100];
4353 open_db(p, 0);
4354 if( p->db==0 ) return 1;
drh512e6c32017-10-11 17:51:08 +00004355 sqlite3_prepare_v2(p->db,"SELECT data FROM sqlite_dbpage(?1) WHERE pgno=1",
4356 -1, &pStmt, 0);
4357 sqlite3_bind_text(pStmt, 1, zDb, -1, SQLITE_STATIC);
4358 if( sqlite3_step(pStmt)==SQLITE_ROW
4359 && sqlite3_column_bytes(pStmt,0)>100
4360 ){
4361 memcpy(aHdr, sqlite3_column_blob(pStmt,0), 100);
4362 sqlite3_finalize(pStmt);
4363 }else{
drh2ce15c32017-07-11 13:34:40 +00004364 raw_printf(stderr, "unable to read database header\n");
drh512e6c32017-10-11 17:51:08 +00004365 sqlite3_finalize(pStmt);
drh2ce15c32017-07-11 13:34:40 +00004366 return 1;
4367 }
4368 i = get2byteInt(aHdr+16);
4369 if( i==1 ) i = 65536;
4370 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4371 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4372 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
4373 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
4374 for(i=0; i<ArraySize(aField); i++){
4375 int ofst = aField[i].ofst;
4376 unsigned int val = get4byteInt(aHdr + ofst);
4377 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
4378 switch( ofst ){
4379 case 56: {
4380 if( val==1 ) raw_printf(p->out, " (utf8)");
4381 if( val==2 ) raw_printf(p->out, " (utf16le)");
4382 if( val==3 ) raw_printf(p->out, " (utf16be)");
4383 }
4384 }
4385 raw_printf(p->out, "\n");
4386 }
4387 if( zDb==0 ){
4388 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
4389 }else if( strcmp(zDb,"temp")==0 ){
4390 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
4391 }else{
4392 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
4393 }
4394 for(i=0; i<ArraySize(aQuery); i++){
4395 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
4396 int val = db_int(p, zSql);
4397 sqlite3_free(zSql);
4398 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
4399 }
4400 sqlite3_free(zSchemaTab);
4401 return 0;
4402}
4403
4404/*
4405** Print the current sqlite3_errmsg() value to stderr and return 1.
4406*/
4407static int shellDatabaseError(sqlite3 *db){
4408 const char *zErr = sqlite3_errmsg(db);
4409 utf8_printf(stderr, "Error: %s\n", zErr);
4410 return 1;
4411}
4412
4413/*
drh2ce15c32017-07-11 13:34:40 +00004414** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
4415** if they match and FALSE (0) if they do not match.
4416**
4417** Globbing rules:
4418**
4419** '*' Matches any sequence of zero or more characters.
4420**
4421** '?' Matches exactly one character.
4422**
4423** [...] Matches one character from the enclosed list of
4424** characters.
4425**
4426** [^...] Matches one character not in the enclosed list.
4427**
4428** '#' Matches any sequence of one or more digits with an
4429** optional + or - sign in front
4430**
4431** ' ' Any span of whitespace matches any other span of
4432** whitespace.
4433**
4434** Extra whitespace at the end of z[] is ignored.
4435*/
4436static int testcase_glob(const char *zGlob, const char *z){
4437 int c, c2;
4438 int invert;
4439 int seen;
4440
4441 while( (c = (*(zGlob++)))!=0 ){
4442 if( IsSpace(c) ){
4443 if( !IsSpace(*z) ) return 0;
4444 while( IsSpace(*zGlob) ) zGlob++;
4445 while( IsSpace(*z) ) z++;
4446 }else if( c=='*' ){
4447 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4448 if( c=='?' && (*(z++))==0 ) return 0;
4449 }
4450 if( c==0 ){
4451 return 1;
4452 }else if( c=='[' ){
4453 while( *z && testcase_glob(zGlob-1,z)==0 ){
4454 z++;
4455 }
4456 return (*z)!=0;
4457 }
4458 while( (c2 = (*(z++)))!=0 ){
4459 while( c2!=c ){
4460 c2 = *(z++);
4461 if( c2==0 ) return 0;
4462 }
4463 if( testcase_glob(zGlob,z) ) return 1;
4464 }
4465 return 0;
4466 }else if( c=='?' ){
4467 if( (*(z++))==0 ) return 0;
4468 }else if( c=='[' ){
4469 int prior_c = 0;
4470 seen = 0;
4471 invert = 0;
4472 c = *(z++);
4473 if( c==0 ) return 0;
4474 c2 = *(zGlob++);
4475 if( c2=='^' ){
4476 invert = 1;
4477 c2 = *(zGlob++);
4478 }
4479 if( c2==']' ){
4480 if( c==']' ) seen = 1;
4481 c2 = *(zGlob++);
4482 }
4483 while( c2 && c2!=']' ){
4484 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4485 c2 = *(zGlob++);
4486 if( c>=prior_c && c<=c2 ) seen = 1;
4487 prior_c = 0;
4488 }else{
4489 if( c==c2 ){
4490 seen = 1;
4491 }
4492 prior_c = c2;
4493 }
4494 c2 = *(zGlob++);
4495 }
4496 if( c2==0 || (seen ^ invert)==0 ) return 0;
4497 }else if( c=='#' ){
4498 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4499 if( !IsDigit(z[0]) ) return 0;
4500 z++;
4501 while( IsDigit(z[0]) ){ z++; }
4502 }else{
4503 if( c!=(*(z++)) ) return 0;
4504 }
4505 }
4506 while( IsSpace(*z) ){ z++; }
4507 return *z==0;
4508}
4509
4510
4511/*
4512** Compare the string as a command-line option with either one or two
4513** initial "-" characters.
4514*/
4515static int optionMatch(const char *zStr, const char *zOpt){
4516 if( zStr[0]!='-' ) return 0;
4517 zStr++;
4518 if( zStr[0]=='-' ) zStr++;
4519 return strcmp(zStr, zOpt)==0;
4520}
4521
4522/*
4523** Delete a file.
4524*/
4525int shellDeleteFile(const char *zFilename){
4526 int rc;
4527#ifdef _WIN32
4528 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
4529 rc = _wunlink(z);
4530 sqlite3_free(z);
4531#else
4532 rc = unlink(zFilename);
4533#endif
4534 return rc;
4535}
4536
drh13c20932018-01-10 21:41:55 +00004537/*
4538** Try to delete the temporary file (if there is one) and free the
4539** memory used to hold the name of the temp file.
4540*/
4541static void clearTempFile(ShellState *p){
4542 if( p->zTempFile==0 ) return;
drh536c3452018-01-11 00:38:39 +00004543 if( p->doXdgOpen ) return;
drh13c20932018-01-10 21:41:55 +00004544 if( shellDeleteFile(p->zTempFile) ) return;
4545 sqlite3_free(p->zTempFile);
4546 p->zTempFile = 0;
4547}
4548
4549/*
4550** Create a new temp file name with the given suffix.
4551*/
4552static void newTempFile(ShellState *p, const char *zSuffix){
4553 clearTempFile(p);
4554 sqlite3_free(p->zTempFile);
4555 p->zTempFile = 0;
drh7f3bf8a2018-01-10 21:50:08 +00004556 if( p->db ){
4557 sqlite3_file_control(p->db, 0, SQLITE_FCNTL_TEMPFILENAME, &p->zTempFile);
4558 }
drh13c20932018-01-10 21:41:55 +00004559 if( p->zTempFile==0 ){
4560 sqlite3_uint64 r;
4561 sqlite3_randomness(sizeof(r), &r);
4562 p->zTempFile = sqlite3_mprintf("temp%llx.%s", r, zSuffix);
4563 }else{
4564 p->zTempFile = sqlite3_mprintf("%z.%s", p->zTempFile, zSuffix);
4565 }
4566 if( p->zTempFile==0 ){
4567 raw_printf(stderr, "out of memory\n");
4568 exit(1);
4569 }
4570}
4571
drh2ce15c32017-07-11 13:34:40 +00004572
4573/*
4574** The implementation of SQL scalar function fkey_collate_clause(), used
4575** by the ".lint fkey-indexes" command. This scalar function is always
4576** called with four arguments - the parent table name, the parent column name,
4577** the child table name and the child column name.
4578**
4579** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4580**
4581** If either of the named tables or columns do not exist, this function
4582** returns an empty string. An empty string is also returned if both tables
4583** and columns exist but have the same default collation sequence. Or,
4584** if both exist but the default collation sequences are different, this
4585** function returns the string " COLLATE <parent-collation>", where
4586** <parent-collation> is the default collation sequence of the parent column.
4587*/
4588static void shellFkeyCollateClause(
4589 sqlite3_context *pCtx,
4590 int nVal,
4591 sqlite3_value **apVal
4592){
4593 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4594 const char *zParent;
4595 const char *zParentCol;
4596 const char *zParentSeq;
4597 const char *zChild;
4598 const char *zChildCol;
4599 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
4600 int rc;
4601
4602 assert( nVal==4 );
4603 zParent = (const char*)sqlite3_value_text(apVal[0]);
4604 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4605 zChild = (const char*)sqlite3_value_text(apVal[2]);
4606 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4607
4608 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4609 rc = sqlite3_table_column_metadata(
4610 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4611 );
4612 if( rc==SQLITE_OK ){
4613 rc = sqlite3_table_column_metadata(
4614 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4615 );
4616 }
4617
4618 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4619 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4620 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4621 sqlite3_free(z);
4622 }
4623}
4624
4625
4626/*
4627** The implementation of dot-command ".lint fkey-indexes".
4628*/
4629static int lintFkeyIndexes(
4630 ShellState *pState, /* Current shell tool state */
4631 char **azArg, /* Array of arguments passed to dot command */
4632 int nArg /* Number of entries in azArg[] */
4633){
4634 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4635 FILE *out = pState->out; /* Stream to write non-error output to */
4636 int bVerbose = 0; /* If -verbose is present */
4637 int bGroupByParent = 0; /* If -groupbyparent is present */
4638 int i; /* To iterate through azArg[] */
4639 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4640 int rc; /* Return code */
4641 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
4642
4643 /*
4644 ** This SELECT statement returns one row for each foreign key constraint
4645 ** in the schema of the main database. The column values are:
4646 **
4647 ** 0. The text of an SQL statement similar to:
4648 **
danf9679312017-12-01 18:40:18 +00004649 ** "EXPLAIN QUERY PLAN SELECT 1 FROM child_table WHERE child_key=?"
drh2ce15c32017-07-11 13:34:40 +00004650 **
danf9679312017-12-01 18:40:18 +00004651 ** This SELECT is similar to the one that the foreign keys implementation
4652 ** needs to run internally on child tables. If there is an index that can
drh2ce15c32017-07-11 13:34:40 +00004653 ** be used to optimize this query, then it can also be used by the FK
4654 ** implementation to optimize DELETE or UPDATE statements on the parent
4655 ** table.
4656 **
4657 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4658 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4659 ** contains an index that can be used to optimize the query.
4660 **
4661 ** 2. Human readable text that describes the child table and columns. e.g.
4662 **
4663 ** "child_table(child_key1, child_key2)"
4664 **
4665 ** 3. Human readable text that describes the parent table and columns. e.g.
4666 **
4667 ** "parent_table(parent_key1, parent_key2)"
4668 **
4669 ** 4. A full CREATE INDEX statement for an index that could be used to
4670 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4671 **
4672 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4673 **
4674 ** 5. The name of the parent table.
4675 **
4676 ** These six values are used by the C logic below to generate the report.
4677 */
4678 const char *zSql =
4679 "SELECT "
danf9679312017-12-01 18:40:18 +00004680 " 'EXPLAIN QUERY PLAN SELECT 1 FROM ' || quote(s.name) || ' WHERE '"
drh2ce15c32017-07-11 13:34:40 +00004681 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4682 " || fkey_collate_clause("
4683 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
4684 ", "
4685 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
4686 " || group_concat('*=?', ' AND ') || ')'"
4687 ", "
4688 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
4689 ", "
4690 " f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
4691 ", "
4692 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4693 " || ' ON ' || quote(s.name) || '('"
4694 " || group_concat(quote(f.[from]) ||"
4695 " fkey_collate_clause("
4696 " f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
4697 " || ');'"
4698 ", "
4699 " f.[table] "
4700 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4701 "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
4702 "GROUP BY s.name, f.id "
4703 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
4704 ;
4705 const char *zGlobIPK = "SEARCH TABLE * USING INTEGER PRIMARY KEY (rowid=?)";
4706
4707 for(i=2; i<nArg; i++){
drhaf2770f2018-01-05 14:55:43 +00004708 int n = strlen30(azArg[i]);
drh2ce15c32017-07-11 13:34:40 +00004709 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4710 bVerbose = 1;
4711 }
4712 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4713 bGroupByParent = 1;
4714 zIndent = " ";
4715 }
4716 else{
4717 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4718 azArg[0], azArg[1]
4719 );
4720 return SQLITE_ERROR;
4721 }
4722 }
4723
4724 /* Register the fkey_collate_clause() SQL function */
4725 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4726 0, shellFkeyCollateClause, 0, 0
4727 );
4728
4729
4730 if( rc==SQLITE_OK ){
4731 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4732 }
4733 if( rc==SQLITE_OK ){
4734 sqlite3_bind_int(pSql, 1, bGroupByParent);
4735 }
4736
4737 if( rc==SQLITE_OK ){
4738 int rc2;
4739 char *zPrev = 0;
4740 while( SQLITE_ROW==sqlite3_step(pSql) ){
4741 int res = -1;
4742 sqlite3_stmt *pExplain = 0;
4743 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4744 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4745 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4746 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4747 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
4748 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
4749
4750 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4751 if( rc!=SQLITE_OK ) break;
4752 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4753 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4754 res = (
4755 0==sqlite3_strglob(zGlob, zPlan)
4756 || 0==sqlite3_strglob(zGlobIPK, zPlan)
4757 );
4758 }
4759 rc = sqlite3_finalize(pExplain);
4760 if( rc!=SQLITE_OK ) break;
4761
4762 if( res<0 ){
4763 raw_printf(stderr, "Error: internal error");
4764 break;
4765 }else{
4766 if( bGroupByParent
4767 && (bVerbose || res==0)
4768 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4769 ){
4770 raw_printf(out, "-- Parent table %s\n", zParent);
4771 sqlite3_free(zPrev);
4772 zPrev = sqlite3_mprintf("%s", zParent);
4773 }
4774
4775 if( res==0 ){
4776 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4777 }else if( bVerbose ){
4778 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4779 zIndent, zFrom, zTarget
4780 );
4781 }
4782 }
4783 }
4784 sqlite3_free(zPrev);
4785
4786 if( rc!=SQLITE_OK ){
4787 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4788 }
4789
4790 rc2 = sqlite3_finalize(pSql);
4791 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4792 rc = rc2;
4793 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4794 }
4795 }else{
4796 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4797 }
4798
4799 return rc;
4800}
4801
4802/*
4803** Implementation of ".lint" dot command.
4804*/
4805static int lintDotCommand(
4806 ShellState *pState, /* Current shell tool state */
4807 char **azArg, /* Array of arguments passed to dot command */
4808 int nArg /* Number of entries in azArg[] */
4809){
4810 int n;
drhaf2770f2018-01-05 14:55:43 +00004811 n = (nArg>=2 ? strlen30(azArg[1]) : 0);
drh2ce15c32017-07-11 13:34:40 +00004812 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4813 return lintFkeyIndexes(pState, azArg, nArg);
4814
4815 usage:
4816 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4817 raw_printf(stderr, "Where sub-commands are:\n");
4818 raw_printf(stderr, " fkey-indexes\n");
4819 return SQLITE_ERROR;
4820}
4821
drhe37c0e12018-01-06 19:19:50 +00004822#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
4823/*********************************************************************************
4824** The ".archive" or ".ar" command.
4825*/
danfd0245d2017-12-07 15:44:29 +00004826static void shellPrepare(
dand4b56e52017-12-12 20:04:59 +00004827 sqlite3 *db,
danfd0245d2017-12-07 15:44:29 +00004828 int *pRc,
4829 const char *zSql,
4830 sqlite3_stmt **ppStmt
4831){
4832 *ppStmt = 0;
4833 if( *pRc==SQLITE_OK ){
dand4b56e52017-12-12 20:04:59 +00004834 int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0);
danfd0245d2017-12-07 15:44:29 +00004835 if( rc!=SQLITE_OK ){
4836 raw_printf(stderr, "sql error: %s (%d)\n",
dand4b56e52017-12-12 20:04:59 +00004837 sqlite3_errmsg(db), sqlite3_errcode(db)
danfd0245d2017-12-07 15:44:29 +00004838 );
4839 *pRc = rc;
4840 }
4841 }
4842}
4843
danac15e2d2017-12-14 19:15:07 +00004844static void shellPreparePrintf(
dan3f67ddf2017-12-13 20:04:53 +00004845 sqlite3 *db,
4846 int *pRc,
danac15e2d2017-12-14 19:15:07 +00004847 sqlite3_stmt **ppStmt,
4848 const char *zFmt,
4849 ...
dan3f67ddf2017-12-13 20:04:53 +00004850){
danac15e2d2017-12-14 19:15:07 +00004851 *ppStmt = 0;
4852 if( *pRc==SQLITE_OK ){
4853 va_list ap;
4854 char *z;
4855 va_start(ap, zFmt);
4856 z = sqlite3_vmprintf(zFmt, ap);
dan3f67ddf2017-12-13 20:04:53 +00004857 if( z==0 ){
4858 *pRc = SQLITE_NOMEM;
4859 }else{
4860 shellPrepare(db, pRc, z, ppStmt);
4861 sqlite3_free(z);
4862 }
dan3f67ddf2017-12-13 20:04:53 +00004863 }
4864}
4865
danfd0245d2017-12-07 15:44:29 +00004866static void shellFinalize(
4867 int *pRc,
4868 sqlite3_stmt *pStmt
4869){
dan25c12182017-12-07 21:03:33 +00004870 if( pStmt ){
4871 sqlite3 *db = sqlite3_db_handle(pStmt);
4872 int rc = sqlite3_finalize(pStmt);
4873 if( *pRc==SQLITE_OK ){
4874 if( rc!=SQLITE_OK ){
4875 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
4876 }
4877 *pRc = rc;
4878 }
4879 }
danfd0245d2017-12-07 15:44:29 +00004880}
4881
4882static void shellReset(
4883 int *pRc,
4884 sqlite3_stmt *pStmt
4885){
4886 int rc = sqlite3_reset(pStmt);
dan5a78b812017-12-27 18:54:11 +00004887 if( *pRc==SQLITE_OK ){
4888 if( rc!=SQLITE_OK ){
4889 sqlite3 *db = sqlite3_db_handle(pStmt);
4890 raw_printf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
4891 }
4892 *pRc = rc;
4893 }
danfd0245d2017-12-07 15:44:29 +00004894}
drhe37c0e12018-01-06 19:19:50 +00004895/*
dan88be0202017-12-09 17:58:02 +00004896** Structure representing a single ".ar" command.
4897*/
4898typedef struct ArCommand ArCommand;
4899struct ArCommand {
drhb376b3d2018-01-10 13:11:51 +00004900 u8 eCmd; /* An AR_CMD_* value */
4901 u8 bVerbose; /* True if --verbose */
drha5676c42018-01-10 15:17:34 +00004902 u8 bZip; /* True if the archive is a ZIP */
drhb376b3d2018-01-10 13:11:51 +00004903 u8 bDryRun; /* True if --dry-run */
drha5676c42018-01-10 15:17:34 +00004904 u8 bAppend; /* True if --append */
drhd0f9cdc2018-05-17 14:09:06 +00004905 u8 fromCmdLine; /* Run from -A instead of .archive */
drhb376b3d2018-01-10 13:11:51 +00004906 int nArg; /* Number of command arguments */
drha5676c42018-01-10 15:17:34 +00004907 char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */
dan88be0202017-12-09 17:58:02 +00004908 const char *zFile; /* --file argument, or NULL */
4909 const char *zDir; /* --directory argument, or NULL */
dan88be0202017-12-09 17:58:02 +00004910 char **azArg; /* Array of command arguments */
drhb376b3d2018-01-10 13:11:51 +00004911 ShellState *p; /* Shell state */
4912 sqlite3 *db; /* Database containing the archive */
dan88be0202017-12-09 17:58:02 +00004913};
4914
4915/*
4916** Print a usage message for the .ar command to stderr and return SQLITE_ERROR.
4917*/
dan0d0547f2017-12-14 15:40:42 +00004918static int arUsage(FILE *f){
4919 raw_printf(f,
4920"\n"
4921"Usage: .ar [OPTION...] [FILE...]\n"
4922"The .ar command manages sqlar archives.\n"
4923"\n"
4924"Examples:\n"
4925" .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar\n"
4926" .ar -tf archive.sar # List members of archive.sar\n"
4927" .ar -xvf archive.sar # Verbosely extract files from archive.sar\n"
4928"\n"
4929"Each command line must feature exactly one command option:\n"
4930" -c, --create Create a new archive\n"
4931" -u, --update Update or add files to an existing archive\n"
4932" -t, --list List contents of archive\n"
4933" -x, --extract Extract files from archive\n"
4934"\n"
4935"And zero or more optional options:\n"
4936" -v, --verbose Print each filename as it is processed\n"
4937" -f FILE, --file FILE Operate on archive FILE (default is current db)\n"
drhca7733b2018-01-10 18:09:20 +00004938" -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS\n"
dan0d0547f2017-12-14 15:40:42 +00004939" -C DIR, --directory DIR Change to directory DIR to read/extract files\n"
drhb376b3d2018-01-10 13:11:51 +00004940" -n, --dryrun Show the SQL that would have occurred\n"
dan0d0547f2017-12-14 15:40:42 +00004941"\n"
4942"See also: http://sqlite.org/cli.html#sqlar_archive_support\n"
4943"\n"
4944);
4945 return SQLITE_ERROR;
4946}
4947
4948/*
4949** Print an error message for the .ar command to stderr and return
4950** SQLITE_ERROR.
4951*/
drhd0f9cdc2018-05-17 14:09:06 +00004952static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){
dan0d0547f2017-12-14 15:40:42 +00004953 va_list ap;
4954 char *z;
4955 va_start(ap, zFmt);
4956 z = sqlite3_vmprintf(zFmt, ap);
4957 va_end(ap);
drhd0f9cdc2018-05-17 14:09:06 +00004958 utf8_printf(stderr, "Error: %s\n", z);
4959 if( pAr->fromCmdLine ){
4960 utf8_printf(stderr, "Use \"-A\" for more help\n");
4961 }else{
4962 utf8_printf(stderr, "Use \".archive --help\" for more help\n");
4963 }
dan0d0547f2017-12-14 15:40:42 +00004964 sqlite3_free(z);
dan88be0202017-12-09 17:58:02 +00004965 return SQLITE_ERROR;
4966}
4967
4968/*
4969** Values for ArCommand.eCmd.
4970*/
dand4b56e52017-12-12 20:04:59 +00004971#define AR_CMD_CREATE 1
4972#define AR_CMD_EXTRACT 2
4973#define AR_CMD_LIST 3
4974#define AR_CMD_UPDATE 4
dan0d0547f2017-12-14 15:40:42 +00004975#define AR_CMD_HELP 5
dand4b56e52017-12-12 20:04:59 +00004976
4977/*
4978** Other (non-command) switches.
4979*/
drhb376b3d2018-01-10 13:11:51 +00004980#define AR_SWITCH_VERBOSE 6
4981#define AR_SWITCH_FILE 7
4982#define AR_SWITCH_DIRECTORY 8
drha5676c42018-01-10 15:17:34 +00004983#define AR_SWITCH_APPEND 9
drhb376b3d2018-01-10 13:11:51 +00004984#define AR_SWITCH_DRYRUN 10
dand4b56e52017-12-12 20:04:59 +00004985
4986static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){
4987 switch( eSwitch ){
4988 case AR_CMD_CREATE:
4989 case AR_CMD_EXTRACT:
4990 case AR_CMD_LIST:
4991 case AR_CMD_UPDATE:
dan0d0547f2017-12-14 15:40:42 +00004992 case AR_CMD_HELP:
4993 if( pAr->eCmd ){
drhd0f9cdc2018-05-17 14:09:06 +00004994 return arErrorMsg(pAr, "multiple command options");
dan0d0547f2017-12-14 15:40:42 +00004995 }
dand4b56e52017-12-12 20:04:59 +00004996 pAr->eCmd = eSwitch;
4997 break;
4998
drhb376b3d2018-01-10 13:11:51 +00004999 case AR_SWITCH_DRYRUN:
5000 pAr->bDryRun = 1;
5001 break;
dand4b56e52017-12-12 20:04:59 +00005002 case AR_SWITCH_VERBOSE:
5003 pAr->bVerbose = 1;
5004 break;
drha5676c42018-01-10 15:17:34 +00005005 case AR_SWITCH_APPEND:
5006 pAr->bAppend = 1;
drhca7733b2018-01-10 18:09:20 +00005007 /* Fall thru into --file */
dand4b56e52017-12-12 20:04:59 +00005008 case AR_SWITCH_FILE:
5009 pAr->zFile = zArg;
5010 break;
5011 case AR_SWITCH_DIRECTORY:
5012 pAr->zDir = zArg;
5013 break;
5014 }
5015
5016 return SQLITE_OK;
5017}
dan88be0202017-12-09 17:58:02 +00005018
5019/*
5020** Parse the command line for an ".ar" command. The results are written into
5021** structure (*pAr). SQLITE_OK is returned if the command line is parsed
5022** successfully, otherwise an error message is written to stderr and
5023** SQLITE_ERROR returned.
5024*/
5025static int arParseCommand(
5026 char **azArg, /* Array of arguments passed to dot command */
5027 int nArg, /* Number of entries in azArg[] */
5028 ArCommand *pAr /* Populate this object */
5029){
dand4b56e52017-12-12 20:04:59 +00005030 struct ArSwitch {
dand4b56e52017-12-12 20:04:59 +00005031 const char *zLong;
drhb376b3d2018-01-10 13:11:51 +00005032 char cShort;
5033 u8 eSwitch;
5034 u8 bArg;
dand4b56e52017-12-12 20:04:59 +00005035 } aSwitch[] = {
drhb376b3d2018-01-10 13:11:51 +00005036 { "create", 'c', AR_CMD_CREATE, 0 },
5037 { "extract", 'x', AR_CMD_EXTRACT, 0 },
5038 { "list", 't', AR_CMD_LIST, 0 },
5039 { "update", 'u', AR_CMD_UPDATE, 0 },
5040 { "help", 'h', AR_CMD_HELP, 0 },
5041 { "verbose", 'v', AR_SWITCH_VERBOSE, 0 },
5042 { "file", 'f', AR_SWITCH_FILE, 1 },
drhca7733b2018-01-10 18:09:20 +00005043 { "append", 'a', AR_SWITCH_APPEND, 1 },
drhb376b3d2018-01-10 13:11:51 +00005044 { "directory", 'C', AR_SWITCH_DIRECTORY, 1 },
drhb376b3d2018-01-10 13:11:51 +00005045 { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 },
dand4b56e52017-12-12 20:04:59 +00005046 };
5047 int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch);
5048 struct ArSwitch *pEnd = &aSwitch[nSwitch];
5049
dan88be0202017-12-09 17:58:02 +00005050 if( nArg<=1 ){
dan0d0547f2017-12-14 15:40:42 +00005051 return arUsage(stderr);
dan88be0202017-12-09 17:58:02 +00005052 }else{
5053 char *z = azArg[1];
dan88be0202017-12-09 17:58:02 +00005054 if( z[0]!='-' ){
5055 /* Traditional style [tar] invocation */
5056 int i;
5057 int iArg = 2;
5058 for(i=0; z[i]; i++){
dand4b56e52017-12-12 20:04:59 +00005059 const char *zArg = 0;
5060 struct ArSwitch *pOpt;
5061 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5062 if( z[i]==pOpt->cShort ) break;
dan88be0202017-12-09 17:58:02 +00005063 }
dan0d0547f2017-12-14 15:40:42 +00005064 if( pOpt==pEnd ){
drhd0f9cdc2018-05-17 14:09:06 +00005065 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
dan0d0547f2017-12-14 15:40:42 +00005066 }
dand4b56e52017-12-12 20:04:59 +00005067 if( pOpt->bArg ){
dan0d0547f2017-12-14 15:40:42 +00005068 if( iArg>=nArg ){
drhd0f9cdc2018-05-17 14:09:06 +00005069 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
dan0d0547f2017-12-14 15:40:42 +00005070 }
dand4b56e52017-12-12 20:04:59 +00005071 zArg = azArg[iArg++];
5072 }
5073 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
dan88be0202017-12-09 17:58:02 +00005074 }
dan88be0202017-12-09 17:58:02 +00005075 pAr->nArg = nArg-iArg;
5076 if( pAr->nArg>0 ){
5077 pAr->azArg = &azArg[iArg];
5078 }
dand4b56e52017-12-12 20:04:59 +00005079 }else{
5080 /* Non-traditional invocation */
5081 int iArg;
5082 for(iArg=1; iArg<nArg; iArg++){
5083 int n;
5084 z = azArg[iArg];
5085 if( z[0]!='-' ){
5086 /* All remaining command line words are command arguments. */
5087 pAr->azArg = &azArg[iArg];
5088 pAr->nArg = nArg-iArg;
5089 break;
5090 }
drhaf2770f2018-01-05 14:55:43 +00005091 n = strlen30(z);
dand4b56e52017-12-12 20:04:59 +00005092
5093 if( z[1]!='-' ){
5094 int i;
5095 /* One or more short options */
5096 for(i=1; i<n; i++){
5097 const char *zArg = 0;
5098 struct ArSwitch *pOpt;
5099 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5100 if( z[i]==pOpt->cShort ) break;
5101 }
dan0d0547f2017-12-14 15:40:42 +00005102 if( pOpt==pEnd ){
drhd0f9cdc2018-05-17 14:09:06 +00005103 return arErrorMsg(pAr, "unrecognized option: %c", z[i]);
dan0d0547f2017-12-14 15:40:42 +00005104 }
dand4b56e52017-12-12 20:04:59 +00005105 if( pOpt->bArg ){
5106 if( i<(n-1) ){
5107 zArg = &z[i+1];
5108 i = n;
5109 }else{
dan0d0547f2017-12-14 15:40:42 +00005110 if( iArg>=(nArg-1) ){
drhd0f9cdc2018-05-17 14:09:06 +00005111 return arErrorMsg(pAr, "option requires an argument: %c",z[i]);
dan0d0547f2017-12-14 15:40:42 +00005112 }
dand4b56e52017-12-12 20:04:59 +00005113 zArg = azArg[++iArg];
5114 }
5115 }
5116 if( arProcessSwitch(pAr, pOpt->eSwitch, zArg) ) return SQLITE_ERROR;
5117 }
5118 }else if( z[2]=='\0' ){
5119 /* A -- option, indicating that all remaining command line words
5120 ** are command arguments. */
5121 pAr->azArg = &azArg[iArg+1];
5122 pAr->nArg = nArg-iArg-1;
5123 break;
5124 }else{
5125 /* A long option */
5126 const char *zArg = 0; /* Argument for option, if any */
5127 struct ArSwitch *pMatch = 0; /* Matching option */
5128 struct ArSwitch *pOpt; /* Iterator */
5129 for(pOpt=&aSwitch[0]; pOpt<pEnd; pOpt++){
5130 const char *zLong = pOpt->zLong;
drhaf2770f2018-01-05 14:55:43 +00005131 if( (n-2)<=strlen30(zLong) && 0==memcmp(&z[2], zLong, n-2) ){
dand4b56e52017-12-12 20:04:59 +00005132 if( pMatch ){
drhd0f9cdc2018-05-17 14:09:06 +00005133 return arErrorMsg(pAr, "ambiguous option: %s",z);
dand4b56e52017-12-12 20:04:59 +00005134 }else{
5135 pMatch = pOpt;
5136 }
5137 }
5138 }
5139
5140 if( pMatch==0 ){
drhd0f9cdc2018-05-17 14:09:06 +00005141 return arErrorMsg(pAr, "unrecognized option: %s", z);
dand4b56e52017-12-12 20:04:59 +00005142 }
5143 if( pMatch->bArg ){
dan0d0547f2017-12-14 15:40:42 +00005144 if( iArg>=(nArg-1) ){
drhd0f9cdc2018-05-17 14:09:06 +00005145 return arErrorMsg(pAr, "option requires an argument: %s", z);
dan0d0547f2017-12-14 15:40:42 +00005146 }
dand4b56e52017-12-12 20:04:59 +00005147 zArg = azArg[++iArg];
5148 }
5149 if( arProcessSwitch(pAr, pMatch->eSwitch, zArg) ) return SQLITE_ERROR;
5150 }
5151 }
dan88be0202017-12-09 17:58:02 +00005152 }
5153 }
5154
5155 return SQLITE_OK;
5156}
5157
5158/*
dan3f67ddf2017-12-13 20:04:53 +00005159** This function assumes that all arguments within the ArCommand.azArg[]
5160** array refer to archive members, as for the --extract or --list commands.
5161** It checks that each of them are present. If any specified file is not
5162** present in the archive, an error is printed to stderr and an error
5163** code returned. Otherwise, if all specified arguments are present in
5164** the archive, SQLITE_OK is returned.
5165**
5166** This function strips any trailing '/' characters from each argument.
5167** This is consistent with the way the [tar] command seems to work on
5168** Linux.
5169*/
drhb376b3d2018-01-10 13:11:51 +00005170static int arCheckEntries(ArCommand *pAr){
dan3f67ddf2017-12-13 20:04:53 +00005171 int rc = SQLITE_OK;
5172 if( pAr->nArg ){
drhb376b3d2018-01-10 13:11:51 +00005173 int i, j;
dan3f67ddf2017-12-13 20:04:53 +00005174 sqlite3_stmt *pTest = 0;
5175
drhb376b3d2018-01-10 13:11:51 +00005176 shellPreparePrintf(pAr->db, &rc, &pTest,
5177 "SELECT name FROM %s WHERE name=$name",
5178 pAr->zSrcTable
dan5a78b812017-12-27 18:54:11 +00005179 );
drhb376b3d2018-01-10 13:11:51 +00005180 j = sqlite3_bind_parameter_index(pTest, "$name");
dan3f67ddf2017-12-13 20:04:53 +00005181 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
5182 char *z = pAr->azArg[i];
drhaf2770f2018-01-05 14:55:43 +00005183 int n = strlen30(z);
dan3f67ddf2017-12-13 20:04:53 +00005184 int bOk = 0;
5185 while( n>0 && z[n-1]=='/' ) n--;
5186 z[n] = '\0';
drhb376b3d2018-01-10 13:11:51 +00005187 sqlite3_bind_text(pTest, j, z, -1, SQLITE_STATIC);
dan3f67ddf2017-12-13 20:04:53 +00005188 if( SQLITE_ROW==sqlite3_step(pTest) ){
5189 bOk = 1;
5190 }
5191 shellReset(&rc, pTest);
5192 if( rc==SQLITE_OK && bOk==0 ){
drhb376b3d2018-01-10 13:11:51 +00005193 utf8_printf(stderr, "not found in archive: %s\n", z);
dan3f67ddf2017-12-13 20:04:53 +00005194 rc = SQLITE_ERROR;
5195 }
5196 }
5197 shellFinalize(&rc, pTest);
5198 }
dan3f67ddf2017-12-13 20:04:53 +00005199 return rc;
5200}
5201
5202/*
5203** Format a WHERE clause that can be used against the "sqlar" table to
5204** identify all archive members that match the command arguments held
5205** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning.
5206** The caller is responsible for eventually calling sqlite3_free() on
5207** any non-NULL (*pzWhere) value.
5208*/
5209static void arWhereClause(
5210 int *pRc,
5211 ArCommand *pAr,
danac15e2d2017-12-14 19:15:07 +00005212 char **pzWhere /* OUT: New WHERE clause */
dan3f67ddf2017-12-13 20:04:53 +00005213){
5214 char *zWhere = 0;
5215 if( *pRc==SQLITE_OK ){
danac15e2d2017-12-14 19:15:07 +00005216 if( pAr->nArg==0 ){
5217 zWhere = sqlite3_mprintf("1");
5218 }else{
5219 int i;
5220 const char *zSep = "";
5221 for(i=0; i<pAr->nArg; i++){
5222 const char *z = pAr->azArg[i];
5223 zWhere = sqlite3_mprintf(
drhb376b3d2018-01-10 13:11:51 +00005224 "%z%s name = '%q' OR substr(name,1,%d) = '%q/'",
5225 zWhere, zSep, z, strlen30(z)+1, z
5226 );
danac15e2d2017-12-14 19:15:07 +00005227 if( zWhere==0 ){
5228 *pRc = SQLITE_NOMEM;
5229 break;
5230 }
5231 zSep = " OR ";
dan3f67ddf2017-12-13 20:04:53 +00005232 }
dan3f67ddf2017-12-13 20:04:53 +00005233 }
5234 }
5235 *pzWhere = zWhere;
5236}
5237
5238/*
dan88be0202017-12-09 17:58:02 +00005239** Implementation of .ar "lisT" command.
5240*/
drhb376b3d2018-01-10 13:11:51 +00005241static int arListCommand(ArCommand *pAr){
danb5090e42017-12-27 21:13:21 +00005242 const char *zSql = "SELECT %s FROM %s WHERE %s";
danb5090e42017-12-27 21:13:21 +00005243 const char *azCols[] = {
5244 "name",
drh410cad92018-01-10 17:19:16 +00005245 "lsmode(mode), sz, datetime(mtime, 'unixepoch'), name"
danb5090e42017-12-27 21:13:21 +00005246 };
dan5a78b812017-12-27 18:54:11 +00005247
dan3f67ddf2017-12-13 20:04:53 +00005248 char *zWhere = 0;
5249 sqlite3_stmt *pSql = 0;
5250 int rc;
5251
drhb376b3d2018-01-10 13:11:51 +00005252 rc = arCheckEntries(pAr);
dan3f67ddf2017-12-13 20:04:53 +00005253 arWhereClause(&rc, pAr, &zWhere);
5254
drhb376b3d2018-01-10 13:11:51 +00005255 shellPreparePrintf(pAr->db, &rc, &pSql, zSql, azCols[pAr->bVerbose],
5256 pAr->zSrcTable, zWhere);
drhb376b3d2018-01-10 13:11:51 +00005257 if( pAr->bDryRun ){
5258 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
5259 }else{
5260 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
5261 if( pAr->bVerbose ){
drh410cad92018-01-10 17:19:16 +00005262 utf8_printf(pAr->p->out, "%s % 10d %s %s\n",
5263 sqlite3_column_text(pSql, 0),
drhb376b3d2018-01-10 13:11:51 +00005264 sqlite3_column_int(pSql, 1),
5265 sqlite3_column_text(pSql, 2),
5266 sqlite3_column_text(pSql, 3)
5267 );
5268 }else{
5269 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
5270 }
danb5090e42017-12-27 21:13:21 +00005271 }
dan3f67ddf2017-12-13 20:04:53 +00005272 }
dan5a78b812017-12-27 18:54:11 +00005273 shellFinalize(&rc, pSql);
drhd0f9cdc2018-05-17 14:09:06 +00005274 sqlite3_free(zWhere);
dan3f67ddf2017-12-13 20:04:53 +00005275 return rc;
dan88be0202017-12-09 17:58:02 +00005276}
5277
5278
danfd0245d2017-12-07 15:44:29 +00005279/*
5280** Implementation of .ar "eXtract" command.
5281*/
drhb376b3d2018-01-10 13:11:51 +00005282static int arExtractCommand(ArCommand *pAr){
dan25c12182017-12-07 21:03:33 +00005283 const char *zSql1 =
dand1b51d42017-12-16 19:11:26 +00005284 "SELECT "
drhb376b3d2018-01-10 13:11:51 +00005285 " ($dir || name),"
5286 " writefile(($dir || name), %s, mode, mtime) "
5287 "FROM %s WHERE (%s) AND (data IS NULL OR $dirOnly = 0)";
dan5a78b812017-12-27 18:54:11 +00005288
5289 const char *azExtraArg[] = {
5290 "sqlar_uncompress(data, sz)",
dan7c15ac12018-01-08 19:59:59 +00005291 "data"
dan5a78b812017-12-27 18:54:11 +00005292 };
dan5a78b812017-12-27 18:54:11 +00005293
danfd0245d2017-12-07 15:44:29 +00005294 sqlite3_stmt *pSql = 0;
5295 int rc = SQLITE_OK;
dan2ad09492017-12-09 18:28:22 +00005296 char *zDir = 0;
dan3f67ddf2017-12-13 20:04:53 +00005297 char *zWhere = 0;
drhb376b3d2018-01-10 13:11:51 +00005298 int i, j;
dan2ad09492017-12-09 18:28:22 +00005299
dan3f67ddf2017-12-13 20:04:53 +00005300 /* If arguments are specified, check that they actually exist within
5301 ** the archive before proceeding. And formulate a WHERE clause to
5302 ** match them. */
drhb376b3d2018-01-10 13:11:51 +00005303 rc = arCheckEntries(pAr);
dan3f67ddf2017-12-13 20:04:53 +00005304 arWhereClause(&rc, pAr, &zWhere);
5305
5306 if( rc==SQLITE_OK ){
5307 if( pAr->zDir ){
5308 zDir = sqlite3_mprintf("%s/", pAr->zDir);
5309 }else{
5310 zDir = sqlite3_mprintf("");
5311 }
5312 if( zDir==0 ) rc = SQLITE_NOMEM;
dan2ad09492017-12-09 18:28:22 +00005313 }
danfd0245d2017-12-07 15:44:29 +00005314
drhb376b3d2018-01-10 13:11:51 +00005315 shellPreparePrintf(pAr->db, &rc, &pSql, zSql1,
5316 azExtraArg[pAr->bZip], pAr->zSrcTable, zWhere
dan5a78b812017-12-27 18:54:11 +00005317 );
5318
dan2ad09492017-12-09 18:28:22 +00005319 if( rc==SQLITE_OK ){
drhb376b3d2018-01-10 13:11:51 +00005320 j = sqlite3_bind_parameter_index(pSql, "$dir");
5321 sqlite3_bind_text(pSql, j, zDir, -1, SQLITE_STATIC);
dan25c12182017-12-07 21:03:33 +00005322
danac15e2d2017-12-14 19:15:07 +00005323 /* Run the SELECT statement twice. The first time, writefile() is called
5324 ** for all archive members that should be extracted. The second time,
5325 ** only for the directories. This is because the timestamps for
5326 ** extracted directories must be reset after they are populated (as
5327 ** populating them changes the timestamp). */
5328 for(i=0; i<2; i++){
drhb376b3d2018-01-10 13:11:51 +00005329 j = sqlite3_bind_parameter_index(pSql, "$dirOnly");
5330 sqlite3_bind_int(pSql, j, i);
5331 if( pAr->bDryRun ){
5332 utf8_printf(pAr->p->out, "%s\n", sqlite3_sql(pSql));
5333 }else{
5334 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pSql) ){
5335 if( i==0 && pAr->bVerbose ){
5336 utf8_printf(pAr->p->out, "%s\n", sqlite3_column_text(pSql, 0));
5337 }
danac15e2d2017-12-14 19:15:07 +00005338 }
5339 }
5340 shellReset(&rc, pSql);
dan25c12182017-12-07 21:03:33 +00005341 }
danac15e2d2017-12-14 19:15:07 +00005342 shellFinalize(&rc, pSql);
dan25c12182017-12-07 21:03:33 +00005343 }
dan25c12182017-12-07 21:03:33 +00005344
dan2ad09492017-12-09 18:28:22 +00005345 sqlite3_free(zDir);
dan3f67ddf2017-12-13 20:04:53 +00005346 sqlite3_free(zWhere);
danfd0245d2017-12-07 15:44:29 +00005347 return rc;
5348}
5349
drhb376b3d2018-01-10 13:11:51 +00005350/*
5351** Run the SQL statement in zSql. Or if doing a --dryrun, merely print it out.
5352*/
5353static int arExecSql(ArCommand *pAr, const char *zSql){
5354 int rc;
5355 if( pAr->bDryRun ){
5356 utf8_printf(pAr->p->out, "%s\n", zSql);
5357 rc = SQLITE_OK;
5358 }else{
drh410cad92018-01-10 17:19:16 +00005359 char *zErr = 0;
5360 rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr);
5361 if( zErr ){
5362 utf8_printf(stdout, "ERROR: %s\n", zErr);
5363 sqlite3_free(zErr);
5364 }
drhb376b3d2018-01-10 13:11:51 +00005365 }
5366 return rc;
5367}
5368
dan1ad3f612017-12-11 20:22:02 +00005369
danfd0245d2017-12-07 15:44:29 +00005370/*
dan06741a32017-12-13 20:17:18 +00005371** Implementation of .ar "create" and "update" commands.
danfd0245d2017-12-07 15:44:29 +00005372**
5373** Create the "sqlar" table in the database if it does not already exist.
5374** Then add each file in the azFile[] array to the archive. Directories
5375** are added recursively. If argument bVerbose is non-zero, a message is
5376** printed on stdout for each file archived.
dan06741a32017-12-13 20:17:18 +00005377**
5378** The create command is the same as update, except that it drops
5379** any existing "sqlar" table before beginning.
danfd0245d2017-12-07 15:44:29 +00005380*/
drhb376b3d2018-01-10 13:11:51 +00005381static int arCreateOrUpdateCommand(
dan06741a32017-12-13 20:17:18 +00005382 ArCommand *pAr, /* Command arguments and options */
drhb376b3d2018-01-10 13:11:51 +00005383 int bUpdate /* true for a --create. false for --update */
danfd0245d2017-12-07 15:44:29 +00005384){
dand4b56e52017-12-12 20:04:59 +00005385 const char *zCreate =
drhafba1802018-01-06 15:49:57 +00005386 "CREATE TABLE IF NOT EXISTS sqlar(\n"
5387 " name TEXT PRIMARY KEY, -- name of the file\n"
5388 " mode INT, -- access permissions\n"
5389 " mtime INT, -- last modification time\n"
5390 " sz INT, -- original file size\n"
5391 " data BLOB -- compressed content\n"
5392 ")";
dand4b56e52017-12-12 20:04:59 +00005393 const char *zDrop = "DROP TABLE IF EXISTS sqlar";
drh1bf208c2018-03-09 21:54:01 +00005394 const char *zInsertFmt[2] = {
5395 "REPLACE INTO %s(name,mode,mtime,sz,data)\n"
drh634c70f2018-01-10 16:50:18 +00005396 " SELECT\n"
5397 " %s,\n"
5398 " mode,\n"
5399 " mtime,\n"
drh410cad92018-01-10 17:19:16 +00005400 " CASE substr(lsmode(mode),1,1)\n"
5401 " WHEN '-' THEN length(data)\n"
5402 " WHEN 'd' THEN 0\n"
drh634c70f2018-01-10 16:50:18 +00005403 " ELSE -1 END,\n"
drh69d2d352018-03-09 22:18:53 +00005404 " sqlar_compress(data)\n"
drh634c70f2018-01-10 16:50:18 +00005405 " FROM fsdir(%Q,%Q)\n"
drh1bf208c2018-03-09 21:54:01 +00005406 " WHERE lsmode(mode) NOT LIKE '?%%';",
5407 "REPLACE INTO %s(name,mode,mtime,data)\n"
5408 " SELECT\n"
5409 " %s,\n"
5410 " mode,\n"
5411 " mtime,\n"
5412 " data\n"
5413 " FROM fsdir(%Q,%Q)\n"
5414 " WHERE lsmode(mode) NOT LIKE '?%%';"
5415 };
danfd0245d2017-12-07 15:44:29 +00005416 int i; /* For iterating through azFile[] */
5417 int rc; /* Return code */
drh1bf208c2018-03-09 21:54:01 +00005418 const char *zTab = 0; /* SQL table into which to insert */
5419 char *zSql;
5420 char zTemp[50];
danfd0245d2017-12-07 15:44:29 +00005421
drh1bf208c2018-03-09 21:54:01 +00005422 arExecSql(pAr, "PRAGMA page_size=512");
drhb376b3d2018-01-10 13:11:51 +00005423 rc = arExecSql(pAr, "SAVEPOINT ar;");
danfd0245d2017-12-07 15:44:29 +00005424 if( rc!=SQLITE_OK ) return rc;
drh1bf208c2018-03-09 21:54:01 +00005425 zTemp[0] = 0;
5426 if( pAr->bZip ){
5427 /* Initialize the zipfile virtual table, if necessary */
5428 if( pAr->zFile ){
5429 sqlite3_uint64 r;
5430 sqlite3_randomness(sizeof(r),&r);
5431 sqlite3_snprintf(sizeof(zTemp),zTemp,"zip%016llx",r);
5432 zTab = zTemp;
5433 zSql = sqlite3_mprintf(
5434 "CREATE VIRTUAL TABLE temp.%s USING zipfile(%Q)",
5435 zTab, pAr->zFile
5436 );
5437 rc = arExecSql(pAr, zSql);
5438 sqlite3_free(zSql);
5439 }else{
5440 zTab = "zip";
5441 }
5442 }else{
5443 /* Initialize the table for an SQLAR */
5444 zTab = "sqlar";
5445 if( bUpdate==0 ){
5446 rc = arExecSql(pAr, zDrop);
5447 if( rc!=SQLITE_OK ) goto end_ar_transaction;
5448 }
5449 rc = arExecSql(pAr, zCreate);
dan06741a32017-12-13 20:17:18 +00005450 }
dan88be0202017-12-09 17:58:02 +00005451 for(i=0; i<pAr->nArg && rc==SQLITE_OK; i++){
mistachkince2052b2018-03-23 00:31:53 +00005452 char *zSql2 = sqlite3_mprintf(zInsertFmt[pAr->bZip], zTab,
drh634c70f2018-01-10 16:50:18 +00005453 pAr->bVerbose ? "shell_putsnl(name)" : "name",
5454 pAr->azArg[i], pAr->zDir);
mistachkince2052b2018-03-23 00:31:53 +00005455 rc = arExecSql(pAr, zSql2);
5456 sqlite3_free(zSql2);
danfd0245d2017-12-07 15:44:29 +00005457 }
drh1bf208c2018-03-09 21:54:01 +00005458end_ar_transaction:
danfd0245d2017-12-07 15:44:29 +00005459 if( rc!=SQLITE_OK ){
drhb376b3d2018-01-10 13:11:51 +00005460 arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;");
danfd0245d2017-12-07 15:44:29 +00005461 }else{
drhb376b3d2018-01-10 13:11:51 +00005462 rc = arExecSql(pAr, "RELEASE ar;");
drh1bf208c2018-03-09 21:54:01 +00005463 if( pAr->bZip && pAr->zFile ){
5464 zSql = sqlite3_mprintf("DROP TABLE %s", zTemp);
5465 arExecSql(pAr, zSql);
5466 sqlite3_free(zSql);
5467 }
danfd0245d2017-12-07 15:44:29 +00005468 }
danfd0245d2017-12-07 15:44:29 +00005469 return rc;
5470}
5471
5472/*
5473** Implementation of ".ar" dot command.
5474*/
5475static int arDotCommand(
5476 ShellState *pState, /* Current shell tool state */
drhd0f9cdc2018-05-17 14:09:06 +00005477 int fromCmdLine, /* True if -A command-line option, not .ar cmd */
danfd0245d2017-12-07 15:44:29 +00005478 char **azArg, /* Array of arguments passed to dot command */
5479 int nArg /* Number of entries in azArg[] */
5480){
dan88be0202017-12-09 17:58:02 +00005481 ArCommand cmd;
5482 int rc;
drh34660642018-01-10 17:39:54 +00005483 memset(&cmd, 0, sizeof(cmd));
drhd0f9cdc2018-05-17 14:09:06 +00005484 cmd.fromCmdLine = fromCmdLine;
dan88be0202017-12-09 17:58:02 +00005485 rc = arParseCommand(azArg, nArg, &cmd);
5486 if( rc==SQLITE_OK ){
drha5676c42018-01-10 15:17:34 +00005487 int eDbType = SHELL_OPEN_UNSPEC;
drhb376b3d2018-01-10 13:11:51 +00005488 cmd.p = pState;
5489 cmd.db = pState->db;
drha5676c42018-01-10 15:17:34 +00005490 if( cmd.zFile ){
drh1bf208c2018-03-09 21:54:01 +00005491 eDbType = deduceDatabaseType(cmd.zFile, 1);
drha5676c42018-01-10 15:17:34 +00005492 }else{
5493 eDbType = pState->openMode;
5494 }
5495 if( eDbType==SHELL_OPEN_ZIPFILE ){
drh1bf208c2018-03-09 21:54:01 +00005496 if( cmd.eCmd==AR_CMD_EXTRACT || cmd.eCmd==AR_CMD_LIST ){
5497 if( cmd.zFile==0 ){
5498 cmd.zSrcTable = sqlite3_mprintf("zip");
5499 }else{
5500 cmd.zSrcTable = sqlite3_mprintf("zipfile(%Q)", cmd.zFile);
5501 }
dan5a78b812017-12-27 18:54:11 +00005502 }
drha5676c42018-01-10 15:17:34 +00005503 cmd.bZip = 1;
dan5a78b812017-12-27 18:54:11 +00005504 }else if( cmd.zFile ){
dand4b56e52017-12-12 20:04:59 +00005505 int flags;
drha5676c42018-01-10 15:17:34 +00005506 if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS;
dand4b56e52017-12-12 20:04:59 +00005507 if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_UPDATE ){
5508 flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
5509 }else{
5510 flags = SQLITE_OPEN_READONLY;
5511 }
drha82c95b2018-01-10 14:00:00 +00005512 cmd.db = 0;
drha5676c42018-01-10 15:17:34 +00005513 if( cmd.bDryRun ){
5514 utf8_printf(pState->out, "-- open database '%s'%s\n", cmd.zFile,
5515 eDbType==SHELL_OPEN_APPENDVFS ? " using 'apndvfs'" : "");
5516 }
5517 rc = sqlite3_open_v2(cmd.zFile, &cmd.db, flags,
5518 eDbType==SHELL_OPEN_APPENDVFS ? "apndvfs" : 0);
dand4b56e52017-12-12 20:04:59 +00005519 if( rc!=SQLITE_OK ){
drhb376b3d2018-01-10 13:11:51 +00005520 utf8_printf(stderr, "cannot open file: %s (%s)\n",
5521 cmd.zFile, sqlite3_errmsg(cmd.db)
dand4b56e52017-12-12 20:04:59 +00005522 );
drha5676c42018-01-10 15:17:34 +00005523 goto end_ar_command;
dand4b56e52017-12-12 20:04:59 +00005524 }
drhb376b3d2018-01-10 13:11:51 +00005525 sqlite3_fileio_init(cmd.db, 0, 0);
drhb376b3d2018-01-10 13:11:51 +00005526 sqlite3_sqlar_init(cmd.db, 0, 0);
drh34660642018-01-10 17:39:54 +00005527 sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
5528 shellPutsFunc, 0, 0);
5529
dand4b56e52017-12-12 20:04:59 +00005530 }
drhd0f9cdc2018-05-17 14:09:06 +00005531 if( cmd.zSrcTable==0 && cmd.bZip==0 && cmd.eCmd!=AR_CMD_HELP ){
drh634c70f2018-01-10 16:50:18 +00005532 if( cmd.eCmd!=AR_CMD_CREATE
5533 && sqlite3_table_column_metadata(cmd.db,0,"sqlar","name",0,0,0,0,0)
5534 ){
drha5676c42018-01-10 15:17:34 +00005535 utf8_printf(stderr, "database does not contain an 'sqlar' table\n");
5536 rc = SQLITE_ERROR;
5537 goto end_ar_command;
5538 }
5539 cmd.zSrcTable = sqlite3_mprintf("sqlar");
5540 }
dand4b56e52017-12-12 20:04:59 +00005541
dan88be0202017-12-09 17:58:02 +00005542 switch( cmd.eCmd ){
5543 case AR_CMD_CREATE:
drhb376b3d2018-01-10 13:11:51 +00005544 rc = arCreateOrUpdateCommand(&cmd, 0);
dan88be0202017-12-09 17:58:02 +00005545 break;
danfd0245d2017-12-07 15:44:29 +00005546
dan88be0202017-12-09 17:58:02 +00005547 case AR_CMD_EXTRACT:
drhb376b3d2018-01-10 13:11:51 +00005548 rc = arExtractCommand(&cmd);
dan88be0202017-12-09 17:58:02 +00005549 break;
5550
5551 case AR_CMD_LIST:
drhb376b3d2018-01-10 13:11:51 +00005552 rc = arListCommand(&cmd);
dan88be0202017-12-09 17:58:02 +00005553 break;
5554
dan0d0547f2017-12-14 15:40:42 +00005555 case AR_CMD_HELP:
5556 arUsage(pState->out);
5557 break;
5558
dan88be0202017-12-09 17:58:02 +00005559 default:
5560 assert( cmd.eCmd==AR_CMD_UPDATE );
drhb376b3d2018-01-10 13:11:51 +00005561 rc = arCreateOrUpdateCommand(&cmd, 1);
dan88be0202017-12-09 17:58:02 +00005562 break;
danfd0245d2017-12-07 15:44:29 +00005563 }
5564 }
drha5676c42018-01-10 15:17:34 +00005565end_ar_command:
5566 if( cmd.db!=pState->db ){
drh9e804032018-05-18 17:11:50 +00005567 close_db(cmd.db);
drha5676c42018-01-10 15:17:34 +00005568 }
5569 sqlite3_free(cmd.zSrcTable);
danfd0245d2017-12-07 15:44:29 +00005570
dan88be0202017-12-09 17:58:02 +00005571 return rc;
danfd0245d2017-12-07 15:44:29 +00005572}
drhe37c0e12018-01-06 19:19:50 +00005573/* End of the ".archive" or ".ar" command logic
5574**********************************************************************************/
5575#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */
danfd0245d2017-12-07 15:44:29 +00005576
drh2ce15c32017-07-11 13:34:40 +00005577
5578/*
5579** If an input line begins with "." then invoke this routine to
5580** process that line.
5581**
5582** Return 1 on error, 2 to exit, and 0 otherwise.
5583*/
5584static int do_meta_command(char *zLine, ShellState *p){
5585 int h = 1;
5586 int nArg = 0;
5587 int n, c;
5588 int rc = 0;
5589 char *azArg[50];
5590
dan6b046be2018-01-09 15:25:55 +00005591#ifndef SQLITE_OMIT_VIRTUALTABLE
dan43efc182017-12-19 17:42:13 +00005592 if( p->expert.pExpert ){
5593 expertFinish(p, 1, 0);
5594 }
dan6b046be2018-01-09 15:25:55 +00005595#endif
dan43efc182017-12-19 17:42:13 +00005596
drh2ce15c32017-07-11 13:34:40 +00005597 /* Parse the input line into tokens.
5598 */
5599 while( zLine[h] && nArg<ArraySize(azArg) ){
5600 while( IsSpace(zLine[h]) ){ h++; }
5601 if( zLine[h]==0 ) break;
5602 if( zLine[h]=='\'' || zLine[h]=='"' ){
5603 int delim = zLine[h++];
5604 azArg[nArg++] = &zLine[h];
5605 while( zLine[h] && zLine[h]!=delim ){
5606 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
5607 h++;
5608 }
5609 if( zLine[h]==delim ){
5610 zLine[h++] = 0;
5611 }
5612 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
5613 }else{
5614 azArg[nArg++] = &zLine[h];
5615 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
5616 if( zLine[h] ) zLine[h++] = 0;
5617 resolve_backslashes(azArg[nArg-1]);
5618 }
5619 }
5620
5621 /* Process the input line.
5622 */
5623 if( nArg==0 ) return 0; /* no tokens, no error */
5624 n = strlen30(azArg[0]);
5625 c = azArg[0][0];
drh13c20932018-01-10 21:41:55 +00005626 clearTempFile(p);
drh2ce15c32017-07-11 13:34:40 +00005627
5628#ifndef SQLITE_OMIT_AUTHORIZATION
5629 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
5630 if( nArg!=2 ){
5631 raw_printf(stderr, "Usage: .auth ON|OFF\n");
5632 rc = 1;
5633 goto meta_command_exit;
5634 }
5635 open_db(p, 0);
5636 if( booleanValue(azArg[1]) ){
5637 sqlite3_set_authorizer(p->db, shellAuth, p);
5638 }else{
5639 sqlite3_set_authorizer(p->db, 0, 0);
5640 }
5641 }else
5642#endif
5643
drhe37c0e12018-01-06 19:19:50 +00005644#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
5645 if( c=='a' && strncmp(azArg[0], "archive", n)==0 ){
danfd0245d2017-12-07 15:44:29 +00005646 open_db(p, 0);
drhd0f9cdc2018-05-17 14:09:06 +00005647 rc = arDotCommand(p, 0, azArg, nArg);
danfd0245d2017-12-07 15:44:29 +00005648 }else
5649#endif
5650
drh2ce15c32017-07-11 13:34:40 +00005651 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
5652 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
5653 ){
5654 const char *zDestFile = 0;
5655 const char *zDb = 0;
5656 sqlite3 *pDest;
5657 sqlite3_backup *pBackup;
5658 int j;
drh69ed38a2018-05-14 00:23:08 +00005659 const char *zVfs = 0;
drh2ce15c32017-07-11 13:34:40 +00005660 for(j=1; j<nArg; j++){
5661 const char *z = azArg[j];
5662 if( z[0]=='-' ){
drh69ed38a2018-05-14 00:23:08 +00005663 if( z[1]=='-' ) z++;
5664 if( strcmp(z, "-append")==0 ){
5665 zVfs = "apndvfs";
5666 }else
drh2ce15c32017-07-11 13:34:40 +00005667 {
5668 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
5669 return 1;
5670 }
5671 }else if( zDestFile==0 ){
5672 zDestFile = azArg[j];
5673 }else if( zDb==0 ){
5674 zDb = zDestFile;
5675 zDestFile = azArg[j];
5676 }else{
drh69ed38a2018-05-14 00:23:08 +00005677 raw_printf(stderr, "Usage: .backup ?DB? ?--append? FILENAME\n");
drh2ce15c32017-07-11 13:34:40 +00005678 return 1;
5679 }
5680 }
5681 if( zDestFile==0 ){
5682 raw_printf(stderr, "missing FILENAME argument on .backup\n");
5683 return 1;
5684 }
5685 if( zDb==0 ) zDb = "main";
drh69ed38a2018-05-14 00:23:08 +00005686 rc = sqlite3_open_v2(zDestFile, &pDest,
5687 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, zVfs);
drh2ce15c32017-07-11 13:34:40 +00005688 if( rc!=SQLITE_OK ){
5689 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9e804032018-05-18 17:11:50 +00005690 close_db(pDest);
drh2ce15c32017-07-11 13:34:40 +00005691 return 1;
5692 }
5693 open_db(p, 0);
5694 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
5695 if( pBackup==0 ){
5696 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9e804032018-05-18 17:11:50 +00005697 close_db(pDest);
drh2ce15c32017-07-11 13:34:40 +00005698 return 1;
5699 }
5700 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
5701 sqlite3_backup_finish(pBackup);
5702 if( rc==SQLITE_DONE ){
5703 rc = 0;
5704 }else{
5705 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
5706 rc = 1;
5707 }
drh9e804032018-05-18 17:11:50 +00005708 close_db(pDest);
drh2ce15c32017-07-11 13:34:40 +00005709 }else
5710
5711 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
5712 if( nArg==2 ){
5713 bail_on_error = booleanValue(azArg[1]);
5714 }else{
5715 raw_printf(stderr, "Usage: .bail on|off\n");
5716 rc = 1;
5717 }
5718 }else
5719
5720 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
5721 if( nArg==2 ){
5722 if( booleanValue(azArg[1]) ){
5723 setBinaryMode(p->out, 1);
5724 }else{
5725 setTextMode(p->out, 1);
5726 }
5727 }else{
5728 raw_printf(stderr, "Usage: .binary on|off\n");
5729 rc = 1;
5730 }
5731 }else
5732
5733 if( c=='c' && strcmp(azArg[0],"cd")==0 ){
5734 if( nArg==2 ){
5735#if defined(_WIN32) || defined(WIN32)
5736 wchar_t *z = sqlite3_win32_utf8_to_unicode(azArg[1]);
5737 rc = !SetCurrentDirectoryW(z);
5738 sqlite3_free(z);
5739#else
5740 rc = chdir(azArg[1]);
5741#endif
5742 if( rc ){
5743 utf8_printf(stderr, "Cannot change to directory \"%s\"\n", azArg[1]);
5744 rc = 1;
5745 }
5746 }else{
5747 raw_printf(stderr, "Usage: .cd DIRECTORY\n");
5748 rc = 1;
5749 }
5750 }else
5751
5752 /* The undocumented ".breakpoint" command causes a call to the no-op
5753 ** routine named test_breakpoint().
5754 */
5755 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
5756 test_breakpoint();
5757 }else
5758
5759 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
5760 if( nArg==2 ){
5761 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
5762 }else{
5763 raw_printf(stderr, "Usage: .changes on|off\n");
5764 rc = 1;
5765 }
5766 }else
5767
5768 /* Cancel output redirection, if it is currently set (by .testcase)
5769 ** Then read the content of the testcase-out.txt file and compare against
5770 ** azArg[1]. If there are differences, report an error and exit.
5771 */
5772 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
5773 char *zRes = 0;
5774 output_reset(p);
5775 if( nArg!=2 ){
5776 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
5777 rc = 2;
5778 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
5779 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
5780 rc = 2;
5781 }else if( testcase_glob(azArg[1],zRes)==0 ){
5782 utf8_printf(stderr,
5783 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
5784 p->zTestcase, azArg[1], zRes);
drhf30d3452017-10-17 13:44:46 +00005785 rc = 1;
drh2ce15c32017-07-11 13:34:40 +00005786 }else{
5787 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
5788 p->nCheck++;
5789 }
5790 sqlite3_free(zRes);
5791 }else
5792
5793 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
5794 if( nArg==2 ){
5795 tryToClone(p, azArg[1]);
5796 }else{
5797 raw_printf(stderr, "Usage: .clone FILENAME\n");
5798 rc = 1;
5799 }
5800 }else
5801
5802 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
5803 ShellState data;
5804 char *zErrMsg = 0;
5805 open_db(p, 0);
5806 memcpy(&data, p, sizeof(data));
5807 data.showHeader = 0;
5808 data.cMode = data.mode = MODE_List;
5809 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
5810 data.cnt = 0;
5811 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
5812 callback, &data, &zErrMsg);
5813 if( zErrMsg ){
5814 utf8_printf(stderr,"Error: %s\n", zErrMsg);
5815 sqlite3_free(zErrMsg);
5816 rc = 1;
5817 }
5818 }else
5819
drh7df01192018-04-28 12:43:16 +00005820 if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){
5821 static const struct DbConfigChoices {const char *zName; int op;} aDbConfig[] = {
5822 { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
5823 { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
5824 { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
5825 { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
5826 { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
5827 { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
5828 { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
5829 { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
5830 };
5831 int ii, v;
5832 open_db(p, 0);
5833 for(ii=0; ii<ArraySize(aDbConfig); ii++){
5834 if( nArg>1 && strcmp(azArg[1], aDbConfig[ii].zName)!=0 ) continue;
5835 if( nArg>=3 ){
5836 sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
5837 }
5838 sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
5839 utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
5840 if( nArg>1 ) break;
5841 }
5842 if( nArg>1 && ii==ArraySize(aDbConfig) ){
5843 utf8_printf(stderr, "Error: unknown dbconfig \"%s\"\n", azArg[1]);
5844 utf8_printf(stderr, "Enter \".dbconfig\" with no arguments for a list\n");
5845 }
5846 }else
5847
5848 if( c=='d' && n>=3 && strncmp(azArg[0], "dbinfo", n)==0 ){
drh2ce15c32017-07-11 13:34:40 +00005849 rc = shell_dbinfo_command(p, nArg, azArg);
5850 }else
5851
5852 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
5853 const char *zLike = 0;
5854 int i;
5855 int savedShowHeader = p->showHeader;
5856 ShellClearFlag(p, SHFLG_PreserveRowid|SHFLG_Newlines);
5857 for(i=1; i<nArg; i++){
5858 if( azArg[i][0]=='-' ){
5859 const char *z = azArg[i]+1;
5860 if( z[0]=='-' ) z++;
5861 if( strcmp(z,"preserve-rowids")==0 ){
5862#ifdef SQLITE_OMIT_VIRTUALTABLE
5863 raw_printf(stderr, "The --preserve-rowids option is not compatible"
5864 " with SQLITE_OMIT_VIRTUALTABLE\n");
5865 rc = 1;
5866 goto meta_command_exit;
5867#else
5868 ShellSetFlag(p, SHFLG_PreserveRowid);
5869#endif
5870 }else
5871 if( strcmp(z,"newlines")==0 ){
5872 ShellSetFlag(p, SHFLG_Newlines);
5873 }else
5874 {
5875 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
5876 rc = 1;
5877 goto meta_command_exit;
5878 }
5879 }else if( zLike ){
5880 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? "
5881 "?--newlines? ?LIKE-PATTERN?\n");
5882 rc = 1;
5883 goto meta_command_exit;
5884 }else{
5885 zLike = azArg[i];
5886 }
5887 }
5888 open_db(p, 0);
5889 /* When playing back a "dump", the content might appear in an order
5890 ** which causes immediate foreign key constraints to be violated.
5891 ** So disable foreign-key constraint enforcement to prevent problems. */
5892 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
5893 raw_printf(p->out, "BEGIN TRANSACTION;\n");
5894 p->writableSchema = 0;
5895 p->showHeader = 0;
5896 /* Set writable_schema=ON since doing so forces SQLite to initialize
5897 ** as much of the schema as it can even if the sqlite_master table is
5898 ** corrupt. */
5899 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
5900 p->nErr = 0;
5901 if( zLike==0 ){
5902 run_schema_dump_query(p,
5903 "SELECT name, type, sql FROM sqlite_master "
5904 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
5905 );
5906 run_schema_dump_query(p,
5907 "SELECT name, type, sql FROM sqlite_master "
5908 "WHERE name=='sqlite_sequence'"
5909 );
5910 run_table_dump_query(p,
5911 "SELECT sql FROM sqlite_master "
5912 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
5913 );
5914 }else{
5915 char *zSql;
5916 zSql = sqlite3_mprintf(
5917 "SELECT name, type, sql FROM sqlite_master "
5918 "WHERE tbl_name LIKE %Q AND type=='table'"
5919 " AND sql NOT NULL", zLike);
5920 run_schema_dump_query(p,zSql);
5921 sqlite3_free(zSql);
5922 zSql = sqlite3_mprintf(
5923 "SELECT sql FROM sqlite_master "
5924 "WHERE sql NOT NULL"
5925 " AND type IN ('index','trigger','view')"
5926 " AND tbl_name LIKE %Q", zLike);
5927 run_table_dump_query(p, zSql, 0);
5928 sqlite3_free(zSql);
5929 }
5930 if( p->writableSchema ){
5931 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
5932 p->writableSchema = 0;
5933 }
5934 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
5935 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
5936 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
5937 p->showHeader = savedShowHeader;
5938 }else
5939
5940 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
5941 if( nArg==2 ){
5942 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
5943 }else{
5944 raw_printf(stderr, "Usage: .echo on|off\n");
5945 rc = 1;
5946 }
5947 }else
5948
5949 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
5950 if( nArg==2 ){
drhe2ca99c2018-05-02 00:33:43 +00005951 p->autoEQPtest = 0;
drh2ce15c32017-07-11 13:34:40 +00005952 if( strcmp(azArg[1],"full")==0 ){
drhada70452017-12-21 21:02:27 +00005953 p->autoEQP = AUTOEQP_full;
5954 }else if( strcmp(azArg[1],"trigger")==0 ){
5955 p->autoEQP = AUTOEQP_trigger;
drhe2ca99c2018-05-02 00:33:43 +00005956 }else if( strcmp(azArg[1],"test")==0 ){
5957 p->autoEQP = AUTOEQP_on;
5958 p->autoEQPtest = 1;
drh2ce15c32017-07-11 13:34:40 +00005959 }else{
mistachkinb71aa092018-01-23 00:05:18 +00005960 p->autoEQP = (u8)booleanValue(azArg[1]);
drh2ce15c32017-07-11 13:34:40 +00005961 }
5962 }else{
drhada70452017-12-21 21:02:27 +00005963 raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n");
drh2ce15c32017-07-11 13:34:40 +00005964 rc = 1;
5965 }
5966 }else
5967
5968 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
5969 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
5970 rc = 2;
5971 }else
5972
5973 /* The ".explain" command is automatic now. It is largely pointless. It
5974 ** retained purely for backwards compatibility */
5975 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
5976 int val = 1;
5977 if( nArg>=2 ){
5978 if( strcmp(azArg[1],"auto")==0 ){
5979 val = 99;
5980 }else{
5981 val = booleanValue(azArg[1]);
5982 }
5983 }
5984 if( val==1 && p->mode!=MODE_Explain ){
5985 p->normalMode = p->mode;
5986 p->mode = MODE_Explain;
5987 p->autoExplain = 0;
5988 }else if( val==0 ){
5989 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5990 p->autoExplain = 0;
5991 }else if( val==99 ){
5992 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
5993 p->autoExplain = 1;
5994 }
5995 }else
5996
dan6b046be2018-01-09 15:25:55 +00005997#ifndef SQLITE_OMIT_VIRTUALTABLE
dan43efc182017-12-19 17:42:13 +00005998 if( c=='e' && strncmp(azArg[0], "expert", n)==0 ){
5999 open_db(p, 0);
6000 expertDotCommand(p, azArg, nArg);
6001 }else
dan6b046be2018-01-09 15:25:55 +00006002#endif
dan43efc182017-12-19 17:42:13 +00006003
drh2ce15c32017-07-11 13:34:40 +00006004 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
6005 ShellState data;
6006 char *zErrMsg = 0;
6007 int doStats = 0;
6008 memcpy(&data, p, sizeof(data));
6009 data.showHeader = 0;
6010 data.cMode = data.mode = MODE_Semi;
6011 if( nArg==2 && optionMatch(azArg[1], "indent") ){
6012 data.cMode = data.mode = MODE_Pretty;
6013 nArg = 1;
6014 }
6015 if( nArg!=1 ){
6016 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
6017 rc = 1;
6018 goto meta_command_exit;
6019 }
6020 open_db(p, 0);
6021 rc = sqlite3_exec(p->db,
6022 "SELECT sql FROM"
6023 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
6024 " FROM sqlite_master UNION ALL"
6025 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
6026 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
6027 "ORDER BY rowid",
6028 callback, &data, &zErrMsg
6029 );
6030 if( rc==SQLITE_OK ){
6031 sqlite3_stmt *pStmt;
6032 rc = sqlite3_prepare_v2(p->db,
6033 "SELECT rowid FROM sqlite_master"
6034 " WHERE name GLOB 'sqlite_stat[134]'",
6035 -1, &pStmt, 0);
6036 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
6037 sqlite3_finalize(pStmt);
6038 }
6039 if( doStats==0 ){
6040 raw_printf(p->out, "/* No STAT tables available */\n");
6041 }else{
6042 raw_printf(p->out, "ANALYZE sqlite_master;\n");
6043 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
6044 callback, &data, &zErrMsg);
6045 data.cMode = data.mode = MODE_Insert;
6046 data.zDestTable = "sqlite_stat1";
drh4c540452018-05-08 23:17:36 +00006047 shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00006048 data.zDestTable = "sqlite_stat3";
drh4c540452018-05-08 23:17:36 +00006049 shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00006050 data.zDestTable = "sqlite_stat4";
drh4c540452018-05-08 23:17:36 +00006051 shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00006052 raw_printf(p->out, "ANALYZE sqlite_master;\n");
6053 }
6054 }else
6055
6056 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
6057 if( nArg==2 ){
6058 p->showHeader = booleanValue(azArg[1]);
6059 }else{
6060 raw_printf(stderr, "Usage: .headers on|off\n");
6061 rc = 1;
6062 }
6063 }else
6064
6065 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
6066 utf8_printf(p->out, "%s", zHelp);
6067 }else
6068
6069 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
6070 char *zTable; /* Insert data into this table */
6071 char *zFile; /* Name of file to extra content from */
6072 sqlite3_stmt *pStmt = NULL; /* A statement */
6073 int nCol; /* Number of columns in the table */
6074 int nByte; /* Number of bytes in an SQL string */
6075 int i, j; /* Loop counters */
6076 int needCommit; /* True to COMMIT or ROLLBACK at end */
6077 int nSep; /* Number of bytes in p->colSeparator[] */
6078 char *zSql; /* An SQL statement */
6079 ImportCtx sCtx; /* Reader context */
6080 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
6081 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
6082
6083 if( nArg!=3 ){
6084 raw_printf(stderr, "Usage: .import FILE TABLE\n");
6085 goto meta_command_exit;
6086 }
6087 zFile = azArg[1];
6088 zTable = azArg[2];
6089 seenInterrupt = 0;
6090 memset(&sCtx, 0, sizeof(sCtx));
6091 open_db(p, 0);
6092 nSep = strlen30(p->colSeparator);
6093 if( nSep==0 ){
6094 raw_printf(stderr,
6095 "Error: non-null column separator required for import\n");
6096 return 1;
6097 }
6098 if( nSep>1 ){
6099 raw_printf(stderr, "Error: multi-character column separators not allowed"
6100 " for import\n");
6101 return 1;
6102 }
6103 nSep = strlen30(p->rowSeparator);
6104 if( nSep==0 ){
6105 raw_printf(stderr, "Error: non-null row separator required for import\n");
6106 return 1;
6107 }
6108 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
6109 /* When importing CSV (only), if the row separator is set to the
6110 ** default output row separator, change it to the default input
6111 ** row separator. This avoids having to maintain different input
6112 ** and output row separators. */
6113 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6114 nSep = strlen30(p->rowSeparator);
6115 }
6116 if( nSep>1 ){
6117 raw_printf(stderr, "Error: multi-character row separators not allowed"
6118 " for import\n");
6119 return 1;
6120 }
6121 sCtx.zFile = zFile;
6122 sCtx.nLine = 1;
6123 if( sCtx.zFile[0]=='|' ){
6124#ifdef SQLITE_OMIT_POPEN
6125 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
6126 return 1;
6127#else
6128 sCtx.in = popen(sCtx.zFile+1, "r");
6129 sCtx.zFile = "<pipe>";
6130 xCloser = pclose;
6131#endif
6132 }else{
6133 sCtx.in = fopen(sCtx.zFile, "rb");
6134 xCloser = fclose;
6135 }
6136 if( p->mode==MODE_Ascii ){
6137 xRead = ascii_read_one_field;
6138 }else{
6139 xRead = csv_read_one_field;
6140 }
6141 if( sCtx.in==0 ){
6142 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
6143 return 1;
6144 }
6145 sCtx.cColSep = p->colSeparator[0];
6146 sCtx.cRowSep = p->rowSeparator[0];
6147 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
6148 if( zSql==0 ){
drh2ce15c32017-07-11 13:34:40 +00006149 xCloser(sCtx.in);
drh4b5345c2018-04-24 13:07:40 +00006150 shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00006151 }
6152 nByte = strlen30(zSql);
6153 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6154 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
6155 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
6156 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
6157 char cSep = '(';
6158 while( xRead(&sCtx) ){
6159 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
6160 cSep = ',';
6161 if( sCtx.cTerm!=sCtx.cColSep ) break;
6162 }
6163 if( cSep=='(' ){
6164 sqlite3_free(zCreate);
6165 sqlite3_free(sCtx.z);
6166 xCloser(sCtx.in);
6167 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
6168 return 1;
6169 }
6170 zCreate = sqlite3_mprintf("%z\n)", zCreate);
6171 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
6172 sqlite3_free(zCreate);
6173 if( rc ){
6174 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
6175 sqlite3_errmsg(p->db));
6176 sqlite3_free(sCtx.z);
6177 xCloser(sCtx.in);
6178 return 1;
6179 }
6180 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6181 }
6182 sqlite3_free(zSql);
6183 if( rc ){
6184 if (pStmt) sqlite3_finalize(pStmt);
6185 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
6186 xCloser(sCtx.in);
6187 return 1;
6188 }
6189 nCol = sqlite3_column_count(pStmt);
6190 sqlite3_finalize(pStmt);
6191 pStmt = 0;
6192 if( nCol==0 ) return 0; /* no columns, no error */
6193 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
6194 if( zSql==0 ){
drh2ce15c32017-07-11 13:34:40 +00006195 xCloser(sCtx.in);
drh4b5345c2018-04-24 13:07:40 +00006196 shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00006197 }
6198 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
6199 j = strlen30(zSql);
6200 for(i=1; i<nCol; i++){
6201 zSql[j++] = ',';
6202 zSql[j++] = '?';
6203 }
6204 zSql[j++] = ')';
6205 zSql[j] = 0;
6206 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6207 sqlite3_free(zSql);
6208 if( rc ){
6209 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6210 if (pStmt) sqlite3_finalize(pStmt);
6211 xCloser(sCtx.in);
6212 return 1;
6213 }
6214 needCommit = sqlite3_get_autocommit(p->db);
6215 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
6216 do{
6217 int startLine = sCtx.nLine;
6218 for(i=0; i<nCol; i++){
6219 char *z = xRead(&sCtx);
6220 /*
6221 ** Did we reach end-of-file before finding any columns?
6222 ** If so, stop instead of NULL filling the remaining columns.
6223 */
6224 if( z==0 && i==0 ) break;
6225 /*
6226 ** Did we reach end-of-file OR end-of-line before finding any
6227 ** columns in ASCII mode? If so, stop instead of NULL filling
6228 ** the remaining columns.
6229 */
6230 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
6231 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
6232 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
6233 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6234 "filling the rest with NULL\n",
6235 sCtx.zFile, startLine, nCol, i+1);
6236 i += 2;
6237 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
6238 }
6239 }
6240 if( sCtx.cTerm==sCtx.cColSep ){
6241 do{
6242 xRead(&sCtx);
6243 i++;
6244 }while( sCtx.cTerm==sCtx.cColSep );
6245 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
6246 "extras ignored\n",
6247 sCtx.zFile, startLine, nCol, i);
6248 }
6249 if( i>=nCol ){
6250 sqlite3_step(pStmt);
6251 rc = sqlite3_reset(pStmt);
6252 if( rc!=SQLITE_OK ){
6253 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
6254 startLine, sqlite3_errmsg(p->db));
6255 }
6256 }
6257 }while( sCtx.cTerm!=EOF );
6258
6259 xCloser(sCtx.in);
6260 sqlite3_free(sCtx.z);
6261 sqlite3_finalize(pStmt);
6262 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
6263 }else
6264
6265#ifndef SQLITE_UNTESTABLE
6266 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
6267 char *zSql;
6268 char *zCollist = 0;
6269 sqlite3_stmt *pStmt;
6270 int tnum = 0;
6271 int i;
drh48d219a2018-04-23 18:38:48 +00006272 if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
6273 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
6274 " .imposter off\n");
drh2ce15c32017-07-11 13:34:40 +00006275 rc = 1;
6276 goto meta_command_exit;
6277 }
6278 open_db(p, 0);
drh48d219a2018-04-23 18:38:48 +00006279 if( nArg==2 ){
6280 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
6281 goto meta_command_exit;
6282 }
drh2ce15c32017-07-11 13:34:40 +00006283 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
6284 " WHERE name='%q' AND type='index'", azArg[1]);
6285 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6286 sqlite3_free(zSql);
6287 if( sqlite3_step(pStmt)==SQLITE_ROW ){
6288 tnum = sqlite3_column_int(pStmt, 0);
6289 }
6290 sqlite3_finalize(pStmt);
6291 if( tnum==0 ){
6292 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
6293 rc = 1;
6294 goto meta_command_exit;
6295 }
6296 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
6297 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6298 sqlite3_free(zSql);
6299 i = 0;
6300 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6301 char zLabel[20];
6302 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
6303 i++;
6304 if( zCol==0 ){
6305 if( sqlite3_column_int(pStmt,1)==-1 ){
6306 zCol = "_ROWID_";
6307 }else{
6308 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
6309 zCol = zLabel;
6310 }
6311 }
6312 if( zCollist==0 ){
6313 zCollist = sqlite3_mprintf("\"%w\"", zCol);
6314 }else{
6315 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
6316 }
6317 }
6318 sqlite3_finalize(pStmt);
6319 zSql = sqlite3_mprintf(
6320 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
6321 azArg[2], zCollist, zCollist);
6322 sqlite3_free(zCollist);
6323 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
6324 if( rc==SQLITE_OK ){
6325 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
6326 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
6327 if( rc ){
6328 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
6329 }else{
6330 utf8_printf(stdout, "%s;\n", zSql);
6331 raw_printf(stdout,
6332 "WARNING: writing to an imposter table will corrupt the index!\n"
6333 );
6334 }
6335 }else{
6336 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
6337 rc = 1;
6338 }
6339 sqlite3_free(zSql);
6340 }else
6341#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
6342
6343#ifdef SQLITE_ENABLE_IOTRACE
6344 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
6345 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
6346 if( iotrace && iotrace!=stdout ) fclose(iotrace);
6347 iotrace = 0;
6348 if( nArg<2 ){
6349 sqlite3IoTrace = 0;
6350 }else if( strcmp(azArg[1], "-")==0 ){
6351 sqlite3IoTrace = iotracePrintf;
6352 iotrace = stdout;
6353 }else{
6354 iotrace = fopen(azArg[1], "w");
6355 if( iotrace==0 ){
6356 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
6357 sqlite3IoTrace = 0;
6358 rc = 1;
6359 }else{
6360 sqlite3IoTrace = iotracePrintf;
6361 }
6362 }
6363 }else
6364#endif
6365
6366 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
6367 static const struct {
6368 const char *zLimitName; /* Name of a limit */
6369 int limitCode; /* Integer code for that limit */
6370 } aLimit[] = {
6371 { "length", SQLITE_LIMIT_LENGTH },
6372 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
6373 { "column", SQLITE_LIMIT_COLUMN },
6374 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
6375 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
6376 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
6377 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
6378 { "attached", SQLITE_LIMIT_ATTACHED },
6379 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
6380 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
6381 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
6382 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
6383 };
6384 int i, n2;
6385 open_db(p, 0);
6386 if( nArg==1 ){
6387 for(i=0; i<ArraySize(aLimit); i++){
6388 printf("%20s %d\n", aLimit[i].zLimitName,
6389 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
6390 }
6391 }else if( nArg>3 ){
6392 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
6393 rc = 1;
6394 goto meta_command_exit;
6395 }else{
6396 int iLimit = -1;
6397 n2 = strlen30(azArg[1]);
6398 for(i=0; i<ArraySize(aLimit); i++){
6399 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
6400 if( iLimit<0 ){
6401 iLimit = i;
6402 }else{
6403 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
6404 rc = 1;
6405 goto meta_command_exit;
6406 }
6407 }
6408 }
6409 if( iLimit<0 ){
6410 utf8_printf(stderr, "unknown limit: \"%s\"\n"
6411 "enter \".limits\" with no arguments for a list.\n",
6412 azArg[1]);
6413 rc = 1;
6414 goto meta_command_exit;
6415 }
6416 if( nArg==3 ){
6417 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
6418 (int)integerValue(azArg[2]));
6419 }
6420 printf("%20s %d\n", aLimit[iLimit].zLimitName,
6421 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
6422 }
6423 }else
6424
6425 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
6426 open_db(p, 0);
6427 lintDotCommand(p, azArg, nArg);
6428 }else
6429
6430#ifndef SQLITE_OMIT_LOAD_EXTENSION
6431 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
6432 const char *zFile, *zProc;
6433 char *zErrMsg = 0;
6434 if( nArg<2 ){
6435 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
6436 rc = 1;
6437 goto meta_command_exit;
6438 }
6439 zFile = azArg[1];
6440 zProc = nArg>=3 ? azArg[2] : 0;
6441 open_db(p, 0);
6442 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
6443 if( rc!=SQLITE_OK ){
6444 utf8_printf(stderr, "Error: %s\n", zErrMsg);
6445 sqlite3_free(zErrMsg);
6446 rc = 1;
6447 }
6448 }else
6449#endif
6450
6451 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
6452 if( nArg!=2 ){
6453 raw_printf(stderr, "Usage: .log FILENAME\n");
6454 rc = 1;
6455 }else{
6456 const char *zFile = azArg[1];
6457 output_file_close(p->pLog);
drha92a01a2018-01-10 22:15:37 +00006458 p->pLog = output_file_open(zFile, 0);
drh2ce15c32017-07-11 13:34:40 +00006459 }
6460 }else
6461
6462 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
6463 const char *zMode = nArg>=2 ? azArg[1] : "";
drhaf2770f2018-01-05 14:55:43 +00006464 int n2 = strlen30(zMode);
drh2ce15c32017-07-11 13:34:40 +00006465 int c2 = zMode[0];
6466 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
6467 p->mode = MODE_Line;
6468 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6469 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
6470 p->mode = MODE_Column;
6471 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6472 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
6473 p->mode = MODE_List;
6474 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
6475 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6476 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
6477 p->mode = MODE_Html;
6478 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
6479 p->mode = MODE_Tcl;
6480 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
6481 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
6482 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
6483 p->mode = MODE_Csv;
6484 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
6485 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
6486 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
6487 p->mode = MODE_List;
6488 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
6489 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
6490 p->mode = MODE_Insert;
6491 set_table_name(p, nArg>=3 ? azArg[2] : "table");
6492 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
6493 p->mode = MODE_Quote;
6494 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
6495 p->mode = MODE_Ascii;
6496 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
6497 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
6498 }else if( nArg==1 ){
6499 raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]);
6500 }else{
6501 raw_printf(stderr, "Error: mode should be one of: "
6502 "ascii column csv html insert line list quote tabs tcl\n");
6503 rc = 1;
6504 }
6505 p->cMode = p->mode;
6506 }else
6507
6508 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
6509 if( nArg==2 ){
6510 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
6511 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
6512 }else{
6513 raw_printf(stderr, "Usage: .nullvalue STRING\n");
6514 rc = 1;
6515 }
6516 }else
6517
6518 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
6519 char *zNewFilename; /* Name of the database file to open */
6520 int iName = 1; /* Index in azArg[] of the filename */
6521 int newFlag = 0; /* True to delete file before opening */
6522 /* Close the existing database */
6523 session_close_all(p);
drh9e804032018-05-18 17:11:50 +00006524 close_db(p->db);
drh2ce15c32017-07-11 13:34:40 +00006525 p->db = 0;
6526 p->zDbFilename = 0;
6527 sqlite3_free(p->zFreeOnClose);
6528 p->zFreeOnClose = 0;
drh1fa6d9f2018-01-06 21:46:01 +00006529 p->openMode = SHELL_OPEN_UNSPEC;
drh2ce15c32017-07-11 13:34:40 +00006530 /* Check for command-line arguments */
6531 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
6532 const char *z = azArg[iName];
6533 if( optionMatch(z,"new") ){
6534 newFlag = 1;
drh3baed312018-03-08 18:14:41 +00006535#ifdef SQLITE_HAVE_ZLIB
drh1fa6d9f2018-01-06 21:46:01 +00006536 }else if( optionMatch(z, "zip") ){
6537 p->openMode = SHELL_OPEN_ZIPFILE;
6538#endif
6539 }else if( optionMatch(z, "append") ){
6540 p->openMode = SHELL_OPEN_APPENDVFS;
drhee269a62018-02-14 23:27:43 +00006541 }else if( optionMatch(z, "readonly") ){
6542 p->openMode = SHELL_OPEN_READONLY;
drh2ce15c32017-07-11 13:34:40 +00006543 }else if( z[0]=='-' ){
6544 utf8_printf(stderr, "unknown option: %s\n", z);
6545 rc = 1;
6546 goto meta_command_exit;
6547 }
6548 }
6549 /* If a filename is specified, try to open it first */
6550 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
6551 if( zNewFilename ){
6552 if( newFlag ) shellDeleteFile(zNewFilename);
6553 p->zDbFilename = zNewFilename;
drhbe4ccb22018-05-17 20:04:24 +00006554 open_db(p, OPEN_DB_KEEPALIVE);
drh2ce15c32017-07-11 13:34:40 +00006555 if( p->db==0 ){
6556 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
6557 sqlite3_free(zNewFilename);
6558 }else{
6559 p->zFreeOnClose = zNewFilename;
6560 }
6561 }
6562 if( p->db==0 ){
6563 /* As a fall-back open a TEMP database */
6564 p->zDbFilename = 0;
6565 open_db(p, 0);
6566 }
6567 }else
6568
drh13c20932018-01-10 21:41:55 +00006569 if( (c=='o'
6570 && (strncmp(azArg[0], "output", n)==0||strncmp(azArg[0], "once", n)==0))
6571 || (c=='e' && n==5 && strcmp(azArg[0],"excel")==0)
drh2ce15c32017-07-11 13:34:40 +00006572 ){
6573 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
drha92a01a2018-01-10 22:15:37 +00006574 int bTxtMode = 0;
drh13c20932018-01-10 21:41:55 +00006575 if( azArg[0][0]=='e' ){
6576 /* Transform the ".excel" command into ".once -x" */
6577 nArg = 2;
6578 azArg[0] = "once";
6579 zFile = azArg[1] = "-x";
6580 n = 4;
6581 }
drh2ce15c32017-07-11 13:34:40 +00006582 if( nArg>2 ){
drh13c20932018-01-10 21:41:55 +00006583 utf8_printf(stderr, "Usage: .%s [-e|-x|FILE]\n", azArg[0]);
drh2ce15c32017-07-11 13:34:40 +00006584 rc = 1;
6585 goto meta_command_exit;
6586 }
6587 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
6588 if( nArg<2 ){
drh13c20932018-01-10 21:41:55 +00006589 raw_printf(stderr, "Usage: .once (-e|-x|FILE)\n");
drh2ce15c32017-07-11 13:34:40 +00006590 rc = 1;
6591 goto meta_command_exit;
6592 }
6593 p->outCount = 2;
6594 }else{
6595 p->outCount = 0;
6596 }
6597 output_reset(p);
drh13c20932018-01-10 21:41:55 +00006598 if( zFile[0]=='-' && zFile[1]=='-' ) zFile++;
drh04a28c32018-01-31 01:38:44 +00006599#ifndef SQLITE_NOHAVE_SYSTEM
drh13c20932018-01-10 21:41:55 +00006600 if( strcmp(zFile, "-e")==0 || strcmp(zFile, "-x")==0 ){
drh3c484e82018-01-10 22:27:21 +00006601 p->doXdgOpen = 1;
6602 outputModePush(p);
drh13c20932018-01-10 21:41:55 +00006603 if( zFile[1]=='x' ){
6604 newTempFile(p, "csv");
6605 p->mode = MODE_Csv;
6606 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
6607 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
6608 }else{
6609 newTempFile(p, "txt");
drha92a01a2018-01-10 22:15:37 +00006610 bTxtMode = 1;
drh13c20932018-01-10 21:41:55 +00006611 }
6612 zFile = p->zTempFile;
6613 }
drh04a28c32018-01-31 01:38:44 +00006614#endif /* SQLITE_NOHAVE_SYSTEM */
drh2ce15c32017-07-11 13:34:40 +00006615 if( zFile[0]=='|' ){
6616#ifdef SQLITE_OMIT_POPEN
6617 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
6618 rc = 1;
6619 p->out = stdout;
6620#else
6621 p->out = popen(zFile + 1, "w");
6622 if( p->out==0 ){
6623 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
6624 p->out = stdout;
6625 rc = 1;
6626 }else{
6627 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6628 }
6629#endif
6630 }else{
drha92a01a2018-01-10 22:15:37 +00006631 p->out = output_file_open(zFile, bTxtMode);
drh2ce15c32017-07-11 13:34:40 +00006632 if( p->out==0 ){
6633 if( strcmp(zFile,"off")!=0 ){
6634 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
6635 }
6636 p->out = stdout;
6637 rc = 1;
6638 } else {
6639 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
6640 }
6641 }
6642 }else
6643
6644 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
6645 int i;
6646 for(i=1; i<nArg; i++){
6647 if( i>1 ) raw_printf(p->out, " ");
6648 utf8_printf(p->out, "%s", azArg[i]);
6649 }
6650 raw_printf(p->out, "\n");
6651 }else
6652
6653 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
6654 if( nArg >= 2) {
6655 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
6656 }
6657 if( nArg >= 3) {
6658 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
6659 }
6660 }else
6661
6662 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
6663 rc = 2;
6664 }else
6665
6666 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
6667 FILE *alt;
6668 if( nArg!=2 ){
6669 raw_printf(stderr, "Usage: .read FILE\n");
6670 rc = 1;
6671 goto meta_command_exit;
6672 }
6673 alt = fopen(azArg[1], "rb");
6674 if( alt==0 ){
6675 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
6676 rc = 1;
6677 }else{
6678 rc = process_input(p, alt);
6679 fclose(alt);
6680 }
6681 }else
6682
6683 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
6684 const char *zSrcFile;
6685 const char *zDb;
6686 sqlite3 *pSrc;
6687 sqlite3_backup *pBackup;
6688 int nTimeout = 0;
6689
6690 if( nArg==2 ){
6691 zSrcFile = azArg[1];
6692 zDb = "main";
6693 }else if( nArg==3 ){
6694 zSrcFile = azArg[2];
6695 zDb = azArg[1];
6696 }else{
6697 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
6698 rc = 1;
6699 goto meta_command_exit;
6700 }
6701 rc = sqlite3_open(zSrcFile, &pSrc);
6702 if( rc!=SQLITE_OK ){
6703 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9e804032018-05-18 17:11:50 +00006704 close_db(pSrc);
drh2ce15c32017-07-11 13:34:40 +00006705 return 1;
6706 }
6707 open_db(p, 0);
6708 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
6709 if( pBackup==0 ){
6710 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9e804032018-05-18 17:11:50 +00006711 close_db(pSrc);
drh2ce15c32017-07-11 13:34:40 +00006712 return 1;
6713 }
6714 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
6715 || rc==SQLITE_BUSY ){
6716 if( rc==SQLITE_BUSY ){
6717 if( nTimeout++ >= 3 ) break;
6718 sqlite3_sleep(100);
6719 }
6720 }
6721 sqlite3_backup_finish(pBackup);
6722 if( rc==SQLITE_DONE ){
6723 rc = 0;
6724 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
6725 raw_printf(stderr, "Error: source database is busy\n");
6726 rc = 1;
6727 }else{
6728 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6729 rc = 1;
6730 }
drh9e804032018-05-18 17:11:50 +00006731 close_db(pSrc);
drh2ce15c32017-07-11 13:34:40 +00006732 }else
6733
drh2ce15c32017-07-11 13:34:40 +00006734 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
6735 if( nArg==2 ){
mistachkinb71aa092018-01-23 00:05:18 +00006736 p->scanstatsOn = (u8)booleanValue(azArg[1]);
drh2ce15c32017-07-11 13:34:40 +00006737#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
6738 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
6739#endif
6740 }else{
6741 raw_printf(stderr, "Usage: .scanstats on|off\n");
6742 rc = 1;
6743 }
6744 }else
6745
6746 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
6747 ShellText sSelect;
6748 ShellState data;
6749 char *zErrMsg = 0;
drh667a2a22018-01-02 00:04:37 +00006750 const char *zDiv = "(";
drhceba7922018-01-01 21:28:25 +00006751 const char *zName = 0;
drh2ce15c32017-07-11 13:34:40 +00006752 int iSchema = 0;
drhceba7922018-01-01 21:28:25 +00006753 int bDebug = 0;
6754 int ii;
drh2ce15c32017-07-11 13:34:40 +00006755
6756 open_db(p, 0);
6757 memcpy(&data, p, sizeof(data));
6758 data.showHeader = 0;
6759 data.cMode = data.mode = MODE_Semi;
6760 initText(&sSelect);
drhceba7922018-01-01 21:28:25 +00006761 for(ii=1; ii<nArg; ii++){
6762 if( optionMatch(azArg[ii],"indent") ){
6763 data.cMode = data.mode = MODE_Pretty;
6764 }else if( optionMatch(azArg[ii],"debug") ){
6765 bDebug = 1;
6766 }else if( zName==0 ){
6767 zName = azArg[ii];
drh2ce15c32017-07-11 13:34:40 +00006768 }else{
drhceba7922018-01-01 21:28:25 +00006769 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
6770 rc = 1;
6771 goto meta_command_exit;
drh2ce15c32017-07-11 13:34:40 +00006772 }
drh2ce15c32017-07-11 13:34:40 +00006773 }
drhceba7922018-01-01 21:28:25 +00006774 if( zName!=0 ){
mistachkin9d107262018-03-23 14:24:34 +00006775 int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0;
6776 if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){
drh2ce15c32017-07-11 13:34:40 +00006777 char *new_argv[2], *new_colv[2];
drhc22b7162018-01-01 20:11:23 +00006778 new_argv[0] = sqlite3_mprintf(
6779 "CREATE TABLE %s (\n"
drh2ce15c32017-07-11 13:34:40 +00006780 " type text,\n"
6781 " name text,\n"
6782 " tbl_name text,\n"
6783 " rootpage integer,\n"
6784 " sql text\n"
drh667a2a22018-01-02 00:04:37 +00006785 ")", isMaster ? "sqlite_master" : "sqlite_temp_master");
drh2ce15c32017-07-11 13:34:40 +00006786 new_argv[1] = 0;
6787 new_colv[0] = "sql";
6788 new_colv[1] = 0;
6789 callback(&data, 1, new_argv, new_colv);
drhc22b7162018-01-01 20:11:23 +00006790 sqlite3_free(new_argv[0]);
drh2ce15c32017-07-11 13:34:40 +00006791 }
drh2ce15c32017-07-11 13:34:40 +00006792 }
6793 if( zDiv ){
6794 sqlite3_stmt *pStmt = 0;
6795 rc = sqlite3_prepare_v2(p->db, "SELECT name FROM pragma_database_list",
6796 -1, &pStmt, 0);
6797 if( rc ){
6798 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
6799 sqlite3_finalize(pStmt);
6800 rc = 1;
6801 goto meta_command_exit;
6802 }
6803 appendText(&sSelect, "SELECT sql FROM", 0);
6804 iSchema = 0;
6805 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6806 const char *zDb = (const char*)sqlite3_column_text(pStmt, 0);
6807 char zScNum[30];
6808 sqlite3_snprintf(sizeof(zScNum), zScNum, "%d", ++iSchema);
6809 appendText(&sSelect, zDiv, 0);
6810 zDiv = " UNION ALL ";
drhceba7922018-01-01 21:28:25 +00006811 appendText(&sSelect, "SELECT shell_add_schema(sql,", 0);
6812 if( sqlite3_stricmp(zDb, "main")!=0 ){
drh2ce15c32017-07-11 13:34:40 +00006813 appendText(&sSelect, zDb, '"');
drh2ce15c32017-07-11 13:34:40 +00006814 }else{
drhceba7922018-01-01 21:28:25 +00006815 appendText(&sSelect, "NULL", 0);
drh2ce15c32017-07-11 13:34:40 +00006816 }
drhceba7922018-01-01 21:28:25 +00006817 appendText(&sSelect, ",name) AS sql, type, tbl_name, name, rowid,", 0);
6818 appendText(&sSelect, zScNum, 0);
6819 appendText(&sSelect, " AS snum, ", 0);
6820 appendText(&sSelect, zDb, '\'');
6821 appendText(&sSelect, " AS sname FROM ", 0);
6822 appendText(&sSelect, zDb, '"');
6823 appendText(&sSelect, ".sqlite_master", 0);
drh2ce15c32017-07-11 13:34:40 +00006824 }
6825 sqlite3_finalize(pStmt);
drhcde7b772018-01-02 12:50:40 +00006826#ifdef SQLITE_INTROSPECTION_PRAGMAS
drh667a2a22018-01-02 00:04:37 +00006827 if( zName ){
6828 appendText(&sSelect,
6829 " UNION ALL SELECT shell_module_schema(name),"
6830 " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 0);
6831 }
drhcde7b772018-01-02 12:50:40 +00006832#endif
drh2ce15c32017-07-11 13:34:40 +00006833 appendText(&sSelect, ") WHERE ", 0);
drhceba7922018-01-01 21:28:25 +00006834 if( zName ){
6835 char *zQarg = sqlite3_mprintf("%Q", zName);
mistachkin9d107262018-03-23 14:24:34 +00006836 int bGlob = strchr(zName, '*') != 0 || strchr(zName, '?') != 0 ||
6837 strchr(zName, '[') != 0;
drhceba7922018-01-01 21:28:25 +00006838 if( strchr(zName, '.') ){
drh2ce15c32017-07-11 13:34:40 +00006839 appendText(&sSelect, "lower(printf('%s.%s',sname,tbl_name))", 0);
6840 }else{
6841 appendText(&sSelect, "lower(tbl_name)", 0);
6842 }
mistachkin9d107262018-03-23 14:24:34 +00006843 appendText(&sSelect, bGlob ? " GLOB " : " LIKE ", 0);
drh2ce15c32017-07-11 13:34:40 +00006844 appendText(&sSelect, zQarg, 0);
mistachkin9d107262018-03-23 14:24:34 +00006845 if( !bGlob ){
6846 appendText(&sSelect, " ESCAPE '\\' ", 0);
6847 }
drh2ce15c32017-07-11 13:34:40 +00006848 appendText(&sSelect, " AND ", 0);
6849 sqlite3_free(zQarg);
6850 }
6851 appendText(&sSelect, "type!='meta' AND sql IS NOT NULL"
6852 " ORDER BY snum, rowid", 0);
drhceba7922018-01-01 21:28:25 +00006853 if( bDebug ){
6854 utf8_printf(p->out, "SQL: %s;\n", sSelect.z);
6855 }else{
6856 rc = sqlite3_exec(p->db, sSelect.z, callback, &data, &zErrMsg);
6857 }
drh2ce15c32017-07-11 13:34:40 +00006858 freeText(&sSelect);
6859 }
6860 if( zErrMsg ){
6861 utf8_printf(stderr,"Error: %s\n", zErrMsg);
6862 sqlite3_free(zErrMsg);
6863 rc = 1;
6864 }else if( rc != SQLITE_OK ){
6865 raw_printf(stderr,"Error: querying schema information\n");
6866 rc = 1;
6867 }else{
6868 rc = 0;
6869 }
6870 }else
6871
6872#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
6873 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
6874 sqlite3SelectTrace = (int)integerValue(azArg[1]);
6875 }else
6876#endif
6877
6878#if defined(SQLITE_ENABLE_SESSION)
6879 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
6880 OpenSession *pSession = &p->aSession[0];
6881 char **azCmd = &azArg[1];
6882 int iSes = 0;
6883 int nCmd = nArg - 1;
6884 int i;
6885 if( nArg<=1 ) goto session_syntax_error;
6886 open_db(p, 0);
6887 if( nArg>=3 ){
6888 for(iSes=0; iSes<p->nSession; iSes++){
6889 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
6890 }
6891 if( iSes<p->nSession ){
6892 pSession = &p->aSession[iSes];
6893 azCmd++;
6894 nCmd--;
6895 }else{
6896 pSession = &p->aSession[0];
6897 iSes = 0;
6898 }
6899 }
6900
6901 /* .session attach TABLE
6902 ** Invoke the sqlite3session_attach() interface to attach a particular
6903 ** table so that it is never filtered.
6904 */
6905 if( strcmp(azCmd[0],"attach")==0 ){
6906 if( nCmd!=2 ) goto session_syntax_error;
6907 if( pSession->p==0 ){
6908 session_not_open:
6909 raw_printf(stderr, "ERROR: No sessions are open\n");
6910 }else{
6911 rc = sqlite3session_attach(pSession->p, azCmd[1]);
6912 if( rc ){
6913 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
6914 rc = 0;
6915 }
6916 }
6917 }else
6918
6919 /* .session changeset FILE
6920 ** .session patchset FILE
6921 ** Write a changeset or patchset into a file. The file is overwritten.
6922 */
6923 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
6924 FILE *out = 0;
6925 if( nCmd!=2 ) goto session_syntax_error;
6926 if( pSession->p==0 ) goto session_not_open;
6927 out = fopen(azCmd[1], "wb");
6928 if( out==0 ){
6929 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
6930 }else{
6931 int szChng;
6932 void *pChng;
6933 if( azCmd[0][0]=='c' ){
6934 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
6935 }else{
6936 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
6937 }
6938 if( rc ){
6939 printf("Error: error code %d\n", rc);
6940 rc = 0;
6941 }
6942 if( pChng
6943 && fwrite(pChng, szChng, 1, out)!=1 ){
6944 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
6945 szChng);
6946 }
6947 sqlite3_free(pChng);
6948 fclose(out);
6949 }
6950 }else
6951
6952 /* .session close
6953 ** Close the identified session
6954 */
6955 if( strcmp(azCmd[0], "close")==0 ){
6956 if( nCmd!=1 ) goto session_syntax_error;
6957 if( p->nSession ){
6958 session_close(pSession);
6959 p->aSession[iSes] = p->aSession[--p->nSession];
6960 }
6961 }else
6962
6963 /* .session enable ?BOOLEAN?
6964 ** Query or set the enable flag
6965 */
6966 if( strcmp(azCmd[0], "enable")==0 ){
6967 int ii;
6968 if( nCmd>2 ) goto session_syntax_error;
6969 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
6970 if( p->nSession ){
6971 ii = sqlite3session_enable(pSession->p, ii);
6972 utf8_printf(p->out, "session %s enable flag = %d\n",
6973 pSession->zName, ii);
6974 }
6975 }else
6976
6977 /* .session filter GLOB ....
6978 ** Set a list of GLOB patterns of table names to be excluded.
6979 */
6980 if( strcmp(azCmd[0], "filter")==0 ){
6981 int ii, nByte;
6982 if( nCmd<2 ) goto session_syntax_error;
6983 if( p->nSession ){
6984 for(ii=0; ii<pSession->nFilter; ii++){
6985 sqlite3_free(pSession->azFilter[ii]);
6986 }
6987 sqlite3_free(pSession->azFilter);
6988 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
6989 pSession->azFilter = sqlite3_malloc( nByte );
6990 if( pSession->azFilter==0 ){
6991 raw_printf(stderr, "Error: out or memory\n");
6992 exit(1);
6993 }
6994 for(ii=1; ii<nCmd; ii++){
6995 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
6996 }
6997 pSession->nFilter = ii-1;
6998 }
6999 }else
7000
7001 /* .session indirect ?BOOLEAN?
7002 ** Query or set the indirect flag
7003 */
7004 if( strcmp(azCmd[0], "indirect")==0 ){
7005 int ii;
7006 if( nCmd>2 ) goto session_syntax_error;
7007 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
7008 if( p->nSession ){
7009 ii = sqlite3session_indirect(pSession->p, ii);
7010 utf8_printf(p->out, "session %s indirect flag = %d\n",
7011 pSession->zName, ii);
7012 }
7013 }else
7014
7015 /* .session isempty
7016 ** Determine if the session is empty
7017 */
7018 if( strcmp(azCmd[0], "isempty")==0 ){
7019 int ii;
7020 if( nCmd!=1 ) goto session_syntax_error;
7021 if( p->nSession ){
7022 ii = sqlite3session_isempty(pSession->p);
7023 utf8_printf(p->out, "session %s isempty flag = %d\n",
7024 pSession->zName, ii);
7025 }
7026 }else
7027
7028 /* .session list
7029 ** List all currently open sessions
7030 */
7031 if( strcmp(azCmd[0],"list")==0 ){
7032 for(i=0; i<p->nSession; i++){
7033 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
7034 }
7035 }else
7036
7037 /* .session open DB NAME
7038 ** Open a new session called NAME on the attached database DB.
7039 ** DB is normally "main".
7040 */
7041 if( strcmp(azCmd[0],"open")==0 ){
7042 char *zName;
7043 if( nCmd!=3 ) goto session_syntax_error;
7044 zName = azCmd[2];
7045 if( zName[0]==0 ) goto session_syntax_error;
7046 for(i=0; i<p->nSession; i++){
7047 if( strcmp(p->aSession[i].zName,zName)==0 ){
7048 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
7049 goto meta_command_exit;
7050 }
7051 }
7052 if( p->nSession>=ArraySize(p->aSession) ){
7053 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
7054 goto meta_command_exit;
7055 }
7056 pSession = &p->aSession[p->nSession];
7057 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
7058 if( rc ){
7059 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
7060 rc = 0;
7061 goto meta_command_exit;
7062 }
7063 pSession->nFilter = 0;
7064 sqlite3session_table_filter(pSession->p, session_filter, pSession);
7065 p->nSession++;
7066 pSession->zName = sqlite3_mprintf("%s", zName);
7067 }else
7068 /* If no command name matches, show a syntax error */
7069 session_syntax_error:
7070 session_help(p);
7071 }else
7072#endif
7073
7074#ifdef SQLITE_DEBUG
7075 /* Undocumented commands for internal testing. Subject to change
7076 ** without notice. */
7077 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
7078 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
7079 int i, v;
7080 for(i=1; i<nArg; i++){
7081 v = booleanValue(azArg[i]);
7082 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
7083 }
7084 }
7085 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
7086 int i; sqlite3_int64 v;
7087 for(i=1; i<nArg; i++){
7088 char zBuf[200];
7089 v = integerValue(azArg[i]);
7090 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
7091 utf8_printf(p->out, "%s", zBuf);
7092 }
7093 }
7094 }else
7095#endif
7096
7097 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
7098 int bIsInit = 0; /* True to initialize the SELFTEST table */
7099 int bVerbose = 0; /* Verbose output */
7100 int bSelftestExists; /* True if SELFTEST already exists */
7101 int i, k; /* Loop counters */
7102 int nTest = 0; /* Number of tests runs */
7103 int nErr = 0; /* Number of errors seen */
7104 ShellText str; /* Answer for a query */
7105 sqlite3_stmt *pStmt = 0; /* Query against the SELFTEST table */
7106
7107 open_db(p,0);
7108 for(i=1; i<nArg; i++){
7109 const char *z = azArg[i];
7110 if( z[0]=='-' && z[1]=='-' ) z++;
7111 if( strcmp(z,"-init")==0 ){
7112 bIsInit = 1;
7113 }else
7114 if( strcmp(z,"-v")==0 ){
7115 bVerbose++;
7116 }else
7117 {
7118 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
7119 azArg[i], azArg[0]);
7120 raw_printf(stderr, "Should be one of: --init -v\n");
7121 rc = 1;
7122 goto meta_command_exit;
7123 }
7124 }
7125 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
7126 != SQLITE_OK ){
7127 bSelftestExists = 0;
7128 }else{
7129 bSelftestExists = 1;
7130 }
7131 if( bIsInit ){
7132 createSelftestTable(p);
7133 bSelftestExists = 1;
7134 }
7135 initText(&str);
7136 appendText(&str, "x", 0);
7137 for(k=bSelftestExists; k>=0; k--){
7138 if( k==1 ){
7139 rc = sqlite3_prepare_v2(p->db,
7140 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
7141 -1, &pStmt, 0);
7142 }else{
7143 rc = sqlite3_prepare_v2(p->db,
7144 "VALUES(0,'memo','Missing SELFTEST table - default checks only',''),"
7145 " (1,'run','PRAGMA integrity_check','ok')",
7146 -1, &pStmt, 0);
7147 }
7148 if( rc ){
7149 raw_printf(stderr, "Error querying the selftest table\n");
7150 rc = 1;
7151 sqlite3_finalize(pStmt);
7152 goto meta_command_exit;
7153 }
7154 for(i=1; sqlite3_step(pStmt)==SQLITE_ROW; i++){
7155 int tno = sqlite3_column_int(pStmt, 0);
7156 const char *zOp = (const char*)sqlite3_column_text(pStmt, 1);
7157 const char *zSql = (const char*)sqlite3_column_text(pStmt, 2);
7158 const char *zAns = (const char*)sqlite3_column_text(pStmt, 3);
7159
7160 k = 0;
7161 if( bVerbose>0 ){
7162 char *zQuote = sqlite3_mprintf("%q", zSql);
7163 printf("%d: %s %s\n", tno, zOp, zSql);
7164 sqlite3_free(zQuote);
7165 }
7166 if( strcmp(zOp,"memo")==0 ){
7167 utf8_printf(p->out, "%s\n", zSql);
7168 }else
7169 if( strcmp(zOp,"run")==0 ){
7170 char *zErrMsg = 0;
7171 str.n = 0;
7172 str.z[0] = 0;
7173 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
7174 nTest++;
7175 if( bVerbose ){
7176 utf8_printf(p->out, "Result: %s\n", str.z);
7177 }
7178 if( rc || zErrMsg ){
7179 nErr++;
7180 rc = 1;
7181 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
7182 sqlite3_free(zErrMsg);
7183 }else if( strcmp(zAns,str.z)!=0 ){
7184 nErr++;
7185 rc = 1;
7186 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
7187 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
7188 }
7189 }else
7190 {
7191 utf8_printf(stderr,
7192 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
7193 rc = 1;
7194 break;
7195 }
7196 } /* End loop over rows of content from SELFTEST */
7197 sqlite3_finalize(pStmt);
7198 } /* End loop over k */
7199 freeText(&str);
7200 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
7201 }else
7202
7203 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
7204 if( nArg<2 || nArg>3 ){
7205 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
7206 rc = 1;
7207 }
7208 if( nArg>=2 ){
7209 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
7210 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
7211 }
7212 if( nArg>=3 ){
7213 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
7214 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
7215 }
7216 }else
7217
7218 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
7219 const char *zLike = 0; /* Which table to checksum. 0 means everything */
7220 int i; /* Loop counter */
7221 int bSchema = 0; /* Also hash the schema */
7222 int bSeparate = 0; /* Hash each table separately */
7223 int iSize = 224; /* Hash algorithm to use */
7224 int bDebug = 0; /* Only show the query that would have run */
7225 sqlite3_stmt *pStmt; /* For querying tables names */
7226 char *zSql; /* SQL to be run */
7227 char *zSep; /* Separator */
7228 ShellText sSql; /* Complete SQL for the query to run the hash */
7229 ShellText sQuery; /* Set of queries used to read all content */
7230 open_db(p, 0);
7231 for(i=1; i<nArg; i++){
7232 const char *z = azArg[i];
7233 if( z[0]=='-' ){
7234 z++;
7235 if( z[0]=='-' ) z++;
7236 if( strcmp(z,"schema")==0 ){
7237 bSchema = 1;
7238 }else
7239 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
7240 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
7241 ){
7242 iSize = atoi(&z[5]);
7243 }else
7244 if( strcmp(z,"debug")==0 ){
7245 bDebug = 1;
7246 }else
7247 {
7248 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
7249 azArg[i], azArg[0]);
7250 raw_printf(stderr, "Should be one of: --schema"
drh003edba2018-05-11 15:10:43 +00007251 " --sha3-224 --sha3-256 --sha3-384 --sha3-512\n");
drh2ce15c32017-07-11 13:34:40 +00007252 rc = 1;
7253 goto meta_command_exit;
7254 }
7255 }else if( zLike ){
7256 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
7257 rc = 1;
7258 goto meta_command_exit;
7259 }else{
7260 zLike = z;
7261 bSeparate = 1;
drhcedfecf2018-03-23 12:59:10 +00007262 if( sqlite3_strlike("sqlite\\_%", zLike, '\\')==0 ) bSchema = 1;
drh2ce15c32017-07-11 13:34:40 +00007263 }
7264 }
7265 if( bSchema ){
7266 zSql = "SELECT lower(name) FROM sqlite_master"
7267 " WHERE type='table' AND coalesce(rootpage,0)>1"
7268 " UNION ALL SELECT 'sqlite_master'"
7269 " ORDER BY 1 collate nocase";
7270 }else{
7271 zSql = "SELECT lower(name) FROM sqlite_master"
7272 " WHERE type='table' AND coalesce(rootpage,0)>1"
7273 " AND name NOT LIKE 'sqlite_%'"
7274 " ORDER BY 1 collate nocase";
7275 }
7276 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
7277 initText(&sQuery);
7278 initText(&sSql);
7279 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
7280 zSep = "VALUES(";
7281 while( SQLITE_ROW==sqlite3_step(pStmt) ){
7282 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
7283 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
7284 if( strncmp(zTab, "sqlite_",7)!=0 ){
7285 appendText(&sQuery,"SELECT * FROM ", 0);
7286 appendText(&sQuery,zTab,'"');
7287 appendText(&sQuery," NOT INDEXED;", 0);
7288 }else if( strcmp(zTab, "sqlite_master")==0 ){
7289 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
7290 " ORDER BY name;", 0);
7291 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
7292 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
7293 " ORDER BY name;", 0);
7294 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
7295 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
7296 " ORDER BY tbl,idx;", 0);
7297 }else if( strcmp(zTab, "sqlite_stat3")==0
7298 || strcmp(zTab, "sqlite_stat4")==0 ){
7299 appendText(&sQuery, "SELECT * FROM ", 0);
7300 appendText(&sQuery, zTab, 0);
7301 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
7302 }
7303 appendText(&sSql, zSep, 0);
7304 appendText(&sSql, sQuery.z, '\'');
7305 sQuery.n = 0;
7306 appendText(&sSql, ",", 0);
7307 appendText(&sSql, zTab, '\'');
7308 zSep = "),(";
7309 }
7310 sqlite3_finalize(pStmt);
7311 if( bSeparate ){
7312 zSql = sqlite3_mprintf(
7313 "%s))"
7314 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
7315 " FROM [sha3sum$query]",
7316 sSql.z, iSize);
7317 }else{
7318 zSql = sqlite3_mprintf(
7319 "%s))"
7320 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
7321 " FROM [sha3sum$query]",
7322 sSql.z, iSize);
7323 }
7324 freeText(&sQuery);
7325 freeText(&sSql);
7326 if( bDebug ){
7327 utf8_printf(p->out, "%s\n", zSql);
7328 }else{
drha10b9992018-03-09 15:24:33 +00007329 shell_exec(p, zSql, 0);
drh2ce15c32017-07-11 13:34:40 +00007330 }
7331 sqlite3_free(zSql);
7332 }else
7333
drh04a28c32018-01-31 01:38:44 +00007334#ifndef SQLITE_NOHAVE_SYSTEM
drh2ce15c32017-07-11 13:34:40 +00007335 if( c=='s'
7336 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
7337 ){
7338 char *zCmd;
7339 int i, x;
7340 if( nArg<2 ){
7341 raw_printf(stderr, "Usage: .system COMMAND\n");
7342 rc = 1;
7343 goto meta_command_exit;
7344 }
7345 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
7346 for(i=2; i<nArg; i++){
7347 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
7348 zCmd, azArg[i]);
7349 }
7350 x = system(zCmd);
7351 sqlite3_free(zCmd);
7352 if( x ) raw_printf(stderr, "System command returns %d\n", x);
7353 }else
drh04a28c32018-01-31 01:38:44 +00007354#endif /* !defined(SQLITE_NOHAVE_SYSTEM) */
drh2ce15c32017-07-11 13:34:40 +00007355
7356 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drhada70452017-12-21 21:02:27 +00007357 static const char *azBool[] = { "off", "on", "trigger", "full"};
drh2ce15c32017-07-11 13:34:40 +00007358 int i;
7359 if( nArg!=1 ){
7360 raw_printf(stderr, "Usage: .show\n");
7361 rc = 1;
7362 goto meta_command_exit;
7363 }
7364 utf8_printf(p->out, "%12.12s: %s\n","echo",
7365 azBool[ShellHasFlag(p, SHFLG_Echo)]);
7366 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
7367 utf8_printf(p->out, "%12.12s: %s\n","explain",
7368 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
7369 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
7370 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
7371 utf8_printf(p->out, "%12.12s: ", "nullvalue");
7372 output_c_string(p->out, p->nullValue);
7373 raw_printf(p->out, "\n");
7374 utf8_printf(p->out,"%12.12s: %s\n","output",
7375 strlen30(p->outfile) ? p->outfile : "stdout");
7376 utf8_printf(p->out,"%12.12s: ", "colseparator");
7377 output_c_string(p->out, p->colSeparator);
7378 raw_printf(p->out, "\n");
7379 utf8_printf(p->out,"%12.12s: ", "rowseparator");
7380 output_c_string(p->out, p->rowSeparator);
7381 raw_printf(p->out, "\n");
7382 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
7383 utf8_printf(p->out, "%12.12s: ", "width");
7384 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
7385 raw_printf(p->out, "%d ", p->colWidth[i]);
7386 }
7387 raw_printf(p->out, "\n");
7388 utf8_printf(p->out, "%12.12s: %s\n", "filename",
7389 p->zDbFilename ? p->zDbFilename : "");
7390 }else
7391
7392 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
7393 if( nArg==2 ){
mistachkinb71aa092018-01-23 00:05:18 +00007394 p->statsOn = (u8)booleanValue(azArg[1]);
drh2ce15c32017-07-11 13:34:40 +00007395 }else if( nArg==1 ){
7396 display_stats(p->db, p, 0);
7397 }else{
7398 raw_printf(stderr, "Usage: .stats ?on|off?\n");
7399 rc = 1;
7400 }
7401 }else
7402
7403 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
7404 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
7405 || strncmp(azArg[0], "indexes", n)==0) )
7406 ){
7407 sqlite3_stmt *pStmt;
7408 char **azResult;
7409 int nRow, nAlloc;
7410 int ii;
7411 ShellText s;
7412 initText(&s);
7413 open_db(p, 0);
7414 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
drh9e804032018-05-18 17:11:50 +00007415 if( rc ){
7416 sqlite3_finalize(pStmt);
7417 return shellDatabaseError(p->db);
7418 }
drh2ce15c32017-07-11 13:34:40 +00007419
7420 if( nArg>2 && c=='i' ){
7421 /* It is an historical accident that the .indexes command shows an error
7422 ** when called with the wrong number of arguments whereas the .tables
7423 ** command does not. */
7424 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
7425 rc = 1;
drh9e804032018-05-18 17:11:50 +00007426 sqlite3_finalize(pStmt);
drh2ce15c32017-07-11 13:34:40 +00007427 goto meta_command_exit;
7428 }
7429 for(ii=0; sqlite3_step(pStmt)==SQLITE_ROW; ii++){
7430 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
7431 if( zDbName==0 ) continue;
7432 if( s.z && s.z[0] ) appendText(&s, " UNION ALL ", 0);
7433 if( sqlite3_stricmp(zDbName, "main")==0 ){
7434 appendText(&s, "SELECT name FROM ", 0);
7435 }else{
7436 appendText(&s, "SELECT ", 0);
7437 appendText(&s, zDbName, '\'');
7438 appendText(&s, "||'.'||name FROM ", 0);
7439 }
7440 appendText(&s, zDbName, '"');
7441 appendText(&s, ".sqlite_master ", 0);
7442 if( c=='t' ){
7443 appendText(&s," WHERE type IN ('table','view')"
7444 " AND name NOT LIKE 'sqlite_%'"
7445 " AND name LIKE ?1", 0);
7446 }else{
7447 appendText(&s," WHERE type='index'"
7448 " AND tbl_name LIKE ?1", 0);
7449 }
7450 }
7451 rc = sqlite3_finalize(pStmt);
7452 appendText(&s, " ORDER BY 1", 0);
7453 rc = sqlite3_prepare_v2(p->db, s.z, -1, &pStmt, 0);
7454 freeText(&s);
7455 if( rc ) return shellDatabaseError(p->db);
7456
7457 /* Run the SQL statement prepared by the above block. Store the results
7458 ** as an array of nul-terminated strings in azResult[]. */
7459 nRow = nAlloc = 0;
7460 azResult = 0;
7461 if( nArg>1 ){
7462 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
7463 }else{
7464 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
7465 }
7466 while( sqlite3_step(pStmt)==SQLITE_ROW ){
7467 if( nRow>=nAlloc ){
7468 char **azNew;
7469 int n2 = nAlloc*2 + 10;
7470 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh4b5345c2018-04-24 13:07:40 +00007471 if( azNew==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00007472 nAlloc = n2;
7473 azResult = azNew;
7474 }
7475 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
drh4b5345c2018-04-24 13:07:40 +00007476 if( 0==azResult[nRow] ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00007477 nRow++;
7478 }
7479 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
7480 rc = shellDatabaseError(p->db);
7481 }
7482
7483 /* Pretty-print the contents of array azResult[] to the output */
7484 if( rc==0 && nRow>0 ){
7485 int len, maxlen = 0;
7486 int i, j;
7487 int nPrintCol, nPrintRow;
7488 for(i=0; i<nRow; i++){
7489 len = strlen30(azResult[i]);
7490 if( len>maxlen ) maxlen = len;
7491 }
7492 nPrintCol = 80/(maxlen+2);
7493 if( nPrintCol<1 ) nPrintCol = 1;
7494 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
7495 for(i=0; i<nPrintRow; i++){
7496 for(j=i; j<nRow; j+=nPrintRow){
7497 char *zSp = j<nPrintRow ? "" : " ";
7498 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
7499 azResult[j] ? azResult[j]:"");
7500 }
7501 raw_printf(p->out, "\n");
7502 }
7503 }
7504
7505 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
7506 sqlite3_free(azResult);
7507 }else
7508
7509 /* Begin redirecting output to the file "testcase-out.txt" */
7510 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
7511 output_reset(p);
drha92a01a2018-01-10 22:15:37 +00007512 p->out = output_file_open("testcase-out.txt", 0);
drh2ce15c32017-07-11 13:34:40 +00007513 if( p->out==0 ){
7514 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
7515 }
7516 if( nArg>=2 ){
7517 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
7518 }else{
7519 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
7520 }
7521 }else
7522
7523#ifndef SQLITE_UNTESTABLE
drh35f51a42017-11-15 17:07:22 +00007524 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 ){
drh2ce15c32017-07-11 13:34:40 +00007525 static const struct {
7526 const char *zCtrlName; /* Name of a test-control option */
7527 int ctrlCode; /* Integer code for that option */
drhef302e82017-11-15 19:14:08 +00007528 const char *zUsage; /* Usage notes */
drh2ce15c32017-07-11 13:34:40 +00007529 } aCtrl[] = {
drhef302e82017-11-15 19:14:08 +00007530 { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" },
7531 { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" },
7532 /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/
7533 /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/
7534 { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" },
7535 /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */
7536 { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
drhef302e82017-11-15 19:14:08 +00007537 { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" },
7538 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" },
7539 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" },
drh0d9de992017-12-26 18:04:23 +00007540#ifdef YYCOVERAGE
7541 { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" },
7542#endif
drhef302e82017-11-15 19:14:08 +00007543 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " },
7544 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET, "" },
7545 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" },
7546 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" },
7547 { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" },
drh2ce15c32017-07-11 13:34:40 +00007548 };
7549 int testctrl = -1;
drhef302e82017-11-15 19:14:08 +00007550 int iCtrl = -1;
7551 int rc2 = 0; /* 0: usage. 1: %d 2: %x 3: no-output */
7552 int isOk = 0;
drh2ce15c32017-07-11 13:34:40 +00007553 int i, n2;
mistachkinc6bc15a2017-11-21 21:14:32 +00007554 const char *zCmd = 0;
7555
drh2ce15c32017-07-11 13:34:40 +00007556 open_db(p, 0);
mistachkinc6bc15a2017-11-21 21:14:32 +00007557 zCmd = nArg>=2 ? azArg[1] : "help";
drh35f51a42017-11-15 17:07:22 +00007558
7559 /* The argument can optionally begin with "-" or "--" */
7560 if( zCmd[0]=='-' && zCmd[1] ){
7561 zCmd++;
7562 if( zCmd[0]=='-' && zCmd[1] ) zCmd++;
7563 }
7564
7565 /* --help lists all test-controls */
7566 if( strcmp(zCmd,"help")==0 ){
7567 utf8_printf(p->out, "Available test-controls:\n");
7568 for(i=0; i<ArraySize(aCtrl); i++){
drhef302e82017-11-15 19:14:08 +00007569 utf8_printf(p->out, " .testctrl %s %s\n",
7570 aCtrl[i].zCtrlName, aCtrl[i].zUsage);
drh35f51a42017-11-15 17:07:22 +00007571 }
7572 rc = 1;
7573 goto meta_command_exit;
7574 }
drh2ce15c32017-07-11 13:34:40 +00007575
7576 /* convert testctrl text option to value. allow any unique prefix
7577 ** of the option name, or a numerical value. */
drh35f51a42017-11-15 17:07:22 +00007578 n2 = strlen30(zCmd);
drh2ce15c32017-07-11 13:34:40 +00007579 for(i=0; i<ArraySize(aCtrl); i++){
drh35f51a42017-11-15 17:07:22 +00007580 if( strncmp(zCmd, aCtrl[i].zCtrlName, n2)==0 ){
drh2ce15c32017-07-11 13:34:40 +00007581 if( testctrl<0 ){
7582 testctrl = aCtrl[i].ctrlCode;
drhef302e82017-11-15 19:14:08 +00007583 iCtrl = i;
drh2ce15c32017-07-11 13:34:40 +00007584 }else{
drh35f51a42017-11-15 17:07:22 +00007585 utf8_printf(stderr, "Error: ambiguous test-control: \"%s\"\n"
7586 "Use \".testctrl --help\" for help\n", zCmd);
7587 rc = 1;
7588 goto meta_command_exit;
drh2ce15c32017-07-11 13:34:40 +00007589 }
7590 }
7591 }
drhef302e82017-11-15 19:14:08 +00007592 if( testctrl<0 ){
drh35f51a42017-11-15 17:07:22 +00007593 utf8_printf(stderr,"Error: unknown test-control: %s\n"
7594 "Use \".testctrl --help\" for help\n", zCmd);
drh2ce15c32017-07-11 13:34:40 +00007595 }else{
7596 switch(testctrl){
7597
7598 /* sqlite3_test_control(int, db, int) */
7599 case SQLITE_TESTCTRL_OPTIMIZATIONS:
7600 case SQLITE_TESTCTRL_RESERVE:
7601 if( nArg==3 ){
7602 int opt = (int)strtol(azArg[2], 0, 0);
7603 rc2 = sqlite3_test_control(testctrl, p->db, opt);
drhef302e82017-11-15 19:14:08 +00007604 isOk = 3;
drh2ce15c32017-07-11 13:34:40 +00007605 }
7606 break;
7607
7608 /* sqlite3_test_control(int) */
7609 case SQLITE_TESTCTRL_PRNG_SAVE:
7610 case SQLITE_TESTCTRL_PRNG_RESTORE:
7611 case SQLITE_TESTCTRL_PRNG_RESET:
7612 case SQLITE_TESTCTRL_BYTEORDER:
7613 if( nArg==2 ){
7614 rc2 = sqlite3_test_control(testctrl);
drhef302e82017-11-15 19:14:08 +00007615 isOk = testctrl==SQLITE_TESTCTRL_BYTEORDER ? 1 : 3;
drh2ce15c32017-07-11 13:34:40 +00007616 }
7617 break;
7618
7619 /* sqlite3_test_control(int, uint) */
7620 case SQLITE_TESTCTRL_PENDING_BYTE:
7621 if( nArg==3 ){
7622 unsigned int opt = (unsigned int)integerValue(azArg[2]);
7623 rc2 = sqlite3_test_control(testctrl, opt);
drhef302e82017-11-15 19:14:08 +00007624 isOk = 3;
drh2ce15c32017-07-11 13:34:40 +00007625 }
7626 break;
7627
7628 /* sqlite3_test_control(int, int) */
7629 case SQLITE_TESTCTRL_ASSERT:
7630 case SQLITE_TESTCTRL_ALWAYS:
drhef302e82017-11-15 19:14:08 +00007631 if( nArg==3 ){
7632 int opt = booleanValue(azArg[2]);
7633 rc2 = sqlite3_test_control(testctrl, opt);
7634 isOk = 1;
7635 }
7636 break;
7637
7638 /* sqlite3_test_control(int, int) */
7639 case SQLITE_TESTCTRL_LOCALTIME_FAULT:
drh2ce15c32017-07-11 13:34:40 +00007640 case SQLITE_TESTCTRL_NEVER_CORRUPT:
7641 if( nArg==3 ){
7642 int opt = booleanValue(azArg[2]);
7643 rc2 = sqlite3_test_control(testctrl, opt);
drhef302e82017-11-15 19:14:08 +00007644 isOk = 3;
drh2ce15c32017-07-11 13:34:40 +00007645 }
7646 break;
7647
drh2ce15c32017-07-11 13:34:40 +00007648 case SQLITE_TESTCTRL_IMPOSTER:
7649 if( nArg==5 ){
7650 rc2 = sqlite3_test_control(testctrl, p->db,
7651 azArg[2],
7652 integerValue(azArg[3]),
7653 integerValue(azArg[4]));
drhef302e82017-11-15 19:14:08 +00007654 isOk = 3;
drh2ce15c32017-07-11 13:34:40 +00007655 }
7656 break;
drh0d9de992017-12-26 18:04:23 +00007657
7658#ifdef YYCOVERAGE
7659 case SQLITE_TESTCTRL_PARSER_COVERAGE:
7660 if( nArg==2 ){
7661 sqlite3_test_control(testctrl, p->out);
7662 isOk = 3;
7663 }
7664#endif
drh2ce15c32017-07-11 13:34:40 +00007665 }
7666 }
drhef302e82017-11-15 19:14:08 +00007667 if( isOk==0 && iCtrl>=0 ){
7668 utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd, aCtrl[iCtrl].zUsage);
7669 rc = 1;
7670 }else if( isOk==1 ){
7671 raw_printf(p->out, "%d\n", rc2);
7672 }else if( isOk==2 ){
7673 raw_printf(p->out, "0x%08x\n", rc2);
7674 }
drh2ce15c32017-07-11 13:34:40 +00007675 }else
7676#endif /* !defined(SQLITE_UNTESTABLE) */
7677
7678 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
7679 open_db(p, 0);
7680 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
7681 }else
7682
7683 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
7684 if( nArg==2 ){
7685 enableTimer = booleanValue(azArg[1]);
7686 if( enableTimer && !HAS_TIMER ){
7687 raw_printf(stderr, "Error: timer not available on this system.\n");
7688 enableTimer = 0;
7689 }
7690 }else{
7691 raw_printf(stderr, "Usage: .timer on|off\n");
7692 rc = 1;
7693 }
7694 }else
7695
7696 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
7697 open_db(p, 0);
7698 if( nArg!=2 ){
7699 raw_printf(stderr, "Usage: .trace FILE|off\n");
7700 rc = 1;
7701 goto meta_command_exit;
7702 }
7703 output_file_close(p->traceOut);
drha92a01a2018-01-10 22:15:37 +00007704 p->traceOut = output_file_open(azArg[1], 0);
drh2ce15c32017-07-11 13:34:40 +00007705#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
7706 if( p->traceOut==0 ){
7707 sqlite3_trace_v2(p->db, 0, 0, 0);
7708 }else{
7709 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
7710 }
7711#endif
7712 }else
7713
7714#if SQLITE_USER_AUTHENTICATION
7715 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
7716 if( nArg<2 ){
7717 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
7718 rc = 1;
7719 goto meta_command_exit;
7720 }
7721 open_db(p, 0);
7722 if( strcmp(azArg[1],"login")==0 ){
7723 if( nArg!=4 ){
7724 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
7725 rc = 1;
7726 goto meta_command_exit;
7727 }
drhaf2770f2018-01-05 14:55:43 +00007728 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], strlen30(azArg[3]));
drh2ce15c32017-07-11 13:34:40 +00007729 if( rc ){
7730 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
7731 rc = 1;
7732 }
7733 }else if( strcmp(azArg[1],"add")==0 ){
7734 if( nArg!=5 ){
7735 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
7736 rc = 1;
7737 goto meta_command_exit;
7738 }
drhaf2770f2018-01-05 14:55:43 +00007739 rc = sqlite3_user_add(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
drh2ce15c32017-07-11 13:34:40 +00007740 booleanValue(azArg[4]));
7741 if( rc ){
7742 raw_printf(stderr, "User-Add failed: %d\n", rc);
7743 rc = 1;
7744 }
7745 }else if( strcmp(azArg[1],"edit")==0 ){
7746 if( nArg!=5 ){
7747 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
7748 rc = 1;
7749 goto meta_command_exit;
7750 }
drhaf2770f2018-01-05 14:55:43 +00007751 rc = sqlite3_user_change(p->db, azArg[2], azArg[3], strlen30(azArg[3]),
drh2ce15c32017-07-11 13:34:40 +00007752 booleanValue(azArg[4]));
7753 if( rc ){
7754 raw_printf(stderr, "User-Edit failed: %d\n", rc);
7755 rc = 1;
7756 }
7757 }else if( strcmp(azArg[1],"delete")==0 ){
7758 if( nArg!=3 ){
7759 raw_printf(stderr, "Usage: .user delete USER\n");
7760 rc = 1;
7761 goto meta_command_exit;
7762 }
7763 rc = sqlite3_user_delete(p->db, azArg[2]);
7764 if( rc ){
7765 raw_printf(stderr, "User-Delete failed: %d\n", rc);
7766 rc = 1;
7767 }
7768 }else{
7769 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
7770 rc = 1;
7771 goto meta_command_exit;
7772 }
7773 }else
7774#endif /* SQLITE_USER_AUTHENTICATION */
7775
7776 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
7777 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
7778 sqlite3_libversion(), sqlite3_sourceid());
drh0ed2fd82018-01-16 20:05:27 +00007779#if SQLITE_HAVE_ZLIB
7780 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
7781#endif
7782#define CTIMEOPT_VAL_(opt) #opt
7783#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
7784#if defined(__clang__) && defined(__clang_major__)
7785 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
7786 CTIMEOPT_VAL(__clang_minor__) "."
7787 CTIMEOPT_VAL(__clang_patchlevel__) "\n");
7788#elif defined(_MSC_VER)
7789 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
7790#elif defined(__GNUC__) && defined(__VERSION__)
7791 utf8_printf(p->out, "gcc-" __VERSION__ "\n");
7792#endif
drh2ce15c32017-07-11 13:34:40 +00007793 }else
7794
7795 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
7796 const char *zDbName = nArg==2 ? azArg[1] : "main";
7797 sqlite3_vfs *pVfs = 0;
7798 if( p->db ){
7799 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
7800 if( pVfs ){
7801 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
7802 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7803 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7804 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7805 }
7806 }
7807 }else
7808
7809 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
7810 sqlite3_vfs *pVfs;
7811 sqlite3_vfs *pCurrent = 0;
7812 if( p->db ){
7813 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
7814 }
7815 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
7816 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
7817 pVfs==pCurrent ? " <--- CURRENT" : "");
7818 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
7819 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
7820 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
7821 if( pVfs->pNext ){
7822 raw_printf(p->out, "-----------------------------------\n");
7823 }
7824 }
7825 }else
7826
7827 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
7828 const char *zDbName = nArg==2 ? azArg[1] : "main";
7829 char *zVfsName = 0;
7830 if( p->db ){
7831 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
7832 if( zVfsName ){
7833 utf8_printf(p->out, "%s\n", zVfsName);
7834 sqlite3_free(zVfsName);
7835 }
7836 }
7837 }else
7838
7839#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
7840 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
7841 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
7842 }else
7843#endif
7844
7845 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
7846 int j;
7847 assert( nArg<=ArraySize(azArg) );
7848 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
7849 p->colWidth[j-1] = (int)integerValue(azArg[j]);
7850 }
7851 }else
7852
7853 {
7854 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
7855 " \"%s\". Enter \".help\" for help\n", azArg[0]);
7856 rc = 1;
7857 }
7858
7859meta_command_exit:
7860 if( p->outCount ){
7861 p->outCount--;
7862 if( p->outCount==0 ) output_reset(p);
7863 }
7864 return rc;
7865}
7866
7867/*
7868** Return TRUE if a semicolon occurs anywhere in the first N characters
7869** of string z[].
7870*/
7871static int line_contains_semicolon(const char *z, int N){
7872 int i;
7873 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
7874 return 0;
7875}
7876
7877/*
7878** Test to see if a line consists entirely of whitespace.
7879*/
7880static int _all_whitespace(const char *z){
7881 for(; *z; z++){
7882 if( IsSpace(z[0]) ) continue;
7883 if( *z=='/' && z[1]=='*' ){
7884 z += 2;
7885 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
7886 if( *z==0 ) return 0;
7887 z++;
7888 continue;
7889 }
7890 if( *z=='-' && z[1]=='-' ){
7891 z += 2;
7892 while( *z && *z!='\n' ){ z++; }
7893 if( *z==0 ) return 1;
7894 continue;
7895 }
7896 return 0;
7897 }
7898 return 1;
7899}
7900
7901/*
7902** Return TRUE if the line typed in is an SQL command terminator other
7903** than a semi-colon. The SQL Server style "go" command is understood
7904** as is the Oracle "/".
7905*/
7906static int line_is_command_terminator(const char *zLine){
7907 while( IsSpace(zLine[0]) ){ zLine++; };
7908 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
7909 return 1; /* Oracle */
7910 }
7911 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
7912 && _all_whitespace(&zLine[2]) ){
7913 return 1; /* SQL Server */
7914 }
7915 return 0;
7916}
7917
7918/*
drh56f17742018-01-24 01:58:49 +00007919** We need a default sqlite3_complete() implementation to use in case
7920** the shell is compiled with SQLITE_OMIT_COMPLETE. The default assumes
7921** any arbitrary text is a complete SQL statement. This is not very
7922** user-friendly, but it does seem to work.
7923*/
7924#ifdef SQLITE_OMIT_COMPLETE
7925int sqlite3_complete(const char *zSql){ return 1; }
7926#endif
7927
7928/*
drh2ce15c32017-07-11 13:34:40 +00007929** Return true if zSql is a complete SQL statement. Return false if it
7930** ends in the middle of a string literal or C-style comment.
7931*/
7932static int line_is_complete(char *zSql, int nSql){
7933 int rc;
7934 if( zSql==0 ) return 1;
7935 zSql[nSql] = ';';
7936 zSql[nSql+1] = 0;
7937 rc = sqlite3_complete(zSql);
7938 zSql[nSql] = 0;
7939 return rc;
7940}
7941
7942/*
drhfc29a862018-05-11 19:11:18 +00007943** Run a single line of SQL. Return the number of errors.
drh2ce15c32017-07-11 13:34:40 +00007944*/
7945static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
7946 int rc;
7947 char *zErrMsg = 0;
7948
7949 open_db(p, 0);
7950 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
7951 BEGIN_TIMER;
drha10b9992018-03-09 15:24:33 +00007952 rc = shell_exec(p, zSql, &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00007953 END_TIMER;
7954 if( rc || zErrMsg ){
7955 char zPrefix[100];
7956 if( in!=0 || !stdin_is_interactive ){
7957 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
7958 "Error: near line %d:", startline);
7959 }else{
7960 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
7961 }
7962 if( zErrMsg!=0 ){
7963 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
7964 sqlite3_free(zErrMsg);
7965 zErrMsg = 0;
7966 }else{
7967 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
7968 }
7969 return 1;
7970 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
7971 raw_printf(p->out, "changes: %3d total_changes: %d\n",
7972 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
7973 }
7974 return 0;
7975}
7976
7977
7978/*
7979** Read input from *in and process it. If *in==0 then input
7980** is interactive - the user is typing it it. Otherwise, input
7981** is coming from a file or device. A prompt is issued and history
7982** is saved only if input is interactive. An interrupt signal will
7983** cause this routine to exit immediately, unless input is interactive.
7984**
7985** Return the number of errors.
7986*/
7987static int process_input(ShellState *p, FILE *in){
7988 char *zLine = 0; /* A single input line */
7989 char *zSql = 0; /* Accumulated SQL text */
7990 int nLine; /* Length of current line */
7991 int nSql = 0; /* Bytes of zSql[] used */
7992 int nAlloc = 0; /* Allocated zSql[] space */
7993 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
7994 int rc; /* Error code */
7995 int errCnt = 0; /* Number of errors seen */
7996 int lineno = 0; /* Current line number */
7997 int startline = 0; /* Line number for start of current input */
7998
7999 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
8000 fflush(p->out);
8001 zLine = one_input_line(in, zLine, nSql>0);
8002 if( zLine==0 ){
8003 /* End of input */
8004 if( in==0 && stdin_is_interactive ) printf("\n");
8005 break;
8006 }
8007 if( seenInterrupt ){
8008 if( in!=0 ) break;
8009 seenInterrupt = 0;
8010 }
8011 lineno++;
8012 if( nSql==0 && _all_whitespace(zLine) ){
8013 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
8014 continue;
8015 }
drh1615c372018-05-12 23:56:22 +00008016 if( zLine && (zLine[0]=='.' || zLine[0]=='#') && nSql==0 ){
drh2ce15c32017-07-11 13:34:40 +00008017 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drh1615c372018-05-12 23:56:22 +00008018 if( zLine[0]=='.' ){
8019 rc = do_meta_command(zLine, p);
8020 if( rc==2 ){ /* exit requested */
8021 break;
8022 }else if( rc ){
8023 errCnt++;
8024 }
drh2ce15c32017-07-11 13:34:40 +00008025 }
8026 continue;
8027 }
8028 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
8029 memcpy(zLine,";",2);
8030 }
8031 nLine = strlen30(zLine);
8032 if( nSql+nLine+2>=nAlloc ){
8033 nAlloc = nSql+nLine+100;
8034 zSql = realloc(zSql, nAlloc);
drh4b5345c2018-04-24 13:07:40 +00008035 if( zSql==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00008036 }
8037 nSqlPrior = nSql;
8038 if( nSql==0 ){
8039 int i;
8040 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
8041 assert( nAlloc>0 && zSql!=0 );
8042 memcpy(zSql, zLine+i, nLine+1-i);
8043 startline = lineno;
8044 nSql = nLine-i;
8045 }else{
8046 zSql[nSql++] = '\n';
8047 memcpy(zSql+nSql, zLine, nLine+1);
8048 nSql += nLine;
8049 }
8050 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
8051 && sqlite3_complete(zSql) ){
8052 errCnt += runOneSqlLine(p, zSql, in, startline);
8053 nSql = 0;
8054 if( p->outCount ){
8055 output_reset(p);
8056 p->outCount = 0;
drh13c20932018-01-10 21:41:55 +00008057 }else{
8058 clearTempFile(p);
drh2ce15c32017-07-11 13:34:40 +00008059 }
8060 }else if( nSql && _all_whitespace(zSql) ){
8061 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
8062 nSql = 0;
8063 }
8064 }
8065 if( nSql && !_all_whitespace(zSql) ){
drhfc29a862018-05-11 19:11:18 +00008066 errCnt += runOneSqlLine(p, zSql, in, startline);
drh2ce15c32017-07-11 13:34:40 +00008067 }
8068 free(zSql);
8069 free(zLine);
8070 return errCnt>0;
8071}
8072
8073/*
8074** Return a pathname which is the user's home directory. A
8075** 0 return indicates an error of some kind.
8076*/
8077static char *find_home_dir(int clearFlag){
8078 static char *home_dir = NULL;
8079 if( clearFlag ){
8080 free(home_dir);
8081 home_dir = 0;
8082 return 0;
8083 }
8084 if( home_dir ) return home_dir;
8085
8086#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
8087 && !defined(__RTP__) && !defined(_WRS_KERNEL)
8088 {
8089 struct passwd *pwent;
8090 uid_t uid = getuid();
8091 if( (pwent=getpwuid(uid)) != NULL) {
8092 home_dir = pwent->pw_dir;
8093 }
8094 }
8095#endif
8096
8097#if defined(_WIN32_WCE)
8098 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
8099 */
8100 home_dir = "/";
8101#else
8102
8103#if defined(_WIN32) || defined(WIN32)
8104 if (!home_dir) {
8105 home_dir = getenv("USERPROFILE");
8106 }
8107#endif
8108
8109 if (!home_dir) {
8110 home_dir = getenv("HOME");
8111 }
8112
8113#if defined(_WIN32) || defined(WIN32)
8114 if (!home_dir) {
8115 char *zDrive, *zPath;
8116 int n;
8117 zDrive = getenv("HOMEDRIVE");
8118 zPath = getenv("HOMEPATH");
8119 if( zDrive && zPath ){
8120 n = strlen30(zDrive) + strlen30(zPath) + 1;
8121 home_dir = malloc( n );
8122 if( home_dir==0 ) return 0;
8123 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
8124 return home_dir;
8125 }
8126 home_dir = "c:\\";
8127 }
8128#endif
8129
8130#endif /* !_WIN32_WCE */
8131
8132 if( home_dir ){
8133 int n = strlen30(home_dir) + 1;
8134 char *z = malloc( n );
8135 if( z ) memcpy(z, home_dir, n);
8136 home_dir = z;
8137 }
8138
8139 return home_dir;
8140}
8141
8142/*
8143** Read input from the file given by sqliterc_override. Or if that
8144** parameter is NULL, take input from ~/.sqliterc
8145**
8146** Returns the number of errors.
8147*/
8148static void process_sqliterc(
8149 ShellState *p, /* Configuration data */
8150 const char *sqliterc_override /* Name of config file. NULL to use default */
8151){
8152 char *home_dir = NULL;
8153 const char *sqliterc = sqliterc_override;
8154 char *zBuf = 0;
8155 FILE *in = NULL;
8156
8157 if (sqliterc == NULL) {
8158 home_dir = find_home_dir(0);
8159 if( home_dir==0 ){
8160 raw_printf(stderr, "-- warning: cannot find home directory;"
8161 " cannot read ~/.sqliterc\n");
8162 return;
8163 }
drh2ce15c32017-07-11 13:34:40 +00008164 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
8165 sqliterc = zBuf;
8166 }
8167 in = fopen(sqliterc,"rb");
8168 if( in ){
8169 if( stdin_is_interactive ){
8170 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
8171 }
8172 process_input(p,in);
8173 fclose(in);
8174 }
8175 sqlite3_free(zBuf);
8176}
8177
8178/*
8179** Show available command line options
8180*/
8181static const char zOptions[] =
drhda57d962018-03-05 19:34:05 +00008182#if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
drhad7fd5d2018-03-05 20:21:50 +00008183 " -A ARGS... run \".archive ARGS\" and exit\n"
drhda57d962018-03-05 19:34:05 +00008184#endif
drh3baed312018-03-08 18:14:41 +00008185 " -append append the database to the end of the file\n"
drh2ce15c32017-07-11 13:34:40 +00008186 " -ascii set output mode to 'ascii'\n"
8187 " -bail stop after hitting an error\n"
8188 " -batch force batch I/O\n"
8189 " -column set output mode to 'column'\n"
8190 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
8191 " -csv set output mode to 'csv'\n"
8192 " -echo print commands before execution\n"
8193 " -init FILENAME read/process named file\n"
8194 " -[no]header turn headers on or off\n"
8195#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
8196 " -heap SIZE Size of heap for memsys3 or memsys5\n"
8197#endif
8198 " -help show this message\n"
8199 " -html set output mode to HTML\n"
8200 " -interactive force interactive I/O\n"
8201 " -line set output mode to 'line'\n"
8202 " -list set output mode to 'list'\n"
8203 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
8204 " -mmap N default mmap size set to N\n"
8205#ifdef SQLITE_ENABLE_MULTIPLEX
8206 " -multiplex enable the multiplexor VFS\n"
8207#endif
8208 " -newline SEP set output row separator. Default: '\\n'\n"
8209 " -nullvalue TEXT set text string for NULL values. Default ''\n"
8210 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
8211 " -quote set output mode to 'quote'\n"
drhee269a62018-02-14 23:27:43 +00008212 " -readonly open the database read-only\n"
drh2ce15c32017-07-11 13:34:40 +00008213 " -separator SEP set output column separator. Default: '|'\n"
drha90d84f2018-04-18 15:21:13 +00008214#ifdef SQLITE_ENABLE_SORTER_REFERENCES
8215 " -sorterref SIZE sorter references threshold size\n"
8216#endif
drh2ce15c32017-07-11 13:34:40 +00008217 " -stats print memory stats before each finalize\n"
8218 " -version show SQLite version\n"
8219 " -vfs NAME use NAME as the default VFS\n"
8220#ifdef SQLITE_ENABLE_VFSTRACE
8221 " -vfstrace enable tracing of all VFS calls\n"
8222#endif
drh3baed312018-03-08 18:14:41 +00008223#ifdef SQLITE_HAVE_ZLIB
8224 " -zip open the file as a ZIP Archive\n"
8225#endif
drh2ce15c32017-07-11 13:34:40 +00008226;
8227static void usage(int showDetail){
8228 utf8_printf(stderr,
8229 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
8230 "FILENAME is the name of an SQLite database. A new database is created\n"
8231 "if the file does not previously exist.\n", Argv0);
8232 if( showDetail ){
8233 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
8234 }else{
8235 raw_printf(stderr, "Use the -help option for additional information\n");
8236 }
8237 exit(1);
8238}
8239
8240/*
drhe7df8922018-04-18 10:44:58 +00008241** Internal check: Verify that the SQLite is uninitialized. Print a
8242** error message if it is initialized.
8243*/
8244static void verify_uninitialized(void){
8245 if( sqlite3_config(-1)==SQLITE_MISUSE ){
drh8e02a182018-05-30 07:24:41 +00008246 utf8_printf(stdout, "WARNING: attempt to configure SQLite after"
drhe7df8922018-04-18 10:44:58 +00008247 " initialization.\n");
8248 }
8249}
8250
8251/*
drh2ce15c32017-07-11 13:34:40 +00008252** Initialize the state information in data
8253*/
8254static void main_init(ShellState *data) {
8255 memset(data, 0, sizeof(*data));
8256 data->normalMode = data->cMode = data->mode = MODE_List;
8257 data->autoExplain = 1;
8258 memcpy(data->colSeparator,SEP_Column, 2);
8259 memcpy(data->rowSeparator,SEP_Row, 2);
8260 data->showHeader = 0;
8261 data->shellFlgs = SHFLG_Lookaside;
drhe7df8922018-04-18 10:44:58 +00008262 verify_uninitialized();
drh2ce15c32017-07-11 13:34:40 +00008263 sqlite3_config(SQLITE_CONFIG_URI, 1);
8264 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
8265 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
8266 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
8267 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
8268}
8269
8270/*
8271** Output text to the console in a font that attracts extra attention.
8272*/
8273#ifdef _WIN32
8274static void printBold(const char *zText){
8275 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
8276 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
8277 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
8278 SetConsoleTextAttribute(out,
8279 FOREGROUND_RED|FOREGROUND_INTENSITY
8280 );
8281 printf("%s", zText);
8282 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
8283}
8284#else
8285static void printBold(const char *zText){
8286 printf("\033[1m%s\033[0m", zText);
8287}
8288#endif
8289
8290/*
8291** Get the argument to an --option. Throw an error and die if no argument
8292** is available.
8293*/
8294static char *cmdline_option_value(int argc, char **argv, int i){
8295 if( i==argc ){
8296 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
8297 argv[0], argv[argc-1]);
8298 exit(1);
8299 }
8300 return argv[i];
8301}
8302
8303#ifndef SQLITE_SHELL_IS_UTF8
8304# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
8305# define SQLITE_SHELL_IS_UTF8 (0)
8306# else
8307# define SQLITE_SHELL_IS_UTF8 (1)
8308# endif
8309#endif
8310
8311#if SQLITE_SHELL_IS_UTF8
8312int SQLITE_CDECL main(int argc, char **argv){
8313#else
8314int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
8315 char **argv;
8316#endif
8317 char *zErrMsg = 0;
8318 ShellState data;
8319 const char *zInitFile = 0;
8320 int i;
8321 int rc = 0;
8322 int warnInmemoryDb = 0;
8323 int readStdin = 1;
8324 int nCmd = 0;
8325 char **azCmd = 0;
dan16a47422018-04-18 09:16:11 +00008326 const char *zVfs = 0; /* Value of -vfs command-line option */
drh1f22f622018-05-17 13:29:14 +00008327#if !SQLITE_SHELL_IS_UTF8
8328 char **argvToFree = 0;
8329 int argcToFree = 0;
8330#endif
drh2ce15c32017-07-11 13:34:40 +00008331
8332 setBinaryMode(stdin, 0);
8333 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
8334 stdin_is_interactive = isatty(0);
8335 stdout_is_console = isatty(1);
8336
8337#if USE_SYSTEM_SQLITE+0!=1
drhb3c45232017-08-28 14:33:27 +00008338 if( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,60)!=0 ){
drh2ce15c32017-07-11 13:34:40 +00008339 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
8340 sqlite3_sourceid(), SQLITE_SOURCE_ID);
8341 exit(1);
8342 }
8343#endif
8344 main_init(&data);
drh501ea052018-02-15 01:03:37 +00008345
8346 /* On Windows, we must translate command-line arguments into UTF-8.
8347 ** The SQLite memory allocator subsystem has to be enabled in order to
8348 ** do this. But we want to run an sqlite3_shutdown() afterwards so that
8349 ** subsequent sqlite3_config() calls will work. So copy all results into
8350 ** memory that does not come from the SQLite memory allocator.
8351 */
drh4b18c1d2018-02-04 20:33:13 +00008352#if !SQLITE_SHELL_IS_UTF8
drh501ea052018-02-15 01:03:37 +00008353 sqlite3_initialize();
drh1f22f622018-05-17 13:29:14 +00008354 argvToFree = malloc(sizeof(argv[0])*argc*2);
8355 argcToFree = argc;
8356 argv = argvToFree + argc;
drh4b5345c2018-04-24 13:07:40 +00008357 if( argv==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00008358 for(i=0; i<argc; i++){
drh501ea052018-02-15 01:03:37 +00008359 char *z = sqlite3_win32_unicode_to_utf8(wargv[i]);
8360 int n;
drh4b5345c2018-04-24 13:07:40 +00008361 if( z==0 ) shell_out_of_memory();
drh501ea052018-02-15 01:03:37 +00008362 n = (int)strlen(z);
8363 argv[i] = malloc( n+1 );
drh4b5345c2018-04-24 13:07:40 +00008364 if( argv[i]==0 ) shell_out_of_memory();
drh501ea052018-02-15 01:03:37 +00008365 memcpy(argv[i], z, n+1);
drh1f22f622018-05-17 13:29:14 +00008366 argvToFree[i] = argv[i];
drh501ea052018-02-15 01:03:37 +00008367 sqlite3_free(z);
drh2ce15c32017-07-11 13:34:40 +00008368 }
drh501ea052018-02-15 01:03:37 +00008369 sqlite3_shutdown();
drh2ce15c32017-07-11 13:34:40 +00008370#endif
drh501ea052018-02-15 01:03:37 +00008371
drh2ce15c32017-07-11 13:34:40 +00008372 assert( argc>=1 && argv && argv[0] );
8373 Argv0 = argv[0];
8374
8375 /* Make sure we have a valid signal handler early, before anything
8376 ** else is done.
8377 */
8378#ifdef SIGINT
8379 signal(SIGINT, interrupt_handler);
mistachkinb4bab902017-10-27 17:09:44 +00008380#elif (defined(_WIN32) || defined(WIN32)) && !defined(_WIN32_WCE)
8381 SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
drh2ce15c32017-07-11 13:34:40 +00008382#endif
8383
8384#ifdef SQLITE_SHELL_DBNAME_PROC
8385 {
8386 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
8387 ** of a C-function that will provide the name of the database file. Use
8388 ** this compile-time option to embed this shell program in larger
8389 ** applications. */
8390 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
8391 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
8392 warnInmemoryDb = 0;
8393 }
8394#endif
8395
8396 /* Do an initial pass through the command-line argument to locate
8397 ** the name of the database file, the name of the initialization file,
8398 ** the size of the alternative malloc heap,
8399 ** and the first command to execute.
8400 */
drhe7df8922018-04-18 10:44:58 +00008401 verify_uninitialized();
drh2ce15c32017-07-11 13:34:40 +00008402 for(i=1; i<argc; i++){
8403 char *z;
8404 z = argv[i];
8405 if( z[0]!='-' ){
8406 if( data.zDbFilename==0 ){
8407 data.zDbFilename = z;
8408 }else{
8409 /* Excesss arguments are interpreted as SQL (or dot-commands) and
8410 ** mean that nothing is read from stdin */
8411 readStdin = 0;
8412 nCmd++;
8413 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
drh4b5345c2018-04-24 13:07:40 +00008414 if( azCmd==0 ) shell_out_of_memory();
drh2ce15c32017-07-11 13:34:40 +00008415 azCmd[nCmd-1] = z;
8416 }
8417 }
8418 if( z[1]=='-' ) z++;
8419 if( strcmp(z,"-separator")==0
8420 || strcmp(z,"-nullvalue")==0
8421 || strcmp(z,"-newline")==0
8422 || strcmp(z,"-cmd")==0
8423 ){
8424 (void)cmdline_option_value(argc, argv, ++i);
8425 }else if( strcmp(z,"-init")==0 ){
8426 zInitFile = cmdline_option_value(argc, argv, ++i);
8427 }else if( strcmp(z,"-batch")==0 ){
8428 /* Need to check for batch mode here to so we can avoid printing
8429 ** informational messages (like from process_sqliterc) before
8430 ** we do the actual processing of arguments later in a second pass.
8431 */
8432 stdin_is_interactive = 0;
8433 }else if( strcmp(z,"-heap")==0 ){
8434#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
8435 const char *zSize;
8436 sqlite3_int64 szHeap;
8437
8438 zSize = cmdline_option_value(argc, argv, ++i);
8439 szHeap = integerValue(zSize);
8440 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
8441 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
8442#else
8443 (void)cmdline_option_value(argc, argv, ++i);
8444#endif
drh2ce15c32017-07-11 13:34:40 +00008445 }else if( strcmp(z,"-pagecache")==0 ){
8446 int n, sz;
8447 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8448 if( sz>70000 ) sz = 70000;
8449 if( sz<0 ) sz = 0;
8450 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8451 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
8452 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
8453 data.shellFlgs |= SHFLG_Pagecache;
8454 }else if( strcmp(z,"-lookaside")==0 ){
8455 int n, sz;
8456 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
8457 if( sz<0 ) sz = 0;
8458 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
8459 if( n<0 ) n = 0;
8460 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
8461 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
8462#ifdef SQLITE_ENABLE_VFSTRACE
8463 }else if( strcmp(z,"-vfstrace")==0 ){
8464 extern int vfstrace_register(
8465 const char *zTraceName,
8466 const char *zOldVfsName,
8467 int (*xOut)(const char*,void*),
8468 void *pOutArg,
8469 int makeDefault
8470 );
8471 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
8472#endif
8473#ifdef SQLITE_ENABLE_MULTIPLEX
8474 }else if( strcmp(z,"-multiplex")==0 ){
8475 extern int sqlite3_multiple_initialize(const char*,int);
8476 sqlite3_multiplex_initialize(0, 1);
8477#endif
8478 }else if( strcmp(z,"-mmap")==0 ){
8479 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8480 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drha90d84f2018-04-18 15:21:13 +00008481#ifdef SQLITE_ENABLE_SORTER_REFERENCES
8482 }else if( strcmp(z,"-sorterref")==0 ){
8483 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
8484 sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE, (int)sz);
8485#endif
drh2ce15c32017-07-11 13:34:40 +00008486 }else if( strcmp(z,"-vfs")==0 ){
dan16a47422018-04-18 09:16:11 +00008487 zVfs = cmdline_option_value(argc, argv, ++i);
drh3baed312018-03-08 18:14:41 +00008488#ifdef SQLITE_HAVE_ZLIB
drh8682e122018-01-07 20:38:10 +00008489 }else if( strcmp(z,"-zip")==0 ){
8490 data.openMode = SHELL_OPEN_ZIPFILE;
8491#endif
8492 }else if( strcmp(z,"-append")==0 ){
8493 data.openMode = SHELL_OPEN_APPENDVFS;
drhee269a62018-02-14 23:27:43 +00008494 }else if( strcmp(z,"-readonly")==0 ){
8495 data.openMode = SHELL_OPEN_READONLY;
drhda57d962018-03-05 19:34:05 +00008496#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
drh93b77312018-03-05 20:20:22 +00008497 }else if( strncmp(z, "-A",2)==0 ){
drhda57d962018-03-05 19:34:05 +00008498 /* All remaining command-line arguments are passed to the ".archive"
8499 ** command, so ignore them */
8500 break;
8501#endif
drh2ce15c32017-07-11 13:34:40 +00008502 }
8503 }
drhe7df8922018-04-18 10:44:58 +00008504 verify_uninitialized();
8505
dan16a47422018-04-18 09:16:11 +00008506
drhd11b8f62018-04-25 13:27:07 +00008507#ifdef SQLITE_SHELL_INIT_PROC
8508 {
8509 /* If the SQLITE_SHELL_INIT_PROC macro is defined, then it is the name
8510 ** of a C-function that will perform initialization actions on SQLite that
8511 ** occur just before or after sqlite3_initialize(). Use this compile-time
8512 ** option to embed this shell program in larger applications. */
8513 extern void SQLITE_SHELL_INIT_PROC(void);
8514 SQLITE_SHELL_INIT_PROC();
8515 }
8516#else
dan16a47422018-04-18 09:16:11 +00008517 /* All the sqlite3_config() calls have now been made. So it is safe
8518 ** to call sqlite3_initialize() and process any command line -vfs option. */
8519 sqlite3_initialize();
drhd11b8f62018-04-25 13:27:07 +00008520#endif
8521
dan16a47422018-04-18 09:16:11 +00008522 if( zVfs ){
8523 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
8524 if( pVfs ){
8525 sqlite3_vfs_register(pVfs, 1);
8526 }else{
8527 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
8528 exit(1);
8529 }
8530 }
8531
drh2ce15c32017-07-11 13:34:40 +00008532 if( data.zDbFilename==0 ){
8533#ifndef SQLITE_OMIT_MEMORYDB
8534 data.zDbFilename = ":memory:";
8535 warnInmemoryDb = argc==1;
8536#else
8537 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
8538 return 1;
8539#endif
8540 }
8541 data.out = stdout;
drh8682e122018-01-07 20:38:10 +00008542 sqlite3_appendvfs_init(0,0,0);
drh2ce15c32017-07-11 13:34:40 +00008543
8544 /* Go ahead and open the database file if it already exists. If the
8545 ** file does not exist, delay opening it. This prevents empty database
8546 ** files from being created if a user mistypes the database name argument
8547 ** to the sqlite command-line tool.
8548 */
8549 if( access(data.zDbFilename, 0)==0 ){
8550 open_db(&data, 0);
8551 }
8552
8553 /* Process the initialization file if there is one. If no -init option
8554 ** is given on the command line, look for a file named ~/.sqliterc and
8555 ** try to process it.
8556 */
8557 process_sqliterc(&data,zInitFile);
8558
8559 /* Make a second pass through the command-line argument and set
8560 ** options. This second pass is delayed until after the initialization
8561 ** file is processed so that the command-line arguments will override
8562 ** settings in the initialization file.
8563 */
8564 for(i=1; i<argc; i++){
8565 char *z = argv[i];
8566 if( z[0]!='-' ) continue;
8567 if( z[1]=='-' ){ z++; }
8568 if( strcmp(z,"-init")==0 ){
8569 i++;
8570 }else if( strcmp(z,"-html")==0 ){
8571 data.mode = MODE_Html;
8572 }else if( strcmp(z,"-list")==0 ){
8573 data.mode = MODE_List;
8574 }else if( strcmp(z,"-quote")==0 ){
8575 data.mode = MODE_Quote;
8576 }else if( strcmp(z,"-line")==0 ){
8577 data.mode = MODE_Line;
8578 }else if( strcmp(z,"-column")==0 ){
8579 data.mode = MODE_Column;
8580 }else if( strcmp(z,"-csv")==0 ){
8581 data.mode = MODE_Csv;
8582 memcpy(data.colSeparator,",",2);
drh3baed312018-03-08 18:14:41 +00008583#ifdef SQLITE_HAVE_ZLIB
drh1fa6d9f2018-01-06 21:46:01 +00008584 }else if( strcmp(z,"-zip")==0 ){
8585 data.openMode = SHELL_OPEN_ZIPFILE;
8586#endif
8587 }else if( strcmp(z,"-append")==0 ){
8588 data.openMode = SHELL_OPEN_APPENDVFS;
drh4aafe592018-03-23 16:08:30 +00008589 }else if( strcmp(z,"-readonly")==0 ){
8590 data.openMode = SHELL_OPEN_READONLY;
drh2ce15c32017-07-11 13:34:40 +00008591 }else if( strcmp(z,"-ascii")==0 ){
8592 data.mode = MODE_Ascii;
8593 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8594 SEP_Unit);
8595 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8596 SEP_Record);
8597 }else if( strcmp(z,"-separator")==0 ){
8598 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
8599 "%s",cmdline_option_value(argc,argv,++i));
8600 }else if( strcmp(z,"-newline")==0 ){
8601 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
8602 "%s",cmdline_option_value(argc,argv,++i));
8603 }else if( strcmp(z,"-nullvalue")==0 ){
8604 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
8605 "%s",cmdline_option_value(argc,argv,++i));
8606 }else if( strcmp(z,"-header")==0 ){
8607 data.showHeader = 1;
8608 }else if( strcmp(z,"-noheader")==0 ){
8609 data.showHeader = 0;
8610 }else if( strcmp(z,"-echo")==0 ){
8611 ShellSetFlag(&data, SHFLG_Echo);
8612 }else if( strcmp(z,"-eqp")==0 ){
drhada70452017-12-21 21:02:27 +00008613 data.autoEQP = AUTOEQP_on;
drh2ce15c32017-07-11 13:34:40 +00008614 }else if( strcmp(z,"-eqpfull")==0 ){
drhada70452017-12-21 21:02:27 +00008615 data.autoEQP = AUTOEQP_full;
drh2ce15c32017-07-11 13:34:40 +00008616 }else if( strcmp(z,"-stats")==0 ){
8617 data.statsOn = 1;
8618 }else if( strcmp(z,"-scanstats")==0 ){
8619 data.scanstatsOn = 1;
8620 }else if( strcmp(z,"-backslash")==0 ){
8621 /* Undocumented command-line option: -backslash
8622 ** Causes C-style backslash escapes to be evaluated in SQL statements
8623 ** prior to sending the SQL into SQLite. Useful for injecting
8624 ** crazy bytes in the middle of SQL statements for testing and debugging.
8625 */
8626 ShellSetFlag(&data, SHFLG_Backslash);
8627 }else if( strcmp(z,"-bail")==0 ){
8628 bail_on_error = 1;
8629 }else if( strcmp(z,"-version")==0 ){
8630 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
8631 return 0;
8632 }else if( strcmp(z,"-interactive")==0 ){
8633 stdin_is_interactive = 1;
8634 }else if( strcmp(z,"-batch")==0 ){
8635 stdin_is_interactive = 0;
8636 }else if( strcmp(z,"-heap")==0 ){
8637 i++;
drh2ce15c32017-07-11 13:34:40 +00008638 }else if( strcmp(z,"-pagecache")==0 ){
8639 i+=2;
8640 }else if( strcmp(z,"-lookaside")==0 ){
8641 i+=2;
8642 }else if( strcmp(z,"-mmap")==0 ){
8643 i++;
drha90d84f2018-04-18 15:21:13 +00008644#ifdef SQLITE_ENABLE_SORTER_REFERENCES
8645 }else if( strcmp(z,"-sorterref")==0 ){
8646 i++;
8647#endif
drh2ce15c32017-07-11 13:34:40 +00008648 }else if( strcmp(z,"-vfs")==0 ){
8649 i++;
8650#ifdef SQLITE_ENABLE_VFSTRACE
8651 }else if( strcmp(z,"-vfstrace")==0 ){
8652 i++;
8653#endif
8654#ifdef SQLITE_ENABLE_MULTIPLEX
8655 }else if( strcmp(z,"-multiplex")==0 ){
8656 i++;
8657#endif
8658 }else if( strcmp(z,"-help")==0 ){
8659 usage(1);
8660 }else if( strcmp(z,"-cmd")==0 ){
8661 /* Run commands that follow -cmd first and separately from commands
8662 ** that simply appear on the command-line. This seems goofy. It would
8663 ** be better if all commands ran in the order that they appear. But
8664 ** we retain the goofy behavior for historical compatibility. */
8665 if( i==argc-1 ) break;
8666 z = cmdline_option_value(argc,argv,++i);
8667 if( z[0]=='.' ){
8668 rc = do_meta_command(z, &data);
8669 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
8670 }else{
8671 open_db(&data, 0);
drha10b9992018-03-09 15:24:33 +00008672 rc = shell_exec(&data, z, &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00008673 if( zErrMsg!=0 ){
8674 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8675 if( bail_on_error ) return rc!=0 ? rc : 1;
8676 }else if( rc!=0 ){
8677 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
8678 if( bail_on_error ) return rc;
8679 }
8680 }
drhda57d962018-03-05 19:34:05 +00008681#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
drh93b77312018-03-05 20:20:22 +00008682 }else if( strncmp(z, "-A", 2)==0 ){
drhda57d962018-03-05 19:34:05 +00008683 if( nCmd>0 ){
8684 utf8_printf(stderr, "Error: cannot mix regular SQL or dot-commands"
8685 " with \"%s\"\n", z);
8686 return 1;
8687 }
drhbe4ccb22018-05-17 20:04:24 +00008688 open_db(&data, OPEN_DB_ZIPFILE);
drh93b77312018-03-05 20:20:22 +00008689 if( z[2] ){
8690 argv[i] = &z[2];
drhd0f9cdc2018-05-17 14:09:06 +00008691 arDotCommand(&data, 1, argv+(i-1), argc-(i-1));
drh93b77312018-03-05 20:20:22 +00008692 }else{
drhd0f9cdc2018-05-17 14:09:06 +00008693 arDotCommand(&data, 1, argv+i, argc-i);
drh93b77312018-03-05 20:20:22 +00008694 }
drhda57d962018-03-05 19:34:05 +00008695 readStdin = 0;
8696 break;
8697#endif
drh2ce15c32017-07-11 13:34:40 +00008698 }else{
8699 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
8700 raw_printf(stderr,"Use -help for a list of options.\n");
8701 return 1;
8702 }
8703 data.cMode = data.mode;
8704 }
8705
8706 if( !readStdin ){
8707 /* Run all arguments that do not begin with '-' as if they were separate
8708 ** command-line inputs, except for the argToSkip argument which contains
8709 ** the database filename.
8710 */
8711 for(i=0; i<nCmd; i++){
8712 if( azCmd[i][0]=='.' ){
8713 rc = do_meta_command(azCmd[i], &data);
8714 if( rc ) return rc==2 ? 0 : rc;
8715 }else{
8716 open_db(&data, 0);
drha10b9992018-03-09 15:24:33 +00008717 rc = shell_exec(&data, azCmd[i], &zErrMsg);
drh2ce15c32017-07-11 13:34:40 +00008718 if( zErrMsg!=0 ){
8719 utf8_printf(stderr,"Error: %s\n", zErrMsg);
8720 return rc!=0 ? rc : 1;
8721 }else if( rc!=0 ){
8722 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
8723 return rc;
8724 }
8725 }
8726 }
8727 free(azCmd);
8728 }else{
8729 /* Run commands received from standard input
8730 */
8731 if( stdin_is_interactive ){
8732 char *zHome;
8733 char *zHistory = 0;
8734 int nHistory;
8735 printf(
8736 "SQLite version %s %.19s\n" /*extra-version-info*/
8737 "Enter \".help\" for usage hints.\n",
8738 sqlite3_libversion(), sqlite3_sourceid()
8739 );
8740 if( warnInmemoryDb ){
8741 printf("Connected to a ");
8742 printBold("transient in-memory database");
8743 printf(".\nUse \".open FILENAME\" to reopen on a "
8744 "persistent database.\n");
8745 }
8746 zHome = find_home_dir(0);
8747 if( zHome ){
8748 nHistory = strlen30(zHome) + 20;
8749 if( (zHistory = malloc(nHistory))!=0 ){
8750 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
8751 }
8752 }
8753 if( zHistory ){ shell_read_history(zHistory); }
drh56eb09b2017-07-11 13:59:07 +00008754#if HAVE_READLINE || HAVE_EDITLINE
8755 rl_attempted_completion_function = readline_completion;
8756#elif HAVE_LINENOISE
8757 linenoiseSetCompletionCallback(linenoise_completion);
8758#endif
drh2ce15c32017-07-11 13:34:40 +00008759 rc = process_input(&data, 0);
8760 if( zHistory ){
drh5a75dd82017-07-18 20:59:40 +00008761 shell_stifle_history(2000);
drh2ce15c32017-07-11 13:34:40 +00008762 shell_write_history(zHistory);
8763 free(zHistory);
8764 }
8765 }else{
8766 rc = process_input(&data, stdin);
8767 }
8768 }
8769 set_table_name(&data, 0);
8770 if( data.db ){
8771 session_close_all(&data);
drh9e804032018-05-18 17:11:50 +00008772 close_db(data.db);
drh2ce15c32017-07-11 13:34:40 +00008773 }
8774 sqlite3_free(data.zFreeOnClose);
8775 find_home_dir(1);
drh536c3452018-01-11 00:38:39 +00008776 output_reset(&data);
8777 data.doXdgOpen = 0;
drh13c20932018-01-10 21:41:55 +00008778 clearTempFile(&data);
drh2ce15c32017-07-11 13:34:40 +00008779#if !SQLITE_SHELL_IS_UTF8
drh1f22f622018-05-17 13:29:14 +00008780 for(i=0; i<argcToFree; i++) free(argvToFree[i]);
8781 free(argvToFree);
drh2ce15c32017-07-11 13:34:40 +00008782#endif
drh9e804032018-05-18 17:11:50 +00008783 /* Clear the global data structure so that valgrind will detect memory
8784 ** leaks */
8785 memset(&data, 0, sizeof(data));
drh2ce15c32017-07-11 13:34:40 +00008786 return rc;
8787}