blob: e7652f8e6707137f2e66aa6ce141ac7ecadaaf50 [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** 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.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
mistachkin2318d332015-01-12 18:02:52 +000021** If requested, include the SQLite compiler options file for MSVC.
22*/
23#if defined(INCLUDE_MSVC_H)
24#include "msvc.h"
25#endif
26
27/*
drh8cd5b252015-03-02 22:06:43 +000028** No support for loadable extensions in VxWorks.
29*/
drhada3f2b2015-03-23 21:32:50 +000030#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
drh8cd5b252015-03-02 22:06:43 +000031# define SQLITE_OMIT_LOAD_EXTENSION 1
32#endif
33
34/*
drh36f7dd32011-10-13 16:02:17 +000035** Enable large-file support for fopen() and friends on unix.
36*/
37#ifndef SQLITE_DISABLE_LFS
38# define _LARGE_FILE 1
39# ifndef _FILE_OFFSET_BITS
40# define _FILE_OFFSET_BITS 64
41# endif
42# define _LARGEFILE_SOURCE 1
43#endif
44
drh75897232000-05-29 14:26:00 +000045#include <stdlib.h>
46#include <string.h>
47#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000048#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000049#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000050#if SQLITE_USER_AUTHENTICATION
51# include "sqlite3userauth.h"
52#endif
drh75897232000-05-29 14:26:00 +000053#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000054#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000055
drh83905c92012-06-21 13:00:37 +000056#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000057# include <signal.h>
chw97185482008-11-17 08:05:31 +000058# if !defined(__RTP__) && !defined(_WRS_KERNEL)
59# include <pwd.h>
60# endif
drhdd45df82002-04-18 12:39:03 +000061# include <unistd.h>
62# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000063#endif
drh75897232000-05-29 14:26:00 +000064
drh0ede9eb2015-01-10 16:49:23 +000065#if HAVE_READLINE
drh8e7e7a22000-05-30 18:45:23 +000066# include <readline/readline.h>
67# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000068#endif
danfd34d6d2015-02-25 10:54:53 +000069
drh0ede9eb2015-01-10 16:49:23 +000070#if HAVE_EDITLINE
drhaaa21b42014-02-11 14:37:51 +000071# include <editline/readline.h>
72#endif
danfd34d6d2015-02-25 10:54:53 +000073
74#if HAVE_EDITLINE || HAVE_READLINE
75
76# define shell_add_history(X) add_history(X)
77# define shell_read_history(X) read_history(X)
78# define shell_write_history(X) write_history(X)
79# define shell_stifle_history(X) stifle_history(X)
80# define shell_readline(X) readline(X)
81
82#elif HAVE_LINENOISE
83
84# include "linenoise.h"
85# define shell_add_history(X) linenoiseHistoryAdd(X)
86# define shell_read_history(X) linenoiseHistoryLoad(X)
87# define shell_write_history(X) linenoiseHistorySave(X)
88# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89# define shell_readline(X) linenoise(X)
90
91#else
92
mistachkin1fe36bb2016-04-04 02:16:44 +000093# define shell_read_history(X)
danfd34d6d2015-02-25 10:54:53 +000094# define shell_write_history(X)
95# define shell_stifle_history(X)
96
97# define SHELL_USE_LOCAL_GETLINE 1
drh75897232000-05-29 14:26:00 +000098#endif
99
danfd34d6d2015-02-25 10:54:53 +0000100
adamd2e8464a2006-09-06 21:39:40 +0000101#if defined(_WIN32) || defined(WIN32)
102# include <io.h>
drh6976c212014-07-24 12:09:47 +0000103# include <fcntl.h>
mistachkin073664d2015-06-17 18:57:37 +0000104# define isatty(h) _isatty(h)
105# ifndef access
106# define access(f,m) _access((f),(m))
107# endif
108# undef popen
109# define popen _popen
110# undef pclose
111# define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000112#else
mistachkin073664d2015-06-17 18:57:37 +0000113 /* Make sure isatty() has a prototype. */
114 extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000115
mistachkin073664d2015-06-17 18:57:37 +0000116# if !defined(__RTP__) && !defined(_WRS_KERNEL)
117 /* popen and pclose are not C89 functions and so are
118 ** sometimes omitted from the <stdio.h> header */
119 extern FILE *popen(const char*,const char*);
120 extern int pclose(FILE*);
121# else
122# define SQLITE_OMIT_POPEN 1
123# endif
mistachkinf6418892013-08-28 01:54:12 +0000124#endif
drh53371f92013-07-25 17:07:03 +0000125
chw65d3c132007-11-12 21:09:10 +0000126#if defined(_WIN32_WCE)
127/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128 * thus we always assume that we have a console. That can be
129 * overridden with the -batch command line option.
130 */
131#define isatty(x) 1
132#endif
133
drhf0693c82011-10-11 20:41:54 +0000134/* ctype macros that work with signed characters */
135#define IsSpace(X) isspace((unsigned char)X)
136#define IsDigit(X) isdigit((unsigned char)X)
137#define ToLower(X) (char)tolower((unsigned char)X)
138
mistachkin1fe36bb2016-04-04 02:16:44 +0000139#if defined(_WIN32) || defined(WIN32)
140#include <windows.h>
141
142/* string conversion routines only needed on Win32 */
143extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
144extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
145extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
mistachkin8145fc62016-09-16 20:39:21 +0000146extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
mistachkin1fe36bb2016-04-04 02:16:44 +0000147#endif
148
drh047d4532015-01-18 20:30:23 +0000149/* On Windows, we normally run with output mode of TEXT so that \n characters
150** are automatically translated into \r\n. However, this behavior needs
151** to be disabled in some cases (ex: when generating CSV output and when
152** rendering quoted strings that contain \n characters). The following
153** routines take care of that.
154*/
155#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000156static void setBinaryMode(FILE *file, int isOutput){
157 if( isOutput ) fflush(file);
158 _setmode(_fileno(file), _O_BINARY);
drh047d4532015-01-18 20:30:23 +0000159}
mistachkin1fe36bb2016-04-04 02:16:44 +0000160static void setTextMode(FILE *file, int isOutput){
161 if( isOutput ) fflush(file);
162 _setmode(_fileno(file), _O_TEXT);
drh047d4532015-01-18 20:30:23 +0000163}
164#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000165# define setBinaryMode(X,Y)
166# define setTextMode(X,Y)
drh047d4532015-01-18 20:30:23 +0000167#endif
168
drh43408312013-10-30 12:43:36 +0000169
170/* True if the timer is enabled */
171static int enableTimer = 0;
172
173/* Return the current wall-clock time */
174static sqlite3_int64 timeOfDay(void){
175 static sqlite3_vfs *clockVfs = 0;
176 sqlite3_int64 t;
177 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000178 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000179 clockVfs->xCurrentTimeInt64(clockVfs, &t);
180 }else{
181 double r;
182 clockVfs->xCurrentTime(clockVfs, &r);
183 t = (sqlite3_int64)(r*86400000.0);
184 }
185 return t;
186}
187
drh91eb93c2015-03-03 19:56:20 +0000188#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000189#include <sys/time.h>
190#include <sys/resource.h>
191
drh91eb93c2015-03-03 19:56:20 +0000192/* VxWorks does not support getrusage() as far as we can determine */
193#if defined(_WRS_KERNEL) || defined(__RTP__)
194struct rusage {
195 struct timeval ru_utime; /* user CPU time used */
196 struct timeval ru_stime; /* system CPU time used */
197};
198#define getrusage(A,B) memset(B,0,sizeof(*B))
199#endif
200
drhda108222009-02-25 19:07:24 +0000201/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000202static struct rusage sBegin; /* CPU time at start */
203static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000204
drhda108222009-02-25 19:07:24 +0000205/*
206** Begin timing an operation
207*/
208static void beginTimer(void){
209 if( enableTimer ){
210 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000211 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000212 }
213}
214
215/* Return the difference of two time_structs in seconds */
216static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
mistachkin1fe36bb2016-04-04 02:16:44 +0000217 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
drhda108222009-02-25 19:07:24 +0000218 (double)(pEnd->tv_sec - pStart->tv_sec);
219}
220
221/*
222** Print the timing results.
223*/
224static void endTimer(void){
225 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000226 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000227 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000228 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000229 printf("Run Time: real %.3f user %f sys %f\n",
230 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000231 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
232 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
233 }
234}
shaneb320ccd2009-10-21 03:42:58 +0000235
drhda108222009-02-25 19:07:24 +0000236#define BEGIN_TIMER beginTimer()
237#define END_TIMER endTimer()
238#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000239
240#elif (defined(_WIN32) || defined(WIN32))
241
shaneb320ccd2009-10-21 03:42:58 +0000242/* Saved resource information for the beginning of an operation */
243static HANDLE hProcess;
244static FILETIME ftKernelBegin;
245static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000246static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000247typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
248 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000249static GETPROCTIMES getProcessTimesAddr = NULL;
250
shaneb320ccd2009-10-21 03:42:58 +0000251/*
252** Check to see if we have timer support. Return 1 if necessary
253** support found (or found previously).
254*/
255static int hasTimer(void){
256 if( getProcessTimesAddr ){
257 return 1;
258 } else {
drh4ace5362014-11-10 14:42:28 +0000259 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
260 ** versions. See if the version we are running on has it, and if it
261 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000262 */
263 hProcess = GetCurrentProcess();
264 if( hProcess ){
265 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
266 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000267 getProcessTimesAddr =
268 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000269 if( NULL != getProcessTimesAddr ){
270 return 1;
271 }
mistachkin1fe36bb2016-04-04 02:16:44 +0000272 FreeLibrary(hinstLib);
shaneb320ccd2009-10-21 03:42:58 +0000273 }
274 }
275 }
276 return 0;
277}
278
279/*
280** Begin timing an operation
281*/
282static void beginTimer(void){
283 if( enableTimer && getProcessTimesAddr ){
284 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000285 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
286 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000287 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000288 }
289}
290
291/* Return the difference of two FILETIME structs in seconds */
292static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
293 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
294 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
295 return (double) ((i64End - i64Start) / 10000000.0);
296}
297
298/*
299** Print the timing results.
300*/
301static void endTimer(void){
302 if( enableTimer && getProcessTimesAddr){
303 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000304 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000305 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000306 printf("Run Time: real %.3f user %f sys %f\n",
307 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000308 timeDiff(&ftUserBegin, &ftUserEnd),
309 timeDiff(&ftKernelBegin, &ftKernelEnd));
310 }
311}
312
313#define BEGIN_TIMER beginTimer()
314#define END_TIMER endTimer()
315#define HAS_TIMER hasTimer()
316
drhda108222009-02-25 19:07:24 +0000317#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000318#define BEGIN_TIMER
drhda108222009-02-25 19:07:24 +0000319#define END_TIMER
320#define HAS_TIMER 0
321#endif
322
shanec0688ea2009-03-05 03:48:06 +0000323/*
324** Used to prevent warnings about unused parameters
325*/
326#define UNUSED_PARAMETER(x) (void)(x)
327
drhe91d16b2008-12-08 18:27:31 +0000328/*
drhc49f44e2006-10-26 18:15:42 +0000329** If the following flag is set, then command execution stops
330** at an error if we are not interactive.
331*/
332static int bail_on_error = 0;
333
334/*
drhc28490c2006-10-26 14:25:58 +0000335** Threat stdin as an interactive input if the following variable
336** is true. Otherwise, assume stdin is connected to a file or pipe.
337*/
338static int stdin_is_interactive = 1;
339
340/*
drhe05461c2015-12-30 13:36:57 +0000341** On Windows systems we have to know if standard output is a console
342** in order to translate UTF-8 into MBCS. The following variable is
343** true if translation is required.
344*/
345static int stdout_is_console = 1;
346
347/*
drh4c504392000-10-16 22:06:40 +0000348** The following is the open SQLite database. We make a pointer
349** to this database a static variable so that it can be accessed
350** by the SIGINT handler to interrupt database processing.
351*/
mistachkin8e189222015-04-19 21:43:16 +0000352static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000353
354/*
drh67505e72002-04-19 12:34:06 +0000355** True if an interrupt (Control-C) has been received.
356*/
drh43617e92006-03-06 20:55:46 +0000357static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000358
359/*
persicom7e2dfdd2002-04-18 02:46:52 +0000360** This is the name of our program. It is set in main(), used
361** in a number of other places, mostly for error messages.
362*/
363static char *Argv0;
364
365/*
366** Prompt strings. Initialized in main. Settable with
367** .prompt main continue
368*/
369static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
370static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
371
drhb0603412007-02-28 04:47:26 +0000372/*
mistachkin710b33b2016-01-03 18:59:28 +0000373** Render output like fprintf(). Except, if the output is going to the
374** console and if this is running on a Windows machine, translate the
375** output from UTF-8 into MBCS.
376*/
377#if defined(_WIN32) || defined(WIN32)
378void utf8_printf(FILE *out, const char *zFormat, ...){
379 va_list ap;
380 va_start(ap, zFormat);
381 if( stdout_is_console && (out==stdout || out==stderr) ){
mistachkin710b33b2016-01-03 18:59:28 +0000382 char *z1 = sqlite3_vmprintf(zFormat, ap);
mistachkin1fe36bb2016-04-04 02:16:44 +0000383 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
mistachkin710b33b2016-01-03 18:59:28 +0000384 sqlite3_free(z1);
385 fputs(z2, out);
386 sqlite3_free(z2);
387 }else{
388 vfprintf(out, zFormat, ap);
389 }
390 va_end(ap);
391}
392#elif !defined(utf8_printf)
393# define utf8_printf fprintf
394#endif
395
396/*
397** Render output like fprintf(). This should not be used on anything that
398** includes string formatting (e.g. "%s").
399*/
400#if !defined(raw_printf)
401# define raw_printf fprintf
402#endif
403
404/*
drhb0603412007-02-28 04:47:26 +0000405** Write I/O traces to the following stream.
406*/
rsebe0a9092007-07-30 18:24:38 +0000407#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000408static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000409#endif
drhb0603412007-02-28 04:47:26 +0000410
411/*
412** This routine works like printf in that its first argument is a
413** format string and subsequent arguments are values to be substituted
414** in place of % fields. The result of formatting this string
415** is written to iotrace.
416*/
rsebe0a9092007-07-30 18:24:38 +0000417#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000418static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000419 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000420 char *z;
drhb0603412007-02-28 04:47:26 +0000421 if( iotrace==0 ) return;
422 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000423 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000424 va_end(ap);
mistachkin710b33b2016-01-03 18:59:28 +0000425 utf8_printf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000426 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000427}
rsebe0a9092007-07-30 18:24:38 +0000428#endif
drhb0603412007-02-28 04:47:26 +0000429
drh44c2eb12003-04-30 11:38:26 +0000430
persicom7e2dfdd2002-04-18 02:46:52 +0000431/*
drh83965662003-04-17 02:54:13 +0000432** Determines if a string is a number of not.
433*/
danielk19772e588c72005-12-09 14:25:08 +0000434static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000435 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000436 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000437 return 0;
438 }
439 z++;
440 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000441 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000442 if( *z=='.' ){
443 z++;
drhf0693c82011-10-11 20:41:54 +0000444 if( !IsDigit(*z) ) return 0;
445 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000446 if( realnum ) *realnum = 1;
447 }
448 if( *z=='e' || *z=='E' ){
449 z++;
450 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000451 if( !IsDigit(*z) ) return 0;
452 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000453 if( realnum ) *realnum = 1;
454 }
455 return *z==0;
456}
drh83965662003-04-17 02:54:13 +0000457
458/*
drhe05461c2015-12-30 13:36:57 +0000459** Compute a string length that is limited to what can be stored in
460** lower 30 bits of a 32-bit signed integer.
461*/
462static int strlen30(const char *z){
463 const char *z2 = z;
464 while( *z2 ){ z2++; }
465 return 0x3fffffff & (int)(z2 - z);
466}
467
468/*
drhfeac5f82004-08-01 00:10:45 +0000469** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000470** the text in memory obtained from malloc() and returns a pointer
471** to the text. NULL is returned at end of file, or if malloc()
472** fails.
473**
drh9f099fd2013-08-06 14:01:46 +0000474** If zLine is not NULL then it is a malloced buffer returned from
475** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000476*/
drh9f099fd2013-08-06 14:01:46 +0000477static char *local_getline(char *zLine, FILE *in){
478 int nLine = zLine==0 ? 0 : 100;
479 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000480
drhb07028f2011-10-14 21:49:18 +0000481 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000482 if( n+100>nLine ){
483 nLine = nLine*2 + 100;
484 zLine = realloc(zLine, nLine);
485 if( zLine==0 ) return 0;
486 }
drhdaffd0e2001-04-11 14:28:42 +0000487 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000488 if( n==0 ){
489 free(zLine);
490 return 0;
491 }
492 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000493 break;
494 }
drh9f099fd2013-08-06 14:01:46 +0000495 while( zLine[n] ) n++;
496 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000497 n--;
shaneh13b36022009-12-17 21:07:15 +0000498 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000499 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000500 break;
drh8e7e7a22000-05-30 18:45:23 +0000501 }
502 }
drhe05461c2015-12-30 13:36:57 +0000503#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000504 /* For interactive input on Windows systems, translate the
drhe05461c2015-12-30 13:36:57 +0000505 ** multi-byte characterset characters into UTF-8. */
drhfc8b40f2016-09-07 10:10:18 +0000506 if( stdin_is_interactive && in==stdin ){
mistachkin1fe36bb2016-04-04 02:16:44 +0000507 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
drhe05461c2015-12-30 13:36:57 +0000508 if( zTrans ){
509 int nTrans = strlen30(zTrans)+1;
510 if( nTrans>nLine ){
511 zLine = realloc(zLine, nTrans);
512 if( zLine==0 ){
513 sqlite3_free(zTrans);
514 return 0;
515 }
516 }
517 memcpy(zLine, zTrans, nTrans);
518 sqlite3_free(zTrans);
519 }
520 }
521#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000522 return zLine;
523}
524
525/*
drhc28490c2006-10-26 14:25:58 +0000526** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000527**
drh9f099fd2013-08-06 14:01:46 +0000528** If in==0 then read from standard input and prompt before each line.
529** If isContinuation is true, then a continuation prompt is appropriate.
530** If isContinuation is zero, then the main prompt should be used.
531**
532** If zPrior is not NULL then it is a buffer from a prior call to this
533** routine that can be reused.
534**
535** The result is stored in space obtained from malloc() and must either
536** be freed by the caller or else passed back into this routine via the
537** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000538*/
drh9f099fd2013-08-06 14:01:46 +0000539static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000540 char *zPrompt;
541 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000542 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000543 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000544 }else{
drh9f099fd2013-08-06 14:01:46 +0000545 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000546#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000547 printf("%s", zPrompt);
548 fflush(stdout);
549 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000550#else
551 free(zPrior);
552 zResult = shell_readline(zPrompt);
553 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000554#endif
drh9f099fd2013-08-06 14:01:46 +0000555 }
drh8e7e7a22000-05-30 18:45:23 +0000556 return zResult;
557}
drhf42d3182017-03-08 12:25:18 +0000558/*
559** A variable length string to which one can append text.
560*/
561typedef struct ShellText ShellText;
562struct ShellText {
563 char *z;
564 int n;
565 int nAlloc;
566};
567
568/*
569** Initialize and destroy a ShellText object
570*/
571static void initText(ShellText *p){
572 memset(p, 0, sizeof(*p));
573}
574static void freeText(ShellText *p){
575 free(p->z);
576 initText(p);
577}
578
579/* zIn is either a pointer to a NULL-terminated string in memory obtained
580** from malloc(), or a NULL pointer. The string pointed to by zAppend is
581** added to zIn, and the result returned in memory obtained from malloc().
582** zIn, if it was not NULL, is freed.
583**
584** If the third argument, quote, is not '\0', then it is used as a
585** quote character for zAppend.
586*/
587static void appendText(ShellText *p, char const *zAppend, char quote){
588 int len;
589 int i;
590 int nAppend = strlen30(zAppend);
591
592 len = nAppend+p->n+1;
593 if( quote ){
594 len += 2;
595 for(i=0; i<nAppend; i++){
596 if( zAppend[i]==quote ) len++;
597 }
598 }
599
600 if( p->n+len>=p->nAlloc ){
601 p->nAlloc = p->nAlloc*2 + len + 20;
602 p->z = realloc(p->z, p->nAlloc);
603 if( p->z==0 ){
604 memset(p, 0, sizeof(*p));
605 return;
606 }
607 }
608
609 if( quote ){
610 char *zCsr = p->z+p->n;
611 *zCsr++ = quote;
612 for(i=0; i<nAppend; i++){
613 *zCsr++ = zAppend[i];
614 if( zAppend[i]==quote ) *zCsr++ = quote;
615 }
616 *zCsr++ = quote;
617 p->n = (int)(zCsr - p->z);
618 *zCsr = '\0';
619 }else{
620 memcpy(p->z+p->n, zAppend, nAppend);
621 p->n += nAppend;
622 p->z[p->n] = '\0';
623 }
624}
625
626/*
627** Attempt to determine if identifier zName needs to be quoted, either
628** because it contains non-alphanumeric characters, or because it is an
629** SQLite keyword. Be conservative in this estimate: When in doubt assume
630** that quoting is required.
631**
632** Return '"' if quoting is required. Return 0 if no quoting is required.
633*/
634static char quoteChar(const char *zName){
635 /* All SQLite keywords, in alphabetical order */
636 static const char *azKeywords[] = {
637 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
638 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
639 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
640 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
641 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
642 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
643 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
644 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
645 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
646 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
647 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
648 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
649 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
650 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
651 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
652 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
653 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
654 "WITH", "WITHOUT",
655 };
656 int i, lwr, upr, mid, c;
657 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
658 for(i=0; zName[i]; i++){
659 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
660 }
661 lwr = 0;
662 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
663 while( lwr<=upr ){
664 mid = (lwr+upr)/2;
665 c = sqlite3_stricmp(azKeywords[mid], zName);
666 if( c==0 ) return '"';
667 if( c<0 ){
668 lwr = mid+1;
669 }else{
670 upr = mid-1;
671 }
672 }
673 return 0;
674}
drh8e7e7a22000-05-30 18:45:23 +0000675
drh1554bc82017-03-08 16:10:34 +0000676/******************************************************************************
677** SHA3 hash implementation copied from ../ext/misc/shathree.c
678*/
679typedef sqlite3_uint64 u64;
680/*
681** Macros to determine whether the machine is big or little endian,
682** and whether or not that determination is run-time or compile-time.
683**
684** For best performance, an attempt is made to guess at the byte-order
685** using C-preprocessor macros. If that is unsuccessful, or if
686** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
687** at run-time.
688*/
689#ifndef SHA3_BYTEORDER
690# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
691 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
692 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
693 defined(__arm__)
694# define SHA3_BYTEORDER 1234
695# elif defined(sparc) || defined(__ppc__)
696# define SHA3_BYTEORDER 4321
697# else
698# define SHA3_BYTEORDER 0
699# endif
700#endif
701
702
703/*
704** State structure for a SHA3 hash in progress
705*/
706typedef struct SHA3Context SHA3Context;
707struct SHA3Context {
708 union {
709 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
710 unsigned char x[1600]; /* ... or 1600 bytes */
711 } u;
712 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
713 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
714 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
715};
716
717/*
718** A single step of the Keccak mixing function for a 1600-bit state
719*/
720static void KeccakF1600Step(SHA3Context *p){
721 int i;
722 u64 B0, B1, B2, B3, B4;
723 u64 C0, C1, C2, C3, C4;
724 u64 D0, D1, D2, D3, D4;
725 static const u64 RC[] = {
726 0x0000000000000001ULL, 0x0000000000008082ULL,
727 0x800000000000808aULL, 0x8000000080008000ULL,
728 0x000000000000808bULL, 0x0000000080000001ULL,
729 0x8000000080008081ULL, 0x8000000000008009ULL,
730 0x000000000000008aULL, 0x0000000000000088ULL,
731 0x0000000080008009ULL, 0x000000008000000aULL,
732 0x000000008000808bULL, 0x800000000000008bULL,
733 0x8000000000008089ULL, 0x8000000000008003ULL,
734 0x8000000000008002ULL, 0x8000000000000080ULL,
735 0x000000000000800aULL, 0x800000008000000aULL,
736 0x8000000080008081ULL, 0x8000000000008080ULL,
737 0x0000000080000001ULL, 0x8000000080008008ULL
738 };
739# define A00 (p->u.s[0])
740# define A01 (p->u.s[1])
741# define A02 (p->u.s[2])
742# define A03 (p->u.s[3])
743# define A04 (p->u.s[4])
744# define A10 (p->u.s[5])
745# define A11 (p->u.s[6])
746# define A12 (p->u.s[7])
747# define A13 (p->u.s[8])
748# define A14 (p->u.s[9])
749# define A20 (p->u.s[10])
750# define A21 (p->u.s[11])
751# define A22 (p->u.s[12])
752# define A23 (p->u.s[13])
753# define A24 (p->u.s[14])
754# define A30 (p->u.s[15])
755# define A31 (p->u.s[16])
756# define A32 (p->u.s[17])
757# define A33 (p->u.s[18])
758# define A34 (p->u.s[19])
759# define A40 (p->u.s[20])
760# define A41 (p->u.s[21])
761# define A42 (p->u.s[22])
762# define A43 (p->u.s[23])
763# define A44 (p->u.s[24])
764# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
765
766 for(i=0; i<24; i+=4){
767 C0 = A00^A10^A20^A30^A40;
768 C1 = A01^A11^A21^A31^A41;
769 C2 = A02^A12^A22^A32^A42;
770 C3 = A03^A13^A23^A33^A43;
771 C4 = A04^A14^A24^A34^A44;
772 D0 = C4^ROL64(C1, 1);
773 D1 = C0^ROL64(C2, 1);
774 D2 = C1^ROL64(C3, 1);
775 D3 = C2^ROL64(C4, 1);
776 D4 = C3^ROL64(C0, 1);
777
778 B0 = (A00^D0);
779 B1 = ROL64((A11^D1), 44);
780 B2 = ROL64((A22^D2), 43);
781 B3 = ROL64((A33^D3), 21);
782 B4 = ROL64((A44^D4), 14);
783 A00 = B0 ^((~B1)& B2 );
784 A00 ^= RC[i];
785 A11 = B1 ^((~B2)& B3 );
786 A22 = B2 ^((~B3)& B4 );
787 A33 = B3 ^((~B4)& B0 );
788 A44 = B4 ^((~B0)& B1 );
789
790 B2 = ROL64((A20^D0), 3);
791 B3 = ROL64((A31^D1), 45);
792 B4 = ROL64((A42^D2), 61);
793 B0 = ROL64((A03^D3), 28);
794 B1 = ROL64((A14^D4), 20);
795 A20 = B0 ^((~B1)& B2 );
796 A31 = B1 ^((~B2)& B3 );
797 A42 = B2 ^((~B3)& B4 );
798 A03 = B3 ^((~B4)& B0 );
799 A14 = B4 ^((~B0)& B1 );
800
801 B4 = ROL64((A40^D0), 18);
802 B0 = ROL64((A01^D1), 1);
803 B1 = ROL64((A12^D2), 6);
804 B2 = ROL64((A23^D3), 25);
805 B3 = ROL64((A34^D4), 8);
806 A40 = B0 ^((~B1)& B2 );
807 A01 = B1 ^((~B2)& B3 );
808 A12 = B2 ^((~B3)& B4 );
809 A23 = B3 ^((~B4)& B0 );
810 A34 = B4 ^((~B0)& B1 );
811
812 B1 = ROL64((A10^D0), 36);
813 B2 = ROL64((A21^D1), 10);
814 B3 = ROL64((A32^D2), 15);
815 B4 = ROL64((A43^D3), 56);
816 B0 = ROL64((A04^D4), 27);
817 A10 = B0 ^((~B1)& B2 );
818 A21 = B1 ^((~B2)& B3 );
819 A32 = B2 ^((~B3)& B4 );
820 A43 = B3 ^((~B4)& B0 );
821 A04 = B4 ^((~B0)& B1 );
822
823 B3 = ROL64((A30^D0), 41);
824 B4 = ROL64((A41^D1), 2);
825 B0 = ROL64((A02^D2), 62);
826 B1 = ROL64((A13^D3), 55);
827 B2 = ROL64((A24^D4), 39);
828 A30 = B0 ^((~B1)& B2 );
829 A41 = B1 ^((~B2)& B3 );
830 A02 = B2 ^((~B3)& B4 );
831 A13 = B3 ^((~B4)& B0 );
832 A24 = B4 ^((~B0)& B1 );
833
834 C0 = A00^A20^A40^A10^A30;
835 C1 = A11^A31^A01^A21^A41;
836 C2 = A22^A42^A12^A32^A02;
837 C3 = A33^A03^A23^A43^A13;
838 C4 = A44^A14^A34^A04^A24;
839 D0 = C4^ROL64(C1, 1);
840 D1 = C0^ROL64(C2, 1);
841 D2 = C1^ROL64(C3, 1);
842 D3 = C2^ROL64(C4, 1);
843 D4 = C3^ROL64(C0, 1);
844
845 B0 = (A00^D0);
846 B1 = ROL64((A31^D1), 44);
847 B2 = ROL64((A12^D2), 43);
848 B3 = ROL64((A43^D3), 21);
849 B4 = ROL64((A24^D4), 14);
850 A00 = B0 ^((~B1)& B2 );
851 A00 ^= RC[i+1];
852 A31 = B1 ^((~B2)& B3 );
853 A12 = B2 ^((~B3)& B4 );
854 A43 = B3 ^((~B4)& B0 );
855 A24 = B4 ^((~B0)& B1 );
856
857 B2 = ROL64((A40^D0), 3);
858 B3 = ROL64((A21^D1), 45);
859 B4 = ROL64((A02^D2), 61);
860 B0 = ROL64((A33^D3), 28);
861 B1 = ROL64((A14^D4), 20);
862 A40 = B0 ^((~B1)& B2 );
863 A21 = B1 ^((~B2)& B3 );
864 A02 = B2 ^((~B3)& B4 );
865 A33 = B3 ^((~B4)& B0 );
866 A14 = B4 ^((~B0)& B1 );
867
868 B4 = ROL64((A30^D0), 18);
869 B0 = ROL64((A11^D1), 1);
870 B1 = ROL64((A42^D2), 6);
871 B2 = ROL64((A23^D3), 25);
872 B3 = ROL64((A04^D4), 8);
873 A30 = B0 ^((~B1)& B2 );
874 A11 = B1 ^((~B2)& B3 );
875 A42 = B2 ^((~B3)& B4 );
876 A23 = B3 ^((~B4)& B0 );
877 A04 = B4 ^((~B0)& B1 );
878
879 B1 = ROL64((A20^D0), 36);
880 B2 = ROL64((A01^D1), 10);
881 B3 = ROL64((A32^D2), 15);
882 B4 = ROL64((A13^D3), 56);
883 B0 = ROL64((A44^D4), 27);
884 A20 = B0 ^((~B1)& B2 );
885 A01 = B1 ^((~B2)& B3 );
886 A32 = B2 ^((~B3)& B4 );
887 A13 = B3 ^((~B4)& B0 );
888 A44 = B4 ^((~B0)& B1 );
889
890 B3 = ROL64((A10^D0), 41);
891 B4 = ROL64((A41^D1), 2);
892 B0 = ROL64((A22^D2), 62);
893 B1 = ROL64((A03^D3), 55);
894 B2 = ROL64((A34^D4), 39);
895 A10 = B0 ^((~B1)& B2 );
896 A41 = B1 ^((~B2)& B3 );
897 A22 = B2 ^((~B3)& B4 );
898 A03 = B3 ^((~B4)& B0 );
899 A34 = B4 ^((~B0)& B1 );
900
901 C0 = A00^A40^A30^A20^A10;
902 C1 = A31^A21^A11^A01^A41;
903 C2 = A12^A02^A42^A32^A22;
904 C3 = A43^A33^A23^A13^A03;
905 C4 = A24^A14^A04^A44^A34;
906 D0 = C4^ROL64(C1, 1);
907 D1 = C0^ROL64(C2, 1);
908 D2 = C1^ROL64(C3, 1);
909 D3 = C2^ROL64(C4, 1);
910 D4 = C3^ROL64(C0, 1);
911
912 B0 = (A00^D0);
913 B1 = ROL64((A21^D1), 44);
914 B2 = ROL64((A42^D2), 43);
915 B3 = ROL64((A13^D3), 21);
916 B4 = ROL64((A34^D4), 14);
917 A00 = B0 ^((~B1)& B2 );
918 A00 ^= RC[i+2];
919 A21 = B1 ^((~B2)& B3 );
920 A42 = B2 ^((~B3)& B4 );
921 A13 = B3 ^((~B4)& B0 );
922 A34 = B4 ^((~B0)& B1 );
923
924 B2 = ROL64((A30^D0), 3);
925 B3 = ROL64((A01^D1), 45);
926 B4 = ROL64((A22^D2), 61);
927 B0 = ROL64((A43^D3), 28);
928 B1 = ROL64((A14^D4), 20);
929 A30 = B0 ^((~B1)& B2 );
930 A01 = B1 ^((~B2)& B3 );
931 A22 = B2 ^((~B3)& B4 );
932 A43 = B3 ^((~B4)& B0 );
933 A14 = B4 ^((~B0)& B1 );
934
935 B4 = ROL64((A10^D0), 18);
936 B0 = ROL64((A31^D1), 1);
937 B1 = ROL64((A02^D2), 6);
938 B2 = ROL64((A23^D3), 25);
939 B3 = ROL64((A44^D4), 8);
940 A10 = B0 ^((~B1)& B2 );
941 A31 = B1 ^((~B2)& B3 );
942 A02 = B2 ^((~B3)& B4 );
943 A23 = B3 ^((~B4)& B0 );
944 A44 = B4 ^((~B0)& B1 );
945
946 B1 = ROL64((A40^D0), 36);
947 B2 = ROL64((A11^D1), 10);
948 B3 = ROL64((A32^D2), 15);
949 B4 = ROL64((A03^D3), 56);
950 B0 = ROL64((A24^D4), 27);
951 A40 = B0 ^((~B1)& B2 );
952 A11 = B1 ^((~B2)& B3 );
953 A32 = B2 ^((~B3)& B4 );
954 A03 = B3 ^((~B4)& B0 );
955 A24 = B4 ^((~B0)& B1 );
956
957 B3 = ROL64((A20^D0), 41);
958 B4 = ROL64((A41^D1), 2);
959 B0 = ROL64((A12^D2), 62);
960 B1 = ROL64((A33^D3), 55);
961 B2 = ROL64((A04^D4), 39);
962 A20 = B0 ^((~B1)& B2 );
963 A41 = B1 ^((~B2)& B3 );
964 A12 = B2 ^((~B3)& B4 );
965 A33 = B3 ^((~B4)& B0 );
966 A04 = B4 ^((~B0)& B1 );
967
968 C0 = A00^A30^A10^A40^A20;
969 C1 = A21^A01^A31^A11^A41;
970 C2 = A42^A22^A02^A32^A12;
971 C3 = A13^A43^A23^A03^A33;
972 C4 = A34^A14^A44^A24^A04;
973 D0 = C4^ROL64(C1, 1);
974 D1 = C0^ROL64(C2, 1);
975 D2 = C1^ROL64(C3, 1);
976 D3 = C2^ROL64(C4, 1);
977 D4 = C3^ROL64(C0, 1);
978
979 B0 = (A00^D0);
980 B1 = ROL64((A01^D1), 44);
981 B2 = ROL64((A02^D2), 43);
982 B3 = ROL64((A03^D3), 21);
983 B4 = ROL64((A04^D4), 14);
984 A00 = B0 ^((~B1)& B2 );
985 A00 ^= RC[i+3];
986 A01 = B1 ^((~B2)& B3 );
987 A02 = B2 ^((~B3)& B4 );
988 A03 = B3 ^((~B4)& B0 );
989 A04 = B4 ^((~B0)& B1 );
990
991 B2 = ROL64((A10^D0), 3);
992 B3 = ROL64((A11^D1), 45);
993 B4 = ROL64((A12^D2), 61);
994 B0 = ROL64((A13^D3), 28);
995 B1 = ROL64((A14^D4), 20);
996 A10 = B0 ^((~B1)& B2 );
997 A11 = B1 ^((~B2)& B3 );
998 A12 = B2 ^((~B3)& B4 );
999 A13 = B3 ^((~B4)& B0 );
1000 A14 = B4 ^((~B0)& B1 );
1001
1002 B4 = ROL64((A20^D0), 18);
1003 B0 = ROL64((A21^D1), 1);
1004 B1 = ROL64((A22^D2), 6);
1005 B2 = ROL64((A23^D3), 25);
1006 B3 = ROL64((A24^D4), 8);
1007 A20 = B0 ^((~B1)& B2 );
1008 A21 = B1 ^((~B2)& B3 );
1009 A22 = B2 ^((~B3)& B4 );
1010 A23 = B3 ^((~B4)& B0 );
1011 A24 = B4 ^((~B0)& B1 );
1012
1013 B1 = ROL64((A30^D0), 36);
1014 B2 = ROL64((A31^D1), 10);
1015 B3 = ROL64((A32^D2), 15);
1016 B4 = ROL64((A33^D3), 56);
1017 B0 = ROL64((A34^D4), 27);
1018 A30 = B0 ^((~B1)& B2 );
1019 A31 = B1 ^((~B2)& B3 );
1020 A32 = B2 ^((~B3)& B4 );
1021 A33 = B3 ^((~B4)& B0 );
1022 A34 = B4 ^((~B0)& B1 );
1023
1024 B3 = ROL64((A40^D0), 41);
1025 B4 = ROL64((A41^D1), 2);
1026 B0 = ROL64((A42^D2), 62);
1027 B1 = ROL64((A43^D3), 55);
1028 B2 = ROL64((A44^D4), 39);
1029 A40 = B0 ^((~B1)& B2 );
1030 A41 = B1 ^((~B2)& B3 );
1031 A42 = B2 ^((~B3)& B4 );
1032 A43 = B3 ^((~B4)& B0 );
1033 A44 = B4 ^((~B0)& B1 );
1034 }
1035}
1036
1037/*
1038** Initialize a new hash. iSize determines the size of the hash
1039** in bits and should be one of 224, 256, 384, or 512. Or iSize
1040** can be zero to use the default hash size of 256 bits.
1041*/
1042static void SHA3Init(SHA3Context *p, int iSize){
1043 memset(p, 0, sizeof(*p));
1044 if( iSize>=128 && iSize<=512 ){
1045 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1046 }else{
1047 p->nRate = (1600 - 2*256)/8;
1048 }
1049#if SHA3_BYTEORDER==1234
1050 /* Known to be little-endian at compile-time. No-op */
1051#elif SHA3_BYTEORDER==4321
1052 p->ixMask = 7; /* Big-endian */
1053#else
1054 {
1055 static unsigned int one = 1;
1056 if( 1==*(unsigned char*)&one ){
1057 /* Little endian. No byte swapping. */
1058 p->ixMask = 0;
1059 }else{
1060 /* Big endian. Byte swap. */
1061 p->ixMask = 7;
1062 }
1063 }
1064#endif
1065}
1066
1067/*
1068** Make consecutive calls to the SHA3Update function to add new content
1069** to the hash
1070*/
1071static void SHA3Update(
1072 SHA3Context *p,
1073 const unsigned char *aData,
1074 unsigned int nData
1075){
1076 unsigned int i = 0;
1077#if SHA3_BYTEORDER==1234
1078 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1079 for(; i+7<nData; i+=8){
1080 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1081 p->nLoaded += 8;
1082 if( p->nLoaded>=p->nRate ){
1083 KeccakF1600Step(p);
1084 p->nLoaded = 0;
1085 }
1086 }
1087 }
1088#endif
1089 for(; i<nData; i++){
1090#if SHA3_BYTEORDER==1234
1091 p->u.x[p->nLoaded] ^= aData[i];
1092#elif SHA3_BYTEORDER==4321
1093 p->u.x[p->nLoaded^0x07] ^= aData[i];
1094#else
1095 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1096#endif
1097 p->nLoaded++;
1098 if( p->nLoaded==p->nRate ){
1099 KeccakF1600Step(p);
1100 p->nLoaded = 0;
1101 }
1102 }
1103}
1104
1105/*
1106** After all content has been added, invoke SHA3Final() to compute
1107** the final hash. The function returns a pointer to the binary
1108** hash value.
1109*/
1110static unsigned char *SHA3Final(SHA3Context *p){
1111 unsigned int i;
1112 if( p->nLoaded==p->nRate-1 ){
1113 const unsigned char c1 = 0x86;
1114 SHA3Update(p, &c1, 1);
1115 }else{
1116 const unsigned char c2 = 0x06;
1117 const unsigned char c3 = 0x80;
1118 SHA3Update(p, &c2, 1);
1119 p->nLoaded = p->nRate - 1;
1120 SHA3Update(p, &c3, 1);
1121 }
1122 for(i=0; i<p->nRate; i++){
1123 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1124 }
1125 return &p->u.x[p->nRate];
1126}
1127
1128/*
1129** Implementation of the sha3(X,SIZE) function.
1130**
1131** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
1132** size is 256. If X is a BLOB, it is hashed as is.
1133** For all other non-NULL types of input, X is converted into a UTF-8 string
1134** and the string is hashed without the trailing 0x00 terminator. The hash
1135** of a NULL value is NULL.
1136*/
1137static void sha3Func(
1138 sqlite3_context *context,
1139 int argc,
1140 sqlite3_value **argv
1141){
1142 SHA3Context cx;
1143 int eType = sqlite3_value_type(argv[0]);
1144 int nByte = sqlite3_value_bytes(argv[0]);
1145 int iSize;
1146 if( argc==1 ){
1147 iSize = 256;
1148 }else{
1149 iSize = sqlite3_value_int(argv[1]);
1150 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1151 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1152 "384 512", -1);
1153 return;
1154 }
1155 }
1156 if( eType==SQLITE_NULL ) return;
1157 SHA3Init(&cx, iSize);
1158 if( eType==SQLITE_BLOB ){
1159 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1160 }else{
1161 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1162 }
1163 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1164}
1165
1166/* Compute a string using sqlite3_vsnprintf() with a maximum length
1167** of 50 bytes and add it to the hash.
1168*/
1169static void hash_step_vformat(
1170 SHA3Context *p, /* Add content to this context */
1171 const char *zFormat,
1172 ...
1173){
1174 va_list ap;
1175 int n;
1176 char zBuf[50];
1177 va_start(ap, zFormat);
1178 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1179 va_end(ap);
1180 n = (int)strlen(zBuf);
1181 SHA3Update(p, (unsigned char*)zBuf, n);
1182}
1183
1184/*
1185** Implementation of the sha3_query(SQL,SIZE) function.
1186**
1187** This function compiles and runs the SQL statement(s) given in the
1188** argument. The results are hashed using a SIZE-bit SHA3. The default
1189** size is 256.
1190**
1191** The format of the byte stream that is hashed is summarized as follows:
1192**
1193** S<n>:<sql>
1194** R
1195** N
1196** I<int>
1197** F<ieee-float>
1198** B<size>:<bytes>
1199** T<size>:<text>
1200**
1201** <sql> is the original SQL text for each statement run and <n> is
1202** the size of that text. The SQL text is UTF-8. A single R character
1203** occurs before the start of each row. N means a NULL value.
1204** I mean an 8-byte little-endian integer <int>. F is a floating point
1205** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1206** B means blobs of <size> bytes. T means text rendered as <size>
1207** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
1208** text integers.
1209**
1210** For each SQL statement in the X input, there is one S segment. Each
1211** S segment is followed by zero or more R segments, one for each row in the
1212** result set. After each R, there are one or more N, I, F, B, or T segments,
1213** one for each column in the result set. Segments are concatentated directly
1214** with no delimiters of any kind.
1215*/
1216static void sha3QueryFunc(
1217 sqlite3_context *context,
1218 int argc,
1219 sqlite3_value **argv
1220){
1221 sqlite3 *db = sqlite3_context_db_handle(context);
1222 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1223 sqlite3_stmt *pStmt = 0;
1224 int nCol; /* Number of columns in the result set */
1225 int i; /* Loop counter */
1226 int rc;
1227 int n;
1228 const char *z;
1229 SHA3Context cx;
1230 int iSize;
1231
1232 if( argc==1 ){
1233 iSize = 256;
1234 }else{
1235 iSize = sqlite3_value_int(argv[1]);
1236 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1237 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1238 "384 512", -1);
1239 return;
1240 }
1241 }
1242 if( zSql==0 ) return;
1243 SHA3Init(&cx, iSize);
1244 while( zSql[0] ){
1245 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1246 if( rc ){
1247 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1248 zSql, sqlite3_errmsg(db));
1249 sqlite3_finalize(pStmt);
1250 sqlite3_result_error(context, zMsg, -1);
1251 sqlite3_free(zMsg);
1252 return;
1253 }
1254 if( !sqlite3_stmt_readonly(pStmt) ){
1255 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1256 sqlite3_finalize(pStmt);
1257 sqlite3_result_error(context, zMsg, -1);
1258 sqlite3_free(zMsg);
1259 return;
1260 }
1261 nCol = sqlite3_column_count(pStmt);
1262 z = sqlite3_sql(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00001263 if( z==0 ){
1264 sqlite3_finalize(pStmt);
1265 continue;
1266 }
drh1554bc82017-03-08 16:10:34 +00001267 n = (int)strlen(z);
1268 hash_step_vformat(&cx,"S%d:",n);
1269 SHA3Update(&cx,(unsigned char*)z,n);
1270
1271 /* Compute a hash over the result of the query */
1272 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1273 SHA3Update(&cx,(const unsigned char*)"R",1);
1274 for(i=0; i<nCol; i++){
1275 switch( sqlite3_column_type(pStmt,i) ){
1276 case SQLITE_NULL: {
1277 SHA3Update(&cx, (const unsigned char*)"N",1);
1278 break;
1279 }
1280 case SQLITE_INTEGER: {
1281 sqlite3_uint64 u;
1282 int j;
1283 unsigned char x[9];
1284 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1285 memcpy(&u, &v, 8);
1286 for(j=8; j>=1; j--){
1287 x[j] = u & 0xff;
1288 u >>= 8;
1289 }
1290 x[0] = 'I';
1291 SHA3Update(&cx, x, 9);
1292 break;
1293 }
1294 case SQLITE_FLOAT: {
1295 sqlite3_uint64 u;
1296 int j;
1297 unsigned char x[9];
1298 double r = sqlite3_column_double(pStmt,i);
1299 memcpy(&u, &r, 8);
1300 for(j=8; j>=1; j--){
1301 x[j] = u & 0xff;
1302 u >>= 8;
1303 }
1304 x[0] = 'F';
1305 SHA3Update(&cx,x,9);
1306 break;
1307 }
1308 case SQLITE_TEXT: {
1309 int n2 = sqlite3_column_bytes(pStmt, i);
1310 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1311 hash_step_vformat(&cx,"T%d:",n2);
1312 SHA3Update(&cx, z2, n2);
1313 break;
1314 }
1315 case SQLITE_BLOB: {
1316 int n2 = sqlite3_column_bytes(pStmt, i);
1317 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1318 hash_step_vformat(&cx,"B%d:",n2);
1319 SHA3Update(&cx, z2, n2);
1320 break;
1321 }
1322 }
1323 }
1324 }
1325 sqlite3_finalize(pStmt);
1326 }
1327 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1328}
1329/* End of SHA3 hashing logic copy/pasted from ../ext/misc/shathree.c
1330********************************************************************************/
1331
drhe6229612014-08-18 15:08:26 +00001332#if defined(SQLITE_ENABLE_SESSION)
1333/*
1334** State information for a single open session
1335*/
1336typedef struct OpenSession OpenSession;
1337struct OpenSession {
1338 char *zName; /* Symbolic name for this session */
1339 int nFilter; /* Number of xFilter rejection GLOB patterns */
1340 char **azFilter; /* Array of xFilter rejection GLOB patterns */
1341 sqlite3_session *p; /* The open session */
1342};
1343#endif
1344
drhdcd87a92014-08-18 13:45:42 +00001345/*
mistachkin1fe36bb2016-04-04 02:16:44 +00001346** Shell output mode information from before ".explain on",
drhdcd87a92014-08-18 13:45:42 +00001347** saved so that it can be restored by ".explain off"
1348*/
1349typedef struct SavedModeInfo SavedModeInfo;
1350struct SavedModeInfo {
1351 int valid; /* Is there legit data in here? */
1352 int mode; /* Mode prior to ".explain on" */
1353 int showHeader; /* The ".header" setting prior to ".explain on" */
1354 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +00001355};
drh45e29d82006-11-20 16:21:10 +00001356
drh8e7e7a22000-05-30 18:45:23 +00001357/*
drhdcd87a92014-08-18 13:45:42 +00001358** State information about the database connection is contained in an
1359** instance of the following structure.
drh75897232000-05-29 14:26:00 +00001360*/
drhdcd87a92014-08-18 13:45:42 +00001361typedef struct ShellState ShellState;
1362struct ShellState {
shane626a6e42009-10-22 17:30:15 +00001363 sqlite3 *db; /* The database */
drh700c2522016-02-09 18:39:25 +00001364 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +00001365 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +00001366 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +00001367 int scanstatsOn; /* True to display scan stats before each finalize */
drhc2ce0be2014-05-29 12:36:14 +00001368 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +00001369 int cnt; /* Number of records displayed so far */
1370 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +00001371 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +00001372 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +00001373 int mode; /* An output mode setting */
drh700c2522016-02-09 18:39:25 +00001374 int cMode; /* temporary output mode for the current query */
1375 int normalMode; /* Output mode before ".explain on" */
drh45e29d82006-11-20 16:21:10 +00001376 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +00001377 int showHeader; /* True to show column names in List or Column mode */
drh760c8162016-09-16 02:52:22 +00001378 int nCheck; /* Number of ".check" commands run */
drh44dec872014-08-30 15:49:25 +00001379 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +00001380 char *zDestTable; /* Name of destination table when MODE_Insert */
drh760c8162016-09-16 02:52:22 +00001381 char zTestcase[30]; /* Name of current test case */
mistachkin636bf9f2014-07-19 20:15:16 +00001382 char colSeparator[20]; /* Column separator character for several modes */
1383 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +00001384 int colWidth[100]; /* Requested width of each column when in column mode*/
1385 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +00001386 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +00001387 ** the database */
drh44c2eb12003-04-30 11:38:26 +00001388 char outfile[FILENAME_MAX]; /* Filename for *out */
1389 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +00001390 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +00001391 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +00001392 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +00001393 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +00001394 int *aiIndent; /* Array of indents used in MODE_Explain */
1395 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +00001396 int iIndent; /* Index of current op in aiIndent[] */
drhe6229612014-08-18 15:08:26 +00001397#if defined(SQLITE_ENABLE_SESSION)
1398 int nSession; /* Number of active sessions */
1399 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1400#endif
drh75897232000-05-29 14:26:00 +00001401};
1402
1403/*
drh44dec872014-08-30 15:49:25 +00001404** These are the allowed shellFlgs values
1405*/
drhe6e1d122017-03-09 13:50:49 +00001406#define SHFLG_Scratch 0x00000001 /* The --scratch option is used */
1407#define SHFLG_Pagecache 0x00000002 /* The --pagecache option is used */
1408#define SHFLG_Lookaside 0x00000004 /* Lookaside memory is used */
1409#define SHFLG_Backslash 0x00000008 /* The --backslash option is used */
1410#define SHFLG_PreserveRowid 0x00000010 /* .dump preserves rowid values */
1411#define SHFLG_CountChanges 0x00000020 /* .changes setting */
1412#define SHFLG_Echo 0x00000040 /* .echo or --echo setting */
1413
1414/*
1415** Macros for testing and setting shellFlgs
1416*/
1417#define ShellHasFlag(P,X) (((P)->shellFlgs & (X))!=0)
1418#define ShellSetFlag(P,X) ((P)->shellFlgs|=(X))
1419#define ShellClearFlag(P,X) ((P)->shellFlgs&=(~(X)))
drh44dec872014-08-30 15:49:25 +00001420
1421/*
drh75897232000-05-29 14:26:00 +00001422** These are the allowed modes.
1423*/
drh967e8b72000-06-21 13:59:10 +00001424#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00001425#define MODE_Column 1 /* One record per line in neat columns */
1426#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00001427#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1428#define MODE_Html 4 /* Generate an XHTML table */
1429#define MODE_Insert 5 /* Generate SQL "insert" statements */
drh41f5f6e2016-10-21 17:39:30 +00001430#define MODE_Quote 6 /* Quote values as for SQL */
1431#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1432#define MODE_Csv 8 /* Quote strings, numbers are plain */
1433#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1434#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1435#define MODE_Pretty 11 /* Pretty-print schemas */
persicom7e2dfdd2002-04-18 02:46:52 +00001436
drh66ce4d02008-02-15 17:38:06 +00001437static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00001438 "line",
1439 "column",
1440 "list",
1441 "semi",
1442 "html",
drhfeac5f82004-08-01 00:10:45 +00001443 "insert",
drh41f5f6e2016-10-21 17:39:30 +00001444 "quote",
drhfeac5f82004-08-01 00:10:45 +00001445 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00001446 "csv",
drh66ce4d02008-02-15 17:38:06 +00001447 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +00001448 "ascii",
drh4926fec2016-04-13 15:33:42 +00001449 "prettyprint",
persicom7e2dfdd2002-04-18 02:46:52 +00001450};
drh75897232000-05-29 14:26:00 +00001451
1452/*
mistachkinfad42082014-07-24 22:13:12 +00001453** These are the column/row/line separators used by the various
1454** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +00001455*/
mistachkinfad42082014-07-24 22:13:12 +00001456#define SEP_Column "|"
1457#define SEP_Row "\n"
1458#define SEP_Tab "\t"
1459#define SEP_Space " "
1460#define SEP_Comma ","
1461#define SEP_CrLf "\r\n"
1462#define SEP_Unit "\x1F"
1463#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +00001464
1465/*
drh75897232000-05-29 14:26:00 +00001466** Number of elements in an array
1467*/
drh902b9ee2008-12-05 17:17:07 +00001468#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00001469
1470/*
drh127f9d72010-02-23 01:47:00 +00001471** A callback for the sqlite3_log() interface.
1472*/
1473static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +00001474 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +00001475 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +00001476 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +00001477 fflush(p->pLog);
1478}
1479
1480/*
shane626a6e42009-10-22 17:30:15 +00001481** Output the given string as a hex-encoded blob (eg. X'1234' )
1482*/
1483static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1484 int i;
1485 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +00001486 raw_printf(out,"X'");
1487 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1488 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +00001489}
1490
1491/*
drh28bd4bc2000-06-15 15:57:22 +00001492** Output the given string as a quoted string using SQL quoting conventions.
drh708b22b2017-03-11 01:56:41 +00001493**
1494** The "\n" and "\r" characters are converted to char(10) and char(13)
1495** to prevent them from being transformed by end-of-line translators.
drh28bd4bc2000-06-15 15:57:22 +00001496*/
1497static void output_quoted_string(FILE *out, const char *z){
1498 int i;
drh708b22b2017-03-11 01:56:41 +00001499 char c;
mistachkin1fe36bb2016-04-04 02:16:44 +00001500 setBinaryMode(out, 1);
drh708b22b2017-03-11 01:56:41 +00001501 for(i=0; (c = z[i])!=0 && c!='\'' && c!='\n' && c!='\r'; i++){}
1502 if( c==0 ){
drhe05461c2015-12-30 13:36:57 +00001503 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00001504 }else{
drh708b22b2017-03-11 01:56:41 +00001505 int inQuote = 0;
1506 int bStarted = 0;
drh28bd4bc2000-06-15 15:57:22 +00001507 while( *z ){
drh708b22b2017-03-11 01:56:41 +00001508 for(i=0; (c = z[i])!=0 && c!='\n' && c!='\r' && c!='\''; i++){}
1509 if( c=='\'' ) i++;
1510 if( i ){
1511 if( !inQuote ){
1512 if( bStarted ) raw_printf(out, "||");
1513 raw_printf(out, "'");
1514 inQuote = 1;
1515 }
1516 utf8_printf(out, "%.*s", i, z);
1517 z += i;
1518 bStarted = 1;
1519 }
1520 if( c=='\'' ){
1521 raw_printf(out, "'");
1522 continue;
1523 }
1524 if( inQuote ){
1525 raw_printf(out, "'");
1526 inQuote = 0;
1527 }
1528 if( c==0 ){
drh28bd4bc2000-06-15 15:57:22 +00001529 break;
1530 }
drh708b22b2017-03-11 01:56:41 +00001531 for(i=0; (c = z[i])=='\r' || c=='\n'; i++){
1532 if( bStarted ) raw_printf(out, "||");
1533 raw_printf(out, "char(%d)", c);
1534 bStarted = 1;
1535 }
1536 z += i;
drh28bd4bc2000-06-15 15:57:22 +00001537 }
drh708b22b2017-03-11 01:56:41 +00001538 if( inQuote ) raw_printf(out, "'");
drh28bd4bc2000-06-15 15:57:22 +00001539 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001540 setTextMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001541}
1542
1543/*
drhfeac5f82004-08-01 00:10:45 +00001544** Output the given string as a quoted according to C or TCL quoting rules.
1545*/
1546static void output_c_string(FILE *out, const char *z){
1547 unsigned int c;
1548 fputc('"', out);
1549 while( (c = *(z++))!=0 ){
1550 if( c=='\\' ){
1551 fputc(c, out);
1552 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +00001553 }else if( c=='"' ){
1554 fputc('\\', out);
1555 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +00001556 }else if( c=='\t' ){
1557 fputc('\\', out);
1558 fputc('t', out);
1559 }else if( c=='\n' ){
1560 fputc('\\', out);
1561 fputc('n', out);
1562 }else if( c=='\r' ){
1563 fputc('\\', out);
1564 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +00001565 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +00001566 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00001567 }else{
1568 fputc(c, out);
1569 }
1570 }
1571 fputc('"', out);
1572}
1573
1574/*
drhc08a4f12000-06-15 16:49:48 +00001575** Output the given string with characters that are special to
1576** HTML escaped.
1577*/
1578static void output_html_string(FILE *out, const char *z){
1579 int i;
drhc3d6ba42014-01-13 20:38:35 +00001580 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +00001581 while( *z ){
mistachkin1fe36bb2016-04-04 02:16:44 +00001582 for(i=0; z[i]
1583 && z[i]!='<'
1584 && z[i]!='&'
1585 && z[i]!='>'
1586 && z[i]!='\"'
shane43d9cb22009-10-21 14:11:48 +00001587 && z[i]!='\'';
1588 i++){}
drhc08a4f12000-06-15 16:49:48 +00001589 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +00001590 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +00001591 }
1592 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +00001593 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +00001594 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +00001595 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +00001596 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +00001597 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +00001598 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +00001599 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +00001600 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +00001601 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +00001602 }else{
1603 break;
1604 }
1605 z += i + 1;
1606 }
1607}
1608
1609/*
drhc49f44e2006-10-26 18:15:42 +00001610** If a field contains any character identified by a 1 in the following
1611** array, then the string must be quoted for CSV.
1612*/
1613static const char needCsvQuote[] = {
mistachkin1fe36bb2016-04-04 02:16:44 +00001614 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1615 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1616 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1617 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1618 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1619 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1620 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1621 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1622 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1623 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1624 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1625 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1626 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1627 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1628 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1629 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
drhc49f44e2006-10-26 18:15:42 +00001630};
1631
1632/*
mistachkindd11f2d2014-12-11 04:49:46 +00001633** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +00001634** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +00001635** the null value. Strings are quoted if necessary. The separator
1636** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +00001637*/
drhdcd87a92014-08-18 13:45:42 +00001638static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00001639 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00001640 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +00001641 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +00001642 }else{
drhc49f44e2006-10-26 18:15:42 +00001643 int i;
mistachkin636bf9f2014-07-19 20:15:16 +00001644 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +00001645 for(i=0; z[i]; i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00001646 if( needCsvQuote[((unsigned char*)z)[i]]
1647 || (z[i]==p->colSeparator[0] &&
mistachkin636bf9f2014-07-19 20:15:16 +00001648 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00001649 i = 0;
1650 break;
1651 }
1652 }
1653 if( i==0 ){
1654 putc('"', out);
1655 for(i=0; z[i]; i++){
1656 if( z[i]=='"' ) putc('"', out);
1657 putc(z[i], out);
1658 }
1659 putc('"', out);
1660 }else{
drhe05461c2015-12-30 13:36:57 +00001661 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +00001662 }
drh8e64d1c2004-10-07 00:32:39 +00001663 }
1664 if( bSep ){
drhe05461c2015-12-30 13:36:57 +00001665 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001666 }
1667}
1668
danielk19774af00c62005-01-23 23:43:21 +00001669#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00001670/*
drh4c504392000-10-16 22:06:40 +00001671** This routine runs when the user presses Ctrl-C
1672*/
1673static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00001674 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +00001675 seenInterrupt++;
1676 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +00001677 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +00001678}
danielk19774af00c62005-01-23 23:43:21 +00001679#endif
drh4c504392000-10-16 22:06:40 +00001680
drha0daa752016-09-16 11:53:10 +00001681#ifndef SQLITE_OMIT_AUTHORIZATION
drh4c504392000-10-16 22:06:40 +00001682/*
drhde613c62016-04-04 17:23:10 +00001683** When the ".auth ON" is set, the following authorizer callback is
1684** invoked. It always returns SQLITE_OK.
1685*/
1686static int shellAuth(
1687 void *pClientData,
1688 int op,
1689 const char *zA1,
1690 const char *zA2,
1691 const char *zA3,
1692 const char *zA4
1693){
1694 ShellState *p = (ShellState*)pClientData;
1695 static const char *azAction[] = { 0,
1696 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1697 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1698 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1699 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1700 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1701 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1702 "PRAGMA", "READ", "SELECT",
1703 "TRANSACTION", "UPDATE", "ATTACH",
1704 "DETACH", "ALTER_TABLE", "REINDEX",
1705 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1706 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1707 };
1708 int i;
1709 const char *az[4];
1710 az[0] = zA1;
1711 az[1] = zA2;
1712 az[2] = zA3;
1713 az[3] = zA4;
mistachkin8145fc62016-09-16 20:39:21 +00001714 utf8_printf(p->out, "authorizer: %s", azAction[op]);
drhde613c62016-04-04 17:23:10 +00001715 for(i=0; i<4; i++){
1716 raw_printf(p->out, " ");
1717 if( az[i] ){
1718 output_c_string(p->out, az[i]);
1719 }else{
1720 raw_printf(p->out, "NULL");
1721 }
1722 }
1723 raw_printf(p->out, "\n");
1724 return SQLITE_OK;
1725}
drha0daa752016-09-16 11:53:10 +00001726#endif
mistachkin8145fc62016-09-16 20:39:21 +00001727
drh79f20e92016-12-13 23:22:39 +00001728/*
1729** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1730**
1731** This routine converts some CREATE TABLE statements for shadow tables
1732** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1733*/
1734static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1735 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1736 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1737 }else{
1738 utf8_printf(out, "%s%s", z, zTail);
1739 }
1740}
1741static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1742 char c = z[n];
1743 z[n] = 0;
1744 printSchemaLine(out, z, zTail);
1745 z[n] = c;
1746}
drhde613c62016-04-04 17:23:10 +00001747
1748/*
shane626a6e42009-10-22 17:30:15 +00001749** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +00001750** invokes for each row of a query result.
1751*/
drh4ace5362014-11-10 14:42:28 +00001752static int shell_callback(
1753 void *pArg,
1754 int nArg, /* Number of result columns */
1755 char **azArg, /* Text of each result column */
1756 char **azCol, /* Column names */
1757 int *aiType /* Column types */
1758){
drh75897232000-05-29 14:26:00 +00001759 int i;
drhdcd87a92014-08-18 13:45:42 +00001760 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +00001761
drh700c2522016-02-09 18:39:25 +00001762 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +00001763 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00001764 int w = 5;
drh6a535342001-10-19 16:44:56 +00001765 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00001766 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00001767 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00001768 if( len>w ) w = len;
1769 }
drhe05461c2015-12-30 13:36:57 +00001770 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001771 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001772 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +00001773 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001774 }
1775 break;
1776 }
danielk19770d78bae2008-01-03 07:09:48 +00001777 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00001778 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +00001779 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1780 const int *colWidth;
1781 int showHdr;
1782 char *rowSep;
1783 if( p->cMode==MODE_Column ){
1784 colWidth = p->colWidth;
1785 showHdr = p->showHeader;
1786 rowSep = p->rowSeparator;
1787 }else{
1788 colWidth = aExplainWidths;
1789 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +00001790 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +00001791 }
drha0c66f52000-07-29 13:20:21 +00001792 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00001793 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00001794 int w, n;
1795 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +00001796 w = colWidth[i];
drh75897232000-05-29 14:26:00 +00001797 }else{
danielk19770d78bae2008-01-03 07:09:48 +00001798 w = 0;
drh75897232000-05-29 14:26:00 +00001799 }
drh078b1fd2012-09-21 13:40:02 +00001800 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +00001801 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00001802 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +00001803 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +00001804 if( w<n ) w = n;
1805 }
1806 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00001807 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00001808 }
drh700c2522016-02-09 18:39:25 +00001809 if( showHdr ){
drh078b1fd2012-09-21 13:40:02 +00001810 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001811 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001812 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001813 }else{
drhe05461c2015-12-30 13:36:57 +00001814 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001815 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001816 }
drha0c66f52000-07-29 13:20:21 +00001817 }
1818 }
drh700c2522016-02-09 18:39:25 +00001819 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +00001820 for(i=0; i<nArg; i++){
1821 int w;
1822 if( i<ArraySize(p->actualWidth) ){
1823 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +00001824 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +00001825 }else{
1826 w = 10;
1827 }
mistachkinaae280e2015-12-31 19:06:24 +00001828 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +00001829 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +00001830 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +00001831 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00001832 }
drh75897232000-05-29 14:26:00 +00001833 }
1834 }
drh6a535342001-10-19 16:44:56 +00001835 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001836 for(i=0; i<nArg; i++){
1837 int w;
drha0c66f52000-07-29 13:20:21 +00001838 if( i<ArraySize(p->actualWidth) ){
1839 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00001840 }else{
1841 w = 10;
1842 }
drh700c2522016-02-09 18:39:25 +00001843 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +00001844 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00001845 }
dana98bf362013-11-13 18:35:01 +00001846 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +00001847 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +00001848 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +00001849 }
danc4650bb2013-11-18 08:41:06 +00001850 p->iIndent++;
dana98bf362013-11-13 18:35:01 +00001851 }
drh078b1fd2012-09-21 13:40:02 +00001852 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001853 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +00001854 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001855 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001856 }else{
drhe05461c2015-12-30 13:36:57 +00001857 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +00001858 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001859 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001860 }
drh75897232000-05-29 14:26:00 +00001861 }
1862 break;
1863 }
drh4926fec2016-04-13 15:33:42 +00001864 case MODE_Semi: { /* .schema and .fullschema output */
drh79f20e92016-12-13 23:22:39 +00001865 printSchemaLine(p->out, azArg[0], ";\n");
drh4926fec2016-04-13 15:33:42 +00001866 break;
1867 }
1868 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1869 char *z;
drh07d683f2016-04-13 21:00:36 +00001870 int j;
drh4926fec2016-04-13 15:33:42 +00001871 int nParen = 0;
1872 char cEnd = 0;
1873 char c;
1874 int nLine = 0;
1875 assert( nArg==1 );
1876 if( azArg[0]==0 ) break;
1877 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1878 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1879 ){
1880 utf8_printf(p->out, "%s;\n", azArg[0]);
1881 break;
1882 }
1883 z = sqlite3_mprintf("%s", azArg[0]);
1884 j = 0;
1885 for(i=0; IsSpace(z[i]); i++){}
1886 for(; (c = z[i])!=0; i++){
1887 if( IsSpace(c) ){
1888 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1889 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1890 j--;
1891 }
1892 z[j++] = c;
1893 }
1894 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1895 z[j] = 0;
1896 if( strlen30(z)>=79 ){
drh07d683f2016-04-13 21:00:36 +00001897 for(i=j=0; (c = z[i])!=0; i++){
drh4926fec2016-04-13 15:33:42 +00001898 if( c==cEnd ){
1899 cEnd = 0;
1900 }else if( c=='"' || c=='\'' || c=='`' ){
1901 cEnd = c;
1902 }else if( c=='[' ){
1903 cEnd = ']';
1904 }else if( c=='(' ){
1905 nParen++;
1906 }else if( c==')' ){
1907 nParen--;
1908 if( nLine>0 && nParen==0 && j>0 ){
drh79f20e92016-12-13 23:22:39 +00001909 printSchemaLineN(p->out, z, j, "\n");
drh4926fec2016-04-13 15:33:42 +00001910 j = 0;
1911 }
1912 }
1913 z[j++] = c;
1914 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1915 if( c=='\n' ) j--;
drh79f20e92016-12-13 23:22:39 +00001916 printSchemaLineN(p->out, z, j, "\n ");
drh4926fec2016-04-13 15:33:42 +00001917 j = 0;
1918 nLine++;
1919 while( IsSpace(z[i+1]) ){ i++; }
1920 }
1921 }
1922 z[j] = 0;
1923 }
drh79f20e92016-12-13 23:22:39 +00001924 printSchemaLine(p->out, z, ";\n");
drh4926fec2016-04-13 15:33:42 +00001925 sqlite3_free(z);
1926 break;
1927 }
drh75897232000-05-29 14:26:00 +00001928 case MODE_List: {
1929 if( p->cnt++==0 && p->showHeader ){
1930 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001931 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00001932 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00001933 }
1934 }
drh6a535342001-10-19 16:44:56 +00001935 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001936 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001937 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00001938 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00001939 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001940 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00001941 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +00001942 }else{
drhe05461c2015-12-30 13:36:57 +00001943 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001944 }
drh75897232000-05-29 14:26:00 +00001945 }
1946 break;
1947 }
drh1e5d0e92000-05-31 23:33:17 +00001948 case MODE_Html: {
1949 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001950 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001951 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001952 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001953 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001954 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001955 }
mistachkinaae280e2015-12-31 19:06:24 +00001956 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001957 }
drh6a535342001-10-19 16:44:56 +00001958 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001959 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001960 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001961 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001962 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001963 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001964 }
mistachkinaae280e2015-12-31 19:06:24 +00001965 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001966 break;
1967 }
drhfeac5f82004-08-01 00:10:45 +00001968 case MODE_Tcl: {
1969 if( p->cnt++==0 && p->showHeader ){
1970 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001971 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001972 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001973 }
drhe05461c2015-12-30 13:36:57 +00001974 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001975 }
1976 if( azArg==0 ) break;
1977 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001978 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001979 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001980 }
drhe05461c2015-12-30 13:36:57 +00001981 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001982 break;
1983 }
drh8e64d1c2004-10-07 00:32:39 +00001984 case MODE_Csv: {
mistachkin1fe36bb2016-04-04 02:16:44 +00001985 setBinaryMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001986 if( p->cnt++==0 && p->showHeader ){
1987 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001988 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001989 }
drhe05461c2015-12-30 13:36:57 +00001990 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001991 }
drh40253262014-10-17 21:35:05 +00001992 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001993 for(i=0; i<nArg; i++){
1994 output_csv(p, azArg[i], i<nArg-1);
1995 }
drhe05461c2015-12-30 13:36:57 +00001996 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001997 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001998 setTextMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001999 break;
2000 }
drh41f5f6e2016-10-21 17:39:30 +00002001 case MODE_Quote:
drh28bd4bc2000-06-15 15:57:22 +00002002 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00002003 if( azArg==0 ) break;
drh41f5f6e2016-10-21 17:39:30 +00002004 if( p->cMode==MODE_Insert ){
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 char *zSep = i>0 ? ",": "";
2010 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
2011 }
2012 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00002013 }
drh41f5f6e2016-10-21 17:39:30 +00002014 raw_printf(p->out," VALUES(");
drh59ce2c42016-11-03 13:12:28 +00002015 }else if( p->cnt==0 && p->showHeader ){
2016 for(i=0; i<nArg; i++){
mistachkin2f9a6132016-11-11 05:19:45 +00002017 if( i>0 ) raw_printf(p->out, ",");
drh59ce2c42016-11-03 13:12:28 +00002018 output_quoted_string(p->out, azCol[i]);
2019 }
mistachkin2f9a6132016-11-11 05:19:45 +00002020 raw_printf(p->out,"\n");
mistachkin151c75a2015-04-07 21:16:40 +00002021 }
drh59ce2c42016-11-03 13:12:28 +00002022 p->cnt++;
drh28bd4bc2000-06-15 15:57:22 +00002023 for(i=0; i<nArg; i++){
2024 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00002025 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00002026 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00002027 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00002028 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00002029 output_quoted_string(p->out, azArg[i]);
drh891d6b42017-03-11 00:46:57 +00002030 }else if( aiType && aiType[i]==SQLITE_INTEGER ){
drhe05461c2015-12-30 13:36:57 +00002031 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh891d6b42017-03-11 00:46:57 +00002032 }else if( aiType && aiType[i]==SQLITE_FLOAT ){
2033 char z[50];
2034 double r = sqlite3_column_double(p->pStmt, i);
2035 sqlite3_snprintf(50,z,"%!.20g", r);
2036 raw_printf(p->out, "%s%s", zSep, z);
shane626a6e42009-10-22 17:30:15 +00002037 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2038 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2039 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00002040 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00002041 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00002042 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00002043 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00002044 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002045 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00002046 output_quoted_string(p->out, azArg[i]);
2047 }
2048 }
drh41f5f6e2016-10-21 17:39:30 +00002049 raw_printf(p->out,p->cMode==MODE_Quote?"\n":");\n");
drh6a535342001-10-19 16:44:56 +00002050 break;
drh28bd4bc2000-06-15 15:57:22 +00002051 }
mistachkin636bf9f2014-07-19 20:15:16 +00002052 case MODE_Ascii: {
2053 if( p->cnt++==0 && p->showHeader ){
2054 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002055 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2056 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00002057 }
drhe05461c2015-12-30 13:36:57 +00002058 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002059 }
2060 if( azArg==0 ) break;
2061 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002062 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2063 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00002064 }
drhe05461c2015-12-30 13:36:57 +00002065 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002066 break;
2067 }
persicom1d0b8722002-04-18 02:53:04 +00002068 }
drh75897232000-05-29 14:26:00 +00002069 return 0;
2070}
2071
2072/*
shane626a6e42009-10-22 17:30:15 +00002073** This is the callback routine that the SQLite library
2074** invokes for each row of a query result.
2075*/
2076static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2077 /* since we don't have type info, call the shell_callback with a NULL value */
2078 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2079}
2080
drhfb546af2017-03-09 22:00:33 +00002081/*
2082** This is the callback routine from sqlite3_exec() that appends all
2083** output onto the end of a ShellText object.
2084*/
2085static int captureOutputCallback(void *pArg, int nArg, char **azArg, char **az){
2086 ShellText *p = (ShellText*)pArg;
2087 int i;
2088 if( p->n ) appendText(p, "|", 0);
2089 for(i=0; i<nArg; i++){
2090 if( i ) appendText(p, ",", 0);
2091 if( azArg[i] ) appendText(p, azArg[i], 0);
2092 }
2093 return 0;
2094}
2095
2096/*
2097** Generate an appropriate SELFTEST table in the main database.
2098*/
2099static void createSelftestTable(ShellState *p){
drhf157d102017-03-10 01:05:38 +00002100 char *zErrMsg = 0;
drhfb546af2017-03-09 22:00:33 +00002101 sqlite3_exec(p->db,
drhf157d102017-03-10 01:05:38 +00002102 "SAVEPOINT selftest_init;\n"
2103 "CREATE TABLE IF NOT EXISTS selftest(\n"
drhfb546af2017-03-09 22:00:33 +00002104 " tno INTEGER PRIMARY KEY,\n" /* Test number */
2105 " op TEXT,\n" /* Operator: memo run */
2106 " cmd TEXT,\n" /* Command text */
2107 " ans TEXT\n" /* Desired answer */
2108 ");"
drhf157d102017-03-10 01:05:38 +00002109 "CREATE TEMP TABLE [_shell$self](op,cmd,ans);\n"
2110 "INSERT INTO [_shell$self](rowid,op,cmd)\n"
2111 " VALUES(coalesce((SELECT (max(tno)+100)/10 FROM selftest),10),\n"
2112 " 'memo','Tests generated by --init');\n"
2113 "INSERT INTO [_shell$self]\n"
2114 " SELECT 'run',\n"
2115 " 'SELECT hex(sha3_query(''SELECT type,name,tbl_name,sql "
2116 "FROM sqlite_master ORDER BY 2'',224))',\n"
2117 " hex(sha3_query('SELECT type,name,tbl_name,sql "
2118 "FROM sqlite_master ORDER BY 2',224));\n"
2119 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00002120 " SELECT 'run',"
2121 " 'SELECT hex(sha3_query(''SELECT * FROM \"' ||"
2122 " printf('%w',name) || '\" NOT INDEXED'',224))',\n"
2123 " hex(sha3_query(printf('SELECT * FROM \"%w\" NOT INDEXED',name),224))\n"
2124 " FROM (\n"
2125 " SELECT name FROM sqlite_master\n"
2126 " WHERE type='table'\n"
2127 " AND name<>'selftest'\n"
2128 " AND coalesce(rootpage,0)>0\n"
2129 " )\n"
2130 " ORDER BY name;\n"
drhf157d102017-03-10 01:05:38 +00002131 "INSERT INTO [_shell$self]\n"
drhfb546af2017-03-09 22:00:33 +00002132 " VALUES('run','PRAGMA integrity_check','ok');\n"
drhf157d102017-03-10 01:05:38 +00002133 "INSERT INTO selftest(tno,op,cmd,ans)"
2134 " SELECT rowid*10,op,cmd,ans FROM [_shell$self];\n"
2135 "DROP TABLE [_shell$self];"
2136 ,0,0,&zErrMsg);
2137 if( zErrMsg ){
2138 utf8_printf(stderr, "SELFTEST initialization failure: %s\n", zErrMsg);
2139 sqlite3_free(zErrMsg);
2140 }
2141 sqlite3_exec(p->db, "RELEASE selftest_init",0,0,0);
drhfb546af2017-03-09 22:00:33 +00002142}
2143
drhf42d3182017-03-08 12:25:18 +00002144
shane626a6e42009-10-22 17:30:15 +00002145/*
drhdcd87a92014-08-18 13:45:42 +00002146** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00002147** the name of the table given. Escape any quote characters in the
2148** table name.
2149*/
drhdcd87a92014-08-18 13:45:42 +00002150static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00002151 int i, n;
drhf42d3182017-03-08 12:25:18 +00002152 int cQuote;
drh33048c02001-10-01 14:29:22 +00002153 char *z;
2154
2155 if( p->zDestTable ){
2156 free(p->zDestTable);
2157 p->zDestTable = 0;
2158 }
2159 if( zName==0 ) return;
drhf42d3182017-03-08 12:25:18 +00002160 cQuote = quoteChar(zName);
2161 n = strlen30(zName);
2162 if( cQuote ) n += 2;
drh33048c02001-10-01 14:29:22 +00002163 z = p->zDestTable = malloc( n+1 );
2164 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002165 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00002166 exit(1);
2167 }
2168 n = 0;
drhf42d3182017-03-08 12:25:18 +00002169 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002170 for(i=0; zName[i]; i++){
2171 z[n++] = zName[i];
drhf42d3182017-03-08 12:25:18 +00002172 if( zName[i]==cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002173 }
drhf42d3182017-03-08 12:25:18 +00002174 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002175 z[n] = 0;
2176}
2177
drhdd3d4592004-08-30 01:54:05 +00002178
2179/*
drhb21a8e42012-01-28 21:08:51 +00002180** Execute a query statement that will generate SQL output. Print
2181** the result columns, comma-separated, on a line and then add a
2182** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00002183**
drhb21a8e42012-01-28 21:08:51 +00002184** If the number of columns is 1 and that column contains text "--"
mistachkin1fe36bb2016-04-04 02:16:44 +00002185** then write the semicolon on a separate line. That way, if a
drhb21a8e42012-01-28 21:08:51 +00002186** "--" comment occurs at the end of the statement, the comment
2187** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00002188*/
drh157e29a2009-05-21 15:15:00 +00002189static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00002190 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00002191 const char *zSelect, /* SELECT statement to extract content */
2192 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00002193){
drhdd3d4592004-08-30 01:54:05 +00002194 sqlite3_stmt *pSelect;
2195 int rc;
drhb21a8e42012-01-28 21:08:51 +00002196 int nResult;
2197 int i;
2198 const char *z;
drhc7181902014-02-27 15:04:13 +00002199 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00002200 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00002201 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2202 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002203 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00002204 return rc;
2205 }
2206 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00002207 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00002208 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00002209 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00002210 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00002211 zFirstRow = 0;
2212 }
drhb21a8e42012-01-28 21:08:51 +00002213 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00002214 utf8_printf(p->out, "%s", z);
mistachkin1fe36bb2016-04-04 02:16:44 +00002215 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00002216 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00002217 }
2218 if( z==0 ) z = "";
2219 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2220 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00002221 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00002222 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002223 raw_printf(p->out, ";\n");
mistachkin1fe36bb2016-04-04 02:16:44 +00002224 }
drhdd3d4592004-08-30 01:54:05 +00002225 rc = sqlite3_step(pSelect);
2226 }
drh2f464a02011-10-13 00:41:49 +00002227 rc = sqlite3_finalize(pSelect);
2228 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002229 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2230 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002231 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00002232 }
2233 return rc;
drhdd3d4592004-08-30 01:54:05 +00002234}
2235
shane626a6e42009-10-22 17:30:15 +00002236/*
2237** Allocate space and save off current error string.
2238*/
2239static char *save_err_msg(
2240 sqlite3 *db /* Database to query */
2241){
2242 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00002243 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00002244 if( zErrMsg ){
2245 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2246 }
2247 return zErrMsg;
2248}
2249
drh34784902016-02-27 17:12:36 +00002250#ifdef __linux__
2251/*
2252** Attempt to display I/O stats on Linux using /proc/PID/io
2253*/
2254static void displayLinuxIoStats(FILE *out){
2255 FILE *in;
2256 char z[200];
2257 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2258 in = fopen(z, "rb");
2259 if( in==0 ) return;
2260 while( fgets(z, sizeof(z), in)!=0 ){
2261 static const struct {
2262 const char *zPattern;
2263 const char *zDesc;
2264 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00002265 { "rchar: ", "Bytes received by read():" },
2266 { "wchar: ", "Bytes sent to write():" },
2267 { "syscr: ", "Read() system calls:" },
2268 { "syscw: ", "Write() system calls:" },
2269 { "read_bytes: ", "Bytes read from storage:" },
2270 { "write_bytes: ", "Bytes written to storage:" },
2271 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00002272 };
2273 int i;
2274 for(i=0; i<ArraySize(aTrans); i++){
2275 int n = (int)strlen(aTrans[i].zPattern);
2276 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00002277 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
drh34784902016-02-27 17:12:36 +00002278 break;
2279 }
2280 }
2281 }
2282 fclose(in);
mistachkin1fe36bb2016-04-04 02:16:44 +00002283}
drh34784902016-02-27 17:12:36 +00002284#endif
2285
drha2df53b2017-03-10 14:36:10 +00002286/*
2287** Display a single line of status using 64-bit values.
2288*/
2289static void displayStatLine(
2290 ShellState *p, /* The shell context */
2291 char *zLabel, /* Label for this one line */
2292 char *zFormat, /* Format for the result */
2293 int iStatusCtrl, /* Which status to display */
2294 int bReset /* True to reset the stats */
2295){
2296 sqlite3_int64 iCur = -1;
2297 sqlite3_int64 iHiwtr = -1;
2298 int i, nPercent;
2299 char zLine[200];
2300 sqlite3_status64(iStatusCtrl, &iCur, &iHiwtr, bReset);
2301 for(i=0, nPercent=0; zFormat[i]; i++){
2302 if( zFormat[i]=='%' ) nPercent++;
2303 }
2304 if( nPercent>1 ){
2305 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iCur, iHiwtr);
2306 }else{
2307 sqlite3_snprintf(sizeof(zLine), zLine, zFormat, iHiwtr);
2308 }
2309 raw_printf(p->out, "%-36s %s\n", zLabel, zLine);
2310}
drh34784902016-02-27 17:12:36 +00002311
shane626a6e42009-10-22 17:30:15 +00002312/*
shaneh642d8b82010-07-28 16:05:34 +00002313** Display memory stats.
2314*/
2315static int display_stats(
2316 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00002317 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00002318 int bReset /* True to reset the stats */
2319){
2320 int iCur;
2321 int iHiwtr;
2322
2323 if( pArg && pArg->out ){
drha2df53b2017-03-10 14:36:10 +00002324 displayStatLine(pArg, "Memory Used:",
2325 "%lld (max %lld) bytes", SQLITE_STATUS_MEMORY_USED, bReset);
2326 displayStatLine(pArg, "Number of Outstanding Allocations:",
2327 "%lld (max %lld)", SQLITE_STATUS_MALLOC_COUNT, bReset);
drh44dec872014-08-30 15:49:25 +00002328 if( pArg->shellFlgs & SHFLG_Pagecache ){
drha2df53b2017-03-10 14:36:10 +00002329 displayStatLine(pArg, "Number of Pcache Pages Used:",
2330 "%lld (max %lld) pages", SQLITE_STATUS_PAGECACHE_USED, bReset);
drh44dec872014-08-30 15:49:25 +00002331 }
drha2df53b2017-03-10 14:36:10 +00002332 displayStatLine(pArg, "Number of Pcache Overflow Bytes:",
2333 "%lld (max %lld) bytes", SQLITE_STATUS_PAGECACHE_OVERFLOW, bReset);
drh44dec872014-08-30 15:49:25 +00002334 if( pArg->shellFlgs & SHFLG_Scratch ){
drha2df53b2017-03-10 14:36:10 +00002335 displayStatLine(pArg, "Number of Scratch Allocations Used:",
2336 "%lld (max %lld)", SQLITE_STATUS_SCRATCH_USED, bReset);
drh44dec872014-08-30 15:49:25 +00002337 }
drha2df53b2017-03-10 14:36:10 +00002338 displayStatLine(pArg, "Number of Scratch Overflow Bytes:",
2339 "%lld (max %lld) bytes", SQLITE_STATUS_SCRATCH_OVERFLOW, bReset);
2340 displayStatLine(pArg, "Largest Allocation:",
2341 "%lld bytes", SQLITE_STATUS_MALLOC_SIZE, bReset);
2342 displayStatLine(pArg, "Largest Pcache Allocation:",
2343 "%lld bytes", SQLITE_STATUS_PAGECACHE_SIZE, bReset);
2344 displayStatLine(pArg, "Largest Scratch Allocation:",
2345 "%lld bytes", SQLITE_STATUS_SCRATCH_SIZE, bReset);
shaneh642d8b82010-07-28 16:05:34 +00002346#ifdef YYTRACKMAXSTACKDEPTH
drha2df53b2017-03-10 14:36:10 +00002347 displayStatLine(pArg, "Deepest Parser Stack:",
2348 "%lld (max %lld)", SQLITE_STATUS_PARSER_STACK, bReset);
shaneh642d8b82010-07-28 16:05:34 +00002349#endif
2350 }
2351
2352 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00002353 if( pArg->shellFlgs & SHFLG_Lookaside ){
2354 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00002355 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2356 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002357 raw_printf(pArg->out,
2358 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002359 iCur, iHiwtr);
2360 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2361 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002362 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2363 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002364 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2365 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002366 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2367 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002368 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2369 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002370 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2371 iHiwtr);
drh44dec872014-08-30 15:49:25 +00002372 }
shaneh642d8b82010-07-28 16:05:34 +00002373 iHiwtr = iCur = -1;
2374 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002375 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2376 iCur);
drh4ace5362014-11-10 14:42:28 +00002377 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00002378 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00002379 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00002380 iHiwtr = iCur = -1;
2381 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002382 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002383 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00002384 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002385 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00002386 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00002387 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002388 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002389 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002390 iHiwtr = iCur = -1;
2391 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002392 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002393 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002394 }
2395
2396 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00002397 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2398 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002399 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002400 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002401 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00002402 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002403 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00002404 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002405 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002406 }
2407
drh34784902016-02-27 17:12:36 +00002408#ifdef __linux__
2409 displayLinuxIoStats(pArg->out);
2410#endif
2411
dan5a790282015-08-07 20:06:14 +00002412 /* Do not remove this machine readable comment: extra-stats-output-here */
2413
shaneh642d8b82010-07-28 16:05:34 +00002414 return 0;
2415}
2416
2417/*
dan8d1edb92014-11-05 09:07:28 +00002418** Display scan stats.
2419*/
2420static void display_scanstats(
2421 sqlite3 *db, /* Database to query */
2422 ShellState *pArg /* Pointer to ShellState */
2423){
drhf5ed7ad2015-06-15 14:43:25 +00002424#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2425 UNUSED_PARAMETER(db);
2426 UNUSED_PARAMETER(pArg);
2427#else
drh15f23c22014-11-06 12:46:16 +00002428 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00002429 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00002430 mx = 0;
2431 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00002432 double rEstLoop = 1.0;
2433 for(i=n=0; 1; i++){
2434 sqlite3_stmt *p = pArg->pStmt;
2435 sqlite3_int64 nLoop, nVisit;
2436 double rEst;
2437 int iSid;
2438 const char *zExplain;
2439 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2440 break;
2441 }
2442 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00002443 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00002444 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00002445 if( n==0 ){
2446 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00002447 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00002448 }
drh42f30bc2014-11-06 12:08:21 +00002449 n++;
2450 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2451 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2452 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00002453 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00002454 rEstLoop *= rEst;
mistachkin1fe36bb2016-04-04 02:16:44 +00002455 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002456 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00002457 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00002458 );
dan8d1edb92014-11-05 09:07:28 +00002459 }
dan8d1edb92014-11-05 09:07:28 +00002460 }
mistachkinaae280e2015-12-31 19:06:24 +00002461 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00002462#endif
dan8d1edb92014-11-05 09:07:28 +00002463}
2464
2465/*
dana98bf362013-11-13 18:35:01 +00002466** Parameter azArray points to a zero-terminated array of strings. zStr
2467** points to a single nul-terminated string. Return non-zero if zStr
2468** is equal, according to strcmp(), to any of the strings in the array.
2469** Otherwise, return zero.
2470*/
2471static int str_in_array(const char *zStr, const char **azArray){
2472 int i;
2473 for(i=0; azArray[i]; i++){
2474 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2475 }
2476 return 0;
2477}
2478
2479/*
2480** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00002481** and populate the ShellState.aiIndent[] array with the number of
mistachkin1fe36bb2016-04-04 02:16:44 +00002482** spaces each opcode should be indented before it is output.
dana98bf362013-11-13 18:35:01 +00002483**
2484** The indenting rules are:
2485**
2486** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2487** all opcodes that occur between the p2 jump destination and the opcode
2488** itself by 2 spaces.
2489**
drh01752bc2013-11-14 23:59:33 +00002490** * For each "Goto", if the jump destination is earlier in the program
2491** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00002492** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00002493** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00002494** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00002495** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00002496*/
drhdcd87a92014-08-18 13:45:42 +00002497static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00002498 const char *zSql; /* The text of the SQL statement */
2499 const char *z; /* Used to check if this is an EXPLAIN */
2500 int *abYield = 0; /* True if op is an OP_Yield */
2501 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00002502 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00002503
drh8ad0de32014-03-20 18:45:27 +00002504 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2505 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00002506 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2507 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00002508 const char *azGoto[] = { "Goto", 0 };
2509
2510 /* Try to figure out if this is really an EXPLAIN statement. If this
2511 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00002512 if( sqlite3_column_count(pSql)!=8 ){
2513 p->cMode = p->mode;
2514 return;
2515 }
dana98bf362013-11-13 18:35:01 +00002516 zSql = sqlite3_sql(pSql);
2517 if( zSql==0 ) return;
2518 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00002519 if( sqlite3_strnicmp(z, "explain", 7) ){
2520 p->cMode = p->mode;
2521 return;
2522 }
dana98bf362013-11-13 18:35:01 +00002523
2524 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2525 int i;
danc4650bb2013-11-18 08:41:06 +00002526 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00002527 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00002528
2529 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2530 ** p2 is an instruction address, set variable p2op to the index of that
2531 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2532 ** the current instruction is part of a sub-program generated by an
2533 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00002534 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00002535 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00002536
2537 /* Grow the p->aiIndent array as required */
2538 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00002539 if( iOp==0 ){
2540 /* Do further verfication that this is explain output. Abort if
2541 ** it is not */
2542 static const char *explainCols[] = {
2543 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2544 int jj;
2545 for(jj=0; jj<ArraySize(explainCols); jj++){
2546 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2547 p->cMode = p->mode;
2548 sqlite3_reset(pSql);
2549 return;
2550 }
2551 }
2552 }
dana98bf362013-11-13 18:35:01 +00002553 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00002554 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2555 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00002556 }
2557 abYield[iOp] = str_in_array(zOp, azYield);
2558 p->aiIndent[iOp] = 0;
2559 p->nIndent = iOp+1;
2560
2561 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00002562 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002563 }
drhfe705102014-03-06 13:38:37 +00002564 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2565 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2566 ){
drheacd29d2016-04-15 15:03:27 +00002567 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002568 }
2569 }
2570
danc4650bb2013-11-18 08:41:06 +00002571 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002572 sqlite3_free(abYield);
2573 sqlite3_reset(pSql);
2574}
2575
2576/*
2577** Free the array allocated by explain_data_prepare().
2578*/
drhdcd87a92014-08-18 13:45:42 +00002579static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00002580 sqlite3_free(p->aiIndent);
2581 p->aiIndent = 0;
2582 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00002583 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002584}
2585
2586/*
drheacd29d2016-04-15 15:03:27 +00002587** Disable and restore .wheretrace and .selecttrace settings.
2588*/
2589#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2590extern int sqlite3SelectTrace;
2591static int savedSelectTrace;
2592#endif
2593#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2594extern int sqlite3WhereTrace;
2595static int savedWhereTrace;
2596#endif
2597static void disable_debug_trace_modes(void){
2598#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2599 savedSelectTrace = sqlite3SelectTrace;
2600 sqlite3SelectTrace = 0;
2601#endif
2602#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2603 savedWhereTrace = sqlite3WhereTrace;
2604 sqlite3WhereTrace = 0;
2605#endif
2606}
2607static void restore_debug_trace_modes(void){
2608#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2609 sqlite3SelectTrace = savedSelectTrace;
2610#endif
2611#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2612 sqlite3WhereTrace = savedWhereTrace;
2613#endif
2614}
2615
2616/*
2617** Run a prepared statement
2618*/
2619static void exec_prepared_stmt(
2620 ShellState *pArg, /* Pointer to ShellState */
2621 sqlite3_stmt *pStmt, /* Statment to run */
2622 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
2623){
2624 int rc;
2625
2626 /* perform the first step. this will tell us if we
2627 ** have a result set or not and how wide it is.
2628 */
2629 rc = sqlite3_step(pStmt);
2630 /* if we have a result set... */
2631 if( SQLITE_ROW == rc ){
2632 /* if we have a callback... */
2633 if( xCallback ){
2634 /* allocate space for col name ptr, value ptr, and type */
2635 int nCol = sqlite3_column_count(pStmt);
2636 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2637 if( !pData ){
2638 rc = SQLITE_NOMEM;
2639 }else{
2640 char **azCols = (char **)pData; /* Names of result columns */
2641 char **azVals = &azCols[nCol]; /* Results */
2642 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2643 int i, x;
2644 assert(sizeof(int) <= sizeof(char *));
2645 /* save off ptrs to column names */
2646 for(i=0; i<nCol; i++){
2647 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2648 }
2649 do{
2650 /* extract the data and data types */
2651 for(i=0; i<nCol; i++){
2652 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2653 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2654 azVals[i] = "";
2655 }else{
2656 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2657 }
2658 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2659 rc = SQLITE_NOMEM;
2660 break; /* from for */
2661 }
2662 } /* end for */
2663
2664 /* if data and types extracted successfully... */
2665 if( SQLITE_ROW == rc ){
2666 /* call the supplied callback with the result row data */
2667 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
2668 rc = SQLITE_ABORT;
2669 }else{
2670 rc = sqlite3_step(pStmt);
2671 }
2672 }
2673 } while( SQLITE_ROW == rc );
2674 sqlite3_free(pData);
2675 }
2676 }else{
2677 do{
2678 rc = sqlite3_step(pStmt);
2679 } while( rc == SQLITE_ROW );
2680 }
2681 }
2682}
2683
2684/*
mistachkin1fe36bb2016-04-04 02:16:44 +00002685** Execute a statement or set of statements. Print
2686** any result rows/columns depending on the current mode
shane626a6e42009-10-22 17:30:15 +00002687** set via the supplied callback.
2688**
mistachkin1fe36bb2016-04-04 02:16:44 +00002689** This is very similar to SQLite's built-in sqlite3_exec()
2690** function except it takes a slightly different callback
shane626a6e42009-10-22 17:30:15 +00002691** and callback data argument.
2692*/
2693static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00002694 sqlite3 *db, /* An open database */
2695 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00002696 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00002697 /* (not the same as sqlite3_exec) */
2698 ShellState *pArg, /* Pointer to ShellState */
2699 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00002700){
dan4564ced2010-01-05 04:59:56 +00002701 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2702 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00002703 int rc2;
dan4564ced2010-01-05 04:59:56 +00002704 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00002705
2706 if( pzErrMsg ){
2707 *pzErrMsg = NULL;
2708 }
2709
shaneb9fc17d2009-10-22 21:23:35 +00002710 while( zSql[0] && (SQLITE_OK == rc) ){
drheacd29d2016-04-15 15:03:27 +00002711 static const char *zStmtSql;
shaneb9fc17d2009-10-22 21:23:35 +00002712 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2713 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00002714 if( pzErrMsg ){
2715 *pzErrMsg = save_err_msg(db);
2716 }
2717 }else{
shaneb9fc17d2009-10-22 21:23:35 +00002718 if( !pStmt ){
2719 /* this happens for a comment or white-space */
2720 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002721 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00002722 continue;
2723 }
drheacd29d2016-04-15 15:03:27 +00002724 zStmtSql = sqlite3_sql(pStmt);
drh60275612016-11-03 02:25:30 +00002725 if( zStmtSql==0 ) zStmtSql = "";
drheacd29d2016-04-15 15:03:27 +00002726 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
shane626a6e42009-10-22 17:30:15 +00002727
shaneh642d8b82010-07-28 16:05:34 +00002728 /* save off the prepared statment handle and reset row count */
2729 if( pArg ){
2730 pArg->pStmt = pStmt;
2731 pArg->cnt = 0;
2732 }
2733
shanehb7977c52010-01-18 18:17:10 +00002734 /* echo the sql statement if echo on */
drhe6e1d122017-03-09 13:50:49 +00002735 if( pArg && ShellHasFlag(pArg, SHFLG_Echo) ){
drhe05461c2015-12-30 13:36:57 +00002736 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00002737 }
shanehb7977c52010-01-18 18:17:10 +00002738
drhefbf3b12014-02-28 20:47:24 +00002739 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
drheacd29d2016-04-15 15:03:27 +00002740 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
drhefbf3b12014-02-28 20:47:24 +00002741 sqlite3_stmt *pExplain;
drheacd29d2016-04-15 15:03:27 +00002742 char *zEQP;
2743 disable_debug_trace_modes();
2744 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
drhefbf3b12014-02-28 20:47:24 +00002745 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2746 if( rc==SQLITE_OK ){
2747 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00002748 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
2749 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
2750 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00002751 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00002752 }
2753 }
2754 sqlite3_finalize(pExplain);
2755 sqlite3_free(zEQP);
drheacd29d2016-04-15 15:03:27 +00002756 if( pArg->autoEQP>=2 ){
2757 /* Also do an EXPLAIN for ".eqp full" mode */
2758 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2759 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2760 if( rc==SQLITE_OK ){
2761 pArg->cMode = MODE_Explain;
2762 explain_data_prepare(pArg, pExplain);
2763 exec_prepared_stmt(pArg, pExplain, xCallback);
2764 explain_data_delete(pArg);
2765 }
2766 sqlite3_finalize(pExplain);
2767 sqlite3_free(zEQP);
2768 }
2769 restore_debug_trace_modes();
drhefbf3b12014-02-28 20:47:24 +00002770 }
2771
drh700c2522016-02-09 18:39:25 +00002772 if( pArg ){
2773 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00002774 if( pArg->autoExplain
2775 && sqlite3_column_count(pStmt)==8
drheacd29d2016-04-15 15:03:27 +00002776 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
drh700c2522016-02-09 18:39:25 +00002777 ){
2778 pArg->cMode = MODE_Explain;
2779 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002780
drh700c2522016-02-09 18:39:25 +00002781 /* If the shell is currently in ".explain" mode, gather the extra
2782 ** data required to add indents to the output.*/
2783 if( pArg->cMode==MODE_Explain ){
2784 explain_data_prepare(pArg, pStmt);
2785 }
dana98bf362013-11-13 18:35:01 +00002786 }
2787
drheacd29d2016-04-15 15:03:27 +00002788 exec_prepared_stmt(pArg, pStmt, xCallback);
dana98bf362013-11-13 18:35:01 +00002789 explain_data_delete(pArg);
2790
shaneh642d8b82010-07-28 16:05:34 +00002791 /* print usage stats if stats on */
2792 if( pArg && pArg->statsOn ){
2793 display_stats(db, pArg, 0);
2794 }
2795
dan8d1edb92014-11-05 09:07:28 +00002796 /* print loop-counters if required */
2797 if( pArg && pArg->scanstatsOn ){
2798 display_scanstats(db, pArg);
2799 }
2800
mistachkin1fe36bb2016-04-04 02:16:44 +00002801 /* Finalize the statement just executed. If this fails, save a
dan4564ced2010-01-05 04:59:56 +00002802 ** copy of the error message. Otherwise, set zSql to point to the
2803 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00002804 rc2 = sqlite3_finalize(pStmt);
2805 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00002806 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00002807 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002808 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00002809 }else if( pzErrMsg ){
2810 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00002811 }
shaneh642d8b82010-07-28 16:05:34 +00002812
2813 /* clear saved stmt handle */
2814 if( pArg ){
2815 pArg->pStmt = NULL;
2816 }
shane626a6e42009-10-22 17:30:15 +00002817 }
shaneb9fc17d2009-10-22 21:23:35 +00002818 } /* end while */
shane626a6e42009-10-22 17:30:15 +00002819
2820 return rc;
2821}
2822
drhe611f142017-03-08 11:44:00 +00002823/*
2824** Release memory previously allocated by tableColumnList().
2825*/
2826static void freeColumnList(char **azCol){
2827 int i;
2828 for(i=1; azCol[i]; i++){
2829 sqlite3_free(azCol[i]);
2830 }
2831 /* azCol[0] is a static string */
2832 sqlite3_free(azCol);
2833}
2834
2835/*
2836** Return a list of pointers to strings which are the names of all
2837** columns in table zTab. The memory to hold the names is dynamically
2838** allocated and must be released by the caller using a subsequent call
2839** to freeColumnList().
2840**
2841** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
2842** value that needs to be preserved, then azCol[0] is filled in with the
2843** name of the rowid column.
2844**
2845** The first regular column in the table is azCol[1]. The list is terminated
2846** by an entry with azCol[i]==0.
2847*/
2848static char **tableColumnList(ShellState *p, const char *zTab){
2849 char **azCol = 0;
2850 sqlite3_stmt *pStmt;
2851 char *zSql;
2852 int nCol = 0;
2853 int nAlloc = 0;
2854 int nPK = 0; /* Number of PRIMARY KEY columns seen */
2855 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
drhe6e1d122017-03-09 13:50:49 +00002856 int preserveRowid = ShellHasFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00002857 int rc;
2858
2859 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
2860 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2861 sqlite3_free(zSql);
2862 if( rc ) return 0;
2863 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2864 if( nCol>=nAlloc-2 ){
2865 nAlloc = nAlloc*2 + nCol + 10;
2866 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
2867 if( azCol==0 ){
2868 raw_printf(stderr, "Error: out of memory\n");
2869 exit(1);
2870 }
2871 }
2872 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
2873 if( sqlite3_column_int(pStmt, 5) ){
2874 nPK++;
2875 if( nPK==1
2876 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
2877 "INTEGER")==0
2878 ){
2879 isIPK = 1;
2880 }else{
2881 isIPK = 0;
2882 }
2883 }
2884 }
2885 sqlite3_finalize(pStmt);
2886 azCol[0] = 0;
2887 azCol[nCol+1] = 0;
2888
2889 /* The decision of whether or not a rowid really needs to be preserved
2890 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
2891 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
2892 ** rowids on tables where the rowid is inaccessible because there are other
2893 ** columns in the table named "rowid", "_rowid_", and "oid".
2894 */
2895 if( preserveRowid && isIPK ){
2896 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
2897 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
2898 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
2899 ** ROWID aliases. To distinguish these cases, check to see if
2900 ** there is a "pk" entry in "PRAGMA index_list". There will be
2901 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
2902 */
2903 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
2904 " WHERE origin='pk'", zTab);
2905 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2906 sqlite3_free(zSql);
2907 if( rc ){
2908 freeColumnList(azCol);
2909 return 0;
2910 }
2911 rc = sqlite3_step(pStmt);
2912 sqlite3_finalize(pStmt);
2913 preserveRowid = rc==SQLITE_ROW;
2914 }
2915 if( preserveRowid ){
2916 /* Only preserve the rowid if we can find a name to use for the
2917 ** rowid */
2918 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
2919 int i, j;
2920 for(j=0; j<3; j++){
2921 for(i=1; i<=nCol; i++){
2922 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
2923 }
2924 if( i>nCol ){
2925 /* At this point, we know that azRowid[j] is not the name of any
2926 ** ordinary column in the table. Verify that azRowid[j] is a valid
2927 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
2928 ** tables will fail this last check */
2929 int rc;
2930 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
2931 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
2932 break;
2933 }
2934 }
2935 }
2936 return azCol;
2937}
2938
drh33048c02001-10-01 14:29:22 +00002939/*
drhf8563c02017-03-09 18:13:52 +00002940** Toggle the reverse_unordered_selects setting.
2941*/
2942static void toggleSelectOrder(sqlite3 *db){
2943 sqlite3_stmt *pStmt = 0;
2944 int iSetting = 0;
2945 char zStmt[100];
2946 sqlite3_prepare_v2(db, "PRAGMA reverse_unordered_selects", -1, &pStmt, 0);
2947 if( sqlite3_step(pStmt)==SQLITE_ROW ){
2948 iSetting = sqlite3_column_int(pStmt, 0);
2949 }
2950 sqlite3_finalize(pStmt);
2951 sqlite3_snprintf(sizeof(zStmt), zStmt,
2952 "PRAGMA reverse_unordered_selects(%d)", !iSetting);
2953 sqlite3_exec(db, zStmt, 0, 0, 0);
2954}
2955
2956/*
drh4c653a02000-06-07 01:27:47 +00002957** This is a different callback routine used for dumping the database.
2958** Each row received by this callback consists of a table name,
2959** the table type ("index" or "table") and SQL to create the table.
2960** This routine should print text sufficient to recreate the table.
2961*/
2962static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00002963 int rc;
2964 const char *zTable;
2965 const char *zType;
2966 const char *zSql;
drhdcd87a92014-08-18 13:45:42 +00002967 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00002968
drh902b9ee2008-12-05 17:17:07 +00002969 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00002970 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00002971 zTable = azArg[0];
2972 zType = azArg[1];
2973 zSql = azArg[2];
mistachkin1fe36bb2016-04-04 02:16:44 +00002974
drh00b950d2005-09-11 02:03:03 +00002975 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhe611f142017-03-08 11:44:00 +00002976 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
drh7ed10322013-08-07 16:04:27 +00002977 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002978 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00002979 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2980 return 0;
drh45e29d82006-11-20 16:21:10 +00002981 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2982 char *zIns;
2983 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00002984 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00002985 p->writableSchema = 1;
2986 }
2987 zIns = sqlite3_mprintf(
2988 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2989 "VALUES('table','%q','%q',0,'%q');",
2990 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00002991 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00002992 sqlite3_free(zIns);
2993 return 0;
drh00b950d2005-09-11 02:03:03 +00002994 }else{
drh79f20e92016-12-13 23:22:39 +00002995 printSchemaLine(p->out, zSql, ";\n");
drhf8eb96a2005-02-03 00:42:34 +00002996 }
danielk19772a02e332004-06-05 08:04:36 +00002997
2998 if( strcmp(zType, "table")==0 ){
drhf42d3182017-03-08 12:25:18 +00002999 ShellText sSelect;
3000 ShellText sTable;
drhe611f142017-03-08 11:44:00 +00003001 char **azCol;
3002 int i;
3003 char *savedDestTable;
3004 int savedMode;
mistachkin1fe36bb2016-04-04 02:16:44 +00003005
drhe611f142017-03-08 11:44:00 +00003006 azCol = tableColumnList(p, zTable);
3007 if( azCol==0 ){
3008 p->nErr++;
3009 return 0;
danielk19772a02e332004-06-05 08:04:36 +00003010 }
3011
drhbf92ec02012-03-22 12:50:34 +00003012 /* Always quote the table name, even if it appears to be pure ascii,
3013 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
drhf42d3182017-03-08 12:25:18 +00003014 initText(&sTable);
3015 appendText(&sTable, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00003016 /* If preserving the rowid, add a column list after the table name.
3017 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
3018 ** instead of the usual "INSERT INTO tab VALUES(...)".
3019 */
3020 if( azCol[0] ){
3021 appendText(&sTable, "(", 0);
3022 appendText(&sTable, azCol[0], 0);
3023 for(i=1; azCol[i]; i++){
3024 appendText(&sTable, ",", 0);
drhf42d3182017-03-08 12:25:18 +00003025 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
danielk19772a02e332004-06-05 08:04:36 +00003026 }
drhe611f142017-03-08 11:44:00 +00003027 appendText(&sTable, ")", 0);
danielk19772a02e332004-06-05 08:04:36 +00003028 }
danielk19772a02e332004-06-05 08:04:36 +00003029
drhe611f142017-03-08 11:44:00 +00003030 /* Build an appropriate SELECT statement */
drhf42d3182017-03-08 12:25:18 +00003031 initText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003032 appendText(&sSelect, "SELECT ", 0);
3033 if( azCol[0] ){
3034 appendText(&sSelect, azCol[0], 0);
3035 appendText(&sSelect, ",", 0);
drhdd3d4592004-08-30 01:54:05 +00003036 }
drhe611f142017-03-08 11:44:00 +00003037 for(i=1; azCol[i]; i++){
drhf42d3182017-03-08 12:25:18 +00003038 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
drhe611f142017-03-08 11:44:00 +00003039 if( azCol[i+1] ){
3040 appendText(&sSelect, ",", 0);
3041 }
3042 }
3043 freeColumnList(azCol);
3044 appendText(&sSelect, " FROM ", 0);
drhf42d3182017-03-08 12:25:18 +00003045 appendText(&sSelect, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00003046
3047 savedDestTable = p->zDestTable;
3048 savedMode = p->mode;
3049 p->zDestTable = sTable.z;
3050 p->mode = p->cMode = MODE_Insert;
3051 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
drhf8563c02017-03-09 18:13:52 +00003052 if( (rc&0xff)==SQLITE_CORRUPT ){
3053 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
3054 toggleSelectOrder(p->db);
3055 shell_exec(p->db, sSelect.z, shell_callback, p, 0);
3056 toggleSelectOrder(p->db);
3057 }
drhe611f142017-03-08 11:44:00 +00003058 p->zDestTable = savedDestTable;
3059 p->mode = savedMode;
drhf42d3182017-03-08 12:25:18 +00003060 freeText(&sTable);
3061 freeText(&sSelect);
drhe611f142017-03-08 11:44:00 +00003062 if( rc ) p->nErr++;
drh4c653a02000-06-07 01:27:47 +00003063 }
drh4c653a02000-06-07 01:27:47 +00003064 return 0;
3065}
3066
3067/*
drh45e29d82006-11-20 16:21:10 +00003068** Run zQuery. Use dump_callback() as the callback routine so that
3069** the contents of the query are output as SQL statements.
3070**
drhdd3d4592004-08-30 01:54:05 +00003071** If we get a SQLITE_CORRUPT error, rerun the query after appending
3072** "ORDER BY rowid DESC" to the end.
3073*/
3074static int run_schema_dump_query(
mistachkin1fe36bb2016-04-04 02:16:44 +00003075 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00003076 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00003077){
3078 int rc;
drh2f464a02011-10-13 00:41:49 +00003079 char *zErr = 0;
3080 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00003081 if( rc==SQLITE_CORRUPT ){
3082 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00003083 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00003084 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00003085 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00003086 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00003087 sqlite3_free(zErr);
3088 zErr = 0;
3089 }
drhdd3d4592004-08-30 01:54:05 +00003090 zQ2 = malloc( len+100 );
3091 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00003092 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00003093 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
3094 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003095 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00003096 }else{
3097 rc = SQLITE_CORRUPT;
3098 }
3099 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00003100 free(zQ2);
3101 }
3102 return rc;
3103}
3104
3105/*
drh75897232000-05-29 14:26:00 +00003106** Text of a help message
3107*/
persicom1d0b8722002-04-18 02:53:04 +00003108static char zHelp[] =
drha0daa752016-09-16 11:53:10 +00003109#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00003110 ".auth ON|OFF Show authorizer callbacks\n"
drha0daa752016-09-16 11:53:10 +00003111#endif
drh9ff849f2009-02-04 20:55:57 +00003112 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00003113 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00003114 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00003115 ".changes on|off Show number of rows changed by SQL\n"
drh2db82112016-09-15 21:35:24 +00003116 ".check GLOB Fail if output since .testcase does not match\n"
drh4bbcf102014-02-06 02:46:08 +00003117 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00003118 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00003119 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00003120 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00003121 " If TABLE specified, only dump tables matching\n"
3122 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00003123 ".echo on|off Turn command echo on or off\n"
drheacd29d2016-04-15 15:03:27 +00003124 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00003125 ".exit Exit this program\n"
drh700c2522016-02-09 18:39:25 +00003126 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
drh4926fec2016-04-13 15:33:42 +00003127 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00003128 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00003129 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00003130 ".import FILE TABLE Import data from FILE into TABLE\n"
drh16eb5942016-11-03 13:01:38 +00003131#ifndef SQLITE_OMIT_TEST_CONTROL
3132 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3133#endif
drh0e55db12015-02-06 14:51:13 +00003134 ".indexes ?TABLE? Show names of all indexes\n"
3135 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00003136 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00003137#ifdef SQLITE_ENABLE_IOTRACE
3138 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3139#endif
drh1a513372015-05-02 17:40:23 +00003140 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh3fd9f332016-12-16 18:41:11 +00003141 ".lint OPTIONS Report potential schema issues. Options:\n"
3142 " fkey-indexes Find missing foreign key indexes\n"
drh70df4fe2006-06-13 15:12:21 +00003143#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00003144 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00003145#endif
drh127f9d72010-02-23 01:47:00 +00003146 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00003147 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00003148 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00003149 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00003150 " column Left-aligned columns. (See .width)\n"
3151 " html HTML <table> code\n"
3152 " insert SQL insert statements for TABLE\n"
3153 " line One value per line\n"
drh0c5cd962017-02-14 21:47:46 +00003154 " list Values delimited by \"|\"\n"
drh41f5f6e2016-10-21 17:39:30 +00003155 " quote Escape answers as for SQL\n"
drhb860bc92004-08-04 15:16:55 +00003156 " tabs Tab-separated values\n"
3157 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00003158 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00003159 ".once FILENAME Output for the next SQL command only to FILENAME\n"
mistachkin8145fc62016-09-16 20:39:21 +00003160 ".open ?--new? ?FILE? Close existing database and reopen FILE\n"
drhcd0509e2016-09-16 00:26:08 +00003161 " The --new starts with an empty file\n"
drhc2ce0be2014-05-29 12:36:14 +00003162 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00003163 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003164 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003165 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00003166 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00003167 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00003168 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00003169 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh4926fec2016-04-13 15:33:42 +00003170 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3171 " Add --indent for pretty-printing\n"
drha5d75ba2017-03-15 14:20:34 +00003172 ".selftest ?--init? Run tests defined in the SELFTEST table\n"
mistachkine0d68852014-12-11 03:12:33 +00003173 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3174 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00003175#if defined(SQLITE_ENABLE_SESSION)
3176 ".session CMD ... Create or control sessions\n"
3177#endif
drh1554bc82017-03-08 16:10:34 +00003178 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh62cdde52014-05-28 20:22:28 +00003179 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00003180 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00003181 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00003182 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00003183 ".tables ?TABLE? List names of tables\n"
3184 " If TABLE specified, only list tables matching\n"
3185 " LIKE pattern TABLE.\n"
drh760c8162016-09-16 02:52:22 +00003186 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
drh2dfbbca2000-07-28 14:32:48 +00003187 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00003188 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00003189 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00003190 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00003191 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00003192 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00003193 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00003194 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00003195;
3196
drhe6229612014-08-18 15:08:26 +00003197#if defined(SQLITE_ENABLE_SESSION)
3198/*
3199** Print help information for the ".sessions" command
3200*/
3201void session_help(ShellState *p){
mistachkin899c5c92016-04-03 20:50:02 +00003202 raw_printf(p->out,
drhe6229612014-08-18 15:08:26 +00003203 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3204 "If ?NAME? is omitted, the first defined session is used.\n"
3205 "Subcommands:\n"
3206 " attach TABLE Attach TABLE\n"
3207 " changeset FILE Write a changeset into FILE\n"
3208 " close Close one session\n"
3209 " enable ?BOOLEAN? Set or query the enable bit\n"
mistachkin1fe36bb2016-04-04 02:16:44 +00003210 " filter GLOB... Reject tables matching GLOBs\n"
drhe6229612014-08-18 15:08:26 +00003211 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3212 " isempty Query whether the session is empty\n"
3213 " list List currently open session names\n"
3214 " open DB NAME Open a new session on DB\n"
3215 " patchset FILE Write a patchset into FILE\n"
3216 );
3217}
3218#endif
3219
3220
drhdaffd0e2001-04-11 14:28:42 +00003221/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00003222static int process_input(ShellState *p, FILE *in);
drh2db82112016-09-15 21:35:24 +00003223
drh2db82112016-09-15 21:35:24 +00003224/*
dan11da0022016-12-17 08:18:05 +00003225** Read the content of file zName into memory obtained from sqlite3_malloc64()
3226** and return a pointer to the buffer. The caller is responsible for freeing
3227** the memory.
drh2db82112016-09-15 21:35:24 +00003228**
dan11da0022016-12-17 08:18:05 +00003229** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3230** read.
3231**
3232** For convenience, a nul-terminator byte is always appended to the data read
3233** from the file before the buffer is returned. This byte is not included in
3234** the final value of (*pnByte), if applicable.
3235**
3236** NULL is returned if any error is encountered. The final value of *pnByte
3237** is undefined in this case.
drh2db82112016-09-15 21:35:24 +00003238*/
dan11da0022016-12-17 08:18:05 +00003239static char *readFile(const char *zName, int *pnByte){
drh2db82112016-09-15 21:35:24 +00003240 FILE *in = fopen(zName, "rb");
3241 long nIn;
drhd1459152016-09-16 19:11:03 +00003242 size_t nRead;
drh2db82112016-09-15 21:35:24 +00003243 char *pBuf;
3244 if( in==0 ) return 0;
3245 fseek(in, 0, SEEK_END);
3246 nIn = ftell(in);
3247 rewind(in);
drhd1459152016-09-16 19:11:03 +00003248 pBuf = sqlite3_malloc64( nIn+1 );
drh2db82112016-09-15 21:35:24 +00003249 if( pBuf==0 ) return 0;
drhd1459152016-09-16 19:11:03 +00003250 nRead = fread(pBuf, nIn, 1, in);
3251 fclose(in);
3252 if( nRead!=1 ){
drh2db82112016-09-15 21:35:24 +00003253 sqlite3_free(pBuf);
3254 return 0;
3255 }
drhd1459152016-09-16 19:11:03 +00003256 pBuf[nIn] = 0;
dan11da0022016-12-17 08:18:05 +00003257 if( pnByte ) *pnByte = nIn;
drh2db82112016-09-15 21:35:24 +00003258 return pBuf;
3259}
3260
drhba5b0932014-07-24 12:39:59 +00003261/*
3262** Implementation of the "readfile(X)" SQL function. The entire content
3263** of the file named X is read and returned as a BLOB. NULL is returned
3264** if the file does not exist or is unreadable.
3265*/
3266static void readfileFunc(
3267 sqlite3_context *context,
3268 int argc,
3269 sqlite3_value **argv
3270){
3271 const char *zName;
drhba5b0932014-07-24 12:39:59 +00003272 void *pBuf;
dan11da0022016-12-17 08:18:05 +00003273 int nBuf;
drhba5b0932014-07-24 12:39:59 +00003274
drhf5ed7ad2015-06-15 14:43:25 +00003275 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003276 zName = (const char*)sqlite3_value_text(argv[0]);
3277 if( zName==0 ) return;
dan11da0022016-12-17 08:18:05 +00003278 pBuf = readFile(zName, &nBuf);
3279 if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free);
drhba5b0932014-07-24 12:39:59 +00003280}
3281
3282/*
3283** Implementation of the "writefile(X,Y)" SQL function. The argument Y
3284** is written into file X. The number of bytes written is returned. Or
3285** NULL is returned if something goes wrong, such as being unable to open
3286** file X for writing.
3287*/
3288static void writefileFunc(
3289 sqlite3_context *context,
3290 int argc,
3291 sqlite3_value **argv
3292){
3293 FILE *out;
3294 const char *z;
drhba5b0932014-07-24 12:39:59 +00003295 sqlite3_int64 rc;
3296 const char *zFile;
3297
drhf5ed7ad2015-06-15 14:43:25 +00003298 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003299 zFile = (const char*)sqlite3_value_text(argv[0]);
3300 if( zFile==0 ) return;
3301 out = fopen(zFile, "wb");
3302 if( out==0 ) return;
3303 z = (const char*)sqlite3_value_blob(argv[1]);
3304 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00003305 rc = 0;
3306 }else{
drh490fe862014-08-11 14:21:32 +00003307 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00003308 }
3309 fclose(out);
3310 sqlite3_result_int64(context, rc);
3311}
drhdaffd0e2001-04-11 14:28:42 +00003312
drhe6229612014-08-18 15:08:26 +00003313#if defined(SQLITE_ENABLE_SESSION)
3314/*
3315** Close a single OpenSession object and release all of its associated
3316** resources.
3317*/
3318static void session_close(OpenSession *pSession){
3319 int i;
3320 sqlite3session_delete(pSession->p);
3321 sqlite3_free(pSession->zName);
3322 for(i=0; i<pSession->nFilter; i++){
3323 sqlite3_free(pSession->azFilter[i]);
3324 }
3325 sqlite3_free(pSession->azFilter);
3326 memset(pSession, 0, sizeof(OpenSession));
3327}
3328#endif
3329
3330/*
drh51b55a32016-04-04 12:38:05 +00003331** Close all OpenSession objects and release all associated resources.
drhe6229612014-08-18 15:08:26 +00003332*/
drhe6229612014-08-18 15:08:26 +00003333#if defined(SQLITE_ENABLE_SESSION)
drh51b55a32016-04-04 12:38:05 +00003334static void session_close_all(ShellState *p){
drhe6229612014-08-18 15:08:26 +00003335 int i;
3336 for(i=0; i<p->nSession; i++){
3337 session_close(&p->aSession[i]);
3338 }
3339 p->nSession = 0;
drhe6229612014-08-18 15:08:26 +00003340}
drh51b55a32016-04-04 12:38:05 +00003341#else
3342# define session_close_all(X)
3343#endif
drhe6229612014-08-18 15:08:26 +00003344
drh75897232000-05-29 14:26:00 +00003345/*
drh03168ca2014-08-18 20:01:31 +00003346** Implementation of the xFilter function for an open session. Omit
3347** any tables named by ".session filter" but let all other table through.
3348*/
3349#if defined(SQLITE_ENABLE_SESSION)
3350static int session_filter(void *pCtx, const char *zTab){
3351 OpenSession *pSession = (OpenSession*)pCtx;
3352 int i;
3353 for(i=0; i<pSession->nFilter; i++){
3354 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3355 }
3356 return 1;
3357}
3358#endif
3359
3360/*
drh44c2eb12003-04-30 11:38:26 +00003361** Make sure the database is open. If it is not, then open it. If
3362** the database fails to open, print an error message and exit.
3363*/
drhdcd87a92014-08-18 13:45:42 +00003364static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00003365 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00003366 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00003367 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00003368 globalDb = p->db;
mistachkin8e189222015-04-19 21:43:16 +00003369 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00003370 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00003371 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00003372 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00003373 exit(1);
drh44c2eb12003-04-30 11:38:26 +00003374 }
drhc2e87a32006-06-27 15:16:14 +00003375#ifndef SQLITE_OMIT_LOAD_EXTENSION
3376 sqlite3_enable_load_extension(p->db, 1);
3377#endif
mistachkin8e189222015-04-19 21:43:16 +00003378 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003379 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003380 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003381 writefileFunc, 0, 0);
drh1554bc82017-03-08 16:10:34 +00003382 sqlite3_create_function(p->db, "sha3", 1, SQLITE_UTF8, 0,
3383 sha3Func, 0, 0);
3384 sqlite3_create_function(p->db, "sha3", 2, SQLITE_UTF8, 0,
3385 sha3Func, 0, 0);
3386 sqlite3_create_function(p->db, "sha3_query", 1, SQLITE_UTF8, 0,
3387 sha3QueryFunc, 0, 0);
3388 sqlite3_create_function(p->db, "sha3_query", 2, SQLITE_UTF8, 0,
3389 sha3QueryFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00003390 }
3391}
3392
3393/*
drhfeac5f82004-08-01 00:10:45 +00003394** Do C-language style dequoting.
3395**
mistachkinf21979d2015-01-18 05:35:01 +00003396** \a -> alarm
3397** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00003398** \t -> tab
3399** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00003400** \v -> vertical tab
3401** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00003402** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00003403** \s -> space
drh4c56b992013-06-27 13:26:55 +00003404** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00003405** \' -> '
drhfeac5f82004-08-01 00:10:45 +00003406** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00003407** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00003408*/
3409static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00003410 int i, j;
3411 char c;
drhc2ce0be2014-05-29 12:36:14 +00003412 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00003413 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00003414 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00003415 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00003416 if( c=='a' ){
3417 c = '\a';
3418 }else if( c=='b' ){
3419 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00003420 }else if( c=='t' ){
3421 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00003422 }else if( c=='n' ){
3423 c = '\n';
3424 }else if( c=='v' ){
3425 c = '\v';
3426 }else if( c=='f' ){
3427 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00003428 }else if( c=='r' ){
3429 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00003430 }else if( c=='"' ){
3431 c = '"';
3432 }else if( c=='\'' ){
3433 c = '\'';
drh4c56b992013-06-27 13:26:55 +00003434 }else if( c=='\\' ){
3435 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00003436 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00003437 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00003438 if( z[i+1]>='0' && z[i+1]<='7' ){
3439 i++;
3440 c = (c<<3) + z[i] - '0';
3441 if( z[i+1]>='0' && z[i+1]<='7' ){
3442 i++;
3443 c = (c<<3) + z[i] - '0';
3444 }
3445 }
3446 }
3447 }
3448 z[j] = c;
3449 }
drhc2ce0be2014-05-29 12:36:14 +00003450 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00003451}
3452
3453/*
drh348d19c2013-06-03 12:47:43 +00003454** Return the value of a hexadecimal digit. Return -1 if the input
3455** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00003456*/
drh348d19c2013-06-03 12:47:43 +00003457static int hexDigitValue(char c){
3458 if( c>='0' && c<='9' ) return c - '0';
3459 if( c>='a' && c<='f' ) return c - 'a' + 10;
3460 if( c>='A' && c<='F' ) return c - 'A' + 10;
3461 return -1;
drhc28490c2006-10-26 14:25:58 +00003462}
3463
3464/*
drh7d9f3942013-04-03 01:26:54 +00003465** Interpret zArg as an integer value, possibly with suffixes.
3466*/
3467static sqlite3_int64 integerValue(const char *zArg){
3468 sqlite3_int64 v = 0;
3469 static const struct { char *zSuffix; int iMult; } aMult[] = {
3470 { "KiB", 1024 },
3471 { "MiB", 1024*1024 },
3472 { "GiB", 1024*1024*1024 },
3473 { "KB", 1000 },
3474 { "MB", 1000000 },
3475 { "GB", 1000000000 },
3476 { "K", 1000 },
3477 { "M", 1000000 },
3478 { "G", 1000000000 },
3479 };
3480 int i;
3481 int isNeg = 0;
3482 if( zArg[0]=='-' ){
3483 isNeg = 1;
3484 zArg++;
3485 }else if( zArg[0]=='+' ){
3486 zArg++;
3487 }
drh348d19c2013-06-03 12:47:43 +00003488 if( zArg[0]=='0' && zArg[1]=='x' ){
3489 int x;
3490 zArg += 2;
3491 while( (x = hexDigitValue(zArg[0]))>=0 ){
3492 v = (v<<4) + x;
3493 zArg++;
3494 }
3495 }else{
3496 while( IsDigit(zArg[0]) ){
3497 v = v*10 + zArg[0] - '0';
3498 zArg++;
3499 }
drh7d9f3942013-04-03 01:26:54 +00003500 }
drhc2bed0a2013-05-24 11:57:50 +00003501 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00003502 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
3503 v *= aMult[i].iMult;
3504 break;
3505 }
3506 }
3507 return isNeg? -v : v;
3508}
3509
3510/*
drh348d19c2013-06-03 12:47:43 +00003511** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3512** for TRUE and FALSE. Return the integer value if appropriate.
3513*/
drhe6e1d122017-03-09 13:50:49 +00003514static int booleanValue(const char *zArg){
drh348d19c2013-06-03 12:47:43 +00003515 int i;
3516 if( zArg[0]=='0' && zArg[1]=='x' ){
3517 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3518 }else{
3519 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3520 }
3521 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3522 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3523 return 1;
3524 }
3525 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3526 return 0;
3527 }
mistachkinaae280e2015-12-31 19:06:24 +00003528 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00003529 zArg);
3530 return 0;
3531}
3532
3533/*
drhe6e1d122017-03-09 13:50:49 +00003534** Set or clear a shell flag according to a boolean value.
3535*/
3536static void setOrClearFlag(ShellState *p, unsigned mFlag, const char *zArg){
3537 if( booleanValue(zArg) ){
3538 ShellSetFlag(p, mFlag);
3539 }else{
3540 ShellClearFlag(p, mFlag);
3541 }
3542}
3543
3544/*
drh42f64e52012-04-04 16:56:23 +00003545** Close an output file, assuming it is not stderr or stdout
3546*/
3547static void output_file_close(FILE *f){
3548 if( f && f!=stdout && f!=stderr ) fclose(f);
3549}
3550
3551/*
3552** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00003553** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00003554** filename is "off".
3555*/
3556static FILE *output_file_open(const char *zFile){
3557 FILE *f;
3558 if( strcmp(zFile,"stdout")==0 ){
3559 f = stdout;
3560 }else if( strcmp(zFile, "stderr")==0 ){
3561 f = stderr;
3562 }else if( strcmp(zFile, "off")==0 ){
3563 f = 0;
3564 }else{
3565 f = fopen(zFile, "wb");
3566 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003567 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003568 }
3569 }
3570 return f;
3571}
3572
drhd12602a2016-12-07 15:49:02 +00003573#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00003574#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003575/*
3576** A routine for handling output from sqlite3_trace().
3577*/
drh4b363a52016-07-23 20:27:41 +00003578static int sql_trace_callback(
3579 unsigned mType,
3580 void *pArg,
3581 void *pP,
3582 void *pX
3583){
drh42f64e52012-04-04 16:56:23 +00003584 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00003585 UNUSED_PARAMETER(mType);
3586 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00003587 if( f ){
drh4b363a52016-07-23 20:27:41 +00003588 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00003589 int i = (int)strlen(z);
3590 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00003591 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00003592 }
drh4b363a52016-07-23 20:27:41 +00003593 return 0;
drh42f64e52012-04-04 16:56:23 +00003594}
drhc10b9da2016-11-20 17:59:59 +00003595#endif
3596#endif
drh42f64e52012-04-04 16:56:23 +00003597
3598/*
drhd8621b92012-04-17 09:09:33 +00003599** A no-op routine that runs with the ".breakpoint" doc-command. This is
3600** a useful spot to set a debugger breakpoint.
3601*/
3602static void test_breakpoint(void){
3603 static int nCall = 0;
3604 nCall++;
3605}
3606
3607/*
mistachkin636bf9f2014-07-19 20:15:16 +00003608** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00003609*/
mistachkin636bf9f2014-07-19 20:15:16 +00003610typedef struct ImportCtx ImportCtx;
3611struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00003612 const char *zFile; /* Name of the input file */
3613 FILE *in; /* Read the CSV text from this input stream */
3614 char *z; /* Accumulated text for a field */
3615 int n; /* Number of bytes in z */
3616 int nAlloc; /* Space allocated for z[] */
3617 int nLine; /* Current line number */
3618 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00003619 int cColSep; /* The column separator character. (Usually ",") */
3620 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00003621};
3622
3623/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00003624static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00003625 if( p->n+1>=p->nAlloc ){
3626 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00003627 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00003628 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003629 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00003630 exit(1);
3631 }
3632 }
3633 p->z[p->n++] = (char)c;
3634}
3635
3636/* Read a single field of CSV text. Compatible with rfc4180 and extended
3637** with the option of having a separator other than ",".
3638**
3639** + Input comes from p->in.
3640** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003641** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003642** + Use p->cSep as the column separator. The default is ",".
3643** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00003644** + Keep track of the line number in p->nLine.
3645** + Store the character that terminates the field in p->cTerm. Store
3646** EOF on end-of-file.
3647** + Report syntax errors on stderr
3648*/
mistachkin44723ce2015-03-21 02:22:37 +00003649static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003650 int c;
3651 int cSep = p->cColSep;
3652 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00003653 p->n = 0;
3654 c = fgetc(p->in);
3655 if( c==EOF || seenInterrupt ){
3656 p->cTerm = EOF;
3657 return 0;
3658 }
3659 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00003660 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00003661 int startLine = p->nLine;
3662 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00003663 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00003664 while( 1 ){
3665 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00003666 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00003667 if( c==cQuote ){
3668 if( pc==cQuote ){
3669 pc = 0;
3670 continue;
3671 }
3672 }
3673 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00003674 || (c==rSep && pc==cQuote)
3675 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00003676 || (c==EOF && pc==cQuote)
3677 ){
3678 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00003679 p->cTerm = c;
3680 break;
3681 }
3682 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00003683 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00003684 p->zFile, p->nLine, cQuote);
3685 }
3686 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00003687 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00003688 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00003689 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00003690 break;
3691 }
mistachkin636bf9f2014-07-19 20:15:16 +00003692 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00003693 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00003694 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00003695 }
drhdb95f682013-06-26 22:46:00 +00003696 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003697 while( c!=EOF && c!=cSep && c!=rSep ){
3698 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00003699 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00003700 }
mistachkin636bf9f2014-07-19 20:15:16 +00003701 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00003702 p->nLine++;
drh3852b682014-02-26 13:53:34 +00003703 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00003704 }
drhdb95f682013-06-26 22:46:00 +00003705 p->cTerm = c;
3706 }
drh8dd675e2013-07-12 21:09:24 +00003707 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00003708 return p->z;
3709}
3710
mistachkin636bf9f2014-07-19 20:15:16 +00003711/* Read a single field of ASCII delimited text.
3712**
3713** + Input comes from p->in.
3714** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003715** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003716** + Use p->cSep as the column separator. The default is "\x1F".
3717** + Use p->rSep as the row separator. The default is "\x1E".
3718** + Keep track of the row number in p->nLine.
3719** + Store the character that terminates the field in p->cTerm. Store
3720** EOF on end-of-file.
3721** + Report syntax errors on stderr
3722*/
mistachkin44723ce2015-03-21 02:22:37 +00003723static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003724 int c;
3725 int cSep = p->cColSep;
3726 int rSep = p->cRowSep;
3727 p->n = 0;
3728 c = fgetc(p->in);
3729 if( c==EOF || seenInterrupt ){
3730 p->cTerm = EOF;
3731 return 0;
3732 }
3733 while( c!=EOF && c!=cSep && c!=rSep ){
3734 import_append_char(p, c);
3735 c = fgetc(p->in);
3736 }
3737 if( c==rSep ){
3738 p->nLine++;
3739 }
3740 p->cTerm = c;
3741 if( p->z ) p->z[p->n] = 0;
3742 return p->z;
3743}
3744
drhdb95f682013-06-26 22:46:00 +00003745/*
drh4bbcf102014-02-06 02:46:08 +00003746** Try to transfer data for table zTable. If an error is seen while
3747** moving forward, try to go backwards. The backwards movement won't
3748** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00003749*/
mistachkine31ae902014-02-06 01:15:29 +00003750static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00003751 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003752 sqlite3 *newDb,
3753 const char *zTable
3754){
mistachkin1fe36bb2016-04-04 02:16:44 +00003755 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00003756 sqlite3_stmt *pInsert = 0;
3757 char *zQuery = 0;
3758 char *zInsert = 0;
3759 int rc;
3760 int i, j, n;
3761 int nTable = (int)strlen(zTable);
3762 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00003763 int cnt = 0;
3764 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00003765
3766 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
3767 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3768 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003769 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003770 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3771 zQuery);
3772 goto end_data_xfer;
3773 }
3774 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00003775 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00003776 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003777 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00003778 goto end_data_xfer;
3779 }
3780 sqlite3_snprintf(200+nTable,zInsert,
3781 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
3782 i = (int)strlen(zInsert);
3783 for(j=1; j<n; j++){
3784 memcpy(zInsert+i, ",?", 2);
3785 i += 2;
3786 }
3787 memcpy(zInsert+i, ");", 3);
3788 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
3789 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003790 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003791 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
3792 zQuery);
3793 goto end_data_xfer;
3794 }
3795 for(k=0; k<2; k++){
3796 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3797 for(i=0; i<n; i++){
3798 switch( sqlite3_column_type(pQuery, i) ){
3799 case SQLITE_NULL: {
3800 sqlite3_bind_null(pInsert, i+1);
3801 break;
3802 }
3803 case SQLITE_INTEGER: {
3804 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
3805 break;
3806 }
3807 case SQLITE_FLOAT: {
3808 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
3809 break;
3810 }
3811 case SQLITE_TEXT: {
3812 sqlite3_bind_text(pInsert, i+1,
3813 (const char*)sqlite3_column_text(pQuery,i),
3814 -1, SQLITE_STATIC);
3815 break;
3816 }
3817 case SQLITE_BLOB: {
3818 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
3819 sqlite3_column_bytes(pQuery,i),
3820 SQLITE_STATIC);
3821 break;
3822 }
3823 }
3824 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00003825 rc = sqlite3_step(pInsert);
3826 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00003827 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00003828 sqlite3_errmsg(newDb));
3829 }
drh3350ce92014-02-06 00:49:12 +00003830 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00003831 cnt++;
3832 if( (cnt%spinRate)==0 ){
3833 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
3834 fflush(stdout);
3835 }
drh3350ce92014-02-06 00:49:12 +00003836 } /* End while */
3837 if( rc==SQLITE_DONE ) break;
3838 sqlite3_finalize(pQuery);
3839 sqlite3_free(zQuery);
3840 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
3841 zTable);
3842 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3843 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003844 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00003845 break;
drh3350ce92014-02-06 00:49:12 +00003846 }
3847 } /* End for(k=0...) */
3848
3849end_data_xfer:
3850 sqlite3_finalize(pQuery);
3851 sqlite3_finalize(pInsert);
3852 sqlite3_free(zQuery);
3853 sqlite3_free(zInsert);
3854}
3855
3856
3857/*
3858** Try to transfer all rows of the schema that match zWhere. For
3859** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00003860** If an error is encountered while moving forward through the
3861** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00003862*/
mistachkine31ae902014-02-06 01:15:29 +00003863static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00003864 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003865 sqlite3 *newDb,
3866 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00003867 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00003868){
3869 sqlite3_stmt *pQuery = 0;
3870 char *zQuery = 0;
3871 int rc;
3872 const unsigned char *zName;
3873 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00003874 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00003875
3876 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3877 " WHERE %s", zWhere);
3878 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3879 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003880 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003881 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3882 zQuery);
3883 goto end_schema_xfer;
3884 }
3885 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3886 zName = sqlite3_column_text(pQuery, 0);
3887 zSql = sqlite3_column_text(pQuery, 1);
3888 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003889 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3890 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003891 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003892 sqlite3_free(zErrMsg);
3893 zErrMsg = 0;
3894 }
drh3350ce92014-02-06 00:49:12 +00003895 if( xForEach ){
3896 xForEach(p, newDb, (const char*)zName);
3897 }
3898 printf("done\n");
3899 }
3900 if( rc!=SQLITE_DONE ){
3901 sqlite3_finalize(pQuery);
3902 sqlite3_free(zQuery);
3903 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3904 " WHERE %s ORDER BY rowid DESC", zWhere);
3905 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3906 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003907 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003908 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3909 zQuery);
3910 goto end_schema_xfer;
3911 }
3912 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3913 zName = sqlite3_column_text(pQuery, 0);
3914 zSql = sqlite3_column_text(pQuery, 1);
3915 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003916 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3917 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003918 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003919 sqlite3_free(zErrMsg);
3920 zErrMsg = 0;
3921 }
drh3350ce92014-02-06 00:49:12 +00003922 if( xForEach ){
3923 xForEach(p, newDb, (const char*)zName);
3924 }
3925 printf("done\n");
3926 }
3927 }
3928end_schema_xfer:
3929 sqlite3_finalize(pQuery);
3930 sqlite3_free(zQuery);
3931}
3932
3933/*
3934** Open a new database file named "zNewDb". Try to recover as much information
3935** as possible out of the main database (which might be corrupt) and write it
3936** into zNewDb.
3937*/
drhdcd87a92014-08-18 13:45:42 +00003938static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00003939 int rc;
3940 sqlite3 *newDb = 0;
3941 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003942 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00003943 return;
3944 }
3945 rc = sqlite3_open(zNewDb, &newDb);
3946 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003947 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00003948 sqlite3_errmsg(newDb));
3949 }else{
drh54d0d2d2014-04-03 00:32:13 +00003950 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003951 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00003952 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
3953 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00003954 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00003955 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003956 }
3957 sqlite3_close(newDb);
3958}
3959
3960/*
drhc2ce0be2014-05-29 12:36:14 +00003961** Change the output file back to stdout
3962*/
drhdcd87a92014-08-18 13:45:42 +00003963static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00003964 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003965#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00003966 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00003967#endif
drhc2ce0be2014-05-29 12:36:14 +00003968 }else{
3969 output_file_close(p->out);
3970 }
3971 p->outfile[0] = 0;
3972 p->out = stdout;
3973}
3974
3975/*
drhf7502f02015-02-06 14:19:44 +00003976** Run an SQL command and return the single integer result.
3977*/
3978static int db_int(ShellState *p, const char *zSql){
3979 sqlite3_stmt *pStmt;
3980 int res = 0;
3981 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3982 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
3983 res = sqlite3_column_int(pStmt,0);
3984 }
3985 sqlite3_finalize(pStmt);
3986 return res;
3987}
3988
3989/*
3990** Convert a 2-byte or 4-byte big-endian integer into a native integer
3991*/
drha0620ac2016-07-13 13:05:13 +00003992static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003993 return (a[0]<<8) + a[1];
3994}
drha0620ac2016-07-13 13:05:13 +00003995static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003996 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
3997}
3998
3999/*
4000** Implementation of the ".info" command.
4001**
4002** Return 1 on error, 2 to exit, and 0 otherwise.
4003*/
drh0e55db12015-02-06 14:51:13 +00004004static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00004005 static const struct { const char *zName; int ofst; } aField[] = {
4006 { "file change counter:", 24 },
4007 { "database page count:", 28 },
4008 { "freelist page count:", 36 },
4009 { "schema cookie:", 40 },
4010 { "schema format:", 44 },
4011 { "default cache size:", 48 },
4012 { "autovacuum top root:", 52 },
4013 { "incremental vacuum:", 64 },
4014 { "text encoding:", 56 },
4015 { "user version:", 60 },
4016 { "application id:", 68 },
4017 { "software version:", 96 },
4018 };
drh0e55db12015-02-06 14:51:13 +00004019 static const struct { const char *zName; const char *zSql; } aQuery[] = {
4020 { "number of tables:",
4021 "SELECT count(*) FROM %s WHERE type='table'" },
4022 { "number of indexes:",
4023 "SELECT count(*) FROM %s WHERE type='index'" },
4024 { "number of triggers:",
4025 "SELECT count(*) FROM %s WHERE type='trigger'" },
4026 { "number of views:",
4027 "SELECT count(*) FROM %s WHERE type='view'" },
4028 { "schema size:",
4029 "SELECT total(length(sql)) FROM %s" },
4030 };
mistachkinbfe8bd52015-11-17 19:17:14 +00004031 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00004032 int i;
4033 char *zSchemaTab;
4034 char *zDb = nArg>=2 ? azArg[1] : "main";
4035 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00004036 open_db(p, 0);
4037 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00004038 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00004039 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
4040 return 1;
4041 }
4042 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
4043 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004044 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00004045 return 1;
4046 }
4047 i = get2byteInt(aHdr+16);
4048 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00004049 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
4050 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
4051 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
4052 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00004053 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00004054 int ofst = aField[i].ofst;
4055 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00004056 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00004057 switch( ofst ){
4058 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00004059 if( val==1 ) raw_printf(p->out, " (utf8)");
4060 if( val==2 ) raw_printf(p->out, " (utf16le)");
4061 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00004062 }
4063 }
mistachkinaae280e2015-12-31 19:06:24 +00004064 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00004065 }
drh0e55db12015-02-06 14:51:13 +00004066 if( zDb==0 ){
4067 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
4068 }else if( strcmp(zDb,"temp")==0 ){
4069 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
4070 }else{
4071 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
4072 }
drhf5ed7ad2015-06-15 14:43:25 +00004073 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00004074 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
4075 int val = db_int(p, zSql);
4076 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00004077 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00004078 }
4079 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00004080 return 0;
4081}
4082
dand95bb392015-09-30 11:19:05 +00004083/*
4084** Print the current sqlite3_errmsg() value to stderr and return 1.
4085*/
4086static int shellDatabaseError(sqlite3 *db){
4087 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00004088 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00004089 return 1;
4090}
4091
4092/*
4093** Print an out-of-memory message to stderr and return 1.
4094*/
4095static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00004096 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00004097 return 1;
4098}
drhf7502f02015-02-06 14:19:44 +00004099
drh2db82112016-09-15 21:35:24 +00004100/*
4101** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
4102** if they match and FALSE (0) if they do not match.
4103**
4104** Globbing rules:
4105**
4106** '*' Matches any sequence of zero or more characters.
4107**
4108** '?' Matches exactly one character.
4109**
4110** [...] Matches one character from the enclosed list of
4111** characters.
4112**
4113** [^...] Matches one character not in the enclosed list.
4114**
4115** '#' Matches any sequence of one or more digits with an
4116** optional + or - sign in front
4117**
4118** ' ' Any span of whitespace matches any other span of
4119** whitespace.
4120**
4121** Extra whitespace at the end of z[] is ignored.
4122*/
4123static int testcase_glob(const char *zGlob, const char *z){
4124 int c, c2;
4125 int invert;
4126 int seen;
4127
4128 while( (c = (*(zGlob++)))!=0 ){
4129 if( IsSpace(c) ){
4130 if( !IsSpace(*z) ) return 0;
4131 while( IsSpace(*zGlob) ) zGlob++;
4132 while( IsSpace(*z) ) z++;
4133 }else if( c=='*' ){
4134 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4135 if( c=='?' && (*(z++))==0 ) return 0;
4136 }
4137 if( c==0 ){
4138 return 1;
4139 }else if( c=='[' ){
4140 while( *z && testcase_glob(zGlob-1,z)==0 ){
4141 z++;
4142 }
4143 return (*z)!=0;
4144 }
4145 while( (c2 = (*(z++)))!=0 ){
4146 while( c2!=c ){
4147 c2 = *(z++);
4148 if( c2==0 ) return 0;
4149 }
4150 if( testcase_glob(zGlob,z) ) return 1;
4151 }
4152 return 0;
4153 }else if( c=='?' ){
4154 if( (*(z++))==0 ) return 0;
4155 }else if( c=='[' ){
4156 int prior_c = 0;
4157 seen = 0;
4158 invert = 0;
4159 c = *(z++);
4160 if( c==0 ) return 0;
4161 c2 = *(zGlob++);
4162 if( c2=='^' ){
4163 invert = 1;
4164 c2 = *(zGlob++);
4165 }
4166 if( c2==']' ){
4167 if( c==']' ) seen = 1;
4168 c2 = *(zGlob++);
4169 }
4170 while( c2 && c2!=']' ){
4171 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4172 c2 = *(zGlob++);
4173 if( c>=prior_c && c<=c2 ) seen = 1;
4174 prior_c = 0;
4175 }else{
4176 if( c==c2 ){
4177 seen = 1;
4178 }
4179 prior_c = c2;
4180 }
4181 c2 = *(zGlob++);
4182 }
4183 if( c2==0 || (seen ^ invert)==0 ) return 0;
4184 }else if( c=='#' ){
4185 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4186 if( !IsDigit(z[0]) ) return 0;
4187 z++;
4188 while( IsDigit(z[0]) ){ z++; }
4189 }else{
4190 if( c!=(*(z++)) ) return 0;
4191 }
4192 }
4193 while( IsSpace(*z) ){ z++; }
4194 return *z==0;
4195}
drh2db82112016-09-15 21:35:24 +00004196
4197
drhf7502f02015-02-06 14:19:44 +00004198/*
drh4926fec2016-04-13 15:33:42 +00004199** Compare the string as a command-line option with either one or two
4200** initial "-" characters.
4201*/
4202static int optionMatch(const char *zStr, const char *zOpt){
4203 if( zStr[0]!='-' ) return 0;
4204 zStr++;
4205 if( zStr[0]=='-' ) zStr++;
4206 return strcmp(zStr, zOpt)==0;
4207}
4208
4209/*
drhcd0509e2016-09-16 00:26:08 +00004210** Delete a file.
4211*/
4212int shellDeleteFile(const char *zFilename){
4213 int rc;
4214#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00004215 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00004216 rc = _wunlink(z);
4217 sqlite3_free(z);
4218#else
4219 rc = unlink(zFilename);
4220#endif
4221 return rc;
4222}
4223
dan35ac58e2016-12-14 19:28:27 +00004224
dan35ac58e2016-12-14 19:28:27 +00004225/*
dandd9e0be2016-12-16 16:44:27 +00004226** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00004227** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00004228** called with four arguments - the parent table name, the parent column name,
4229** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00004230**
4231** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4232**
4233** If either of the named tables or columns do not exist, this function
4234** returns an empty string. An empty string is also returned if both tables
4235** and columns exist but have the same default collation sequence. Or,
4236** if both exist but the default collation sequences are different, this
4237** function returns the string " COLLATE <parent-collation>", where
4238** <parent-collation> is the default collation sequence of the parent column.
4239*/
4240static void shellFkeyCollateClause(
4241 sqlite3_context *pCtx,
4242 int nVal,
4243 sqlite3_value **apVal
4244){
4245 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4246 const char *zParent;
4247 const char *zParentCol;
4248 const char *zParentSeq;
4249 const char *zChild;
4250 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00004251 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00004252 int rc;
4253
4254 assert( nVal==4 );
4255 zParent = (const char*)sqlite3_value_text(apVal[0]);
4256 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4257 zChild = (const char*)sqlite3_value_text(apVal[2]);
4258 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4259
4260 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4261 rc = sqlite3_table_column_metadata(
4262 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4263 );
4264 if( rc==SQLITE_OK ){
4265 rc = sqlite3_table_column_metadata(
4266 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4267 );
4268 }
4269
4270 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4271 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4272 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4273 sqlite3_free(z);
4274 }
4275}
4276
4277
4278/*
dan3c7ebeb2016-12-16 17:28:56 +00004279** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00004280*/
dan3c7ebeb2016-12-16 17:28:56 +00004281static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00004282 ShellState *pState, /* Current shell tool state */
4283 char **azArg, /* Array of arguments passed to dot command */
4284 int nArg /* Number of entries in azArg[] */
4285){
dandd9e0be2016-12-16 16:44:27 +00004286 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4287 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00004288 int bVerbose = 0; /* If -verbose is present */
4289 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00004290 int i; /* To iterate through azArg[] */
4291 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4292 int rc; /* Return code */
4293 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00004294
dandd9e0be2016-12-16 16:44:27 +00004295 /*
4296 ** This SELECT statement returns one row for each foreign key constraint
4297 ** in the schema of the main database. The column values are:
4298 **
4299 ** 0. The text of an SQL statement similar to:
4300 **
4301 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
4302 **
4303 ** This is the same SELECT that the foreign keys implementation needs
4304 ** to run internally on child tables. If there is an index that can
4305 ** be used to optimize this query, then it can also be used by the FK
4306 ** implementation to optimize DELETE or UPDATE statements on the parent
4307 ** table.
4308 **
4309 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4310 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4311 ** contains an index that can be used to optimize the query.
4312 **
4313 ** 2. Human readable text that describes the child table and columns. e.g.
4314 **
4315 ** "child_table(child_key1, child_key2)"
4316 **
4317 ** 3. Human readable text that describes the parent table and columns. e.g.
4318 **
4319 ** "parent_table(parent_key1, parent_key2)"
4320 **
4321 ** 4. A full CREATE INDEX statement for an index that could be used to
4322 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4323 **
4324 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4325 **
4326 ** 5. The name of the parent table.
4327 **
4328 ** These six values are used by the C logic below to generate the report.
4329 */
dan35ac58e2016-12-14 19:28:27 +00004330 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00004331 "SELECT "
4332 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
4333 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4334 " || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00004335 ", "
dandd9e0be2016-12-16 16:44:27 +00004336 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00004337 " || group_concat('*=?', ' AND ') || ')'"
4338 ", "
dandd9e0be2016-12-16 16:44:27 +00004339 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00004340 ", "
dandd9e0be2016-12-16 16:44:27 +00004341 " f.[table] || '(' || group_concat(COALESCE(f.[to], "
4342 " (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)"
dan35ac58e2016-12-14 19:28:27 +00004343 " )) || ')'"
4344 ", "
dandd9e0be2016-12-16 16:44:27 +00004345 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4346 " || ' ON ' || quote(s.name) || '('"
4347 " || group_concat(quote(f.[from]) ||"
4348 " fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00004349 " || ');'"
danf9647b62016-12-15 06:01:40 +00004350 ", "
dandd9e0be2016-12-16 16:44:27 +00004351 " f.[table] "
dan35ac58e2016-12-14 19:28:27 +00004352
dandd9e0be2016-12-16 16:44:27 +00004353 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4354 "GROUP BY s.name, f.id "
4355 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00004356 ;
4357
dan3c7ebeb2016-12-16 17:28:56 +00004358 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00004359 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00004360 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4361 bVerbose = 1;
4362 }
4363 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4364 bGroupByParent = 1;
4365 zIndent = " ";
4366 }
4367 else{
dan3c7ebeb2016-12-16 17:28:56 +00004368 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4369 azArg[0], azArg[1]
4370 );
danf9647b62016-12-15 06:01:40 +00004371 return SQLITE_ERROR;
4372 }
dan35ac58e2016-12-14 19:28:27 +00004373 }
dan35ac58e2016-12-14 19:28:27 +00004374
4375 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00004376 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4377 0, shellFkeyCollateClause, 0, 0
4378 );
dan35ac58e2016-12-14 19:28:27 +00004379
4380
4381 if( rc==SQLITE_OK ){
4382 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4383 }
danf9647b62016-12-15 06:01:40 +00004384 if( rc==SQLITE_OK ){
4385 sqlite3_bind_int(pSql, 1, bGroupByParent);
4386 }
dan35ac58e2016-12-14 19:28:27 +00004387
4388 if( rc==SQLITE_OK ){
4389 int rc2;
danf9647b62016-12-15 06:01:40 +00004390 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00004391 while( SQLITE_ROW==sqlite3_step(pSql) ){
4392 int res = -1;
4393 sqlite3_stmt *pExplain = 0;
4394 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4395 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4396 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4397 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4398 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00004399 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00004400
4401 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4402 if( rc!=SQLITE_OK ) break;
4403 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4404 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4405 res = (0==sqlite3_strglob(zGlob, zPlan));
4406 }
4407 rc = sqlite3_finalize(pExplain);
4408 if( rc!=SQLITE_OK ) break;
4409
4410 if( res<0 ){
4411 raw_printf(stderr, "Error: internal error");
4412 break;
danf9647b62016-12-15 06:01:40 +00004413 }else{
4414 if( bGroupByParent
4415 && (bVerbose || res==0)
4416 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4417 ){
4418 raw_printf(out, "-- Parent table %s\n", zParent);
4419 sqlite3_free(zPrev);
4420 zPrev = sqlite3_mprintf("%s", zParent);
4421 }
4422
4423 if( res==0 ){
4424 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4425 }else if( bVerbose ){
4426 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4427 zIndent, zFrom, zTarget
4428 );
4429 }
dan35ac58e2016-12-14 19:28:27 +00004430 }
4431 }
danf9647b62016-12-15 06:01:40 +00004432 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00004433
4434 if( rc!=SQLITE_OK ){
4435 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4436 }
4437
4438 rc2 = sqlite3_finalize(pSql);
4439 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4440 rc = rc2;
4441 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4442 }
4443 }else{
4444 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4445 }
4446
4447 return rc;
4448}
dan3c7ebeb2016-12-16 17:28:56 +00004449
dan35ac58e2016-12-14 19:28:27 +00004450/*
dan3c7ebeb2016-12-16 17:28:56 +00004451** Implementation of ".lint" dot command.
4452*/
4453static int lintDotCommand(
4454 ShellState *pState, /* Current shell tool state */
4455 char **azArg, /* Array of arguments passed to dot command */
4456 int nArg /* Number of entries in azArg[] */
4457){
4458 int n;
drh96ada592016-12-29 19:48:46 +00004459 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00004460 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4461 return lintFkeyIndexes(pState, azArg, nArg);
4462
4463 usage:
4464 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4465 raw_printf(stderr, "Where sub-commands are:\n");
4466 raw_printf(stderr, " fkey-indexes\n");
4467 return SQLITE_ERROR;
4468}
4469
dan35ac58e2016-12-14 19:28:27 +00004470
drhcd0509e2016-09-16 00:26:08 +00004471/*
drh75897232000-05-29 14:26:00 +00004472** If an input line begins with "." then invoke this routine to
4473** process that line.
drh67505e72002-04-19 12:34:06 +00004474**
drh47ad6842006-11-08 12:25:42 +00004475** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00004476*/
drhdcd87a92014-08-18 13:45:42 +00004477static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00004478 int h = 1;
drh75897232000-05-29 14:26:00 +00004479 int nArg = 0;
4480 int n, c;
drh67505e72002-04-19 12:34:06 +00004481 int rc = 0;
drh75897232000-05-29 14:26:00 +00004482 char *azArg[50];
4483
4484 /* Parse the input line into tokens.
4485 */
mistachkin8e189222015-04-19 21:43:16 +00004486 while( zLine[h] && nArg<ArraySize(azArg) ){
4487 while( IsSpace(zLine[h]) ){ h++; }
4488 if( zLine[h]==0 ) break;
4489 if( zLine[h]=='\'' || zLine[h]=='"' ){
4490 int delim = zLine[h++];
4491 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00004492 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00004493 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00004494 h++;
drh4c56b992013-06-27 13:26:55 +00004495 }
mistachkin8e189222015-04-19 21:43:16 +00004496 if( zLine[h]==delim ){
4497 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00004498 }
drhfeac5f82004-08-01 00:10:45 +00004499 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004500 }else{
mistachkin8e189222015-04-19 21:43:16 +00004501 azArg[nArg++] = &zLine[h];
4502 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
4503 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00004504 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004505 }
4506 }
4507
4508 /* Process the input line.
4509 */
shane9bd1b442009-10-23 01:27:39 +00004510 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00004511 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00004512 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00004513
drha0daa752016-09-16 11:53:10 +00004514#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00004515 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
4516 if( nArg!=2 ){
4517 raw_printf(stderr, "Usage: .auth ON|OFF\n");
4518 rc = 1;
4519 goto meta_command_exit;
4520 }
4521 open_db(p, 0);
4522 if( booleanValue(azArg[1]) ){
4523 sqlite3_set_authorizer(p->db, shellAuth, p);
4524 }else{
4525 sqlite3_set_authorizer(p->db, 0, 0);
4526 }
4527 }else
drha0daa752016-09-16 11:53:10 +00004528#endif
drhde613c62016-04-04 17:23:10 +00004529
drh5c7976f2014-02-10 19:59:27 +00004530 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
4531 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
4532 ){
drhbc46f022013-01-23 18:53:23 +00004533 const char *zDestFile = 0;
4534 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00004535 sqlite3 *pDest;
4536 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00004537 int j;
4538 for(j=1; j<nArg; j++){
4539 const char *z = azArg[j];
4540 if( z[0]=='-' ){
4541 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00004542 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00004543 {
mistachkinaae280e2015-12-31 19:06:24 +00004544 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00004545 return 1;
4546 }
4547 }else if( zDestFile==0 ){
4548 zDestFile = azArg[j];
4549 }else if( zDb==0 ){
4550 zDb = zDestFile;
4551 zDestFile = azArg[j];
4552 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004553 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00004554 return 1;
4555 }
drh9ff849f2009-02-04 20:55:57 +00004556 }
drhbc46f022013-01-23 18:53:23 +00004557 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004558 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00004559 return 1;
4560 }
4561 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00004562 rc = sqlite3_open(zDestFile, &pDest);
4563 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004564 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00004565 sqlite3_close(pDest);
4566 return 1;
4567 }
drh05782482013-10-24 15:20:20 +00004568 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00004569 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
4570 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004571 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00004572 sqlite3_close(pDest);
4573 return 1;
4574 }
4575 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
4576 sqlite3_backup_finish(pBackup);
4577 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00004578 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00004579 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004580 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00004581 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00004582 }
4583 sqlite3_close(pDest);
4584 }else
4585
drhc2ce0be2014-05-29 12:36:14 +00004586 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
4587 if( nArg==2 ){
4588 bail_on_error = booleanValue(azArg[1]);
4589 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004590 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004591 rc = 1;
4592 }
drhc49f44e2006-10-26 18:15:42 +00004593 }else
4594
mistachkinf21979d2015-01-18 05:35:01 +00004595 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
4596 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00004597 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004598 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004599 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00004600 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004601 }
mistachkinf21979d2015-01-18 05:35:01 +00004602 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004603 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00004604 rc = 1;
4605 }
4606 }else
4607
drhd8621b92012-04-17 09:09:33 +00004608 /* The undocumented ".breakpoint" command causes a call to the no-op
4609 ** routine named test_breakpoint().
4610 */
4611 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
4612 test_breakpoint();
4613 }else
4614
drhdf12f1c2015-12-07 21:46:19 +00004615 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
4616 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00004617 setOrClearFlag(p, SHFLG_CountChanges, azArg[1]);
drhdf12f1c2015-12-07 21:46:19 +00004618 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004619 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00004620 rc = 1;
4621 }
4622 }else
4623
drh2db82112016-09-15 21:35:24 +00004624 /* Cancel output redirection, if it is currently set (by .testcase)
4625 ** Then read the content of the testcase-out.txt file and compare against
4626 ** azArg[1]. If there are differences, report an error and exit.
4627 */
4628 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
4629 char *zRes = 0;
4630 output_reset(p);
4631 if( nArg!=2 ){
4632 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00004633 rc = 2;
dan11da0022016-12-17 08:18:05 +00004634 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00004635 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
4636 rc = 2;
4637 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00004638 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00004639 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
4640 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00004641 rc = 2;
drh760c8162016-09-16 02:52:22 +00004642 }else{
mistachkin8145fc62016-09-16 20:39:21 +00004643 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00004644 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00004645 }
4646 sqlite3_free(zRes);
4647 }else
drh2db82112016-09-15 21:35:24 +00004648
drhc2ce0be2014-05-29 12:36:14 +00004649 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
4650 if( nArg==2 ){
4651 tryToClone(p, azArg[1]);
4652 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004653 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00004654 rc = 1;
4655 }
mistachkine31ae902014-02-06 01:15:29 +00004656 }else
4657
drhc2ce0be2014-05-29 12:36:14 +00004658 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004659 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00004660 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00004661 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00004662 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00004663 data.showHeader = 0;
4664 data.cMode = data.mode = MODE_List;
4665 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00004666 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00004667 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
4668 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00004669 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004670 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004671 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00004672 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00004673 }
4674 }else
4675
drh0e55db12015-02-06 14:51:13 +00004676 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
4677 rc = shell_dbinfo_command(p, nArg, azArg);
4678 }else
4679
drhc2ce0be2014-05-29 12:36:14 +00004680 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00004681 const char *zLike = 0;
4682 int i;
drhe6e1d122017-03-09 13:50:49 +00004683 ShellClearFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00004684 for(i=1; i<nArg; i++){
4685 if( azArg[i][0]=='-' ){
4686 const char *z = azArg[i]+1;
4687 if( z[0]=='-' ) z++;
4688 if( strcmp(z,"preserve-rowids")==0 ){
drhe6e1d122017-03-09 13:50:49 +00004689 ShellSetFlag(p, SHFLG_PreserveRowid);
drhe611f142017-03-08 11:44:00 +00004690 }else
4691 {
4692 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
4693 rc = 1;
4694 goto meta_command_exit;
4695 }
4696 }else if( zLike ){
4697 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? ?LIKE-PATTERN?\n");
4698 rc = 1;
4699 goto meta_command_exit;
4700 }else{
4701 zLike = azArg[i];
4702 }
4703 }
drh05782482013-10-24 15:20:20 +00004704 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00004705 /* When playing back a "dump", the content might appear in an order
4706 ** which causes immediate foreign key constraints to be violated.
4707 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00004708 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
4709 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00004710 p->writableSchema = 0;
drhe611f142017-03-08 11:44:00 +00004711 /* Set writable_schema=ON since doing so forces SQLite to initialize
4712 ** as much of the schema as it can even if the sqlite_master table is
4713 ** corrupt. */
drh56197952011-10-13 16:30:13 +00004714 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00004715 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00004716 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004717 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00004718 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004719 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00004720 );
mistachkin1fe36bb2016-04-04 02:16:44 +00004721 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00004722 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004723 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00004724 );
drh2f464a02011-10-13 00:41:49 +00004725 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00004726 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00004727 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00004728 );
drh4c653a02000-06-07 01:27:47 +00004729 }else{
drhe611f142017-03-08 11:44:00 +00004730 char *zSql;
4731 zSql = sqlite3_mprintf(
4732 "SELECT name, type, sql FROM sqlite_master "
4733 "WHERE tbl_name LIKE %Q AND type=='table'"
4734 " AND sql NOT NULL", zLike);
4735 run_schema_dump_query(p,zSql);
4736 sqlite3_free(zSql);
4737 zSql = sqlite3_mprintf(
4738 "SELECT sql FROM sqlite_master "
4739 "WHERE sql NOT NULL"
4740 " AND type IN ('index','trigger','view')"
4741 " AND tbl_name LIKE %Q", zLike);
4742 run_table_dump_query(p, zSql, 0);
4743 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00004744 }
drh45e29d82006-11-20 16:21:10 +00004745 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00004746 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00004747 p->writableSchema = 0;
4748 }
drh56197952011-10-13 16:30:13 +00004749 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4750 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00004751 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00004752 }else
drh75897232000-05-29 14:26:00 +00004753
drhc2ce0be2014-05-29 12:36:14 +00004754 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
4755 if( nArg==2 ){
drhe6e1d122017-03-09 13:50:49 +00004756 setOrClearFlag(p, SHFLG_Echo, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00004757 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004758 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004759 rc = 1;
4760 }
drhdaffd0e2001-04-11 14:28:42 +00004761 }else
4762
drhc2ce0be2014-05-29 12:36:14 +00004763 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
4764 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00004765 if( strcmp(azArg[1],"full")==0 ){
4766 p->autoEQP = 2;
4767 }else{
4768 p->autoEQP = booleanValue(azArg[1]);
4769 }
drhc2ce0be2014-05-29 12:36:14 +00004770 }else{
drheacd29d2016-04-15 15:03:27 +00004771 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00004772 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00004773 }
drhefbf3b12014-02-28 20:47:24 +00004774 }else
4775
drhd3ac7d92013-01-25 18:33:43 +00004776 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00004777 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00004778 rc = 2;
drh75897232000-05-29 14:26:00 +00004779 }else
4780
drhc2ce0be2014-05-29 12:36:14 +00004781 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00004782 int val = 1;
4783 if( nArg>=2 ){
4784 if( strcmp(azArg[1],"auto")==0 ){
4785 val = 99;
4786 }else{
4787 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00004788 }
drh700c2522016-02-09 18:39:25 +00004789 }
4790 if( val==1 && p->mode!=MODE_Explain ){
4791 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00004792 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00004793 p->autoExplain = 0;
4794 }else if( val==0 ){
4795 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4796 p->autoExplain = 0;
4797 }else if( val==99 ){
4798 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4799 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00004800 }
drh75897232000-05-29 14:26:00 +00004801 }else
4802
drhc1971542014-06-23 23:28:13 +00004803 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004804 ShellState data;
drhc1971542014-06-23 23:28:13 +00004805 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00004806 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00004807 memcpy(&data, p, sizeof(data));
4808 data.showHeader = 0;
4809 data.cMode = data.mode = MODE_Semi;
4810 if( nArg==2 && optionMatch(azArg[1], "indent") ){
4811 data.cMode = data.mode = MODE_Pretty;
4812 nArg = 1;
4813 }
drhc1971542014-06-23 23:28:13 +00004814 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00004815 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00004816 rc = 1;
4817 goto meta_command_exit;
4818 }
4819 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00004820 rc = sqlite3_exec(p->db,
4821 "SELECT sql FROM"
4822 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4823 " FROM sqlite_master UNION ALL"
4824 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00004825 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00004826 "ORDER BY rowid",
4827 callback, &data, &zErrMsg
4828 );
drh56f674c2014-07-18 14:43:29 +00004829 if( rc==SQLITE_OK ){
4830 sqlite3_stmt *pStmt;
4831 rc = sqlite3_prepare_v2(p->db,
4832 "SELECT rowid FROM sqlite_master"
4833 " WHERE name GLOB 'sqlite_stat[134]'",
4834 -1, &pStmt, 0);
4835 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
4836 sqlite3_finalize(pStmt);
4837 }
4838 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004839 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00004840 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004841 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004842 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
4843 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00004844 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00004845 data.zDestTable = "sqlite_stat1";
4846 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
4847 shell_callback, &data,&zErrMsg);
4848 data.zDestTable = "sqlite_stat3";
4849 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
4850 shell_callback, &data,&zErrMsg);
4851 data.zDestTable = "sqlite_stat4";
4852 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
4853 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00004854 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004855 }
drhc1971542014-06-23 23:28:13 +00004856 }else
4857
drhc2ce0be2014-05-29 12:36:14 +00004858 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
4859 if( nArg==2 ){
4860 p->showHeader = booleanValue(azArg[1]);
4861 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004862 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004863 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00004864 }
drh75897232000-05-29 14:26:00 +00004865 }else
4866
drhc2ce0be2014-05-29 12:36:14 +00004867 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004868 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00004869 }else
4870
4871 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00004872 char *zTable; /* Insert data into this table */
4873 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00004874 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00004875 int nCol; /* Number of columns in the table */
4876 int nByte; /* Number of bytes in an SQL string */
4877 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00004878 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00004879 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00004880 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00004881 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00004882 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
4883 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00004884
drhc2ce0be2014-05-29 12:36:14 +00004885 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004886 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00004887 goto meta_command_exit;
4888 }
drh01f37542014-05-31 15:43:33 +00004889 zFile = azArg[1];
4890 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00004891 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00004892 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00004893 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004894 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00004895 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004896 raw_printf(stderr,
4897 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00004898 return 1;
drhfeac5f82004-08-01 00:10:45 +00004899 }
drhdb95f682013-06-26 22:46:00 +00004900 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004901 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00004902 " for import\n");
4903 return 1;
4904 }
mistachkin636bf9f2014-07-19 20:15:16 +00004905 nSep = strlen30(p->rowSeparator);
4906 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004907 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004908 return 1;
4909 }
mistachkine0d68852014-12-11 03:12:33 +00004910 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
4911 /* When importing CSV (only), if the row separator is set to the
4912 ** default output row separator, change it to the default input
4913 ** row separator. This avoids having to maintain different input
4914 ** and output row separators. */
4915 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4916 nSep = strlen30(p->rowSeparator);
4917 }
mistachkin636bf9f2014-07-19 20:15:16 +00004918 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004919 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00004920 " for import\n");
4921 return 1;
4922 }
4923 sCtx.zFile = zFile;
4924 sCtx.nLine = 1;
4925 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004926#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00004927 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00004928 return 1;
4929#else
mistachkin636bf9f2014-07-19 20:15:16 +00004930 sCtx.in = popen(sCtx.zFile+1, "r");
4931 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00004932 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00004933#endif
drh5bde8162013-06-27 14:07:53 +00004934 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00004935 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00004936 xCloser = fclose;
4937 }
mistachkin636bf9f2014-07-19 20:15:16 +00004938 if( p->mode==MODE_Ascii ){
4939 xRead = ascii_read_one_field;
4940 }else{
4941 xRead = csv_read_one_field;
4942 }
4943 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004944 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00004945 return 1;
4946 }
mistachkin636bf9f2014-07-19 20:15:16 +00004947 sCtx.cColSep = p->colSeparator[0];
4948 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00004949 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00004950 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004951 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004952 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004953 return 1;
4954 }
drh4f21c4a2008-12-10 22:15:00 +00004955 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00004956 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004957 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00004958 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00004959 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
4960 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00004961 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00004962 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00004963 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00004964 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00004965 }
drh5bde8162013-06-27 14:07:53 +00004966 if( cSep=='(' ){
4967 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00004968 sqlite3_free(sCtx.z);
4969 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00004970 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00004971 return 1;
4972 }
drhdb95f682013-06-26 22:46:00 +00004973 zCreate = sqlite3_mprintf("%z\n)", zCreate);
4974 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
4975 sqlite3_free(zCreate);
4976 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004977 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00004978 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004979 sqlite3_free(sCtx.z);
4980 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00004981 return 1;
4982 }
drhc7181902014-02-27 15:04:13 +00004983 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004984 }
drhfeac5f82004-08-01 00:10:45 +00004985 sqlite3_free(zSql);
4986 if( rc ){
shane916f9612009-10-23 00:37:15 +00004987 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00004988 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004989 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004990 return 1;
drhfeac5f82004-08-01 00:10:45 +00004991 }
shane916f9612009-10-23 00:37:15 +00004992 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00004993 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00004994 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00004995 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00004996 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00004997 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004998 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004999 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00005000 return 1;
5001 }
drhdb95f682013-06-26 22:46:00 +00005002 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00005003 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00005004 for(i=1; i<nCol; i++){
5005 zSql[j++] = ',';
5006 zSql[j++] = '?';
5007 }
5008 zSql[j++] = ')';
5009 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00005010 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00005011 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00005012 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00005013 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00005014 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00005015 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00005016 return 1;
drhfeac5f82004-08-01 00:10:45 +00005017 }
mistachkin8e189222015-04-19 21:43:16 +00005018 needCommit = sqlite3_get_autocommit(p->db);
5019 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00005020 do{
mistachkin636bf9f2014-07-19 20:15:16 +00005021 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00005022 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00005023 char *z = xRead(&sCtx);
5024 /*
5025 ** Did we reach end-of-file before finding any columns?
5026 ** If so, stop instead of NULL filling the remaining columns.
5027 */
drhdb95f682013-06-26 22:46:00 +00005028 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00005029 /*
5030 ** Did we reach end-of-file OR end-of-line before finding any
5031 ** columns in ASCII mode? If so, stop instead of NULL filling
5032 ** the remaining columns.
5033 */
5034 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00005035 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00005036 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00005037 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00005038 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00005039 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00005040 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00005041 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00005042 }
drhfeac5f82004-08-01 00:10:45 +00005043 }
mistachkin636bf9f2014-07-19 20:15:16 +00005044 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00005045 do{
mistachkin636bf9f2014-07-19 20:15:16 +00005046 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00005047 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00005048 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00005049 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00005050 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00005051 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00005052 }
drhdb95f682013-06-26 22:46:00 +00005053 if( i>=nCol ){
5054 sqlite3_step(pStmt);
5055 rc = sqlite3_reset(pStmt);
5056 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005057 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
5058 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00005059 }
5060 }
mistachkin636bf9f2014-07-19 20:15:16 +00005061 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00005062
mistachkin636bf9f2014-07-19 20:15:16 +00005063 xCloser(sCtx.in);
5064 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00005065 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00005066 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00005067 }else
5068
drhd12602a2016-12-07 15:49:02 +00005069#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00005070 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
5071 char *zSql;
5072 char *zCollist = 0;
5073 sqlite3_stmt *pStmt;
5074 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00005075 int i;
drh16eb5942016-11-03 13:01:38 +00005076 if( nArg!=3 ){
5077 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
5078 rc = 1;
5079 goto meta_command_exit;
5080 }
5081 open_db(p, 0);
5082 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
5083 " WHERE name='%q' AND type='index'", azArg[1]);
5084 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5085 sqlite3_free(zSql);
5086 if( sqlite3_step(pStmt)==SQLITE_ROW ){
5087 tnum = sqlite3_column_int(pStmt, 0);
5088 }
5089 sqlite3_finalize(pStmt);
5090 if( tnum==0 ){
5091 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
5092 rc = 1;
5093 goto meta_command_exit;
5094 }
5095 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
5096 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5097 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00005098 i = 0;
drh16eb5942016-11-03 13:01:38 +00005099 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00005100 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00005101 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00005102 i++;
5103 if( zCol==0 ){
5104 if( sqlite3_column_int(pStmt,1)==-1 ){
5105 zCol = "_ROWID_";
5106 }else{
5107 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
5108 zCol = zLabel;
5109 }
5110 }
drh16eb5942016-11-03 13:01:38 +00005111 if( zCollist==0 ){
5112 zCollist = sqlite3_mprintf("\"%w\"", zCol);
5113 }else{
5114 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
5115 }
5116 }
5117 sqlite3_finalize(pStmt);
5118 zSql = sqlite3_mprintf(
5119 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
5120 azArg[2], zCollist, zCollist);
5121 sqlite3_free(zCollist);
5122 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
5123 if( rc==SQLITE_OK ){
5124 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
5125 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
5126 if( rc ){
5127 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
5128 }else{
5129 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00005130 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00005131 "WARNING: writing to an imposter table will corrupt the index!\n"
5132 );
5133 }
5134 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00005135 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00005136 rc = 1;
5137 }
5138 sqlite3_free(zSql);
5139 }else
5140#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
5141
drhae5e4452007-05-03 17:18:36 +00005142#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00005143 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00005144 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00005145 if( iotrace && iotrace!=stdout ) fclose(iotrace);
5146 iotrace = 0;
5147 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00005148 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00005149 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00005150 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005151 iotrace = stdout;
5152 }else{
5153 iotrace = fopen(azArg[1], "w");
5154 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005155 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00005156 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00005157 rc = 1;
drhb0603412007-02-28 04:47:26 +00005158 }else{
mlcreech3a00f902008-03-04 17:45:01 +00005159 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005160 }
5161 }
5162 }else
drhae5e4452007-05-03 17:18:36 +00005163#endif
drh16eb5942016-11-03 13:01:38 +00005164
drh1a513372015-05-02 17:40:23 +00005165 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
5166 static const struct {
5167 const char *zLimitName; /* Name of a limit */
5168 int limitCode; /* Integer code for that limit */
5169 } aLimit[] = {
5170 { "length", SQLITE_LIMIT_LENGTH },
5171 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
5172 { "column", SQLITE_LIMIT_COLUMN },
5173 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
5174 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
5175 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
5176 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
5177 { "attached", SQLITE_LIMIT_ATTACHED },
5178 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
5179 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
5180 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
5181 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
5182 };
5183 int i, n2;
5184 open_db(p, 0);
5185 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00005186 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005187 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00005188 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
5189 }
5190 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005191 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00005192 rc = 1;
5193 goto meta_command_exit;
5194 }else{
5195 int iLimit = -1;
5196 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00005197 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00005198 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
5199 if( iLimit<0 ){
5200 iLimit = i;
5201 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005202 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00005203 rc = 1;
5204 goto meta_command_exit;
5205 }
5206 }
5207 }
5208 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005209 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00005210 "enter \".limits\" with no arguments for a list.\n",
5211 azArg[1]);
5212 rc = 1;
5213 goto meta_command_exit;
5214 }
5215 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00005216 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
5217 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00005218 }
5219 printf("%20s %d\n", aLimit[iLimit].zLimitName,
5220 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
5221 }
5222 }else
drhb0603412007-02-28 04:47:26 +00005223
dan3c7ebeb2016-12-16 17:28:56 +00005224 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00005225 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00005226 lintDotCommand(p, azArg, nArg);
5227 }else
5228
drh70df4fe2006-06-13 15:12:21 +00005229#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00005230 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00005231 const char *zFile, *zProc;
5232 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00005233 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005234 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00005235 rc = 1;
5236 goto meta_command_exit;
5237 }
drh1e397f82006-06-08 15:28:43 +00005238 zFile = azArg[1];
5239 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00005240 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00005241 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
5242 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005243 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00005244 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00005245 rc = 1;
drh1e397f82006-06-08 15:28:43 +00005246 }
5247 }else
drh70df4fe2006-06-13 15:12:21 +00005248#endif
drh1e397f82006-06-08 15:28:43 +00005249
drhc2ce0be2014-05-29 12:36:14 +00005250 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
5251 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005252 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005253 rc = 1;
5254 }else{
5255 const char *zFile = azArg[1];
5256 output_file_close(p->pLog);
5257 p->pLog = output_file_open(zFile);
5258 }
drh127f9d72010-02-23 01:47:00 +00005259 }else
5260
drhc2ce0be2014-05-29 12:36:14 +00005261 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
5262 const char *zMode = nArg>=2 ? azArg[1] : "";
5263 int n2 = (int)strlen(zMode);
5264 int c2 = zMode[0];
5265 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005266 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00005267 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005268 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005269 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00005270 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005271 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005272 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00005273 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
5274 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005275 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005276 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00005277 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005278 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00005279 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00005280 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005281 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00005282 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00005283 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00005284 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00005285 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005286 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00005287 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00005288 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00005289 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00005290 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00005291 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
5292 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00005293 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
5294 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00005295 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
5296 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00005297 }else {
mistachkinaae280e2015-12-31 19:06:24 +00005298 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00005299 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00005300 rc = 1;
drh75897232000-05-29 14:26:00 +00005301 }
drh700c2522016-02-09 18:39:25 +00005302 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00005303 }else
5304
drhc2ce0be2014-05-29 12:36:14 +00005305 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
5306 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00005307 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
5308 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005309 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005310 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00005311 rc = 1;
5312 }
5313 }else
5314
drh05782482013-10-24 15:20:20 +00005315 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00005316 char *zNewFilename; /* Name of the database file to open */
5317 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00005318 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00005319 /* Close the existing database */
5320 session_close_all(p);
5321 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00005322 p->db = 0;
dan21472212017-03-01 11:30:27 +00005323 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00005324 sqlite3_free(p->zFreeOnClose);
5325 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00005326 /* Check for command-line arguments */
5327 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
5328 const char *z = azArg[iName];
5329 if( optionMatch(z,"new") ){
5330 newFlag = 1;
5331 }else if( z[0]=='-' ){
5332 utf8_printf(stderr, "unknown option: %s\n", z);
5333 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00005334 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00005335 }
drhcd0509e2016-09-16 00:26:08 +00005336 }
5337 /* If a filename is specified, try to open it first */
5338 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
5339 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00005340 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00005341 p->zDbFilename = zNewFilename;
5342 open_db(p, 1);
5343 if( p->db==0 ){
5344 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
5345 sqlite3_free(zNewFilename);
5346 }else{
5347 p->zFreeOnClose = zNewFilename;
5348 }
5349 }
5350 if( p->db==0 ){
5351 /* As a fall-back open a TEMP database */
5352 p->zDbFilename = 0;
5353 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00005354 }
5355 }else
5356
drhc2ce0be2014-05-29 12:36:14 +00005357 if( c=='o'
5358 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
5359 ){
5360 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
5361 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005362 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00005363 rc = 1;
5364 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005365 }
drhc2ce0be2014-05-29 12:36:14 +00005366 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
5367 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005368 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005369 rc = 1;
5370 goto meta_command_exit;
5371 }
5372 p->outCount = 2;
5373 }else{
5374 p->outCount = 0;
5375 }
5376 output_reset(p);
5377 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005378#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005379 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005380 rc = 1;
5381 p->out = stdout;
5382#else
drhc2ce0be2014-05-29 12:36:14 +00005383 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00005384 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005385 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00005386 p->out = stdout;
5387 rc = 1;
5388 }else{
drhc2ce0be2014-05-29 12:36:14 +00005389 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00005390 }
drh8cd5b252015-03-02 22:06:43 +00005391#endif
drh75897232000-05-29 14:26:00 +00005392 }else{
drhc2ce0be2014-05-29 12:36:14 +00005393 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00005394 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00005395 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005396 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00005397 }
drh75897232000-05-29 14:26:00 +00005398 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00005399 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005400 } else {
drhc2ce0be2014-05-29 12:36:14 +00005401 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00005402 }
5403 }
5404 }else
5405
drh078b1fd2012-09-21 13:40:02 +00005406 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
5407 int i;
5408 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00005409 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00005410 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00005411 }
mistachkinaae280e2015-12-31 19:06:24 +00005412 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00005413 }else
5414
drhc2ce0be2014-05-29 12:36:14 +00005415 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00005416 if( nArg >= 2) {
5417 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
5418 }
5419 if( nArg >= 3) {
5420 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
5421 }
5422 }else
5423
drhc2ce0be2014-05-29 12:36:14 +00005424 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00005425 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00005426 }else
5427
drhc2ce0be2014-05-29 12:36:14 +00005428 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
5429 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00005430 if( nArg!=2 ){
5431 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005432 rc = 1;
5433 goto meta_command_exit;
5434 }
drh4e8142c2016-11-11 14:54:22 +00005435 alt = fopen(azArg[1], "rb");
5436 if( alt==0 ){
5437 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
5438 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00005439 }else{
drh4e8142c2016-11-11 14:54:22 +00005440 rc = process_input(p, alt);
5441 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00005442 }
5443 }else
5444
drhc2ce0be2014-05-29 12:36:14 +00005445 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00005446 const char *zSrcFile;
5447 const char *zDb;
5448 sqlite3 *pSrc;
5449 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00005450 int nTimeout = 0;
5451
drh9ff849f2009-02-04 20:55:57 +00005452 if( nArg==2 ){
5453 zSrcFile = azArg[1];
5454 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00005455 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00005456 zSrcFile = azArg[2];
5457 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00005458 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005459 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005460 rc = 1;
5461 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00005462 }
5463 rc = sqlite3_open(zSrcFile, &pSrc);
5464 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005465 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00005466 sqlite3_close(pSrc);
5467 return 1;
5468 }
drh05782482013-10-24 15:20:20 +00005469 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005470 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
5471 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005472 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00005473 sqlite3_close(pSrc);
5474 return 1;
5475 }
drhdc2c4912009-02-04 22:46:47 +00005476 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
5477 || rc==SQLITE_BUSY ){
5478 if( rc==SQLITE_BUSY ){
5479 if( nTimeout++ >= 3 ) break;
5480 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00005481 }
5482 }
5483 sqlite3_backup_finish(pBackup);
5484 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005485 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00005486 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00005487 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00005488 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005489 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005490 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00005491 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005492 }
5493 sqlite3_close(pSrc);
5494 }else
5495
dan8d1edb92014-11-05 09:07:28 +00005496
5497 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
5498 if( nArg==2 ){
5499 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00005500#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00005501 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00005502#endif
dan8d1edb92014-11-05 09:07:28 +00005503 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005504 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00005505 rc = 1;
5506 }
5507 }else
5508
drhc2ce0be2014-05-29 12:36:14 +00005509 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005510 ShellState data;
drh75897232000-05-29 14:26:00 +00005511 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005512 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00005513 memcpy(&data, p, sizeof(data));
5514 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00005515 data.cMode = data.mode = MODE_Semi;
drh4926fec2016-04-13 15:33:42 +00005516 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
5517 data.cMode = data.mode = MODE_Pretty;
5518 nArg--;
5519 if( nArg==2 ) azArg[1] = azArg[2];
5520 }
5521 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00005522 int i;
drhf0693c82011-10-11 20:41:54 +00005523 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00005524 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00005525 char *new_argv[2], *new_colv[2];
5526 new_argv[0] = "CREATE TABLE sqlite_master (\n"
5527 " type text,\n"
5528 " name text,\n"
5529 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00005530 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00005531 " sql text\n"
5532 ")";
5533 new_argv[1] = 0;
5534 new_colv[0] = "sql";
5535 new_colv[1] = 0;
5536 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005537 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00005538 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00005539 char *new_argv[2], *new_colv[2];
5540 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
5541 " type text,\n"
5542 " name text,\n"
5543 " tbl_name text,\n"
5544 " rootpage integer,\n"
5545 " sql text\n"
5546 ")";
5547 new_argv[1] = 0;
5548 new_colv[0] = "sql";
5549 new_colv[1] = 0;
5550 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005551 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00005552 }else{
drhe611f142017-03-08 11:44:00 +00005553 char *zSql;
5554 zSql = sqlite3_mprintf(
drhe0bc4042002-06-25 01:09:11 +00005555 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005556 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005557 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005558 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drhe611f142017-03-08 11:44:00 +00005559 "WHERE lower(tbl_name) LIKE %Q"
drh6ac7a582011-11-04 00:35:56 +00005560 " AND type!='meta' AND sql NOTNULL "
drhe611f142017-03-08 11:44:00 +00005561 "ORDER BY rowid", azArg[1]);
5562 rc = sqlite3_exec(p->db, zSql, callback, &data, &zErrMsg);
5563 sqlite3_free(zSql);
drha18c5682000-10-08 22:20:57 +00005564 }
drhc2ce0be2014-05-29 12:36:14 +00005565 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00005566 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00005567 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005568 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005569 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005570 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005571 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00005572 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00005573 callback, &data, &zErrMsg
5574 );
drhc2ce0be2014-05-29 12:36:14 +00005575 }else{
drh4926fec2016-04-13 15:33:42 +00005576 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00005577 rc = 1;
5578 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005579 }
drh75897232000-05-29 14:26:00 +00005580 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005581 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005582 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005583 rc = 1;
5584 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005585 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00005586 rc = 1;
5587 }else{
5588 rc = 0;
drh75897232000-05-29 14:26:00 +00005589 }
5590 }else
5591
drhabd4c722014-09-20 18:18:33 +00005592#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
5593 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00005594 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00005595 }else
5596#endif
5597
drhe6229612014-08-18 15:08:26 +00005598#if defined(SQLITE_ENABLE_SESSION)
5599 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
5600 OpenSession *pSession = &p->aSession[0];
5601 char **azCmd = &azArg[1];
5602 int iSes = 0;
5603 int nCmd = nArg - 1;
5604 int i;
5605 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00005606 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00005607 if( nArg>=3 ){
5608 for(iSes=0; iSes<p->nSession; iSes++){
5609 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
5610 }
5611 if( iSes<p->nSession ){
5612 pSession = &p->aSession[iSes];
5613 azCmd++;
5614 nCmd--;
5615 }else{
5616 pSession = &p->aSession[0];
5617 iSes = 0;
5618 }
5619 }
5620
drh3a67b042014-08-18 17:56:31 +00005621 /* .session attach TABLE
5622 ** Invoke the sqlite3session_attach() interface to attach a particular
5623 ** table so that it is never filtered.
5624 */
5625 if( strcmp(azCmd[0],"attach")==0 ){
5626 if( nCmd!=2 ) goto session_syntax_error;
5627 if( pSession->p==0 ){
5628 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00005629 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00005630 }else{
5631 rc = sqlite3session_attach(pSession->p, azCmd[1]);
5632 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005633 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005634 rc = 0;
5635 }
5636 }
5637 }else
5638
5639 /* .session changeset FILE
5640 ** .session patchset FILE
5641 ** Write a changeset or patchset into a file. The file is overwritten.
5642 */
5643 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
5644 FILE *out = 0;
5645 if( nCmd!=2 ) goto session_syntax_error;
5646 if( pSession->p==0 ) goto session_not_open;
5647 out = fopen(azCmd[1], "wb");
5648 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005649 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00005650 }else{
5651 int szChng;
5652 void *pChng;
5653 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00005654 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00005655 }else{
drh2967e0c2014-08-19 00:26:17 +00005656 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
5657 }
5658 if( rc ){
5659 printf("Error: error code %d\n", rc);
5660 rc = 0;
drh3a67b042014-08-18 17:56:31 +00005661 }
mistachkin1fe36bb2016-04-04 02:16:44 +00005662 if( pChng
drh3a67b042014-08-18 17:56:31 +00005663 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00005664 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00005665 szChng);
5666 }
5667 sqlite3_free(pChng);
5668 fclose(out);
5669 }
5670 }else
5671
drhe6229612014-08-18 15:08:26 +00005672 /* .session close
5673 ** Close the identified session
5674 */
5675 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00005676 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00005677 if( p->nSession ){
5678 session_close(pSession);
5679 p->aSession[iSes] = p->aSession[--p->nSession];
5680 }
5681 }else
5682
drh03168ca2014-08-18 20:01:31 +00005683 /* .session enable ?BOOLEAN?
5684 ** Query or set the enable flag
5685 */
5686 if( strcmp(azCmd[0], "enable")==0 ){
5687 int ii;
5688 if( nCmd>2 ) goto session_syntax_error;
5689 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5690 if( p->nSession ){
5691 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005692 utf8_printf(p->out, "session %s enable flag = %d\n",
5693 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005694 }
5695 }else
5696
5697 /* .session filter GLOB ....
5698 ** Set a list of GLOB patterns of table names to be excluded.
5699 */
5700 if( strcmp(azCmd[0], "filter")==0 ){
5701 int ii, nByte;
5702 if( nCmd<2 ) goto session_syntax_error;
5703 if( p->nSession ){
5704 for(ii=0; ii<pSession->nFilter; ii++){
5705 sqlite3_free(pSession->azFilter[ii]);
5706 }
5707 sqlite3_free(pSession->azFilter);
5708 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
5709 pSession->azFilter = sqlite3_malloc( nByte );
5710 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005711 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00005712 exit(1);
5713 }
5714 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005715 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00005716 }
5717 pSession->nFilter = ii-1;
5718 }
5719 }else
5720
5721 /* .session indirect ?BOOLEAN?
5722 ** Query or set the indirect flag
5723 */
5724 if( strcmp(azCmd[0], "indirect")==0 ){
5725 int ii;
5726 if( nCmd>2 ) goto session_syntax_error;
5727 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5728 if( p->nSession ){
5729 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005730 utf8_printf(p->out, "session %s indirect flag = %d\n",
5731 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005732 }
5733 }else
5734
5735 /* .session isempty
5736 ** Determine if the session is empty
5737 */
5738 if( strcmp(azCmd[0], "isempty")==0 ){
5739 int ii;
5740 if( nCmd!=1 ) goto session_syntax_error;
5741 if( p->nSession ){
5742 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00005743 utf8_printf(p->out, "session %s isempty flag = %d\n",
5744 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005745 }
5746 }else
5747
drhe6229612014-08-18 15:08:26 +00005748 /* .session list
5749 ** List all currently open sessions
5750 */
5751 if( strcmp(azCmd[0],"list")==0 ){
5752 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00005753 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00005754 }
5755 }else
5756
5757 /* .session open DB NAME
5758 ** Open a new session called NAME on the attached database DB.
5759 ** DB is normally "main".
5760 */
5761 if( strcmp(azCmd[0],"open")==0 ){
5762 char *zName;
5763 if( nCmd!=3 ) goto session_syntax_error;
5764 zName = azCmd[2];
5765 if( zName[0]==0 ) goto session_syntax_error;
5766 for(i=0; i<p->nSession; i++){
5767 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005768 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00005769 goto meta_command_exit;
5770 }
5771 }
5772 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00005773 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00005774 goto meta_command_exit;
5775 }
5776 pSession = &p->aSession[p->nSession];
5777 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
5778 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005779 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005780 rc = 0;
drhe6229612014-08-18 15:08:26 +00005781 goto meta_command_exit;
5782 }
drh03168ca2014-08-18 20:01:31 +00005783 pSession->nFilter = 0;
5784 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00005785 p->nSession++;
5786 pSession->zName = sqlite3_mprintf("%s", zName);
5787 }else
5788 /* If no command name matches, show a syntax error */
5789 session_syntax_error:
5790 session_help(p);
5791 }else
5792#endif
5793
drh340f5822013-06-27 13:01:21 +00005794#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00005795 /* Undocumented commands for internal testing. Subject to change
5796 ** without notice. */
5797 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
5798 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
5799 int i, v;
5800 for(i=1; i<nArg; i++){
5801 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00005802 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00005803 }
5804 }
5805 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
5806 int i; sqlite3_int64 v;
5807 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00005808 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00005809 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00005810 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00005811 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00005812 }
5813 }
5814 }else
drh340f5822013-06-27 13:01:21 +00005815#endif
drh348d19c2013-06-03 12:47:43 +00005816
drhfb546af2017-03-09 22:00:33 +00005817 if( c=='s' && n>=4 && strncmp(azArg[0],"selftest",n)==0 ){
5818 int bIsInit = 0; /* True to initialize the SELFTEST table */
5819 int bVerbose = 0; /* Verbose output */
5820 int bSelftestExists; /* True if SELFTEST already exists */
5821 char **azTest = 0; /* Content of the SELFTEST table */
5822 int nRow = 0; /* Number of rows in the SELFTEST table */
5823 int nCol = 4; /* Number of columns in the SELFTEST table */
5824 int i; /* Loop counter */
5825 int nTest = 0; /* Number of tests runs */
5826 int nErr = 0; /* Number of errors seen */
5827 ShellText str; /* Answer for a query */
5828 static char *azDefaultTest[] = {
5829 0, 0, 0, 0,
5830 "0", "memo", "Missing SELFTEST table - default checks only", "",
5831 "1", "run", "PRAGMA integrity_check", "ok"
5832 };
5833 static const int nDefaultRow = 2;
5834
5835 open_db(p,0);
5836 for(i=1; i<nArg; i++){
5837 const char *z = azArg[i];
5838 if( z[0]=='-' && z[1]=='-' ) z++;
5839 if( strcmp(z,"-init")==0 ){
5840 bIsInit = 1;
5841 }else
5842 if( strcmp(z,"-v")==0 ){
5843 bVerbose++;
5844 }else
5845 {
5846 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
5847 azArg[i], azArg[0]);
5848 raw_printf(stderr, "Should be one of: --init -v\n");
5849 rc = 1;
5850 goto meta_command_exit;
5851 }
5852 }
5853 if( sqlite3_table_column_metadata(p->db,"main","selftest",0,0,0,0,0,0)
5854 != SQLITE_OK ){
5855 bSelftestExists = 0;
5856 }else{
5857 bSelftestExists = 1;
5858 }
5859 if( bIsInit ){
drhfb546af2017-03-09 22:00:33 +00005860 createSelftestTable(p);
5861 bSelftestExists = 1;
5862 }
5863 if( bSelftestExists ){
5864 rc = sqlite3_get_table(p->db,
5865 "SELECT tno,op,cmd,ans FROM selftest ORDER BY tno",
5866 &azTest, &nRow, &nCol, 0);
5867 if( rc ){
5868 raw_printf(stderr, "Error querying the selftest table\n");
5869 rc = 1;
5870 sqlite3_free_table(azTest);
5871 goto meta_command_exit;
5872 }else if( nRow==0 ){
5873 sqlite3_free_table(azTest);
5874 azTest = azDefaultTest;
5875 nRow = nDefaultRow;
5876 }
5877 }else{
5878 azTest = azDefaultTest;
5879 nRow = nDefaultRow;
5880 }
5881 initText(&str);
5882 appendText(&str, "x", 0);
5883 for(i=1; i<=nRow; i++){
5884 int tno = atoi(azTest[i*nCol]);
5885 const char *zOp = azTest[i*nCol+1];
5886 const char *zSql = azTest[i*nCol+2];
5887 const char *zAns = azTest[i*nCol+3];
5888
5889 if( bVerbose>0 ){
5890 char *zQuote = sqlite3_mprintf("%q", zSql);
5891 printf("%d: %s %s\n", tno, zOp, zSql);
5892 sqlite3_free(zQuote);
5893 }
5894 if( strcmp(zOp,"memo")==0 ){
5895 utf8_printf(p->out, "%s\n", zSql);
5896 }else
5897 if( strcmp(zOp,"run")==0 ){
5898 char *zErrMsg = 0;
5899 str.n = 0;
5900 str.z[0] = 0;
5901 rc = sqlite3_exec(p->db, zSql, captureOutputCallback, &str, &zErrMsg);
5902 nTest++;
5903 if( bVerbose ){
5904 utf8_printf(p->out, "Result: %s\n", str.z);
5905 }
5906 if( rc || zErrMsg ){
5907 nErr++;
5908 rc = 1;
5909 utf8_printf(p->out, "%d: error-code-%d: %s\n", tno, rc, zErrMsg);
5910 sqlite3_free(zErrMsg);
5911 }else if( strcmp(zAns,str.z)!=0 ){
5912 nErr++;
5913 rc = 1;
5914 utf8_printf(p->out, "%d: Expected: [%s]\n", tno, zAns);
5915 utf8_printf(p->out, "%d: Got: [%s]\n", tno, str.z);
5916 }
5917 }else
5918 {
5919 utf8_printf(stderr,
5920 "Unknown operation \"%s\" on selftest line %d\n", zOp, tno);
5921 rc = 1;
5922 break;
5923 }
5924 }
5925 freeText(&str);
5926 if( azTest!=azDefaultTest ) sqlite3_free_table(azTest);
5927 utf8_printf(p->out, "%d errors out of %d tests\n", nErr, nTest);
5928 }else
5929
drhc2ce0be2014-05-29 12:36:14 +00005930 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00005931 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005932 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00005933 rc = 1;
5934 }
drh6976c212014-07-24 12:09:47 +00005935 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00005936 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00005937 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00005938 }
5939 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00005940 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
5941 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00005942 }
drh75897232000-05-29 14:26:00 +00005943 }else
5944
drh1554bc82017-03-08 16:10:34 +00005945 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
5946 const char *zLike = 0; /* Which table to checksum. 0 means everything */
5947 int i; /* Loop counter */
5948 int bSchema = 0; /* Also hash the schema */
drh3ee83ef2017-03-08 17:56:54 +00005949 int bSeparate = 0; /* Hash each table separately */
drh1554bc82017-03-08 16:10:34 +00005950 int iSize = 224; /* Hash algorithm to use */
5951 int bDebug = 0; /* Only show the query that would have run */
5952 sqlite3_stmt *pStmt; /* For querying tables names */
5953 char *zSql; /* SQL to be run */
drh3ee83ef2017-03-08 17:56:54 +00005954 char *zSep; /* Separator */
5955 ShellText sSql; /* Complete SQL for the query to run the hash */
drh1554bc82017-03-08 16:10:34 +00005956 ShellText sQuery; /* Set of queries used to read all content */
drhf80d4ff2017-03-08 18:06:20 +00005957 open_db(p, 0);
drh1554bc82017-03-08 16:10:34 +00005958 for(i=1; i<nArg; i++){
5959 const char *z = azArg[i];
5960 if( z[0]=='-' ){
5961 z++;
5962 if( z[0]=='-' ) z++;
5963 if( strcmp(z,"schema")==0 ){
5964 bSchema = 1;
5965 }else
5966 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
5967 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
5968 ){
5969 iSize = atoi(&z[5]);
5970 }else
5971 if( strcmp(z,"debug")==0 ){
5972 bDebug = 1;
5973 }else
5974 {
5975 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
drh3ee83ef2017-03-08 17:56:54 +00005976 azArg[i], azArg[0]);
drh1554bc82017-03-08 16:10:34 +00005977 raw_printf(stderr, "Should be one of: --schema"
5978 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
5979 rc = 1;
5980 goto meta_command_exit;
5981 }
5982 }else if( zLike ){
5983 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
5984 rc = 1;
5985 goto meta_command_exit;
5986 }else{
5987 zLike = z;
drh3ee83ef2017-03-08 17:56:54 +00005988 bSeparate = 1;
5989 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
drh1554bc82017-03-08 16:10:34 +00005990 }
5991 }
5992 if( bSchema ){
5993 zSql = "SELECT lower(name) FROM sqlite_master"
5994 " WHERE type='table' AND coalesce(rootpage,0)>1"
5995 " UNION ALL SELECT 'sqlite_master'"
5996 " ORDER BY 1 collate nocase";
5997 }else{
5998 zSql = "SELECT lower(name) FROM sqlite_master"
5999 " WHERE type='table' AND coalesce(rootpage,0)>1"
6000 " AND name NOT LIKE 'sqlite_%'"
6001 " ORDER BY 1 collate nocase";
6002 }
6003 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6004 initText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00006005 initText(&sSql);
6006 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
6007 zSep = "VALUES(";
drh1554bc82017-03-08 16:10:34 +00006008 while( SQLITE_ROW==sqlite3_step(pStmt) ){
6009 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
6010 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
6011 if( strncmp(zTab, "sqlite_",7)!=0 ){
6012 appendText(&sQuery,"SELECT * FROM ", 0);
6013 appendText(&sQuery,zTab,'"');
6014 appendText(&sQuery," NOT INDEXED;", 0);
6015 }else if( strcmp(zTab, "sqlite_master")==0 ){
6016 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
6017 " ORDER BY name;", 0);
6018 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
6019 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
6020 " ORDER BY name;", 0);
6021 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
6022 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
6023 " ORDER BY tbl,idx;", 0);
6024 }else if( strcmp(zTab, "sqlite_stat3")==0
6025 || strcmp(zTab, "sqlite_stat4")==0 ){
6026 appendText(&sQuery, "SELECT * FROM ", 0);
6027 appendText(&sQuery, zTab, 0);
6028 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
6029 }
drh3ee83ef2017-03-08 17:56:54 +00006030 appendText(&sSql, zSep, 0);
6031 appendText(&sSql, sQuery.z, '\'');
6032 sQuery.n = 0;
6033 appendText(&sSql, ",", 0);
6034 appendText(&sSql, zTab, '\'');
6035 zSep = "),(";
drh1554bc82017-03-08 16:10:34 +00006036 }
6037 sqlite3_finalize(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00006038 if( bSeparate ){
6039 zSql = sqlite3_mprintf(
6040 "%s))"
6041 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
6042 " FROM [sha3sum$query]",
6043 sSql.z, iSize);
6044 }else{
6045 zSql = sqlite3_mprintf(
6046 "%s))"
6047 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
6048 " FROM [sha3sum$query]",
6049 sSql.z, iSize);
6050 }
drh1554bc82017-03-08 16:10:34 +00006051 freeText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00006052 freeText(&sSql);
drh1554bc82017-03-08 16:10:34 +00006053 if( bDebug ){
6054 utf8_printf(p->out, "%s\n", zSql);
6055 }else{
6056 shell_exec(p->db, zSql, shell_callback, p, 0);
6057 }
6058 sqlite3_free(zSql);
6059 }else
6060
drh62cdde52014-05-28 20:22:28 +00006061 if( c=='s'
6062 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00006063 ){
6064 char *zCmd;
drh54027102014-08-06 14:36:53 +00006065 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00006066 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006067 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00006068 rc = 1;
6069 goto meta_command_exit;
6070 }
drhdcb3e3d2014-05-29 03:17:29 +00006071 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00006072 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00006073 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
6074 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00006075 }
drh54027102014-08-06 14:36:53 +00006076 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00006077 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00006078 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00006079 }else
6080
drhc2ce0be2014-05-29 12:36:14 +00006081 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00006082 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00006083 int i;
drhc2ce0be2014-05-29 12:36:14 +00006084 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00006085 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00006086 rc = 1;
6087 goto meta_command_exit;
6088 }
drhe6e1d122017-03-09 13:50:49 +00006089 utf8_printf(p->out, "%12.12s: %s\n","echo",
6090 azBool[ShellHasFlag(p, SHFLG_Echo)]);
drheacd29d2016-04-15 15:03:27 +00006091 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00006092 utf8_printf(p->out, "%12.12s: %s\n","explain",
6093 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00006094 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00006095 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
6096 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00006097 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00006098 raw_printf(p->out, "\n");
6099 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00006100 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00006101 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00006102 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00006103 raw_printf(p->out, "\n");
6104 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00006105 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00006106 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00006107 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00006108 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00006109 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00006110 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00006111 }
mistachkinaae280e2015-12-31 19:06:24 +00006112 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00006113 utf8_printf(p->out, "%12.12s: %s\n", "filename",
6114 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00006115 }else
6116
drhc2ce0be2014-05-29 12:36:14 +00006117 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
6118 if( nArg==2 ){
6119 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00006120 }else if( nArg==1 ){
6121 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006122 }else{
drh34784902016-02-27 17:12:36 +00006123 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00006124 rc = 1;
6125 }
shaneh642d8b82010-07-28 16:05:34 +00006126 }else
6127
drh6a5a4202016-12-24 21:32:40 +00006128 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
6129 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
6130 || strncmp(azArg[0], "indexes", n)==0) )
6131 ){
drh98781232012-04-23 12:38:05 +00006132 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00006133 char **azResult;
drh98781232012-04-23 12:38:05 +00006134 int nRow, nAlloc;
6135 char *zSql = 0;
6136 int ii;
drh05782482013-10-24 15:20:20 +00006137 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00006138 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00006139 if( rc ) return shellDatabaseError(p->db);
6140
6141 /* Create an SQL statement to query for the list of tables in the
6142 ** main and all attached databases where the table name matches the
6143 ** LIKE pattern bound to variable "?1". */
drh6a5a4202016-12-24 21:32:40 +00006144 if( c=='t' ){
6145 zSql = sqlite3_mprintf(
6146 "SELECT name FROM sqlite_master"
6147 " WHERE type IN ('table','view')"
6148 " AND name NOT LIKE 'sqlite_%%'"
6149 " AND name LIKE ?1");
6150 }else if( nArg>2 ){
6151 /* It is an historical accident that the .indexes command shows an error
6152 ** when called with the wrong number of arguments whereas the .tables
6153 ** command does not. */
6154 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
6155 rc = 1;
6156 goto meta_command_exit;
6157 }else{
6158 zSql = sqlite3_mprintf(
6159 "SELECT name FROM sqlite_master"
6160 " WHERE type='index'"
6161 " AND tbl_name LIKE ?1");
6162 }
drha4b81d22016-12-24 18:04:28 +00006163 for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00006164 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drha4b81d22016-12-24 18:04:28 +00006165 if( zDbName==0 || ii==0 ) continue;
drh6a5a4202016-12-24 21:32:40 +00006166 if( c=='t' ){
drh98781232012-04-23 12:38:05 +00006167 zSql = sqlite3_mprintf(
6168 "%z UNION ALL "
6169 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
6170 " WHERE type IN ('table','view')"
6171 " AND name NOT LIKE 'sqlite_%%'"
6172 " AND name LIKE ?1", zSql, zDbName, zDbName);
drh6a5a4202016-12-24 21:32:40 +00006173 }else{
6174 zSql = sqlite3_mprintf(
6175 "%z UNION ALL "
6176 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
6177 " WHERE type='index'"
6178 " AND tbl_name LIKE ?1", zSql, zDbName, zDbName);
drh98781232012-04-23 12:38:05 +00006179 }
drha50da102000-08-08 20:19:09 +00006180 }
dand95bb392015-09-30 11:19:05 +00006181 rc = sqlite3_finalize(pStmt);
6182 if( zSql && rc==SQLITE_OK ){
6183 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
6184 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
6185 }
drh98781232012-04-23 12:38:05 +00006186 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00006187 if( !zSql ) return shellNomemError();
6188 if( rc ) return shellDatabaseError(p->db);
6189
6190 /* Run the SQL statement prepared by the above block. Store the results
6191 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00006192 nRow = nAlloc = 0;
6193 azResult = 0;
6194 if( nArg>1 ){
6195 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00006196 }else{
drh98781232012-04-23 12:38:05 +00006197 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
6198 }
6199 while( sqlite3_step(pStmt)==SQLITE_ROW ){
6200 if( nRow>=nAlloc ){
6201 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00006202 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00006203 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00006204 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00006205 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00006206 break;
6207 }
mistachkin8e189222015-04-19 21:43:16 +00006208 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00006209 azResult = azNew;
6210 }
6211 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00006212 if( 0==azResult[nRow] ){
6213 rc = shellNomemError();
6214 break;
6215 }
6216 nRow++;
drh98781232012-04-23 12:38:05 +00006217 }
dand95bb392015-09-30 11:19:05 +00006218 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
6219 rc = shellDatabaseError(p->db);
6220 }
6221
6222 /* Pretty-print the contents of array azResult[] to the output */
6223 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00006224 int len, maxlen = 0;
6225 int i, j;
6226 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00006227 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00006228 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00006229 if( len>maxlen ) maxlen = len;
6230 }
6231 nPrintCol = 80/(maxlen+2);
6232 if( nPrintCol<1 ) nPrintCol = 1;
6233 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
6234 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00006235 for(j=i; j<nRow; j+=nPrintRow){
6236 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00006237 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
6238 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00006239 }
mistachkinaae280e2015-12-31 19:06:24 +00006240 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00006241 }
6242 }
dand95bb392015-09-30 11:19:05 +00006243
drh98781232012-04-23 12:38:05 +00006244 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
6245 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00006246 }else
6247
drh2db82112016-09-15 21:35:24 +00006248 /* Begin redirecting output to the file "testcase-out.txt" */
6249 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
6250 output_reset(p);
6251 p->out = output_file_open("testcase-out.txt");
6252 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00006253 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00006254 }
drh760c8162016-09-16 02:52:22 +00006255 if( nArg>=2 ){
6256 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
6257 }else{
6258 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
6259 }
drh2db82112016-09-15 21:35:24 +00006260 }else
drh2db82112016-09-15 21:35:24 +00006261
drhd12602a2016-12-07 15:49:02 +00006262#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00006263 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00006264 static const struct {
6265 const char *zCtrlName; /* Name of a test-control option */
6266 int ctrlCode; /* Integer code for that option */
6267 } aCtrl[] = {
6268 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
6269 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
6270 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
6271 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
6272 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
6273 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
6274 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
6275 { "assert", SQLITE_TESTCTRL_ASSERT },
6276 { "always", SQLITE_TESTCTRL_ALWAYS },
6277 { "reserve", SQLITE_TESTCTRL_RESERVE },
6278 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
6279 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00006280 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00006281 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00006282 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00006283 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00006284 };
shaneh96887e12011-02-10 21:08:58 +00006285 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00006286 int rc2 = 0;
6287 int i, n2;
drh05782482013-10-24 15:20:20 +00006288 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00006289
drhd416fe72011-03-17 16:45:50 +00006290 /* convert testctrl text option to value. allow any unique prefix
6291 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00006292 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006293 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00006294 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00006295 if( testctrl<0 ){
6296 testctrl = aCtrl[i].ctrlCode;
6297 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006298 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00006299 testctrl = -1;
6300 break;
6301 }
6302 }
6303 }
drh348d19c2013-06-03 12:47:43 +00006304 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006305 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00006306 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006307 }else{
6308 switch(testctrl){
6309
6310 /* sqlite3_test_control(int, db, int) */
6311 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00006312 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00006313 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006314 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00006315 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006316 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006317 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006318 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006319 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006320 }
6321 break;
6322
6323 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00006324 case SQLITE_TESTCTRL_PRNG_SAVE:
6325 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00006326 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00006327 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00006328 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00006329 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00006330 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006331 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006332 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
6333 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006334 }
6335 break;
6336
6337 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006338 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00006339 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00006340 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006341 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006342 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006343 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006344 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00006345 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006346 }
6347 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00006348
shaneh96887e12011-02-10 21:08:58 +00006349 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006350 case SQLITE_TESTCTRL_ASSERT:
6351 case SQLITE_TESTCTRL_ALWAYS:
6352 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00006353 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006354 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006355 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006356 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006357 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006358 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006359 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006360 }
6361 break;
6362
6363 /* sqlite3_test_control(int, char *) */
6364#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00006365 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00006366 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006367 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00006368 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006369 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006370 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006371 utf8_printf(stderr,
6372 "Error: testctrl %s takes a single char * option\n",
6373 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006374 }
6375 break;
6376#endif
6377
drh1ffede82015-01-30 20:59:27 +00006378 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00006379 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006380 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00006381 azArg[2],
drh8964b342015-01-29 17:54:52 +00006382 integerValue(azArg[3]),
6383 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00006384 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00006385 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006386 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00006387 }
6388 break;
6389
mistachkin1fe36bb2016-04-04 02:16:44 +00006390 case SQLITE_TESTCTRL_BITVEC_TEST:
6391 case SQLITE_TESTCTRL_FAULT_INSTALL:
6392 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
6393 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00006394 default:
mistachkinaae280e2015-12-31 19:06:24 +00006395 utf8_printf(stderr,
6396 "Error: CLI support for testctrl %s not implemented\n",
6397 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006398 break;
6399 }
6400 }
6401 }else
drhf1969722017-02-17 23:52:00 +00006402#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00006403
drhc2ce0be2014-05-29 12:36:14 +00006404 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00006405 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006406 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00006407 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006408
drhc2ce0be2014-05-29 12:36:14 +00006409 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
6410 if( nArg==2 ){
6411 enableTimer = booleanValue(azArg[1]);
6412 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00006413 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00006414 enableTimer = 0;
6415 }
6416 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006417 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006418 rc = 1;
6419 }
shanehe2aa9d72009-11-06 17:20:17 +00006420 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006421
drhc2ce0be2014-05-29 12:36:14 +00006422 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00006423 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006424 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006425 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006426 rc = 1;
6427 goto meta_command_exit;
6428 }
drh657b4a82015-03-19 13:30:41 +00006429 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006430 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00006431#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00006432 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00006433 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00006434 }else{
drh4b363a52016-07-23 20:27:41 +00006435 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006436 }
6437#endif
6438 }else
6439
drhf442e332014-09-10 19:01:14 +00006440#if SQLITE_USER_AUTHENTICATION
6441 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
6442 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006443 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00006444 rc = 1;
6445 goto meta_command_exit;
6446 }
drh7883ecf2014-09-11 16:19:31 +00006447 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00006448 if( strcmp(azArg[1],"login")==0 ){
6449 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00006450 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00006451 rc = 1;
6452 goto meta_command_exit;
6453 }
drhd39c40f2014-09-11 00:27:53 +00006454 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
6455 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00006456 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006457 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00006458 rc = 1;
6459 }
6460 }else if( strcmp(azArg[1],"add")==0 ){
6461 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006462 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006463 rc = 1;
6464 goto meta_command_exit;
6465 }
drhd39c40f2014-09-11 00:27:53 +00006466 rc = sqlite3_user_add(p->db, azArg[2],
6467 azArg[3], (int)strlen(azArg[3]),
6468 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006469 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006470 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006471 rc = 1;
6472 }
6473 }else if( strcmp(azArg[1],"edit")==0 ){
6474 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006475 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006476 rc = 1;
6477 goto meta_command_exit;
6478 }
drhd39c40f2014-09-11 00:27:53 +00006479 rc = sqlite3_user_change(p->db, azArg[2],
6480 azArg[3], (int)strlen(azArg[3]),
6481 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006482 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006483 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006484 rc = 1;
6485 }
6486 }else if( strcmp(azArg[1],"delete")==0 ){
6487 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006488 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00006489 rc = 1;
6490 goto meta_command_exit;
6491 }
6492 rc = sqlite3_user_delete(p->db, azArg[2]);
6493 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006494 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006495 rc = 1;
6496 }
6497 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006498 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00006499 rc = 1;
6500 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00006501 }
drhf442e332014-09-10 19:01:14 +00006502 }else
6503#endif /* SQLITE_USER_AUTHENTICATION */
6504
drh9fd301b2011-06-03 13:28:22 +00006505 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006506 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00006507 sqlite3_libversion(), sqlite3_sourceid());
6508 }else
6509
drh790f2872015-11-28 18:06:36 +00006510 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
6511 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00006512 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00006513 if( p->db ){
6514 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
6515 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00006516 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
6517 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6518 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6519 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00006520 }
6521 }
6522 }else
6523
drhb19e7352016-01-12 19:37:20 +00006524 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
6525 sqlite3_vfs *pVfs;
6526 sqlite3_vfs *pCurrent = 0;
6527 if( p->db ){
6528 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
6529 }
6530 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
6531 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
6532 pVfs==pCurrent ? " <--- CURRENT" : "");
6533 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6534 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6535 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6536 if( pVfs->pNext ){
6537 raw_printf(p->out, "-----------------------------------\n");
6538 }
6539 }
6540 }else
6541
drhde60fc22011-12-14 17:53:36 +00006542 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
6543 const char *zDbName = nArg==2 ? azArg[1] : "main";
6544 char *zVfsName = 0;
6545 if( p->db ){
6546 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
6547 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00006548 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00006549 sqlite3_free(zVfsName);
6550 }
6551 }
6552 }else
6553
drhcef4fc82012-09-21 22:50:45 +00006554#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
6555 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006556 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00006557 }else
6558#endif
6559
drhc2ce0be2014-05-29 12:36:14 +00006560 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00006561 int j;
drh43617e92006-03-06 20:55:46 +00006562 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00006563 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00006564 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00006565 }
6566 }else
6567
6568 {
mistachkinaae280e2015-12-31 19:06:24 +00006569 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00006570 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00006571 rc = 1;
drh75897232000-05-29 14:26:00 +00006572 }
drh67505e72002-04-19 12:34:06 +00006573
drhc2ce0be2014-05-29 12:36:14 +00006574meta_command_exit:
6575 if( p->outCount ){
6576 p->outCount--;
6577 if( p->outCount==0 ) output_reset(p);
6578 }
drh67505e72002-04-19 12:34:06 +00006579 return rc;
drh75897232000-05-29 14:26:00 +00006580}
6581
drh67505e72002-04-19 12:34:06 +00006582/*
drh91a66392007-09-07 01:12:32 +00006583** Return TRUE if a semicolon occurs anywhere in the first N characters
6584** of string z[].
drh324ccef2003-02-05 14:06:20 +00006585*/
drh9f099fd2013-08-06 14:01:46 +00006586static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00006587 int i;
6588 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
6589 return 0;
drh324ccef2003-02-05 14:06:20 +00006590}
6591
6592/*
drh70c7a4b2003-04-26 03:03:06 +00006593** Test to see if a line consists entirely of whitespace.
6594*/
6595static int _all_whitespace(const char *z){
6596 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00006597 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00006598 if( *z=='/' && z[1]=='*' ){
6599 z += 2;
6600 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
6601 if( *z==0 ) return 0;
6602 z++;
6603 continue;
6604 }
6605 if( *z=='-' && z[1]=='-' ){
6606 z += 2;
6607 while( *z && *z!='\n' ){ z++; }
6608 if( *z==0 ) return 1;
6609 continue;
6610 }
6611 return 0;
6612 }
6613 return 1;
6614}
6615
6616/*
drha9b17162003-04-29 18:01:28 +00006617** Return TRUE if the line typed in is an SQL command terminator other
6618** than a semi-colon. The SQL Server style "go" command is understood
6619** as is the Oracle "/".
6620*/
drh9f099fd2013-08-06 14:01:46 +00006621static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00006622 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00006623 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
6624 return 1; /* Oracle */
6625 }
drhf0693c82011-10-11 20:41:54 +00006626 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00006627 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00006628 return 1; /* SQL Server */
6629 }
6630 return 0;
6631}
6632
6633/*
drh233a5312008-12-18 22:25:13 +00006634** Return true if zSql is a complete SQL statement. Return false if it
6635** ends in the middle of a string literal or C-style comment.
6636*/
drh9f099fd2013-08-06 14:01:46 +00006637static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00006638 int rc;
6639 if( zSql==0 ) return 1;
6640 zSql[nSql] = ';';
6641 zSql[nSql+1] = 0;
6642 rc = sqlite3_complete(zSql);
6643 zSql[nSql] = 0;
6644 return rc;
6645}
6646
6647/*
drh4e8142c2016-11-11 14:54:22 +00006648** Run a single line of SQL
6649*/
6650static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
6651 int rc;
6652 char *zErrMsg = 0;
6653
6654 open_db(p, 0);
drhe6e1d122017-03-09 13:50:49 +00006655 if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql);
drh4e8142c2016-11-11 14:54:22 +00006656 BEGIN_TIMER;
6657 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
6658 END_TIMER;
6659 if( rc || zErrMsg ){
6660 char zPrefix[100];
6661 if( in!=0 || !stdin_is_interactive ){
6662 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
6663 "Error: near line %d:", startline);
6664 }else{
6665 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
6666 }
6667 if( zErrMsg!=0 ){
6668 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
6669 sqlite3_free(zErrMsg);
6670 zErrMsg = 0;
6671 }else{
6672 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
6673 }
6674 return 1;
drhe6e1d122017-03-09 13:50:49 +00006675 }else if( ShellHasFlag(p, SHFLG_CountChanges) ){
drh4e8142c2016-11-11 14:54:22 +00006676 raw_printf(p->out, "changes: %3d total_changes: %d\n",
6677 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
6678 }
6679 return 0;
6680}
6681
6682
6683/*
drh67505e72002-04-19 12:34:06 +00006684** Read input from *in and process it. If *in==0 then input
6685** is interactive - the user is typing it it. Otherwise, input
6686** is coming from a file or device. A prompt is issued and history
6687** is saved only if input is interactive. An interrupt signal will
6688** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00006689**
6690** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00006691*/
drhdcd87a92014-08-18 13:45:42 +00006692static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00006693 char *zLine = 0; /* A single input line */
6694 char *zSql = 0; /* Accumulated SQL text */
6695 int nLine; /* Length of current line */
6696 int nSql = 0; /* Bytes of zSql[] used */
6697 int nAlloc = 0; /* Allocated zSql[] space */
6698 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00006699 int rc; /* Error code */
6700 int errCnt = 0; /* Number of errors seen */
6701 int lineno = 0; /* Current line number */
6702 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00006703
6704 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
6705 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00006706 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00006707 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00006708 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00006709 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00006710 break;
drhc49f44e2006-10-26 18:15:42 +00006711 }
drh67505e72002-04-19 12:34:06 +00006712 if( seenInterrupt ){
6713 if( in!=0 ) break;
6714 seenInterrupt = 0;
6715 }
drhc28490c2006-10-26 14:25:58 +00006716 lineno++;
drh849a9d92013-12-21 15:46:06 +00006717 if( nSql==0 && _all_whitespace(zLine) ){
drhe6e1d122017-03-09 13:50:49 +00006718 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drh849a9d92013-12-21 15:46:06 +00006719 continue;
6720 }
drh2af0b2d2002-02-21 02:25:02 +00006721 if( zLine && zLine[0]=='.' && nSql==0 ){
drhe6e1d122017-03-09 13:50:49 +00006722 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00006723 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00006724 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00006725 break;
6726 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00006727 errCnt++;
6728 }
drhdaffd0e2001-04-11 14:28:42 +00006729 continue;
6730 }
drh9f099fd2013-08-06 14:01:46 +00006731 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00006732 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00006733 }
drh9f099fd2013-08-06 14:01:46 +00006734 nLine = strlen30(zLine);
6735 if( nSql+nLine+2>=nAlloc ){
6736 nAlloc = nSql+nLine+100;
6737 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00006738 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006739 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00006740 exit(1);
6741 }
drhdaffd0e2001-04-11 14:28:42 +00006742 }
drh9f099fd2013-08-06 14:01:46 +00006743 nSqlPrior = nSql;
6744 if( nSql==0 ){
6745 int i;
6746 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00006747 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00006748 memcpy(zSql, zLine+i, nLine+1-i);
6749 startline = lineno;
6750 nSql = nLine-i;
6751 }else{
6752 zSql[nSql++] = '\n';
6753 memcpy(zSql+nSql, zLine, nLine+1);
6754 nSql += nLine;
6755 }
6756 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00006757 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00006758 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006759 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00006760 if( p->outCount ){
6761 output_reset(p);
6762 p->outCount = 0;
6763 }
drh9f099fd2013-08-06 14:01:46 +00006764 }else if( nSql && _all_whitespace(zSql) ){
drhe6e1d122017-03-09 13:50:49 +00006765 if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00006766 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00006767 }
6768 }
drh4e8142c2016-11-11 14:54:22 +00006769 if( nSql && !_all_whitespace(zSql) ){
6770 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006771 }
drh1f9ca2c2015-08-25 16:57:52 +00006772 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00006773 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00006774 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00006775}
6776
drh67505e72002-04-19 12:34:06 +00006777/*
6778** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00006779** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00006780*/
drhd1459152016-09-16 19:11:03 +00006781static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00006782 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00006783 if( clearFlag ){
6784 free(home_dir);
6785 home_dir = 0;
6786 return 0;
6787 }
drh85e72432012-04-11 11:38:53 +00006788 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00006789
drh4ace5362014-11-10 14:42:28 +00006790#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
6791 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00006792 {
6793 struct passwd *pwent;
6794 uid_t uid = getuid();
6795 if( (pwent=getpwuid(uid)) != NULL) {
6796 home_dir = pwent->pw_dir;
6797 }
drh67505e72002-04-19 12:34:06 +00006798 }
6799#endif
6800
chw65d3c132007-11-12 21:09:10 +00006801#if defined(_WIN32_WCE)
6802 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
6803 */
drh85e72432012-04-11 11:38:53 +00006804 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00006805#else
6806
drh83905c92012-06-21 13:00:37 +00006807#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00006808 if (!home_dir) {
6809 home_dir = getenv("USERPROFILE");
6810 }
6811#endif
6812
drh67505e72002-04-19 12:34:06 +00006813 if (!home_dir) {
6814 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00006815 }
6816
drh83905c92012-06-21 13:00:37 +00006817#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00006818 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00006819 char *zDrive, *zPath;
6820 int n;
6821 zDrive = getenv("HOMEDRIVE");
6822 zPath = getenv("HOMEPATH");
6823 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00006824 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00006825 home_dir = malloc( n );
6826 if( home_dir==0 ) return 0;
6827 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
6828 return home_dir;
6829 }
6830 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00006831 }
6832#endif
6833
chw65d3c132007-11-12 21:09:10 +00006834#endif /* !_WIN32_WCE */
6835
drh67505e72002-04-19 12:34:06 +00006836 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00006837 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00006838 char *z = malloc( n );
6839 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00006840 home_dir = z;
6841 }
drhe98d4fa2002-04-21 19:06:22 +00006842
drh67505e72002-04-19 12:34:06 +00006843 return home_dir;
6844}
6845
6846/*
6847** Read input from the file given by sqliterc_override. Or if that
6848** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00006849**
6850** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00006851*/
drh534f4df2015-02-28 14:03:35 +00006852static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00006853 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00006854 const char *sqliterc_override /* Name of config file. NULL to use default */
6855){
persicom7e2dfdd2002-04-18 02:46:52 +00006856 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00006857 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00006858 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00006859 FILE *in = NULL;
6860
6861 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00006862 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00006863 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006864 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00006865 " cannot read ~/.sqliterc\n");
6866 return;
drhe98d4fa2002-04-21 19:06:22 +00006867 }
drh2f3de322012-06-27 16:41:31 +00006868 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00006869 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
6870 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00006871 }
drha1f9b5e2004-02-14 16:31:02 +00006872 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00006873 if( in ){
drhc28490c2006-10-26 14:25:58 +00006874 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00006875 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00006876 }
drh534f4df2015-02-28 14:03:35 +00006877 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00006878 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00006879 }
drh85e72432012-04-11 11:38:53 +00006880 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00006881}
6882
drh67505e72002-04-19 12:34:06 +00006883/*
drhe1e38c42003-05-04 18:30:59 +00006884** Show available command line options
6885*/
mistachkin1fe36bb2016-04-04 02:16:44 +00006886static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00006887 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00006888 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00006889 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006890 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00006891 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00006892 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00006893 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00006894 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00006895 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00006896#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6897 " -heap SIZE Size of heap for memsys3 or memsys5\n"
6898#endif
drhcc3b4f82012-02-07 14:13:50 +00006899 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00006900 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00006901 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006902 " -line set output mode to 'line'\n"
6903 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00006904 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00006905 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00006906#ifdef SQLITE_ENABLE_MULTIPLEX
6907 " -multiplex enable the multiplexor VFS\n"
6908#endif
mistachkine0d68852014-12-11 03:12:33 +00006909 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00006910 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00006911 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
6912 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00006913 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00006914 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00006915 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00006916 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00006917#ifdef SQLITE_ENABLE_VFSTRACE
6918 " -vfstrace enable tracing of all VFS calls\n"
6919#endif
drhe1e38c42003-05-04 18:30:59 +00006920;
6921static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00006922 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00006923 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00006924 "FILENAME is the name of an SQLite database. A new database is created\n"
6925 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00006926 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00006927 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00006928 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006929 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00006930 }
6931 exit(1);
6932}
6933
6934/*
drh67505e72002-04-19 12:34:06 +00006935** Initialize the state information in data
6936*/
drhdcd87a92014-08-18 13:45:42 +00006937static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00006938 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00006939 data->normalMode = data->cMode = data->mode = MODE_List;
6940 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00006941 memcpy(data->colSeparator,SEP_Column, 2);
6942 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00006943 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00006944 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00006945 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00006946 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00006947 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00006948 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
6949 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00006950}
6951
drh98d312f2012-10-25 15:23:14 +00006952/*
drh5c7976f2014-02-10 19:59:27 +00006953** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00006954*/
6955#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00006956static void printBold(const char *zText){
6957 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
6958 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
6959 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
6960 SetConsoleTextAttribute(out,
6961 FOREGROUND_RED|FOREGROUND_INTENSITY
6962 );
6963 printf("%s", zText);
6964 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00006965}
6966#else
drh5c7976f2014-02-10 19:59:27 +00006967static void printBold(const char *zText){
6968 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00006969}
6970#endif
6971
6972/*
drh98d312f2012-10-25 15:23:14 +00006973** Get the argument to an --option. Throw an error and die if no argument
6974** is available.
6975*/
6976static char *cmdline_option_value(int argc, char **argv, int i){
6977 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00006978 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00006979 argv[0], argv[argc-1]);
6980 exit(1);
6981 }
6982 return argv[i];
6983}
6984
mistachkin1fe36bb2016-04-04 02:16:44 +00006985#ifndef SQLITE_SHELL_IS_UTF8
6986# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
6987# define SQLITE_SHELL_IS_UTF8 (0)
6988# else
6989# define SQLITE_SHELL_IS_UTF8 (1)
6990# endif
6991#endif
6992
6993#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00006994int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00006995#else
6996int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00006997 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00006998#endif
drh75897232000-05-29 14:26:00 +00006999 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00007000 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00007001 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00007002 int i;
drhc28490c2006-10-26 14:25:58 +00007003 int rc = 0;
drhb3735912014-02-10 16:13:42 +00007004 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00007005 int readStdin = 1;
7006 int nCmd = 0;
7007 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00007008
mistachkin1fe36bb2016-04-04 02:16:44 +00007009 setBinaryMode(stdin, 0);
7010 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00007011 stdin_is_interactive = isatty(0);
7012 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00007013
drh69b30ab2014-02-27 15:11:52 +00007014#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00007015 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007016 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00007017 sqlite3_sourceid(), SQLITE_SOURCE_ID);
7018 exit(1);
7019 }
drhc7181902014-02-27 15:04:13 +00007020#endif
persicom7e2dfdd2002-04-18 02:46:52 +00007021 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00007022#if !SQLITE_SHELL_IS_UTF8
7023 sqlite3_initialize();
7024 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
7025 if( argv==0 ){
7026 raw_printf(stderr, "out of memory\n");
7027 exit(1);
7028 }
7029 for(i=0; i<argc; i++){
7030 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
7031 if( argv[i]==0 ){
7032 raw_printf(stderr, "out of memory\n");
7033 exit(1);
7034 }
7035 }
7036#endif
mistachkin1810f222016-04-04 02:33:34 +00007037 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00007038 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00007039
drh44c2eb12003-04-30 11:38:26 +00007040 /* Make sure we have a valid signal handler early, before anything
7041 ** else is done.
7042 */
drh4c504392000-10-16 22:06:40 +00007043#ifdef SIGINT
7044 signal(SIGINT, interrupt_handler);
7045#endif
drh44c2eb12003-04-30 11:38:26 +00007046
drhac5649a2014-11-28 13:35:03 +00007047#ifdef SQLITE_SHELL_DBNAME_PROC
7048 {
7049 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
7050 ** of a C-function that will provide the name of the database file. Use
7051 ** this compile-time option to embed this shell program in larger
7052 ** applications. */
7053 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
7054 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
7055 warnInmemoryDb = 0;
7056 }
7057#endif
7058
drh22fbcb82004-02-01 01:22:50 +00007059 /* Do an initial pass through the command-line argument to locate
7060 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00007061 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00007062 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00007063 */
drh98d312f2012-10-25 15:23:14 +00007064 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00007065 char *z;
drhc28490c2006-10-26 14:25:58 +00007066 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00007067 if( z[0]!='-' ){
7068 if( data.zDbFilename==0 ){
7069 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00007070 }else{
7071 /* Excesss arguments are interpreted as SQL (or dot-commands) and
7072 ** mean that nothing is read from stdin */
7073 readStdin = 0;
7074 nCmd++;
7075 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
7076 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007077 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00007078 exit(1);
7079 }
7080 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00007081 }
drh98d312f2012-10-25 15:23:14 +00007082 }
drhcc3b4f82012-02-07 14:13:50 +00007083 if( z[1]=='-' ) z++;
7084 if( strcmp(z,"-separator")==0
7085 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00007086 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00007087 || strcmp(z,"-cmd")==0
7088 ){
drh98d312f2012-10-25 15:23:14 +00007089 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00007090 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00007091 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00007092 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00007093 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00007094 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00007095 ** we do the actual processing of arguments later in a second pass.
7096 */
shanef69573d2009-10-24 02:06:14 +00007097 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00007098 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00007099#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00007100 const char *zSize;
7101 sqlite3_int64 szHeap;
7102
drh98d312f2012-10-25 15:23:14 +00007103 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00007104 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00007105 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00007106 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00007107#else
7108 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00007109#endif
drh44dec872014-08-30 15:49:25 +00007110 }else if( strcmp(z,"-scratch")==0 ){
7111 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007112 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007113 if( sz>400000 ) sz = 400000;
7114 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00007115 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007116 if( n>10 ) n = 10;
7117 if( n<1 ) n = 1;
7118 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
7119 data.shellFlgs |= SHFLG_Scratch;
7120 }else if( strcmp(z,"-pagecache")==0 ){
7121 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007122 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007123 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00007124 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00007125 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00007126 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
7127 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00007128 data.shellFlgs |= SHFLG_Pagecache;
7129 }else if( strcmp(z,"-lookaside")==0 ){
7130 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00007131 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007132 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00007133 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00007134 if( n<0 ) n = 0;
7135 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
7136 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00007137#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00007138 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00007139 extern int vfstrace_register(
7140 const char *zTraceName,
7141 const char *zOldVfsName,
7142 int (*xOut)(const char*,void*),
7143 void *pOutArg,
7144 int makeDefault
7145 );
drh2b625e22011-03-16 17:05:28 +00007146 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00007147#endif
drh6f25e892011-07-08 17:02:57 +00007148#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00007149 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00007150 extern int sqlite3_multiple_initialize(const char*,int);
7151 sqlite3_multiplex_initialize(0, 1);
7152#endif
drh7d9f3942013-04-03 01:26:54 +00007153 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00007154 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
7155 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00007156 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00007157 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00007158 if( pVfs ){
7159 sqlite3_vfs_register(pVfs, 1);
7160 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007161 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00007162 exit(1);
7163 }
drh44c2eb12003-04-30 11:38:26 +00007164 }
7165 }
drh98d312f2012-10-25 15:23:14 +00007166 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00007167#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00007168 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00007169 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00007170#else
mistachkinaae280e2015-12-31 19:06:24 +00007171 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00007172 return 1;
drh01b41712005-08-29 23:06:23 +00007173#endif
drh98d312f2012-10-25 15:23:14 +00007174 }
7175 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00007176
drh44c2eb12003-04-30 11:38:26 +00007177 /* Go ahead and open the database file if it already exists. If the
7178 ** file does not exist, delay opening it. This prevents empty database
7179 ** files from being created if a user mistypes the database name argument
7180 ** to the sqlite command-line tool.
7181 */
drhc8d74412004-08-31 23:41:26 +00007182 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00007183 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00007184 }
7185
drh22fbcb82004-02-01 01:22:50 +00007186 /* Process the initialization file if there is one. If no -init option
7187 ** is given on the command line, look for a file named ~/.sqliterc and
7188 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00007189 */
drh534f4df2015-02-28 14:03:35 +00007190 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00007191
drh22fbcb82004-02-01 01:22:50 +00007192 /* Make a second pass through the command-line argument and set
7193 ** options. This second pass is delayed until after the initialization
7194 ** file is processed so that the command-line arguments will override
7195 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00007196 */
drh98d312f2012-10-25 15:23:14 +00007197 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00007198 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00007199 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00007200 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00007201 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00007202 i++;
7203 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007204 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00007205 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007206 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00007207 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007208 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00007209 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00007210 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00007211 }else if( strcmp(z,"-csv")==0 ){
7212 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00007213 memcpy(data.colSeparator,",",2);
7214 }else if( strcmp(z,"-ascii")==0 ){
7215 data.mode = MODE_Ascii;
7216 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00007217 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00007218 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00007219 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00007220 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00007221 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00007222 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00007223 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00007224 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00007225 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00007226 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00007227 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00007228 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00007229 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007230 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00007231 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00007232 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00007233 }else if( strcmp(z,"-echo")==0 ){
drhe6e1d122017-03-09 13:50:49 +00007234 ShellSetFlag(&data, SHFLG_Echo);
drhefbf3b12014-02-28 20:47:24 +00007235 }else if( strcmp(z,"-eqp")==0 ){
7236 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00007237 }else if( strcmp(z,"-eqpfull")==0 ){
7238 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00007239 }else if( strcmp(z,"-stats")==0 ){
7240 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00007241 }else if( strcmp(z,"-scanstats")==0 ){
7242 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00007243 }else if( strcmp(z,"-backslash")==0 ){
7244 /* Undocumented command-line option: -backslash
7245 ** Causes C-style backslash escapes to be evaluated in SQL statements
7246 ** prior to sending the SQL into SQLite. Useful for injecting
7247 ** crazy bytes in the middle of SQL statements for testing and debugging.
7248 */
drhe6e1d122017-03-09 13:50:49 +00007249 ShellSetFlag(&data, SHFLG_Backslash);
drhc49f44e2006-10-26 18:15:42 +00007250 }else if( strcmp(z,"-bail")==0 ){
7251 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00007252 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00007253 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00007254 return 0;
drhc28490c2006-10-26 14:25:58 +00007255 }else if( strcmp(z,"-interactive")==0 ){
7256 stdin_is_interactive = 1;
7257 }else if( strcmp(z,"-batch")==0 ){
7258 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00007259 }else if( strcmp(z,"-heap")==0 ){
7260 i++;
drh44dec872014-08-30 15:49:25 +00007261 }else if( strcmp(z,"-scratch")==0 ){
7262 i+=2;
7263 }else if( strcmp(z,"-pagecache")==0 ){
7264 i+=2;
7265 }else if( strcmp(z,"-lookaside")==0 ){
7266 i+=2;
drh7d9f3942013-04-03 01:26:54 +00007267 }else if( strcmp(z,"-mmap")==0 ){
7268 i++;
drha7e61d82011-03-12 17:02:57 +00007269 }else if( strcmp(z,"-vfs")==0 ){
7270 i++;
drh6f25e892011-07-08 17:02:57 +00007271#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00007272 }else if( strcmp(z,"-vfstrace")==0 ){
7273 i++;
drh6f25e892011-07-08 17:02:57 +00007274#endif
7275#ifdef SQLITE_ENABLE_MULTIPLEX
7276 }else if( strcmp(z,"-multiplex")==0 ){
7277 i++;
7278#endif
drhcc3b4f82012-02-07 14:13:50 +00007279 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00007280 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00007281 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00007282 /* Run commands that follow -cmd first and separately from commands
7283 ** that simply appear on the command-line. This seems goofy. It would
7284 ** be better if all commands ran in the order that they appear. But
7285 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00007286 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00007287 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00007288 if( z[0]=='.' ){
7289 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00007290 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00007291 }else{
drh05782482013-10-24 15:20:20 +00007292 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00007293 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
7294 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007295 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00007296 if( bail_on_error ) return rc!=0 ? rc : 1;
7297 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007298 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00007299 if( bail_on_error ) return rc;
7300 }
7301 }
drh1e5d0e92000-05-31 23:33:17 +00007302 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007303 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
7304 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00007305 return 1;
7306 }
drh700c2522016-02-09 18:39:25 +00007307 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00007308 }
drh44c2eb12003-04-30 11:38:26 +00007309
drhac5649a2014-11-28 13:35:03 +00007310 if( !readStdin ){
7311 /* Run all arguments that do not begin with '-' as if they were separate
7312 ** command-line inputs, except for the argToSkip argument which contains
7313 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00007314 */
drhac5649a2014-11-28 13:35:03 +00007315 for(i=0; i<nCmd; i++){
7316 if( azCmd[i][0]=='.' ){
7317 rc = do_meta_command(azCmd[i], &data);
7318 if( rc ) return rc==2 ? 0 : rc;
7319 }else{
7320 open_db(&data, 0);
7321 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
7322 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007323 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00007324 return rc!=0 ? rc : 1;
7325 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007326 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00007327 return rc;
7328 }
drh6ff13852001-11-25 13:18:23 +00007329 }
drh75897232000-05-29 14:26:00 +00007330 }
drhac5649a2014-11-28 13:35:03 +00007331 free(azCmd);
drh75897232000-05-29 14:26:00 +00007332 }else{
drh44c2eb12003-04-30 11:38:26 +00007333 /* Run commands received from standard input
7334 */
drhc28490c2006-10-26 14:25:58 +00007335 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00007336 char *zHome;
7337 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00007338 int nHistory;
drh75897232000-05-29 14:26:00 +00007339 printf(
drh743e0032011-12-12 16:51:50 +00007340 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00007341 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00007342 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00007343 );
drhb3735912014-02-10 16:13:42 +00007344 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00007345 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00007346 printBold("transient in-memory database");
7347 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00007348 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00007349 }
drhd1459152016-09-16 19:11:03 +00007350 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00007351 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00007352 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00007353 if( (zHistory = malloc(nHistory))!=0 ){
7354 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
7355 }
drh67505e72002-04-19 12:34:06 +00007356 }
drhf5ed7ad2015-06-15 14:43:25 +00007357 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00007358 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00007359 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00007360 shell_stifle_history(100);
7361 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00007362 free(zHistory);
drh67505e72002-04-19 12:34:06 +00007363 }
drhdaffd0e2001-04-11 14:28:42 +00007364 }else{
drhc28490c2006-10-26 14:25:58 +00007365 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00007366 }
7367 }
drh33048c02001-10-01 14:29:22 +00007368 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00007369 if( data.db ){
drhe6229612014-08-18 15:08:26 +00007370 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00007371 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00007372 }
mistachkin1fe36bb2016-04-04 02:16:44 +00007373 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00007374 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00007375#if !SQLITE_SHELL_IS_UTF8
7376 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
7377 sqlite3_free(argv);
7378#endif
drhc28490c2006-10-26 14:25:58 +00007379 return rc;
drh75897232000-05-29 14:26:00 +00007380}