blob: 06cf36ccccda6746c6e42e814bc10496e4a4f825 [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);
1263 n = (int)strlen(z);
1264 hash_step_vformat(&cx,"S%d:",n);
1265 SHA3Update(&cx,(unsigned char*)z,n);
1266
1267 /* Compute a hash over the result of the query */
1268 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1269 SHA3Update(&cx,(const unsigned char*)"R",1);
1270 for(i=0; i<nCol; i++){
1271 switch( sqlite3_column_type(pStmt,i) ){
1272 case SQLITE_NULL: {
1273 SHA3Update(&cx, (const unsigned char*)"N",1);
1274 break;
1275 }
1276 case SQLITE_INTEGER: {
1277 sqlite3_uint64 u;
1278 int j;
1279 unsigned char x[9];
1280 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1281 memcpy(&u, &v, 8);
1282 for(j=8; j>=1; j--){
1283 x[j] = u & 0xff;
1284 u >>= 8;
1285 }
1286 x[0] = 'I';
1287 SHA3Update(&cx, x, 9);
1288 break;
1289 }
1290 case SQLITE_FLOAT: {
1291 sqlite3_uint64 u;
1292 int j;
1293 unsigned char x[9];
1294 double r = sqlite3_column_double(pStmt,i);
1295 memcpy(&u, &r, 8);
1296 for(j=8; j>=1; j--){
1297 x[j] = u & 0xff;
1298 u >>= 8;
1299 }
1300 x[0] = 'F';
1301 SHA3Update(&cx,x,9);
1302 break;
1303 }
1304 case SQLITE_TEXT: {
1305 int n2 = sqlite3_column_bytes(pStmt, i);
1306 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1307 hash_step_vformat(&cx,"T%d:",n2);
1308 SHA3Update(&cx, z2, n2);
1309 break;
1310 }
1311 case SQLITE_BLOB: {
1312 int n2 = sqlite3_column_bytes(pStmt, i);
1313 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1314 hash_step_vformat(&cx,"B%d:",n2);
1315 SHA3Update(&cx, z2, n2);
1316 break;
1317 }
1318 }
1319 }
1320 }
1321 sqlite3_finalize(pStmt);
1322 }
1323 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1324}
1325/* End of SHA3 hashing logic copy/pasted from ../ext/misc/shathree.c
1326********************************************************************************/
1327
drhe6229612014-08-18 15:08:26 +00001328#if defined(SQLITE_ENABLE_SESSION)
1329/*
1330** State information for a single open session
1331*/
1332typedef struct OpenSession OpenSession;
1333struct OpenSession {
1334 char *zName; /* Symbolic name for this session */
1335 int nFilter; /* Number of xFilter rejection GLOB patterns */
1336 char **azFilter; /* Array of xFilter rejection GLOB patterns */
1337 sqlite3_session *p; /* The open session */
1338};
1339#endif
1340
drhdcd87a92014-08-18 13:45:42 +00001341/*
mistachkin1fe36bb2016-04-04 02:16:44 +00001342** Shell output mode information from before ".explain on",
drhdcd87a92014-08-18 13:45:42 +00001343** saved so that it can be restored by ".explain off"
1344*/
1345typedef struct SavedModeInfo SavedModeInfo;
1346struct SavedModeInfo {
1347 int valid; /* Is there legit data in here? */
1348 int mode; /* Mode prior to ".explain on" */
1349 int showHeader; /* The ".header" setting prior to ".explain on" */
1350 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +00001351};
drh45e29d82006-11-20 16:21:10 +00001352
drh8e7e7a22000-05-30 18:45:23 +00001353/*
drhdcd87a92014-08-18 13:45:42 +00001354** State information about the database connection is contained in an
1355** instance of the following structure.
drh75897232000-05-29 14:26:00 +00001356*/
drhdcd87a92014-08-18 13:45:42 +00001357typedef struct ShellState ShellState;
1358struct ShellState {
shane626a6e42009-10-22 17:30:15 +00001359 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +00001360 int echoOn; /* True to echo input commands */
drh700c2522016-02-09 18:39:25 +00001361 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +00001362 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +00001363 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +00001364 int scanstatsOn; /* True to display scan stats before each finalize */
drhdf12f1c2015-12-07 21:46:19 +00001365 int countChanges; /* True to display change counts */
drh9569f602015-04-16 15:05:04 +00001366 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +00001367 int outCount; /* Revert to stdout when reaching zero */
drhe611f142017-03-08 11:44:00 +00001368 int preserveRowid; /* Preserver ROWID values on a ".dump" command */
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*/
1406#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
1407#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
1408#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
1409
1410/*
drh75897232000-05-29 14:26:00 +00001411** These are the allowed modes.
1412*/
drh967e8b72000-06-21 13:59:10 +00001413#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00001414#define MODE_Column 1 /* One record per line in neat columns */
1415#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00001416#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1417#define MODE_Html 4 /* Generate an XHTML table */
1418#define MODE_Insert 5 /* Generate SQL "insert" statements */
drh41f5f6e2016-10-21 17:39:30 +00001419#define MODE_Quote 6 /* Quote values as for SQL */
1420#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1421#define MODE_Csv 8 /* Quote strings, numbers are plain */
1422#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1423#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1424#define MODE_Pretty 11 /* Pretty-print schemas */
persicom7e2dfdd2002-04-18 02:46:52 +00001425
drh66ce4d02008-02-15 17:38:06 +00001426static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00001427 "line",
1428 "column",
1429 "list",
1430 "semi",
1431 "html",
drhfeac5f82004-08-01 00:10:45 +00001432 "insert",
drh41f5f6e2016-10-21 17:39:30 +00001433 "quote",
drhfeac5f82004-08-01 00:10:45 +00001434 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00001435 "csv",
drh66ce4d02008-02-15 17:38:06 +00001436 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +00001437 "ascii",
drh4926fec2016-04-13 15:33:42 +00001438 "prettyprint",
persicom7e2dfdd2002-04-18 02:46:52 +00001439};
drh75897232000-05-29 14:26:00 +00001440
1441/*
mistachkinfad42082014-07-24 22:13:12 +00001442** These are the column/row/line separators used by the various
1443** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +00001444*/
mistachkinfad42082014-07-24 22:13:12 +00001445#define SEP_Column "|"
1446#define SEP_Row "\n"
1447#define SEP_Tab "\t"
1448#define SEP_Space " "
1449#define SEP_Comma ","
1450#define SEP_CrLf "\r\n"
1451#define SEP_Unit "\x1F"
1452#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +00001453
1454/*
drh75897232000-05-29 14:26:00 +00001455** Number of elements in an array
1456*/
drh902b9ee2008-12-05 17:17:07 +00001457#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00001458
1459/*
drh127f9d72010-02-23 01:47:00 +00001460** A callback for the sqlite3_log() interface.
1461*/
1462static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +00001463 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +00001464 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +00001465 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +00001466 fflush(p->pLog);
1467}
1468
1469/*
shane626a6e42009-10-22 17:30:15 +00001470** Output the given string as a hex-encoded blob (eg. X'1234' )
1471*/
1472static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1473 int i;
1474 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +00001475 raw_printf(out,"X'");
1476 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1477 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +00001478}
1479
1480/*
drh28bd4bc2000-06-15 15:57:22 +00001481** Output the given string as a quoted string using SQL quoting conventions.
1482*/
1483static void output_quoted_string(FILE *out, const char *z){
1484 int i;
1485 int nSingle = 0;
mistachkin1fe36bb2016-04-04 02:16:44 +00001486 setBinaryMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001487 for(i=0; z[i]; i++){
1488 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +00001489 }
1490 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +00001491 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00001492 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001493 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001494 while( *z ){
1495 for(i=0; z[i] && z[i]!='\''; i++){}
1496 if( i==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001497 raw_printf(out,"''");
drh28bd4bc2000-06-15 15:57:22 +00001498 z++;
1499 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +00001500 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +00001501 z += i+1;
1502 }else{
drhe05461c2015-12-30 13:36:57 +00001503 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +00001504 break;
1505 }
1506 }
mistachkinaae280e2015-12-31 19:06:24 +00001507 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001508 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001509 setTextMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001510}
1511
1512/*
drhfeac5f82004-08-01 00:10:45 +00001513** Output the given string as a quoted according to C or TCL quoting rules.
1514*/
1515static void output_c_string(FILE *out, const char *z){
1516 unsigned int c;
1517 fputc('"', out);
1518 while( (c = *(z++))!=0 ){
1519 if( c=='\\' ){
1520 fputc(c, out);
1521 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +00001522 }else if( c=='"' ){
1523 fputc('\\', out);
1524 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +00001525 }else if( c=='\t' ){
1526 fputc('\\', out);
1527 fputc('t', out);
1528 }else if( c=='\n' ){
1529 fputc('\\', out);
1530 fputc('n', out);
1531 }else if( c=='\r' ){
1532 fputc('\\', out);
1533 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +00001534 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +00001535 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00001536 }else{
1537 fputc(c, out);
1538 }
1539 }
1540 fputc('"', out);
1541}
1542
1543/*
drhc08a4f12000-06-15 16:49:48 +00001544** Output the given string with characters that are special to
1545** HTML escaped.
1546*/
1547static void output_html_string(FILE *out, const char *z){
1548 int i;
drhc3d6ba42014-01-13 20:38:35 +00001549 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +00001550 while( *z ){
mistachkin1fe36bb2016-04-04 02:16:44 +00001551 for(i=0; z[i]
1552 && z[i]!='<'
1553 && z[i]!='&'
1554 && z[i]!='>'
1555 && z[i]!='\"'
shane43d9cb22009-10-21 14:11:48 +00001556 && z[i]!='\'';
1557 i++){}
drhc08a4f12000-06-15 16:49:48 +00001558 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +00001559 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +00001560 }
1561 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +00001562 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +00001563 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +00001564 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +00001565 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +00001566 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +00001567 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +00001568 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +00001569 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +00001570 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +00001571 }else{
1572 break;
1573 }
1574 z += i + 1;
1575 }
1576}
1577
1578/*
drhc49f44e2006-10-26 18:15:42 +00001579** If a field contains any character identified by a 1 in the following
1580** array, then the string must be quoted for CSV.
1581*/
1582static const char needCsvQuote[] = {
mistachkin1fe36bb2016-04-04 02:16:44 +00001583 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1584 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1585 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1586 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1587 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1589 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1590 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1591 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1592 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1593 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1594 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1595 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1596 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1597 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1598 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
drhc49f44e2006-10-26 18:15:42 +00001599};
1600
1601/*
mistachkindd11f2d2014-12-11 04:49:46 +00001602** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +00001603** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +00001604** the null value. Strings are quoted if necessary. The separator
1605** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +00001606*/
drhdcd87a92014-08-18 13:45:42 +00001607static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00001608 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00001609 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +00001610 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +00001611 }else{
drhc49f44e2006-10-26 18:15:42 +00001612 int i;
mistachkin636bf9f2014-07-19 20:15:16 +00001613 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +00001614 for(i=0; z[i]; i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00001615 if( needCsvQuote[((unsigned char*)z)[i]]
1616 || (z[i]==p->colSeparator[0] &&
mistachkin636bf9f2014-07-19 20:15:16 +00001617 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00001618 i = 0;
1619 break;
1620 }
1621 }
1622 if( i==0 ){
1623 putc('"', out);
1624 for(i=0; z[i]; i++){
1625 if( z[i]=='"' ) putc('"', out);
1626 putc(z[i], out);
1627 }
1628 putc('"', out);
1629 }else{
drhe05461c2015-12-30 13:36:57 +00001630 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +00001631 }
drh8e64d1c2004-10-07 00:32:39 +00001632 }
1633 if( bSep ){
drhe05461c2015-12-30 13:36:57 +00001634 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001635 }
1636}
1637
danielk19774af00c62005-01-23 23:43:21 +00001638#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00001639/*
drh4c504392000-10-16 22:06:40 +00001640** This routine runs when the user presses Ctrl-C
1641*/
1642static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00001643 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +00001644 seenInterrupt++;
1645 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +00001646 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +00001647}
danielk19774af00c62005-01-23 23:43:21 +00001648#endif
drh4c504392000-10-16 22:06:40 +00001649
drha0daa752016-09-16 11:53:10 +00001650#ifndef SQLITE_OMIT_AUTHORIZATION
drh4c504392000-10-16 22:06:40 +00001651/*
drhde613c62016-04-04 17:23:10 +00001652** When the ".auth ON" is set, the following authorizer callback is
1653** invoked. It always returns SQLITE_OK.
1654*/
1655static int shellAuth(
1656 void *pClientData,
1657 int op,
1658 const char *zA1,
1659 const char *zA2,
1660 const char *zA3,
1661 const char *zA4
1662){
1663 ShellState *p = (ShellState*)pClientData;
1664 static const char *azAction[] = { 0,
1665 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1666 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1667 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1668 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1669 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1670 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1671 "PRAGMA", "READ", "SELECT",
1672 "TRANSACTION", "UPDATE", "ATTACH",
1673 "DETACH", "ALTER_TABLE", "REINDEX",
1674 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1675 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1676 };
1677 int i;
1678 const char *az[4];
1679 az[0] = zA1;
1680 az[1] = zA2;
1681 az[2] = zA3;
1682 az[3] = zA4;
mistachkin8145fc62016-09-16 20:39:21 +00001683 utf8_printf(p->out, "authorizer: %s", azAction[op]);
drhde613c62016-04-04 17:23:10 +00001684 for(i=0; i<4; i++){
1685 raw_printf(p->out, " ");
1686 if( az[i] ){
1687 output_c_string(p->out, az[i]);
1688 }else{
1689 raw_printf(p->out, "NULL");
1690 }
1691 }
1692 raw_printf(p->out, "\n");
1693 return SQLITE_OK;
1694}
drha0daa752016-09-16 11:53:10 +00001695#endif
mistachkin8145fc62016-09-16 20:39:21 +00001696
drh79f20e92016-12-13 23:22:39 +00001697/*
1698** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1699**
1700** This routine converts some CREATE TABLE statements for shadow tables
1701** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1702*/
1703static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1704 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1705 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1706 }else{
1707 utf8_printf(out, "%s%s", z, zTail);
1708 }
1709}
1710static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1711 char c = z[n];
1712 z[n] = 0;
1713 printSchemaLine(out, z, zTail);
1714 z[n] = c;
1715}
drhde613c62016-04-04 17:23:10 +00001716
1717/*
shane626a6e42009-10-22 17:30:15 +00001718** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +00001719** invokes for each row of a query result.
1720*/
drh4ace5362014-11-10 14:42:28 +00001721static int shell_callback(
1722 void *pArg,
1723 int nArg, /* Number of result columns */
1724 char **azArg, /* Text of each result column */
1725 char **azCol, /* Column names */
1726 int *aiType /* Column types */
1727){
drh75897232000-05-29 14:26:00 +00001728 int i;
drhdcd87a92014-08-18 13:45:42 +00001729 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +00001730
drh700c2522016-02-09 18:39:25 +00001731 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +00001732 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00001733 int w = 5;
drh6a535342001-10-19 16:44:56 +00001734 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00001735 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00001736 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00001737 if( len>w ) w = len;
1738 }
drhe05461c2015-12-30 13:36:57 +00001739 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001740 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001741 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +00001742 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001743 }
1744 break;
1745 }
danielk19770d78bae2008-01-03 07:09:48 +00001746 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00001747 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +00001748 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1749 const int *colWidth;
1750 int showHdr;
1751 char *rowSep;
1752 if( p->cMode==MODE_Column ){
1753 colWidth = p->colWidth;
1754 showHdr = p->showHeader;
1755 rowSep = p->rowSeparator;
1756 }else{
1757 colWidth = aExplainWidths;
1758 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +00001759 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +00001760 }
drha0c66f52000-07-29 13:20:21 +00001761 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00001762 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00001763 int w, n;
1764 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +00001765 w = colWidth[i];
drh75897232000-05-29 14:26:00 +00001766 }else{
danielk19770d78bae2008-01-03 07:09:48 +00001767 w = 0;
drh75897232000-05-29 14:26:00 +00001768 }
drh078b1fd2012-09-21 13:40:02 +00001769 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +00001770 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00001771 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +00001772 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +00001773 if( w<n ) w = n;
1774 }
1775 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00001776 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00001777 }
drh700c2522016-02-09 18:39:25 +00001778 if( showHdr ){
drh078b1fd2012-09-21 13:40:02 +00001779 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001780 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001781 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001782 }else{
drhe05461c2015-12-30 13:36:57 +00001783 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001784 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001785 }
drha0c66f52000-07-29 13:20:21 +00001786 }
1787 }
drh700c2522016-02-09 18:39:25 +00001788 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +00001789 for(i=0; i<nArg; i++){
1790 int w;
1791 if( i<ArraySize(p->actualWidth) ){
1792 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +00001793 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +00001794 }else{
1795 w = 10;
1796 }
mistachkinaae280e2015-12-31 19:06:24 +00001797 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +00001798 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +00001799 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +00001800 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00001801 }
drh75897232000-05-29 14:26:00 +00001802 }
1803 }
drh6a535342001-10-19 16:44:56 +00001804 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001805 for(i=0; i<nArg; i++){
1806 int w;
drha0c66f52000-07-29 13:20:21 +00001807 if( i<ArraySize(p->actualWidth) ){
1808 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00001809 }else{
1810 w = 10;
1811 }
drh700c2522016-02-09 18:39:25 +00001812 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +00001813 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00001814 }
dana98bf362013-11-13 18:35:01 +00001815 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +00001816 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +00001817 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +00001818 }
danc4650bb2013-11-18 08:41:06 +00001819 p->iIndent++;
dana98bf362013-11-13 18:35:01 +00001820 }
drh078b1fd2012-09-21 13:40:02 +00001821 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001822 utf8_printf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +00001823 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001824 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001825 }else{
drhe05461c2015-12-30 13:36:57 +00001826 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +00001827 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001828 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001829 }
drh75897232000-05-29 14:26:00 +00001830 }
1831 break;
1832 }
drh4926fec2016-04-13 15:33:42 +00001833 case MODE_Semi: { /* .schema and .fullschema output */
drh79f20e92016-12-13 23:22:39 +00001834 printSchemaLine(p->out, azArg[0], ";\n");
drh4926fec2016-04-13 15:33:42 +00001835 break;
1836 }
1837 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1838 char *z;
drh07d683f2016-04-13 21:00:36 +00001839 int j;
drh4926fec2016-04-13 15:33:42 +00001840 int nParen = 0;
1841 char cEnd = 0;
1842 char c;
1843 int nLine = 0;
1844 assert( nArg==1 );
1845 if( azArg[0]==0 ) break;
1846 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1847 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1848 ){
1849 utf8_printf(p->out, "%s;\n", azArg[0]);
1850 break;
1851 }
1852 z = sqlite3_mprintf("%s", azArg[0]);
1853 j = 0;
1854 for(i=0; IsSpace(z[i]); i++){}
1855 for(; (c = z[i])!=0; i++){
1856 if( IsSpace(c) ){
1857 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1858 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1859 j--;
1860 }
1861 z[j++] = c;
1862 }
1863 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1864 z[j] = 0;
1865 if( strlen30(z)>=79 ){
drh07d683f2016-04-13 21:00:36 +00001866 for(i=j=0; (c = z[i])!=0; i++){
drh4926fec2016-04-13 15:33:42 +00001867 if( c==cEnd ){
1868 cEnd = 0;
1869 }else if( c=='"' || c=='\'' || c=='`' ){
1870 cEnd = c;
1871 }else if( c=='[' ){
1872 cEnd = ']';
1873 }else if( c=='(' ){
1874 nParen++;
1875 }else if( c==')' ){
1876 nParen--;
1877 if( nLine>0 && nParen==0 && j>0 ){
drh79f20e92016-12-13 23:22:39 +00001878 printSchemaLineN(p->out, z, j, "\n");
drh4926fec2016-04-13 15:33:42 +00001879 j = 0;
1880 }
1881 }
1882 z[j++] = c;
1883 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1884 if( c=='\n' ) j--;
drh79f20e92016-12-13 23:22:39 +00001885 printSchemaLineN(p->out, z, j, "\n ");
drh4926fec2016-04-13 15:33:42 +00001886 j = 0;
1887 nLine++;
1888 while( IsSpace(z[i+1]) ){ i++; }
1889 }
1890 }
1891 z[j] = 0;
1892 }
drh79f20e92016-12-13 23:22:39 +00001893 printSchemaLine(p->out, z, ";\n");
drh4926fec2016-04-13 15:33:42 +00001894 sqlite3_free(z);
1895 break;
1896 }
drh75897232000-05-29 14:26:00 +00001897 case MODE_List: {
1898 if( p->cnt++==0 && p->showHeader ){
1899 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001900 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00001901 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00001902 }
1903 }
drh6a535342001-10-19 16:44:56 +00001904 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001905 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001906 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00001907 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00001908 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001909 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00001910 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +00001911 }else{
drhe05461c2015-12-30 13:36:57 +00001912 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001913 }
drh75897232000-05-29 14:26:00 +00001914 }
1915 break;
1916 }
drh1e5d0e92000-05-31 23:33:17 +00001917 case MODE_Html: {
1918 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001919 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001920 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001921 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001922 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001923 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001924 }
mistachkinaae280e2015-12-31 19:06:24 +00001925 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001926 }
drh6a535342001-10-19 16:44:56 +00001927 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001928 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001929 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001930 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001931 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001932 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001933 }
mistachkinaae280e2015-12-31 19:06:24 +00001934 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001935 break;
1936 }
drhfeac5f82004-08-01 00:10:45 +00001937 case MODE_Tcl: {
1938 if( p->cnt++==0 && p->showHeader ){
1939 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001940 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001941 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001942 }
drhe05461c2015-12-30 13:36:57 +00001943 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001944 }
1945 if( azArg==0 ) break;
1946 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001947 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001948 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001949 }
drhe05461c2015-12-30 13:36:57 +00001950 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001951 break;
1952 }
drh8e64d1c2004-10-07 00:32:39 +00001953 case MODE_Csv: {
mistachkin1fe36bb2016-04-04 02:16:44 +00001954 setBinaryMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001955 if( p->cnt++==0 && p->showHeader ){
1956 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001957 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001958 }
drhe05461c2015-12-30 13:36:57 +00001959 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001960 }
drh40253262014-10-17 21:35:05 +00001961 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001962 for(i=0; i<nArg; i++){
1963 output_csv(p, azArg[i], i<nArg-1);
1964 }
drhe05461c2015-12-30 13:36:57 +00001965 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001966 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001967 setTextMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001968 break;
1969 }
drh41f5f6e2016-10-21 17:39:30 +00001970 case MODE_Quote:
drh28bd4bc2000-06-15 15:57:22 +00001971 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00001972 if( azArg==0 ) break;
drh41f5f6e2016-10-21 17:39:30 +00001973 if( p->cMode==MODE_Insert ){
1974 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
1975 if( p->showHeader ){
1976 raw_printf(p->out,"(");
1977 for(i=0; i<nArg; i++){
1978 char *zSep = i>0 ? ",": "";
1979 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
1980 }
1981 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00001982 }
drh41f5f6e2016-10-21 17:39:30 +00001983 raw_printf(p->out," VALUES(");
drh59ce2c42016-11-03 13:12:28 +00001984 }else if( p->cnt==0 && p->showHeader ){
1985 for(i=0; i<nArg; i++){
mistachkin2f9a6132016-11-11 05:19:45 +00001986 if( i>0 ) raw_printf(p->out, ",");
drh59ce2c42016-11-03 13:12:28 +00001987 output_quoted_string(p->out, azCol[i]);
1988 }
mistachkin2f9a6132016-11-11 05:19:45 +00001989 raw_printf(p->out,"\n");
mistachkin151c75a2015-04-07 21:16:40 +00001990 }
drh59ce2c42016-11-03 13:12:28 +00001991 p->cnt++;
drh28bd4bc2000-06-15 15:57:22 +00001992 for(i=0; i<nArg; i++){
1993 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00001994 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00001995 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00001996 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00001997 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00001998 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001999 }else if( aiType && (aiType[i]==SQLITE_INTEGER
2000 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00002001 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00002002 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2003 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2004 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00002005 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00002006 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00002007 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00002008 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00002009 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002010 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00002011 output_quoted_string(p->out, azArg[i]);
2012 }
2013 }
drh41f5f6e2016-10-21 17:39:30 +00002014 raw_printf(p->out,p->cMode==MODE_Quote?"\n":");\n");
drh6a535342001-10-19 16:44:56 +00002015 break;
drh28bd4bc2000-06-15 15:57:22 +00002016 }
mistachkin636bf9f2014-07-19 20:15:16 +00002017 case MODE_Ascii: {
2018 if( p->cnt++==0 && p->showHeader ){
2019 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002020 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2021 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00002022 }
drhe05461c2015-12-30 13:36:57 +00002023 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002024 }
2025 if( azArg==0 ) break;
2026 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002027 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2028 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00002029 }
drhe05461c2015-12-30 13:36:57 +00002030 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002031 break;
2032 }
persicom1d0b8722002-04-18 02:53:04 +00002033 }
drh75897232000-05-29 14:26:00 +00002034 return 0;
2035}
2036
2037/*
shane626a6e42009-10-22 17:30:15 +00002038** This is the callback routine that the SQLite library
2039** invokes for each row of a query result.
2040*/
2041static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2042 /* since we don't have type info, call the shell_callback with a NULL value */
2043 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2044}
2045
drhf42d3182017-03-08 12:25:18 +00002046
shane626a6e42009-10-22 17:30:15 +00002047/*
drhdcd87a92014-08-18 13:45:42 +00002048** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00002049** the name of the table given. Escape any quote characters in the
2050** table name.
2051*/
drhdcd87a92014-08-18 13:45:42 +00002052static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00002053 int i, n;
drhf42d3182017-03-08 12:25:18 +00002054 int cQuote;
drh33048c02001-10-01 14:29:22 +00002055 char *z;
2056
2057 if( p->zDestTable ){
2058 free(p->zDestTable);
2059 p->zDestTable = 0;
2060 }
2061 if( zName==0 ) return;
drhf42d3182017-03-08 12:25:18 +00002062 cQuote = quoteChar(zName);
2063 n = strlen30(zName);
2064 if( cQuote ) n += 2;
drh33048c02001-10-01 14:29:22 +00002065 z = p->zDestTable = malloc( n+1 );
2066 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002067 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00002068 exit(1);
2069 }
2070 n = 0;
drhf42d3182017-03-08 12:25:18 +00002071 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002072 for(i=0; zName[i]; i++){
2073 z[n++] = zName[i];
drhf42d3182017-03-08 12:25:18 +00002074 if( zName[i]==cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002075 }
drhf42d3182017-03-08 12:25:18 +00002076 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002077 z[n] = 0;
2078}
2079
drhdd3d4592004-08-30 01:54:05 +00002080
2081/*
drhb21a8e42012-01-28 21:08:51 +00002082** Execute a query statement that will generate SQL output. Print
2083** the result columns, comma-separated, on a line and then add a
2084** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00002085**
drhb21a8e42012-01-28 21:08:51 +00002086** If the number of columns is 1 and that column contains text "--"
mistachkin1fe36bb2016-04-04 02:16:44 +00002087** then write the semicolon on a separate line. That way, if a
drhb21a8e42012-01-28 21:08:51 +00002088** "--" comment occurs at the end of the statement, the comment
2089** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00002090*/
drh157e29a2009-05-21 15:15:00 +00002091static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00002092 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00002093 const char *zSelect, /* SELECT statement to extract content */
2094 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00002095){
drhdd3d4592004-08-30 01:54:05 +00002096 sqlite3_stmt *pSelect;
2097 int rc;
drhb21a8e42012-01-28 21:08:51 +00002098 int nResult;
2099 int i;
2100 const char *z;
drhc7181902014-02-27 15:04:13 +00002101 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00002102 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00002103 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2104 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002105 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00002106 return rc;
2107 }
2108 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00002109 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00002110 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00002111 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00002112 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00002113 zFirstRow = 0;
2114 }
drhb21a8e42012-01-28 21:08:51 +00002115 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00002116 utf8_printf(p->out, "%s", z);
mistachkin1fe36bb2016-04-04 02:16:44 +00002117 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00002118 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00002119 }
2120 if( z==0 ) z = "";
2121 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2122 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00002123 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00002124 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002125 raw_printf(p->out, ";\n");
mistachkin1fe36bb2016-04-04 02:16:44 +00002126 }
drhdd3d4592004-08-30 01:54:05 +00002127 rc = sqlite3_step(pSelect);
2128 }
drh2f464a02011-10-13 00:41:49 +00002129 rc = sqlite3_finalize(pSelect);
2130 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002131 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2132 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002133 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00002134 }
2135 return rc;
drhdd3d4592004-08-30 01:54:05 +00002136}
2137
shane626a6e42009-10-22 17:30:15 +00002138/*
2139** Allocate space and save off current error string.
2140*/
2141static char *save_err_msg(
2142 sqlite3 *db /* Database to query */
2143){
2144 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00002145 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00002146 if( zErrMsg ){
2147 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2148 }
2149 return zErrMsg;
2150}
2151
drh34784902016-02-27 17:12:36 +00002152#ifdef __linux__
2153/*
2154** Attempt to display I/O stats on Linux using /proc/PID/io
2155*/
2156static void displayLinuxIoStats(FILE *out){
2157 FILE *in;
2158 char z[200];
2159 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2160 in = fopen(z, "rb");
2161 if( in==0 ) return;
2162 while( fgets(z, sizeof(z), in)!=0 ){
2163 static const struct {
2164 const char *zPattern;
2165 const char *zDesc;
2166 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00002167 { "rchar: ", "Bytes received by read():" },
2168 { "wchar: ", "Bytes sent to write():" },
2169 { "syscr: ", "Read() system calls:" },
2170 { "syscw: ", "Write() system calls:" },
2171 { "read_bytes: ", "Bytes read from storage:" },
2172 { "write_bytes: ", "Bytes written to storage:" },
2173 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00002174 };
2175 int i;
2176 for(i=0; i<ArraySize(aTrans); i++){
2177 int n = (int)strlen(aTrans[i].zPattern);
2178 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00002179 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
drh34784902016-02-27 17:12:36 +00002180 break;
2181 }
2182 }
2183 }
2184 fclose(in);
mistachkin1fe36bb2016-04-04 02:16:44 +00002185}
drh34784902016-02-27 17:12:36 +00002186#endif
2187
2188
shane626a6e42009-10-22 17:30:15 +00002189/*
shaneh642d8b82010-07-28 16:05:34 +00002190** Display memory stats.
2191*/
2192static int display_stats(
2193 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00002194 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00002195 int bReset /* True to reset the stats */
2196){
2197 int iCur;
2198 int iHiwtr;
2199
2200 if( pArg && pArg->out ){
mistachkin1fe36bb2016-04-04 02:16:44 +00002201
shaneh642d8b82010-07-28 16:05:34 +00002202 iHiwtr = iCur = -1;
2203 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002204 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002205 "Memory Used: %d (max %d) bytes\n",
2206 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002207 iHiwtr = iCur = -1;
2208 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002209 raw_printf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002210 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002211 if( pArg->shellFlgs & SHFLG_Pagecache ){
2212 iHiwtr = iCur = -1;
2213 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002214 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002215 "Number of Pcache Pages Used: %d (max %d) pages\n",
2216 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002217 }
shaneh642d8b82010-07-28 16:05:34 +00002218 iHiwtr = iCur = -1;
2219 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002220 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002221 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
2222 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002223 if( pArg->shellFlgs & SHFLG_Scratch ){
2224 iHiwtr = iCur = -1;
2225 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002226 raw_printf(pArg->out,
2227 "Number of Scratch Allocations Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002228 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002229 }
shaneh642d8b82010-07-28 16:05:34 +00002230 iHiwtr = iCur = -1;
2231 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002232 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002233 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
2234 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002235 iHiwtr = iCur = -1;
2236 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002237 raw_printf(pArg->out, "Largest Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00002238 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002239 iHiwtr = iCur = -1;
2240 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002241 raw_printf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00002242 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002243 iHiwtr = iCur = -1;
2244 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002245 raw_printf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00002246 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002247#ifdef YYTRACKMAXSTACKDEPTH
2248 iHiwtr = iCur = -1;
2249 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002250 raw_printf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002251 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002252#endif
2253 }
2254
2255 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00002256 if( pArg->shellFlgs & SHFLG_Lookaside ){
2257 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00002258 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2259 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002260 raw_printf(pArg->out,
2261 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002262 iCur, iHiwtr);
2263 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2264 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002265 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2266 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002267 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2268 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002269 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2270 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002271 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2272 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002273 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2274 iHiwtr);
drh44dec872014-08-30 15:49:25 +00002275 }
shaneh642d8b82010-07-28 16:05:34 +00002276 iHiwtr = iCur = -1;
2277 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002278 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2279 iCur);
drh4ace5362014-11-10 14:42:28 +00002280 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00002281 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00002282 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00002283 iHiwtr = iCur = -1;
2284 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002285 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002286 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00002287 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002288 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00002289 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00002290 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002291 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002292 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002293 iHiwtr = iCur = -1;
2294 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002295 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002296 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002297 }
2298
2299 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00002300 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2301 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002302 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002303 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002304 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00002305 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002306 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00002307 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002308 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002309 }
2310
drh34784902016-02-27 17:12:36 +00002311#ifdef __linux__
2312 displayLinuxIoStats(pArg->out);
2313#endif
2314
dan5a790282015-08-07 20:06:14 +00002315 /* Do not remove this machine readable comment: extra-stats-output-here */
2316
shaneh642d8b82010-07-28 16:05:34 +00002317 return 0;
2318}
2319
2320/*
dan8d1edb92014-11-05 09:07:28 +00002321** Display scan stats.
2322*/
2323static void display_scanstats(
2324 sqlite3 *db, /* Database to query */
2325 ShellState *pArg /* Pointer to ShellState */
2326){
drhf5ed7ad2015-06-15 14:43:25 +00002327#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2328 UNUSED_PARAMETER(db);
2329 UNUSED_PARAMETER(pArg);
2330#else
drh15f23c22014-11-06 12:46:16 +00002331 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00002332 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00002333 mx = 0;
2334 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00002335 double rEstLoop = 1.0;
2336 for(i=n=0; 1; i++){
2337 sqlite3_stmt *p = pArg->pStmt;
2338 sqlite3_int64 nLoop, nVisit;
2339 double rEst;
2340 int iSid;
2341 const char *zExplain;
2342 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2343 break;
2344 }
2345 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00002346 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00002347 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00002348 if( n==0 ){
2349 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00002350 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00002351 }
drh42f30bc2014-11-06 12:08:21 +00002352 n++;
2353 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2354 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2355 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00002356 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00002357 rEstLoop *= rEst;
mistachkin1fe36bb2016-04-04 02:16:44 +00002358 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002359 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00002360 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00002361 );
dan8d1edb92014-11-05 09:07:28 +00002362 }
dan8d1edb92014-11-05 09:07:28 +00002363 }
mistachkinaae280e2015-12-31 19:06:24 +00002364 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00002365#endif
dan8d1edb92014-11-05 09:07:28 +00002366}
2367
2368/*
dana98bf362013-11-13 18:35:01 +00002369** Parameter azArray points to a zero-terminated array of strings. zStr
2370** points to a single nul-terminated string. Return non-zero if zStr
2371** is equal, according to strcmp(), to any of the strings in the array.
2372** Otherwise, return zero.
2373*/
2374static int str_in_array(const char *zStr, const char **azArray){
2375 int i;
2376 for(i=0; azArray[i]; i++){
2377 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2378 }
2379 return 0;
2380}
2381
2382/*
2383** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00002384** and populate the ShellState.aiIndent[] array with the number of
mistachkin1fe36bb2016-04-04 02:16:44 +00002385** spaces each opcode should be indented before it is output.
dana98bf362013-11-13 18:35:01 +00002386**
2387** The indenting rules are:
2388**
2389** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2390** all opcodes that occur between the p2 jump destination and the opcode
2391** itself by 2 spaces.
2392**
drh01752bc2013-11-14 23:59:33 +00002393** * For each "Goto", if the jump destination is earlier in the program
2394** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00002395** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00002396** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00002397** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00002398** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00002399*/
drhdcd87a92014-08-18 13:45:42 +00002400static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00002401 const char *zSql; /* The text of the SQL statement */
2402 const char *z; /* Used to check if this is an EXPLAIN */
2403 int *abYield = 0; /* True if op is an OP_Yield */
2404 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00002405 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00002406
drh8ad0de32014-03-20 18:45:27 +00002407 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2408 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00002409 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2410 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00002411 const char *azGoto[] = { "Goto", 0 };
2412
2413 /* Try to figure out if this is really an EXPLAIN statement. If this
2414 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00002415 if( sqlite3_column_count(pSql)!=8 ){
2416 p->cMode = p->mode;
2417 return;
2418 }
dana98bf362013-11-13 18:35:01 +00002419 zSql = sqlite3_sql(pSql);
2420 if( zSql==0 ) return;
2421 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00002422 if( sqlite3_strnicmp(z, "explain", 7) ){
2423 p->cMode = p->mode;
2424 return;
2425 }
dana98bf362013-11-13 18:35:01 +00002426
2427 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2428 int i;
danc4650bb2013-11-18 08:41:06 +00002429 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00002430 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00002431
2432 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2433 ** p2 is an instruction address, set variable p2op to the index of that
2434 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2435 ** the current instruction is part of a sub-program generated by an
2436 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00002437 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00002438 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00002439
2440 /* Grow the p->aiIndent array as required */
2441 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00002442 if( iOp==0 ){
2443 /* Do further verfication that this is explain output. Abort if
2444 ** it is not */
2445 static const char *explainCols[] = {
2446 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2447 int jj;
2448 for(jj=0; jj<ArraySize(explainCols); jj++){
2449 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2450 p->cMode = p->mode;
2451 sqlite3_reset(pSql);
2452 return;
2453 }
2454 }
2455 }
dana98bf362013-11-13 18:35:01 +00002456 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00002457 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2458 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00002459 }
2460 abYield[iOp] = str_in_array(zOp, azYield);
2461 p->aiIndent[iOp] = 0;
2462 p->nIndent = iOp+1;
2463
2464 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00002465 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002466 }
drhfe705102014-03-06 13:38:37 +00002467 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2468 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2469 ){
drheacd29d2016-04-15 15:03:27 +00002470 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002471 }
2472 }
2473
danc4650bb2013-11-18 08:41:06 +00002474 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002475 sqlite3_free(abYield);
2476 sqlite3_reset(pSql);
2477}
2478
2479/*
2480** Free the array allocated by explain_data_prepare().
2481*/
drhdcd87a92014-08-18 13:45:42 +00002482static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00002483 sqlite3_free(p->aiIndent);
2484 p->aiIndent = 0;
2485 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00002486 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002487}
2488
2489/*
drheacd29d2016-04-15 15:03:27 +00002490** Disable and restore .wheretrace and .selecttrace settings.
2491*/
2492#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2493extern int sqlite3SelectTrace;
2494static int savedSelectTrace;
2495#endif
2496#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2497extern int sqlite3WhereTrace;
2498static int savedWhereTrace;
2499#endif
2500static void disable_debug_trace_modes(void){
2501#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2502 savedSelectTrace = sqlite3SelectTrace;
2503 sqlite3SelectTrace = 0;
2504#endif
2505#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2506 savedWhereTrace = sqlite3WhereTrace;
2507 sqlite3WhereTrace = 0;
2508#endif
2509}
2510static void restore_debug_trace_modes(void){
2511#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2512 sqlite3SelectTrace = savedSelectTrace;
2513#endif
2514#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2515 sqlite3WhereTrace = savedWhereTrace;
2516#endif
2517}
2518
2519/*
2520** Run a prepared statement
2521*/
2522static void exec_prepared_stmt(
2523 ShellState *pArg, /* Pointer to ShellState */
2524 sqlite3_stmt *pStmt, /* Statment to run */
2525 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
2526){
2527 int rc;
2528
2529 /* perform the first step. this will tell us if we
2530 ** have a result set or not and how wide it is.
2531 */
2532 rc = sqlite3_step(pStmt);
2533 /* if we have a result set... */
2534 if( SQLITE_ROW == rc ){
2535 /* if we have a callback... */
2536 if( xCallback ){
2537 /* allocate space for col name ptr, value ptr, and type */
2538 int nCol = sqlite3_column_count(pStmt);
2539 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2540 if( !pData ){
2541 rc = SQLITE_NOMEM;
2542 }else{
2543 char **azCols = (char **)pData; /* Names of result columns */
2544 char **azVals = &azCols[nCol]; /* Results */
2545 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2546 int i, x;
2547 assert(sizeof(int) <= sizeof(char *));
2548 /* save off ptrs to column names */
2549 for(i=0; i<nCol; i++){
2550 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2551 }
2552 do{
2553 /* extract the data and data types */
2554 for(i=0; i<nCol; i++){
2555 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2556 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2557 azVals[i] = "";
2558 }else{
2559 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2560 }
2561 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2562 rc = SQLITE_NOMEM;
2563 break; /* from for */
2564 }
2565 } /* end for */
2566
2567 /* if data and types extracted successfully... */
2568 if( SQLITE_ROW == rc ){
2569 /* call the supplied callback with the result row data */
2570 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
2571 rc = SQLITE_ABORT;
2572 }else{
2573 rc = sqlite3_step(pStmt);
2574 }
2575 }
2576 } while( SQLITE_ROW == rc );
2577 sqlite3_free(pData);
2578 }
2579 }else{
2580 do{
2581 rc = sqlite3_step(pStmt);
2582 } while( rc == SQLITE_ROW );
2583 }
2584 }
2585}
2586
2587/*
mistachkin1fe36bb2016-04-04 02:16:44 +00002588** Execute a statement or set of statements. Print
2589** any result rows/columns depending on the current mode
shane626a6e42009-10-22 17:30:15 +00002590** set via the supplied callback.
2591**
mistachkin1fe36bb2016-04-04 02:16:44 +00002592** This is very similar to SQLite's built-in sqlite3_exec()
2593** function except it takes a slightly different callback
shane626a6e42009-10-22 17:30:15 +00002594** and callback data argument.
2595*/
2596static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00002597 sqlite3 *db, /* An open database */
2598 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00002599 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00002600 /* (not the same as sqlite3_exec) */
2601 ShellState *pArg, /* Pointer to ShellState */
2602 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00002603){
dan4564ced2010-01-05 04:59:56 +00002604 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2605 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00002606 int rc2;
dan4564ced2010-01-05 04:59:56 +00002607 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00002608
2609 if( pzErrMsg ){
2610 *pzErrMsg = NULL;
2611 }
2612
shaneb9fc17d2009-10-22 21:23:35 +00002613 while( zSql[0] && (SQLITE_OK == rc) ){
drheacd29d2016-04-15 15:03:27 +00002614 static const char *zStmtSql;
shaneb9fc17d2009-10-22 21:23:35 +00002615 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2616 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00002617 if( pzErrMsg ){
2618 *pzErrMsg = save_err_msg(db);
2619 }
2620 }else{
shaneb9fc17d2009-10-22 21:23:35 +00002621 if( !pStmt ){
2622 /* this happens for a comment or white-space */
2623 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002624 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00002625 continue;
2626 }
drheacd29d2016-04-15 15:03:27 +00002627 zStmtSql = sqlite3_sql(pStmt);
drh60275612016-11-03 02:25:30 +00002628 if( zStmtSql==0 ) zStmtSql = "";
drheacd29d2016-04-15 15:03:27 +00002629 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
shane626a6e42009-10-22 17:30:15 +00002630
shaneh642d8b82010-07-28 16:05:34 +00002631 /* save off the prepared statment handle and reset row count */
2632 if( pArg ){
2633 pArg->pStmt = pStmt;
2634 pArg->cnt = 0;
2635 }
2636
shanehb7977c52010-01-18 18:17:10 +00002637 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00002638 if( pArg && pArg->echoOn ){
drhe05461c2015-12-30 13:36:57 +00002639 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00002640 }
shanehb7977c52010-01-18 18:17:10 +00002641
drhefbf3b12014-02-28 20:47:24 +00002642 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
drheacd29d2016-04-15 15:03:27 +00002643 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
drhefbf3b12014-02-28 20:47:24 +00002644 sqlite3_stmt *pExplain;
drheacd29d2016-04-15 15:03:27 +00002645 char *zEQP;
2646 disable_debug_trace_modes();
2647 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
drhefbf3b12014-02-28 20:47:24 +00002648 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2649 if( rc==SQLITE_OK ){
2650 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00002651 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
2652 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
2653 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00002654 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00002655 }
2656 }
2657 sqlite3_finalize(pExplain);
2658 sqlite3_free(zEQP);
drheacd29d2016-04-15 15:03:27 +00002659 if( pArg->autoEQP>=2 ){
2660 /* Also do an EXPLAIN for ".eqp full" mode */
2661 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2662 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2663 if( rc==SQLITE_OK ){
2664 pArg->cMode = MODE_Explain;
2665 explain_data_prepare(pArg, pExplain);
2666 exec_prepared_stmt(pArg, pExplain, xCallback);
2667 explain_data_delete(pArg);
2668 }
2669 sqlite3_finalize(pExplain);
2670 sqlite3_free(zEQP);
2671 }
2672 restore_debug_trace_modes();
drhefbf3b12014-02-28 20:47:24 +00002673 }
2674
drh700c2522016-02-09 18:39:25 +00002675 if( pArg ){
2676 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00002677 if( pArg->autoExplain
2678 && sqlite3_column_count(pStmt)==8
drheacd29d2016-04-15 15:03:27 +00002679 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
drh700c2522016-02-09 18:39:25 +00002680 ){
2681 pArg->cMode = MODE_Explain;
2682 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002683
drh700c2522016-02-09 18:39:25 +00002684 /* If the shell is currently in ".explain" mode, gather the extra
2685 ** data required to add indents to the output.*/
2686 if( pArg->cMode==MODE_Explain ){
2687 explain_data_prepare(pArg, pStmt);
2688 }
dana98bf362013-11-13 18:35:01 +00002689 }
2690
drheacd29d2016-04-15 15:03:27 +00002691 exec_prepared_stmt(pArg, pStmt, xCallback);
dana98bf362013-11-13 18:35:01 +00002692 explain_data_delete(pArg);
2693
shaneh642d8b82010-07-28 16:05:34 +00002694 /* print usage stats if stats on */
2695 if( pArg && pArg->statsOn ){
2696 display_stats(db, pArg, 0);
2697 }
2698
dan8d1edb92014-11-05 09:07:28 +00002699 /* print loop-counters if required */
2700 if( pArg && pArg->scanstatsOn ){
2701 display_scanstats(db, pArg);
2702 }
2703
mistachkin1fe36bb2016-04-04 02:16:44 +00002704 /* Finalize the statement just executed. If this fails, save a
dan4564ced2010-01-05 04:59:56 +00002705 ** copy of the error message. Otherwise, set zSql to point to the
2706 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00002707 rc2 = sqlite3_finalize(pStmt);
2708 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00002709 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00002710 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002711 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00002712 }else if( pzErrMsg ){
2713 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00002714 }
shaneh642d8b82010-07-28 16:05:34 +00002715
2716 /* clear saved stmt handle */
2717 if( pArg ){
2718 pArg->pStmt = NULL;
2719 }
shane626a6e42009-10-22 17:30:15 +00002720 }
shaneb9fc17d2009-10-22 21:23:35 +00002721 } /* end while */
shane626a6e42009-10-22 17:30:15 +00002722
2723 return rc;
2724}
2725
drhe611f142017-03-08 11:44:00 +00002726/*
2727** Release memory previously allocated by tableColumnList().
2728*/
2729static void freeColumnList(char **azCol){
2730 int i;
2731 for(i=1; azCol[i]; i++){
2732 sqlite3_free(azCol[i]);
2733 }
2734 /* azCol[0] is a static string */
2735 sqlite3_free(azCol);
2736}
2737
2738/*
2739** Return a list of pointers to strings which are the names of all
2740** columns in table zTab. The memory to hold the names is dynamically
2741** allocated and must be released by the caller using a subsequent call
2742** to freeColumnList().
2743**
2744** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
2745** value that needs to be preserved, then azCol[0] is filled in with the
2746** name of the rowid column.
2747**
2748** The first regular column in the table is azCol[1]. The list is terminated
2749** by an entry with azCol[i]==0.
2750*/
2751static char **tableColumnList(ShellState *p, const char *zTab){
2752 char **azCol = 0;
2753 sqlite3_stmt *pStmt;
2754 char *zSql;
2755 int nCol = 0;
2756 int nAlloc = 0;
2757 int nPK = 0; /* Number of PRIMARY KEY columns seen */
2758 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
2759 int preserveRowid = p->preserveRowid;
2760 int rc;
2761
2762 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
2763 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2764 sqlite3_free(zSql);
2765 if( rc ) return 0;
2766 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2767 if( nCol>=nAlloc-2 ){
2768 nAlloc = nAlloc*2 + nCol + 10;
2769 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
2770 if( azCol==0 ){
2771 raw_printf(stderr, "Error: out of memory\n");
2772 exit(1);
2773 }
2774 }
2775 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
2776 if( sqlite3_column_int(pStmt, 5) ){
2777 nPK++;
2778 if( nPK==1
2779 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
2780 "INTEGER")==0
2781 ){
2782 isIPK = 1;
2783 }else{
2784 isIPK = 0;
2785 }
2786 }
2787 }
2788 sqlite3_finalize(pStmt);
2789 azCol[0] = 0;
2790 azCol[nCol+1] = 0;
2791
2792 /* The decision of whether or not a rowid really needs to be preserved
2793 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
2794 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
2795 ** rowids on tables where the rowid is inaccessible because there are other
2796 ** columns in the table named "rowid", "_rowid_", and "oid".
2797 */
2798 if( preserveRowid && isIPK ){
2799 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
2800 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
2801 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
2802 ** ROWID aliases. To distinguish these cases, check to see if
2803 ** there is a "pk" entry in "PRAGMA index_list". There will be
2804 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
2805 */
2806 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
2807 " WHERE origin='pk'", zTab);
2808 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2809 sqlite3_free(zSql);
2810 if( rc ){
2811 freeColumnList(azCol);
2812 return 0;
2813 }
2814 rc = sqlite3_step(pStmt);
2815 sqlite3_finalize(pStmt);
2816 preserveRowid = rc==SQLITE_ROW;
2817 }
2818 if( preserveRowid ){
2819 /* Only preserve the rowid if we can find a name to use for the
2820 ** rowid */
2821 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
2822 int i, j;
2823 for(j=0; j<3; j++){
2824 for(i=1; i<=nCol; i++){
2825 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
2826 }
2827 if( i>nCol ){
2828 /* At this point, we know that azRowid[j] is not the name of any
2829 ** ordinary column in the table. Verify that azRowid[j] is a valid
2830 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
2831 ** tables will fail this last check */
2832 int rc;
2833 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
2834 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
2835 break;
2836 }
2837 }
2838 }
2839 return azCol;
2840}
2841
drh33048c02001-10-01 14:29:22 +00002842/*
drh4c653a02000-06-07 01:27:47 +00002843** This is a different callback routine used for dumping the database.
2844** Each row received by this callback consists of a table name,
2845** the table type ("index" or "table") and SQL to create the table.
2846** This routine should print text sufficient to recreate the table.
2847*/
2848static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00002849 int rc;
2850 const char *zTable;
2851 const char *zType;
2852 const char *zSql;
drhdcd87a92014-08-18 13:45:42 +00002853 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00002854
drh902b9ee2008-12-05 17:17:07 +00002855 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00002856 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00002857 zTable = azArg[0];
2858 zType = azArg[1];
2859 zSql = azArg[2];
mistachkin1fe36bb2016-04-04 02:16:44 +00002860
drh00b950d2005-09-11 02:03:03 +00002861 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhe611f142017-03-08 11:44:00 +00002862 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
drh7ed10322013-08-07 16:04:27 +00002863 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002864 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00002865 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2866 return 0;
drh45e29d82006-11-20 16:21:10 +00002867 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2868 char *zIns;
2869 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00002870 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00002871 p->writableSchema = 1;
2872 }
2873 zIns = sqlite3_mprintf(
2874 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2875 "VALUES('table','%q','%q',0,'%q');",
2876 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00002877 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00002878 sqlite3_free(zIns);
2879 return 0;
drh00b950d2005-09-11 02:03:03 +00002880 }else{
drh79f20e92016-12-13 23:22:39 +00002881 printSchemaLine(p->out, zSql, ";\n");
drhf8eb96a2005-02-03 00:42:34 +00002882 }
danielk19772a02e332004-06-05 08:04:36 +00002883
2884 if( strcmp(zType, "table")==0 ){
drhf42d3182017-03-08 12:25:18 +00002885 ShellText sSelect;
2886 ShellText sTable;
drhe611f142017-03-08 11:44:00 +00002887 char **azCol;
2888 int i;
2889 char *savedDestTable;
2890 int savedMode;
mistachkin1fe36bb2016-04-04 02:16:44 +00002891
drhe611f142017-03-08 11:44:00 +00002892 azCol = tableColumnList(p, zTable);
2893 if( azCol==0 ){
2894 p->nErr++;
2895 return 0;
danielk19772a02e332004-06-05 08:04:36 +00002896 }
2897
drhbf92ec02012-03-22 12:50:34 +00002898 /* Always quote the table name, even if it appears to be pure ascii,
2899 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
drhf42d3182017-03-08 12:25:18 +00002900 initText(&sTable);
2901 appendText(&sTable, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00002902 /* If preserving the rowid, add a column list after the table name.
2903 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
2904 ** instead of the usual "INSERT INTO tab VALUES(...)".
2905 */
2906 if( azCol[0] ){
2907 appendText(&sTable, "(", 0);
2908 appendText(&sTable, azCol[0], 0);
2909 for(i=1; azCol[i]; i++){
2910 appendText(&sTable, ",", 0);
drhf42d3182017-03-08 12:25:18 +00002911 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
danielk19772a02e332004-06-05 08:04:36 +00002912 }
drhe611f142017-03-08 11:44:00 +00002913 appendText(&sTable, ")", 0);
danielk19772a02e332004-06-05 08:04:36 +00002914 }
danielk19772a02e332004-06-05 08:04:36 +00002915
drhe611f142017-03-08 11:44:00 +00002916 /* Build an appropriate SELECT statement */
drhf42d3182017-03-08 12:25:18 +00002917 initText(&sSelect);
drhe611f142017-03-08 11:44:00 +00002918 appendText(&sSelect, "SELECT ", 0);
2919 if( azCol[0] ){
2920 appendText(&sSelect, azCol[0], 0);
2921 appendText(&sSelect, ",", 0);
drhdd3d4592004-08-30 01:54:05 +00002922 }
drhe611f142017-03-08 11:44:00 +00002923 for(i=1; azCol[i]; i++){
drhf42d3182017-03-08 12:25:18 +00002924 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
drhe611f142017-03-08 11:44:00 +00002925 if( azCol[i+1] ){
2926 appendText(&sSelect, ",", 0);
2927 }
2928 }
2929 freeColumnList(azCol);
2930 appendText(&sSelect, " FROM ", 0);
drhf42d3182017-03-08 12:25:18 +00002931 appendText(&sSelect, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00002932
2933 savedDestTable = p->zDestTable;
2934 savedMode = p->mode;
2935 p->zDestTable = sTable.z;
2936 p->mode = p->cMode = MODE_Insert;
2937 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
2938 p->zDestTable = savedDestTable;
2939 p->mode = savedMode;
drhf42d3182017-03-08 12:25:18 +00002940 freeText(&sTable);
2941 freeText(&sSelect);
drhe611f142017-03-08 11:44:00 +00002942 if( rc ) p->nErr++;
drh4c653a02000-06-07 01:27:47 +00002943 }
drh4c653a02000-06-07 01:27:47 +00002944 return 0;
2945}
2946
2947/*
drh45e29d82006-11-20 16:21:10 +00002948** Run zQuery. Use dump_callback() as the callback routine so that
2949** the contents of the query are output as SQL statements.
2950**
drhdd3d4592004-08-30 01:54:05 +00002951** If we get a SQLITE_CORRUPT error, rerun the query after appending
2952** "ORDER BY rowid DESC" to the end.
2953*/
2954static int run_schema_dump_query(
mistachkin1fe36bb2016-04-04 02:16:44 +00002955 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00002956 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00002957){
2958 int rc;
drh2f464a02011-10-13 00:41:49 +00002959 char *zErr = 0;
2960 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00002961 if( rc==SQLITE_CORRUPT ){
2962 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00002963 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00002964 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00002965 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00002966 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00002967 sqlite3_free(zErr);
2968 zErr = 0;
2969 }
drhdd3d4592004-08-30 01:54:05 +00002970 zQ2 = malloc( len+100 );
2971 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00002972 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00002973 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
2974 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002975 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00002976 }else{
2977 rc = SQLITE_CORRUPT;
2978 }
2979 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00002980 free(zQ2);
2981 }
2982 return rc;
2983}
2984
2985/*
drh75897232000-05-29 14:26:00 +00002986** Text of a help message
2987*/
persicom1d0b8722002-04-18 02:53:04 +00002988static char zHelp[] =
drha0daa752016-09-16 11:53:10 +00002989#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00002990 ".auth ON|OFF Show authorizer callbacks\n"
drha0daa752016-09-16 11:53:10 +00002991#endif
drh9ff849f2009-02-04 20:55:57 +00002992 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00002993 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00002994 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00002995 ".changes on|off Show number of rows changed by SQL\n"
drh2db82112016-09-15 21:35:24 +00002996 ".check GLOB Fail if output since .testcase does not match\n"
drh4bbcf102014-02-06 02:46:08 +00002997 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00002998 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00002999 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00003000 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00003001 " If TABLE specified, only dump tables matching\n"
3002 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00003003 ".echo on|off Turn command echo on or off\n"
drheacd29d2016-04-15 15:03:27 +00003004 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00003005 ".exit Exit this program\n"
drh700c2522016-02-09 18:39:25 +00003006 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
drh4926fec2016-04-13 15:33:42 +00003007 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00003008 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00003009 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00003010 ".import FILE TABLE Import data from FILE into TABLE\n"
drh16eb5942016-11-03 13:01:38 +00003011#ifndef SQLITE_OMIT_TEST_CONTROL
3012 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3013#endif
drh0e55db12015-02-06 14:51:13 +00003014 ".indexes ?TABLE? Show names of all indexes\n"
3015 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00003016 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00003017#ifdef SQLITE_ENABLE_IOTRACE
3018 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3019#endif
drh1a513372015-05-02 17:40:23 +00003020 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh3fd9f332016-12-16 18:41:11 +00003021 ".lint OPTIONS Report potential schema issues. Options:\n"
3022 " fkey-indexes Find missing foreign key indexes\n"
drh70df4fe2006-06-13 15:12:21 +00003023#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00003024 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00003025#endif
drh127f9d72010-02-23 01:47:00 +00003026 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00003027 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00003028 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00003029 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00003030 " column Left-aligned columns. (See .width)\n"
3031 " html HTML <table> code\n"
3032 " insert SQL insert statements for TABLE\n"
3033 " line One value per line\n"
drh0c5cd962017-02-14 21:47:46 +00003034 " list Values delimited by \"|\"\n"
drh41f5f6e2016-10-21 17:39:30 +00003035 " quote Escape answers as for SQL\n"
drhb860bc92004-08-04 15:16:55 +00003036 " tabs Tab-separated values\n"
3037 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00003038 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00003039 ".once FILENAME Output for the next SQL command only to FILENAME\n"
mistachkin8145fc62016-09-16 20:39:21 +00003040 ".open ?--new? ?FILE? Close existing database and reopen FILE\n"
drhcd0509e2016-09-16 00:26:08 +00003041 " The --new starts with an empty file\n"
drhc2ce0be2014-05-29 12:36:14 +00003042 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00003043 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003044 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003045 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00003046 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00003047 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00003048 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00003049 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh4926fec2016-04-13 15:33:42 +00003050 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3051 " Add --indent for pretty-printing\n"
mistachkine0d68852014-12-11 03:12:33 +00003052 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3053 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00003054#if defined(SQLITE_ENABLE_SESSION)
3055 ".session CMD ... Create or control sessions\n"
3056#endif
drh1554bc82017-03-08 16:10:34 +00003057 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh62cdde52014-05-28 20:22:28 +00003058 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00003059 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00003060 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00003061 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00003062 ".tables ?TABLE? List names of tables\n"
3063 " If TABLE specified, only list tables matching\n"
3064 " LIKE pattern TABLE.\n"
drh760c8162016-09-16 02:52:22 +00003065 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
drh2dfbbca2000-07-28 14:32:48 +00003066 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00003067 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00003068 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00003069 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00003070 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00003071 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00003072 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00003073 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00003074;
3075
drhe6229612014-08-18 15:08:26 +00003076#if defined(SQLITE_ENABLE_SESSION)
3077/*
3078** Print help information for the ".sessions" command
3079*/
3080void session_help(ShellState *p){
mistachkin899c5c92016-04-03 20:50:02 +00003081 raw_printf(p->out,
drhe6229612014-08-18 15:08:26 +00003082 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3083 "If ?NAME? is omitted, the first defined session is used.\n"
3084 "Subcommands:\n"
3085 " attach TABLE Attach TABLE\n"
3086 " changeset FILE Write a changeset into FILE\n"
3087 " close Close one session\n"
3088 " enable ?BOOLEAN? Set or query the enable bit\n"
mistachkin1fe36bb2016-04-04 02:16:44 +00003089 " filter GLOB... Reject tables matching GLOBs\n"
drhe6229612014-08-18 15:08:26 +00003090 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3091 " isempty Query whether the session is empty\n"
3092 " list List currently open session names\n"
3093 " open DB NAME Open a new session on DB\n"
3094 " patchset FILE Write a patchset into FILE\n"
3095 );
3096}
3097#endif
3098
3099
drhdaffd0e2001-04-11 14:28:42 +00003100/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00003101static int process_input(ShellState *p, FILE *in);
drh2db82112016-09-15 21:35:24 +00003102
drh2db82112016-09-15 21:35:24 +00003103/*
dan11da0022016-12-17 08:18:05 +00003104** Read the content of file zName into memory obtained from sqlite3_malloc64()
3105** and return a pointer to the buffer. The caller is responsible for freeing
3106** the memory.
drh2db82112016-09-15 21:35:24 +00003107**
dan11da0022016-12-17 08:18:05 +00003108** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3109** read.
3110**
3111** For convenience, a nul-terminator byte is always appended to the data read
3112** from the file before the buffer is returned. This byte is not included in
3113** the final value of (*pnByte), if applicable.
3114**
3115** NULL is returned if any error is encountered. The final value of *pnByte
3116** is undefined in this case.
drh2db82112016-09-15 21:35:24 +00003117*/
dan11da0022016-12-17 08:18:05 +00003118static char *readFile(const char *zName, int *pnByte){
drh2db82112016-09-15 21:35:24 +00003119 FILE *in = fopen(zName, "rb");
3120 long nIn;
drhd1459152016-09-16 19:11:03 +00003121 size_t nRead;
drh2db82112016-09-15 21:35:24 +00003122 char *pBuf;
3123 if( in==0 ) return 0;
3124 fseek(in, 0, SEEK_END);
3125 nIn = ftell(in);
3126 rewind(in);
drhd1459152016-09-16 19:11:03 +00003127 pBuf = sqlite3_malloc64( nIn+1 );
drh2db82112016-09-15 21:35:24 +00003128 if( pBuf==0 ) return 0;
drhd1459152016-09-16 19:11:03 +00003129 nRead = fread(pBuf, nIn, 1, in);
3130 fclose(in);
3131 if( nRead!=1 ){
drh2db82112016-09-15 21:35:24 +00003132 sqlite3_free(pBuf);
3133 return 0;
3134 }
drhd1459152016-09-16 19:11:03 +00003135 pBuf[nIn] = 0;
dan11da0022016-12-17 08:18:05 +00003136 if( pnByte ) *pnByte = nIn;
drh2db82112016-09-15 21:35:24 +00003137 return pBuf;
3138}
3139
drhba5b0932014-07-24 12:39:59 +00003140/*
3141** Implementation of the "readfile(X)" SQL function. The entire content
3142** of the file named X is read and returned as a BLOB. NULL is returned
3143** if the file does not exist or is unreadable.
3144*/
3145static void readfileFunc(
3146 sqlite3_context *context,
3147 int argc,
3148 sqlite3_value **argv
3149){
3150 const char *zName;
drhba5b0932014-07-24 12:39:59 +00003151 void *pBuf;
dan11da0022016-12-17 08:18:05 +00003152 int nBuf;
drhba5b0932014-07-24 12:39:59 +00003153
drhf5ed7ad2015-06-15 14:43:25 +00003154 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003155 zName = (const char*)sqlite3_value_text(argv[0]);
3156 if( zName==0 ) return;
dan11da0022016-12-17 08:18:05 +00003157 pBuf = readFile(zName, &nBuf);
3158 if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free);
drhba5b0932014-07-24 12:39:59 +00003159}
3160
3161/*
3162** Implementation of the "writefile(X,Y)" SQL function. The argument Y
3163** is written into file X. The number of bytes written is returned. Or
3164** NULL is returned if something goes wrong, such as being unable to open
3165** file X for writing.
3166*/
3167static void writefileFunc(
3168 sqlite3_context *context,
3169 int argc,
3170 sqlite3_value **argv
3171){
3172 FILE *out;
3173 const char *z;
drhba5b0932014-07-24 12:39:59 +00003174 sqlite3_int64 rc;
3175 const char *zFile;
3176
drhf5ed7ad2015-06-15 14:43:25 +00003177 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003178 zFile = (const char*)sqlite3_value_text(argv[0]);
3179 if( zFile==0 ) return;
3180 out = fopen(zFile, "wb");
3181 if( out==0 ) return;
3182 z = (const char*)sqlite3_value_blob(argv[1]);
3183 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00003184 rc = 0;
3185 }else{
drh490fe862014-08-11 14:21:32 +00003186 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00003187 }
3188 fclose(out);
3189 sqlite3_result_int64(context, rc);
3190}
drhdaffd0e2001-04-11 14:28:42 +00003191
drhe6229612014-08-18 15:08:26 +00003192#if defined(SQLITE_ENABLE_SESSION)
3193/*
3194** Close a single OpenSession object and release all of its associated
3195** resources.
3196*/
3197static void session_close(OpenSession *pSession){
3198 int i;
3199 sqlite3session_delete(pSession->p);
3200 sqlite3_free(pSession->zName);
3201 for(i=0; i<pSession->nFilter; i++){
3202 sqlite3_free(pSession->azFilter[i]);
3203 }
3204 sqlite3_free(pSession->azFilter);
3205 memset(pSession, 0, sizeof(OpenSession));
3206}
3207#endif
3208
3209/*
drh51b55a32016-04-04 12:38:05 +00003210** Close all OpenSession objects and release all associated resources.
drhe6229612014-08-18 15:08:26 +00003211*/
drhe6229612014-08-18 15:08:26 +00003212#if defined(SQLITE_ENABLE_SESSION)
drh51b55a32016-04-04 12:38:05 +00003213static void session_close_all(ShellState *p){
drhe6229612014-08-18 15:08:26 +00003214 int i;
3215 for(i=0; i<p->nSession; i++){
3216 session_close(&p->aSession[i]);
3217 }
3218 p->nSession = 0;
drhe6229612014-08-18 15:08:26 +00003219}
drh51b55a32016-04-04 12:38:05 +00003220#else
3221# define session_close_all(X)
3222#endif
drhe6229612014-08-18 15:08:26 +00003223
drh75897232000-05-29 14:26:00 +00003224/*
drh03168ca2014-08-18 20:01:31 +00003225** Implementation of the xFilter function for an open session. Omit
3226** any tables named by ".session filter" but let all other table through.
3227*/
3228#if defined(SQLITE_ENABLE_SESSION)
3229static int session_filter(void *pCtx, const char *zTab){
3230 OpenSession *pSession = (OpenSession*)pCtx;
3231 int i;
3232 for(i=0; i<pSession->nFilter; i++){
3233 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3234 }
3235 return 1;
3236}
3237#endif
3238
3239/*
drh44c2eb12003-04-30 11:38:26 +00003240** Make sure the database is open. If it is not, then open it. If
3241** the database fails to open, print an error message and exit.
3242*/
drhdcd87a92014-08-18 13:45:42 +00003243static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00003244 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00003245 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00003246 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00003247 globalDb = p->db;
mistachkin8e189222015-04-19 21:43:16 +00003248 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00003249 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00003250 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00003251 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00003252 exit(1);
drh44c2eb12003-04-30 11:38:26 +00003253 }
drhc2e87a32006-06-27 15:16:14 +00003254#ifndef SQLITE_OMIT_LOAD_EXTENSION
3255 sqlite3_enable_load_extension(p->db, 1);
3256#endif
mistachkin8e189222015-04-19 21:43:16 +00003257 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003258 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003259 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003260 writefileFunc, 0, 0);
drh1554bc82017-03-08 16:10:34 +00003261 sqlite3_create_function(p->db, "sha3", 1, SQLITE_UTF8, 0,
3262 sha3Func, 0, 0);
3263 sqlite3_create_function(p->db, "sha3", 2, SQLITE_UTF8, 0,
3264 sha3Func, 0, 0);
3265 sqlite3_create_function(p->db, "sha3_query", 1, SQLITE_UTF8, 0,
3266 sha3QueryFunc, 0, 0);
3267 sqlite3_create_function(p->db, "sha3_query", 2, SQLITE_UTF8, 0,
3268 sha3QueryFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00003269 }
3270}
3271
3272/*
drhfeac5f82004-08-01 00:10:45 +00003273** Do C-language style dequoting.
3274**
mistachkinf21979d2015-01-18 05:35:01 +00003275** \a -> alarm
3276** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00003277** \t -> tab
3278** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00003279** \v -> vertical tab
3280** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00003281** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00003282** \s -> space
drh4c56b992013-06-27 13:26:55 +00003283** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00003284** \' -> '
drhfeac5f82004-08-01 00:10:45 +00003285** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00003286** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00003287*/
3288static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00003289 int i, j;
3290 char c;
drhc2ce0be2014-05-29 12:36:14 +00003291 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00003292 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00003293 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00003294 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00003295 if( c=='a' ){
3296 c = '\a';
3297 }else if( c=='b' ){
3298 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00003299 }else if( c=='t' ){
3300 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00003301 }else if( c=='n' ){
3302 c = '\n';
3303 }else if( c=='v' ){
3304 c = '\v';
3305 }else if( c=='f' ){
3306 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00003307 }else if( c=='r' ){
3308 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00003309 }else if( c=='"' ){
3310 c = '"';
3311 }else if( c=='\'' ){
3312 c = '\'';
drh4c56b992013-06-27 13:26:55 +00003313 }else if( c=='\\' ){
3314 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00003315 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00003316 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00003317 if( z[i+1]>='0' && z[i+1]<='7' ){
3318 i++;
3319 c = (c<<3) + z[i] - '0';
3320 if( z[i+1]>='0' && z[i+1]<='7' ){
3321 i++;
3322 c = (c<<3) + z[i] - '0';
3323 }
3324 }
3325 }
3326 }
3327 z[j] = c;
3328 }
drhc2ce0be2014-05-29 12:36:14 +00003329 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00003330}
3331
3332/*
drh348d19c2013-06-03 12:47:43 +00003333** Return the value of a hexadecimal digit. Return -1 if the input
3334** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00003335*/
drh348d19c2013-06-03 12:47:43 +00003336static int hexDigitValue(char c){
3337 if( c>='0' && c<='9' ) return c - '0';
3338 if( c>='a' && c<='f' ) return c - 'a' + 10;
3339 if( c>='A' && c<='F' ) return c - 'A' + 10;
3340 return -1;
drhc28490c2006-10-26 14:25:58 +00003341}
3342
3343/*
drh7d9f3942013-04-03 01:26:54 +00003344** Interpret zArg as an integer value, possibly with suffixes.
3345*/
3346static sqlite3_int64 integerValue(const char *zArg){
3347 sqlite3_int64 v = 0;
3348 static const struct { char *zSuffix; int iMult; } aMult[] = {
3349 { "KiB", 1024 },
3350 { "MiB", 1024*1024 },
3351 { "GiB", 1024*1024*1024 },
3352 { "KB", 1000 },
3353 { "MB", 1000000 },
3354 { "GB", 1000000000 },
3355 { "K", 1000 },
3356 { "M", 1000000 },
3357 { "G", 1000000000 },
3358 };
3359 int i;
3360 int isNeg = 0;
3361 if( zArg[0]=='-' ){
3362 isNeg = 1;
3363 zArg++;
3364 }else if( zArg[0]=='+' ){
3365 zArg++;
3366 }
drh348d19c2013-06-03 12:47:43 +00003367 if( zArg[0]=='0' && zArg[1]=='x' ){
3368 int x;
3369 zArg += 2;
3370 while( (x = hexDigitValue(zArg[0]))>=0 ){
3371 v = (v<<4) + x;
3372 zArg++;
3373 }
3374 }else{
3375 while( IsDigit(zArg[0]) ){
3376 v = v*10 + zArg[0] - '0';
3377 zArg++;
3378 }
drh7d9f3942013-04-03 01:26:54 +00003379 }
drhc2bed0a2013-05-24 11:57:50 +00003380 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00003381 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
3382 v *= aMult[i].iMult;
3383 break;
3384 }
3385 }
3386 return isNeg? -v : v;
3387}
3388
3389/*
drh348d19c2013-06-03 12:47:43 +00003390** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3391** for TRUE and FALSE. Return the integer value if appropriate.
3392*/
3393static int booleanValue(char *zArg){
3394 int i;
3395 if( zArg[0]=='0' && zArg[1]=='x' ){
3396 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3397 }else{
3398 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3399 }
3400 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3401 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3402 return 1;
3403 }
3404 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3405 return 0;
3406 }
mistachkinaae280e2015-12-31 19:06:24 +00003407 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00003408 zArg);
3409 return 0;
3410}
3411
3412/*
drh42f64e52012-04-04 16:56:23 +00003413** Close an output file, assuming it is not stderr or stdout
3414*/
3415static void output_file_close(FILE *f){
3416 if( f && f!=stdout && f!=stderr ) fclose(f);
3417}
3418
3419/*
3420** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00003421** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00003422** filename is "off".
3423*/
3424static FILE *output_file_open(const char *zFile){
3425 FILE *f;
3426 if( strcmp(zFile,"stdout")==0 ){
3427 f = stdout;
3428 }else if( strcmp(zFile, "stderr")==0 ){
3429 f = stderr;
3430 }else if( strcmp(zFile, "off")==0 ){
3431 f = 0;
3432 }else{
3433 f = fopen(zFile, "wb");
3434 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003435 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003436 }
3437 }
3438 return f;
3439}
3440
drhd12602a2016-12-07 15:49:02 +00003441#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00003442#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003443/*
3444** A routine for handling output from sqlite3_trace().
3445*/
drh4b363a52016-07-23 20:27:41 +00003446static int sql_trace_callback(
3447 unsigned mType,
3448 void *pArg,
3449 void *pP,
3450 void *pX
3451){
drh42f64e52012-04-04 16:56:23 +00003452 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00003453 UNUSED_PARAMETER(mType);
3454 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00003455 if( f ){
drh4b363a52016-07-23 20:27:41 +00003456 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00003457 int i = (int)strlen(z);
3458 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00003459 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00003460 }
drh4b363a52016-07-23 20:27:41 +00003461 return 0;
drh42f64e52012-04-04 16:56:23 +00003462}
drhc10b9da2016-11-20 17:59:59 +00003463#endif
3464#endif
drh42f64e52012-04-04 16:56:23 +00003465
3466/*
drhd8621b92012-04-17 09:09:33 +00003467** A no-op routine that runs with the ".breakpoint" doc-command. This is
3468** a useful spot to set a debugger breakpoint.
3469*/
3470static void test_breakpoint(void){
3471 static int nCall = 0;
3472 nCall++;
3473}
3474
3475/*
mistachkin636bf9f2014-07-19 20:15:16 +00003476** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00003477*/
mistachkin636bf9f2014-07-19 20:15:16 +00003478typedef struct ImportCtx ImportCtx;
3479struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00003480 const char *zFile; /* Name of the input file */
3481 FILE *in; /* Read the CSV text from this input stream */
3482 char *z; /* Accumulated text for a field */
3483 int n; /* Number of bytes in z */
3484 int nAlloc; /* Space allocated for z[] */
3485 int nLine; /* Current line number */
3486 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00003487 int cColSep; /* The column separator character. (Usually ",") */
3488 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00003489};
3490
3491/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00003492static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00003493 if( p->n+1>=p->nAlloc ){
3494 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00003495 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00003496 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003497 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00003498 exit(1);
3499 }
3500 }
3501 p->z[p->n++] = (char)c;
3502}
3503
3504/* Read a single field of CSV text. Compatible with rfc4180 and extended
3505** with the option of having a separator other than ",".
3506**
3507** + Input comes from p->in.
3508** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003509** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003510** + Use p->cSep as the column separator. The default is ",".
3511** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00003512** + Keep track of the line number in p->nLine.
3513** + Store the character that terminates the field in p->cTerm. Store
3514** EOF on end-of-file.
3515** + Report syntax errors on stderr
3516*/
mistachkin44723ce2015-03-21 02:22:37 +00003517static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003518 int c;
3519 int cSep = p->cColSep;
3520 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00003521 p->n = 0;
3522 c = fgetc(p->in);
3523 if( c==EOF || seenInterrupt ){
3524 p->cTerm = EOF;
3525 return 0;
3526 }
3527 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00003528 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00003529 int startLine = p->nLine;
3530 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00003531 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00003532 while( 1 ){
3533 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00003534 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00003535 if( c==cQuote ){
3536 if( pc==cQuote ){
3537 pc = 0;
3538 continue;
3539 }
3540 }
3541 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00003542 || (c==rSep && pc==cQuote)
3543 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00003544 || (c==EOF && pc==cQuote)
3545 ){
3546 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00003547 p->cTerm = c;
3548 break;
3549 }
3550 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00003551 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00003552 p->zFile, p->nLine, cQuote);
3553 }
3554 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00003555 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00003556 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00003557 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00003558 break;
3559 }
mistachkin636bf9f2014-07-19 20:15:16 +00003560 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00003561 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00003562 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00003563 }
drhdb95f682013-06-26 22:46:00 +00003564 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003565 while( c!=EOF && c!=cSep && c!=rSep ){
3566 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00003567 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00003568 }
mistachkin636bf9f2014-07-19 20:15:16 +00003569 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00003570 p->nLine++;
drh3852b682014-02-26 13:53:34 +00003571 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00003572 }
drhdb95f682013-06-26 22:46:00 +00003573 p->cTerm = c;
3574 }
drh8dd675e2013-07-12 21:09:24 +00003575 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00003576 return p->z;
3577}
3578
mistachkin636bf9f2014-07-19 20:15:16 +00003579/* Read a single field of ASCII delimited text.
3580**
3581** + Input comes from p->in.
3582** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003583** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003584** + Use p->cSep as the column separator. The default is "\x1F".
3585** + Use p->rSep as the row separator. The default is "\x1E".
3586** + Keep track of the row number in p->nLine.
3587** + Store the character that terminates the field in p->cTerm. Store
3588** EOF on end-of-file.
3589** + Report syntax errors on stderr
3590*/
mistachkin44723ce2015-03-21 02:22:37 +00003591static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003592 int c;
3593 int cSep = p->cColSep;
3594 int rSep = p->cRowSep;
3595 p->n = 0;
3596 c = fgetc(p->in);
3597 if( c==EOF || seenInterrupt ){
3598 p->cTerm = EOF;
3599 return 0;
3600 }
3601 while( c!=EOF && c!=cSep && c!=rSep ){
3602 import_append_char(p, c);
3603 c = fgetc(p->in);
3604 }
3605 if( c==rSep ){
3606 p->nLine++;
3607 }
3608 p->cTerm = c;
3609 if( p->z ) p->z[p->n] = 0;
3610 return p->z;
3611}
3612
drhdb95f682013-06-26 22:46:00 +00003613/*
drh4bbcf102014-02-06 02:46:08 +00003614** Try to transfer data for table zTable. If an error is seen while
3615** moving forward, try to go backwards. The backwards movement won't
3616** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00003617*/
mistachkine31ae902014-02-06 01:15:29 +00003618static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00003619 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003620 sqlite3 *newDb,
3621 const char *zTable
3622){
mistachkin1fe36bb2016-04-04 02:16:44 +00003623 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00003624 sqlite3_stmt *pInsert = 0;
3625 char *zQuery = 0;
3626 char *zInsert = 0;
3627 int rc;
3628 int i, j, n;
3629 int nTable = (int)strlen(zTable);
3630 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00003631 int cnt = 0;
3632 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00003633
3634 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
3635 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3636 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003637 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003638 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3639 zQuery);
3640 goto end_data_xfer;
3641 }
3642 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00003643 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00003644 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003645 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00003646 goto end_data_xfer;
3647 }
3648 sqlite3_snprintf(200+nTable,zInsert,
3649 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
3650 i = (int)strlen(zInsert);
3651 for(j=1; j<n; j++){
3652 memcpy(zInsert+i, ",?", 2);
3653 i += 2;
3654 }
3655 memcpy(zInsert+i, ");", 3);
3656 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
3657 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003658 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003659 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
3660 zQuery);
3661 goto end_data_xfer;
3662 }
3663 for(k=0; k<2; k++){
3664 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3665 for(i=0; i<n; i++){
3666 switch( sqlite3_column_type(pQuery, i) ){
3667 case SQLITE_NULL: {
3668 sqlite3_bind_null(pInsert, i+1);
3669 break;
3670 }
3671 case SQLITE_INTEGER: {
3672 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
3673 break;
3674 }
3675 case SQLITE_FLOAT: {
3676 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
3677 break;
3678 }
3679 case SQLITE_TEXT: {
3680 sqlite3_bind_text(pInsert, i+1,
3681 (const char*)sqlite3_column_text(pQuery,i),
3682 -1, SQLITE_STATIC);
3683 break;
3684 }
3685 case SQLITE_BLOB: {
3686 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
3687 sqlite3_column_bytes(pQuery,i),
3688 SQLITE_STATIC);
3689 break;
3690 }
3691 }
3692 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00003693 rc = sqlite3_step(pInsert);
3694 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00003695 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00003696 sqlite3_errmsg(newDb));
3697 }
drh3350ce92014-02-06 00:49:12 +00003698 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00003699 cnt++;
3700 if( (cnt%spinRate)==0 ){
3701 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
3702 fflush(stdout);
3703 }
drh3350ce92014-02-06 00:49:12 +00003704 } /* End while */
3705 if( rc==SQLITE_DONE ) break;
3706 sqlite3_finalize(pQuery);
3707 sqlite3_free(zQuery);
3708 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
3709 zTable);
3710 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3711 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003712 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00003713 break;
drh3350ce92014-02-06 00:49:12 +00003714 }
3715 } /* End for(k=0...) */
3716
3717end_data_xfer:
3718 sqlite3_finalize(pQuery);
3719 sqlite3_finalize(pInsert);
3720 sqlite3_free(zQuery);
3721 sqlite3_free(zInsert);
3722}
3723
3724
3725/*
3726** Try to transfer all rows of the schema that match zWhere. For
3727** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00003728** If an error is encountered while moving forward through the
3729** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00003730*/
mistachkine31ae902014-02-06 01:15:29 +00003731static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00003732 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003733 sqlite3 *newDb,
3734 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00003735 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00003736){
3737 sqlite3_stmt *pQuery = 0;
3738 char *zQuery = 0;
3739 int rc;
3740 const unsigned char *zName;
3741 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00003742 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00003743
3744 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3745 " WHERE %s", zWhere);
3746 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3747 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003748 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003749 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3750 zQuery);
3751 goto end_schema_xfer;
3752 }
3753 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3754 zName = sqlite3_column_text(pQuery, 0);
3755 zSql = sqlite3_column_text(pQuery, 1);
3756 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003757 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3758 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003759 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003760 sqlite3_free(zErrMsg);
3761 zErrMsg = 0;
3762 }
drh3350ce92014-02-06 00:49:12 +00003763 if( xForEach ){
3764 xForEach(p, newDb, (const char*)zName);
3765 }
3766 printf("done\n");
3767 }
3768 if( rc!=SQLITE_DONE ){
3769 sqlite3_finalize(pQuery);
3770 sqlite3_free(zQuery);
3771 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3772 " WHERE %s ORDER BY rowid DESC", zWhere);
3773 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3774 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003775 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003776 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3777 zQuery);
3778 goto end_schema_xfer;
3779 }
3780 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3781 zName = sqlite3_column_text(pQuery, 0);
3782 zSql = sqlite3_column_text(pQuery, 1);
3783 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003784 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3785 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003786 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003787 sqlite3_free(zErrMsg);
3788 zErrMsg = 0;
3789 }
drh3350ce92014-02-06 00:49:12 +00003790 if( xForEach ){
3791 xForEach(p, newDb, (const char*)zName);
3792 }
3793 printf("done\n");
3794 }
3795 }
3796end_schema_xfer:
3797 sqlite3_finalize(pQuery);
3798 sqlite3_free(zQuery);
3799}
3800
3801/*
3802** Open a new database file named "zNewDb". Try to recover as much information
3803** as possible out of the main database (which might be corrupt) and write it
3804** into zNewDb.
3805*/
drhdcd87a92014-08-18 13:45:42 +00003806static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00003807 int rc;
3808 sqlite3 *newDb = 0;
3809 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003810 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00003811 return;
3812 }
3813 rc = sqlite3_open(zNewDb, &newDb);
3814 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003815 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00003816 sqlite3_errmsg(newDb));
3817 }else{
drh54d0d2d2014-04-03 00:32:13 +00003818 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003819 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00003820 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
3821 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00003822 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00003823 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003824 }
3825 sqlite3_close(newDb);
3826}
3827
3828/*
drhc2ce0be2014-05-29 12:36:14 +00003829** Change the output file back to stdout
3830*/
drhdcd87a92014-08-18 13:45:42 +00003831static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00003832 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003833#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00003834 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00003835#endif
drhc2ce0be2014-05-29 12:36:14 +00003836 }else{
3837 output_file_close(p->out);
3838 }
3839 p->outfile[0] = 0;
3840 p->out = stdout;
3841}
3842
3843/*
drhf7502f02015-02-06 14:19:44 +00003844** Run an SQL command and return the single integer result.
3845*/
3846static int db_int(ShellState *p, const char *zSql){
3847 sqlite3_stmt *pStmt;
3848 int res = 0;
3849 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3850 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
3851 res = sqlite3_column_int(pStmt,0);
3852 }
3853 sqlite3_finalize(pStmt);
3854 return res;
3855}
3856
3857/*
3858** Convert a 2-byte or 4-byte big-endian integer into a native integer
3859*/
drha0620ac2016-07-13 13:05:13 +00003860static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003861 return (a[0]<<8) + a[1];
3862}
drha0620ac2016-07-13 13:05:13 +00003863static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003864 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
3865}
3866
3867/*
3868** Implementation of the ".info" command.
3869**
3870** Return 1 on error, 2 to exit, and 0 otherwise.
3871*/
drh0e55db12015-02-06 14:51:13 +00003872static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00003873 static const struct { const char *zName; int ofst; } aField[] = {
3874 { "file change counter:", 24 },
3875 { "database page count:", 28 },
3876 { "freelist page count:", 36 },
3877 { "schema cookie:", 40 },
3878 { "schema format:", 44 },
3879 { "default cache size:", 48 },
3880 { "autovacuum top root:", 52 },
3881 { "incremental vacuum:", 64 },
3882 { "text encoding:", 56 },
3883 { "user version:", 60 },
3884 { "application id:", 68 },
3885 { "software version:", 96 },
3886 };
drh0e55db12015-02-06 14:51:13 +00003887 static const struct { const char *zName; const char *zSql; } aQuery[] = {
3888 { "number of tables:",
3889 "SELECT count(*) FROM %s WHERE type='table'" },
3890 { "number of indexes:",
3891 "SELECT count(*) FROM %s WHERE type='index'" },
3892 { "number of triggers:",
3893 "SELECT count(*) FROM %s WHERE type='trigger'" },
3894 { "number of views:",
3895 "SELECT count(*) FROM %s WHERE type='view'" },
3896 { "schema size:",
3897 "SELECT total(length(sql)) FROM %s" },
3898 };
mistachkinbfe8bd52015-11-17 19:17:14 +00003899 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00003900 int i;
3901 char *zSchemaTab;
3902 char *zDb = nArg>=2 ? azArg[1] : "main";
3903 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00003904 open_db(p, 0);
3905 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00003906 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00003907 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
3908 return 1;
3909 }
3910 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
3911 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003912 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00003913 return 1;
3914 }
3915 i = get2byteInt(aHdr+16);
3916 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00003917 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
3918 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
3919 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
3920 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00003921 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00003922 int ofst = aField[i].ofst;
3923 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00003924 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00003925 switch( ofst ){
3926 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00003927 if( val==1 ) raw_printf(p->out, " (utf8)");
3928 if( val==2 ) raw_printf(p->out, " (utf16le)");
3929 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00003930 }
3931 }
mistachkinaae280e2015-12-31 19:06:24 +00003932 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00003933 }
drh0e55db12015-02-06 14:51:13 +00003934 if( zDb==0 ){
3935 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
3936 }else if( strcmp(zDb,"temp")==0 ){
3937 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
3938 }else{
3939 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
3940 }
drhf5ed7ad2015-06-15 14:43:25 +00003941 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00003942 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
3943 int val = db_int(p, zSql);
3944 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00003945 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00003946 }
3947 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00003948 return 0;
3949}
3950
dand95bb392015-09-30 11:19:05 +00003951/*
3952** Print the current sqlite3_errmsg() value to stderr and return 1.
3953*/
3954static int shellDatabaseError(sqlite3 *db){
3955 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00003956 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00003957 return 1;
3958}
3959
3960/*
3961** Print an out-of-memory message to stderr and return 1.
3962*/
3963static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00003964 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00003965 return 1;
3966}
drhf7502f02015-02-06 14:19:44 +00003967
drh2db82112016-09-15 21:35:24 +00003968/*
3969** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
3970** if they match and FALSE (0) if they do not match.
3971**
3972** Globbing rules:
3973**
3974** '*' Matches any sequence of zero or more characters.
3975**
3976** '?' Matches exactly one character.
3977**
3978** [...] Matches one character from the enclosed list of
3979** characters.
3980**
3981** [^...] Matches one character not in the enclosed list.
3982**
3983** '#' Matches any sequence of one or more digits with an
3984** optional + or - sign in front
3985**
3986** ' ' Any span of whitespace matches any other span of
3987** whitespace.
3988**
3989** Extra whitespace at the end of z[] is ignored.
3990*/
3991static int testcase_glob(const char *zGlob, const char *z){
3992 int c, c2;
3993 int invert;
3994 int seen;
3995
3996 while( (c = (*(zGlob++)))!=0 ){
3997 if( IsSpace(c) ){
3998 if( !IsSpace(*z) ) return 0;
3999 while( IsSpace(*zGlob) ) zGlob++;
4000 while( IsSpace(*z) ) z++;
4001 }else if( c=='*' ){
4002 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4003 if( c=='?' && (*(z++))==0 ) return 0;
4004 }
4005 if( c==0 ){
4006 return 1;
4007 }else if( c=='[' ){
4008 while( *z && testcase_glob(zGlob-1,z)==0 ){
4009 z++;
4010 }
4011 return (*z)!=0;
4012 }
4013 while( (c2 = (*(z++)))!=0 ){
4014 while( c2!=c ){
4015 c2 = *(z++);
4016 if( c2==0 ) return 0;
4017 }
4018 if( testcase_glob(zGlob,z) ) return 1;
4019 }
4020 return 0;
4021 }else if( c=='?' ){
4022 if( (*(z++))==0 ) return 0;
4023 }else if( c=='[' ){
4024 int prior_c = 0;
4025 seen = 0;
4026 invert = 0;
4027 c = *(z++);
4028 if( c==0 ) return 0;
4029 c2 = *(zGlob++);
4030 if( c2=='^' ){
4031 invert = 1;
4032 c2 = *(zGlob++);
4033 }
4034 if( c2==']' ){
4035 if( c==']' ) seen = 1;
4036 c2 = *(zGlob++);
4037 }
4038 while( c2 && c2!=']' ){
4039 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4040 c2 = *(zGlob++);
4041 if( c>=prior_c && c<=c2 ) seen = 1;
4042 prior_c = 0;
4043 }else{
4044 if( c==c2 ){
4045 seen = 1;
4046 }
4047 prior_c = c2;
4048 }
4049 c2 = *(zGlob++);
4050 }
4051 if( c2==0 || (seen ^ invert)==0 ) return 0;
4052 }else if( c=='#' ){
4053 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4054 if( !IsDigit(z[0]) ) return 0;
4055 z++;
4056 while( IsDigit(z[0]) ){ z++; }
4057 }else{
4058 if( c!=(*(z++)) ) return 0;
4059 }
4060 }
4061 while( IsSpace(*z) ){ z++; }
4062 return *z==0;
4063}
drh2db82112016-09-15 21:35:24 +00004064
4065
drhf7502f02015-02-06 14:19:44 +00004066/*
drh4926fec2016-04-13 15:33:42 +00004067** Compare the string as a command-line option with either one or two
4068** initial "-" characters.
4069*/
4070static int optionMatch(const char *zStr, const char *zOpt){
4071 if( zStr[0]!='-' ) return 0;
4072 zStr++;
4073 if( zStr[0]=='-' ) zStr++;
4074 return strcmp(zStr, zOpt)==0;
4075}
4076
4077/*
drhcd0509e2016-09-16 00:26:08 +00004078** Delete a file.
4079*/
4080int shellDeleteFile(const char *zFilename){
4081 int rc;
4082#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00004083 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00004084 rc = _wunlink(z);
4085 sqlite3_free(z);
4086#else
4087 rc = unlink(zFilename);
4088#endif
4089 return rc;
4090}
4091
dan35ac58e2016-12-14 19:28:27 +00004092
dan35ac58e2016-12-14 19:28:27 +00004093/*
dandd9e0be2016-12-16 16:44:27 +00004094** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00004095** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00004096** called with four arguments - the parent table name, the parent column name,
4097** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00004098**
4099** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4100**
4101** If either of the named tables or columns do not exist, this function
4102** returns an empty string. An empty string is also returned if both tables
4103** and columns exist but have the same default collation sequence. Or,
4104** if both exist but the default collation sequences are different, this
4105** function returns the string " COLLATE <parent-collation>", where
4106** <parent-collation> is the default collation sequence of the parent column.
4107*/
4108static void shellFkeyCollateClause(
4109 sqlite3_context *pCtx,
4110 int nVal,
4111 sqlite3_value **apVal
4112){
4113 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4114 const char *zParent;
4115 const char *zParentCol;
4116 const char *zParentSeq;
4117 const char *zChild;
4118 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00004119 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00004120 int rc;
4121
4122 assert( nVal==4 );
4123 zParent = (const char*)sqlite3_value_text(apVal[0]);
4124 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4125 zChild = (const char*)sqlite3_value_text(apVal[2]);
4126 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4127
4128 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4129 rc = sqlite3_table_column_metadata(
4130 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4131 );
4132 if( rc==SQLITE_OK ){
4133 rc = sqlite3_table_column_metadata(
4134 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4135 );
4136 }
4137
4138 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4139 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4140 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4141 sqlite3_free(z);
4142 }
4143}
4144
4145
4146/*
dan3c7ebeb2016-12-16 17:28:56 +00004147** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00004148*/
dan3c7ebeb2016-12-16 17:28:56 +00004149static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00004150 ShellState *pState, /* Current shell tool state */
4151 char **azArg, /* Array of arguments passed to dot command */
4152 int nArg /* Number of entries in azArg[] */
4153){
dandd9e0be2016-12-16 16:44:27 +00004154 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4155 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00004156 int bVerbose = 0; /* If -verbose is present */
4157 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00004158 int i; /* To iterate through azArg[] */
4159 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4160 int rc; /* Return code */
4161 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00004162
dandd9e0be2016-12-16 16:44:27 +00004163 /*
4164 ** This SELECT statement returns one row for each foreign key constraint
4165 ** in the schema of the main database. The column values are:
4166 **
4167 ** 0. The text of an SQL statement similar to:
4168 **
4169 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
4170 **
4171 ** This is the same SELECT that the foreign keys implementation needs
4172 ** to run internally on child tables. If there is an index that can
4173 ** be used to optimize this query, then it can also be used by the FK
4174 ** implementation to optimize DELETE or UPDATE statements on the parent
4175 ** table.
4176 **
4177 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4178 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4179 ** contains an index that can be used to optimize the query.
4180 **
4181 ** 2. Human readable text that describes the child table and columns. e.g.
4182 **
4183 ** "child_table(child_key1, child_key2)"
4184 **
4185 ** 3. Human readable text that describes the parent table and columns. e.g.
4186 **
4187 ** "parent_table(parent_key1, parent_key2)"
4188 **
4189 ** 4. A full CREATE INDEX statement for an index that could be used to
4190 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4191 **
4192 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4193 **
4194 ** 5. The name of the parent table.
4195 **
4196 ** These six values are used by the C logic below to generate the report.
4197 */
dan35ac58e2016-12-14 19:28:27 +00004198 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00004199 "SELECT "
4200 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
4201 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4202 " || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00004203 ", "
dandd9e0be2016-12-16 16:44:27 +00004204 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00004205 " || group_concat('*=?', ' AND ') || ')'"
4206 ", "
dandd9e0be2016-12-16 16:44:27 +00004207 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00004208 ", "
dandd9e0be2016-12-16 16:44:27 +00004209 " f.[table] || '(' || group_concat(COALESCE(f.[to], "
4210 " (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)"
dan35ac58e2016-12-14 19:28:27 +00004211 " )) || ')'"
4212 ", "
dandd9e0be2016-12-16 16:44:27 +00004213 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4214 " || ' ON ' || quote(s.name) || '('"
4215 " || group_concat(quote(f.[from]) ||"
4216 " fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00004217 " || ');'"
danf9647b62016-12-15 06:01:40 +00004218 ", "
dandd9e0be2016-12-16 16:44:27 +00004219 " f.[table] "
dan35ac58e2016-12-14 19:28:27 +00004220
dandd9e0be2016-12-16 16:44:27 +00004221 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4222 "GROUP BY s.name, f.id "
4223 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00004224 ;
4225
dan3c7ebeb2016-12-16 17:28:56 +00004226 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00004227 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00004228 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4229 bVerbose = 1;
4230 }
4231 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4232 bGroupByParent = 1;
4233 zIndent = " ";
4234 }
4235 else{
dan3c7ebeb2016-12-16 17:28:56 +00004236 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4237 azArg[0], azArg[1]
4238 );
danf9647b62016-12-15 06:01:40 +00004239 return SQLITE_ERROR;
4240 }
dan35ac58e2016-12-14 19:28:27 +00004241 }
dan35ac58e2016-12-14 19:28:27 +00004242
4243 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00004244 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4245 0, shellFkeyCollateClause, 0, 0
4246 );
dan35ac58e2016-12-14 19:28:27 +00004247
4248
4249 if( rc==SQLITE_OK ){
4250 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4251 }
danf9647b62016-12-15 06:01:40 +00004252 if( rc==SQLITE_OK ){
4253 sqlite3_bind_int(pSql, 1, bGroupByParent);
4254 }
dan35ac58e2016-12-14 19:28:27 +00004255
4256 if( rc==SQLITE_OK ){
4257 int rc2;
danf9647b62016-12-15 06:01:40 +00004258 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00004259 while( SQLITE_ROW==sqlite3_step(pSql) ){
4260 int res = -1;
4261 sqlite3_stmt *pExplain = 0;
4262 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4263 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4264 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4265 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4266 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00004267 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00004268
4269 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4270 if( rc!=SQLITE_OK ) break;
4271 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4272 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4273 res = (0==sqlite3_strglob(zGlob, zPlan));
4274 }
4275 rc = sqlite3_finalize(pExplain);
4276 if( rc!=SQLITE_OK ) break;
4277
4278 if( res<0 ){
4279 raw_printf(stderr, "Error: internal error");
4280 break;
danf9647b62016-12-15 06:01:40 +00004281 }else{
4282 if( bGroupByParent
4283 && (bVerbose || res==0)
4284 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4285 ){
4286 raw_printf(out, "-- Parent table %s\n", zParent);
4287 sqlite3_free(zPrev);
4288 zPrev = sqlite3_mprintf("%s", zParent);
4289 }
4290
4291 if( res==0 ){
4292 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4293 }else if( bVerbose ){
4294 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4295 zIndent, zFrom, zTarget
4296 );
4297 }
dan35ac58e2016-12-14 19:28:27 +00004298 }
4299 }
danf9647b62016-12-15 06:01:40 +00004300 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00004301
4302 if( rc!=SQLITE_OK ){
4303 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4304 }
4305
4306 rc2 = sqlite3_finalize(pSql);
4307 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4308 rc = rc2;
4309 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4310 }
4311 }else{
4312 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4313 }
4314
4315 return rc;
4316}
dan3c7ebeb2016-12-16 17:28:56 +00004317
dan35ac58e2016-12-14 19:28:27 +00004318/*
dan3c7ebeb2016-12-16 17:28:56 +00004319** Implementation of ".lint" dot command.
4320*/
4321static int lintDotCommand(
4322 ShellState *pState, /* Current shell tool state */
4323 char **azArg, /* Array of arguments passed to dot command */
4324 int nArg /* Number of entries in azArg[] */
4325){
4326 int n;
drh96ada592016-12-29 19:48:46 +00004327 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00004328 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4329 return lintFkeyIndexes(pState, azArg, nArg);
4330
4331 usage:
4332 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4333 raw_printf(stderr, "Where sub-commands are:\n");
4334 raw_printf(stderr, " fkey-indexes\n");
4335 return SQLITE_ERROR;
4336}
4337
dan35ac58e2016-12-14 19:28:27 +00004338
drhcd0509e2016-09-16 00:26:08 +00004339/*
drh75897232000-05-29 14:26:00 +00004340** If an input line begins with "." then invoke this routine to
4341** process that line.
drh67505e72002-04-19 12:34:06 +00004342**
drh47ad6842006-11-08 12:25:42 +00004343** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00004344*/
drhdcd87a92014-08-18 13:45:42 +00004345static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00004346 int h = 1;
drh75897232000-05-29 14:26:00 +00004347 int nArg = 0;
4348 int n, c;
drh67505e72002-04-19 12:34:06 +00004349 int rc = 0;
drh75897232000-05-29 14:26:00 +00004350 char *azArg[50];
4351
4352 /* Parse the input line into tokens.
4353 */
mistachkin8e189222015-04-19 21:43:16 +00004354 while( zLine[h] && nArg<ArraySize(azArg) ){
4355 while( IsSpace(zLine[h]) ){ h++; }
4356 if( zLine[h]==0 ) break;
4357 if( zLine[h]=='\'' || zLine[h]=='"' ){
4358 int delim = zLine[h++];
4359 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00004360 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00004361 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00004362 h++;
drh4c56b992013-06-27 13:26:55 +00004363 }
mistachkin8e189222015-04-19 21:43:16 +00004364 if( zLine[h]==delim ){
4365 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00004366 }
drhfeac5f82004-08-01 00:10:45 +00004367 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004368 }else{
mistachkin8e189222015-04-19 21:43:16 +00004369 azArg[nArg++] = &zLine[h];
4370 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
4371 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00004372 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004373 }
4374 }
4375
4376 /* Process the input line.
4377 */
shane9bd1b442009-10-23 01:27:39 +00004378 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00004379 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00004380 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00004381
drha0daa752016-09-16 11:53:10 +00004382#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00004383 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
4384 if( nArg!=2 ){
4385 raw_printf(stderr, "Usage: .auth ON|OFF\n");
4386 rc = 1;
4387 goto meta_command_exit;
4388 }
4389 open_db(p, 0);
4390 if( booleanValue(azArg[1]) ){
4391 sqlite3_set_authorizer(p->db, shellAuth, p);
4392 }else{
4393 sqlite3_set_authorizer(p->db, 0, 0);
4394 }
4395 }else
drha0daa752016-09-16 11:53:10 +00004396#endif
drhde613c62016-04-04 17:23:10 +00004397
drh5c7976f2014-02-10 19:59:27 +00004398 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
4399 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
4400 ){
drhbc46f022013-01-23 18:53:23 +00004401 const char *zDestFile = 0;
4402 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00004403 sqlite3 *pDest;
4404 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00004405 int j;
4406 for(j=1; j<nArg; j++){
4407 const char *z = azArg[j];
4408 if( z[0]=='-' ){
4409 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00004410 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00004411 {
mistachkinaae280e2015-12-31 19:06:24 +00004412 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00004413 return 1;
4414 }
4415 }else if( zDestFile==0 ){
4416 zDestFile = azArg[j];
4417 }else if( zDb==0 ){
4418 zDb = zDestFile;
4419 zDestFile = azArg[j];
4420 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004421 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00004422 return 1;
4423 }
drh9ff849f2009-02-04 20:55:57 +00004424 }
drhbc46f022013-01-23 18:53:23 +00004425 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004426 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00004427 return 1;
4428 }
4429 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00004430 rc = sqlite3_open(zDestFile, &pDest);
4431 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004432 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00004433 sqlite3_close(pDest);
4434 return 1;
4435 }
drh05782482013-10-24 15:20:20 +00004436 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00004437 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
4438 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004439 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00004440 sqlite3_close(pDest);
4441 return 1;
4442 }
4443 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
4444 sqlite3_backup_finish(pBackup);
4445 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00004446 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00004447 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004448 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00004449 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00004450 }
4451 sqlite3_close(pDest);
4452 }else
4453
drhc2ce0be2014-05-29 12:36:14 +00004454 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
4455 if( nArg==2 ){
4456 bail_on_error = booleanValue(azArg[1]);
4457 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004458 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004459 rc = 1;
4460 }
drhc49f44e2006-10-26 18:15:42 +00004461 }else
4462
mistachkinf21979d2015-01-18 05:35:01 +00004463 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
4464 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00004465 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004466 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004467 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00004468 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004469 }
mistachkinf21979d2015-01-18 05:35:01 +00004470 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004471 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00004472 rc = 1;
4473 }
4474 }else
4475
drhd8621b92012-04-17 09:09:33 +00004476 /* The undocumented ".breakpoint" command causes a call to the no-op
4477 ** routine named test_breakpoint().
4478 */
4479 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
4480 test_breakpoint();
4481 }else
4482
drhdf12f1c2015-12-07 21:46:19 +00004483 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
4484 if( nArg==2 ){
4485 p->countChanges = booleanValue(azArg[1]);
4486 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004487 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00004488 rc = 1;
4489 }
4490 }else
4491
drh2db82112016-09-15 21:35:24 +00004492 /* Cancel output redirection, if it is currently set (by .testcase)
4493 ** Then read the content of the testcase-out.txt file and compare against
4494 ** azArg[1]. If there are differences, report an error and exit.
4495 */
4496 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
4497 char *zRes = 0;
4498 output_reset(p);
4499 if( nArg!=2 ){
4500 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00004501 rc = 2;
dan11da0022016-12-17 08:18:05 +00004502 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00004503 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
4504 rc = 2;
4505 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00004506 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00004507 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
4508 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00004509 rc = 2;
drh760c8162016-09-16 02:52:22 +00004510 }else{
mistachkin8145fc62016-09-16 20:39:21 +00004511 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00004512 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00004513 }
4514 sqlite3_free(zRes);
4515 }else
drh2db82112016-09-15 21:35:24 +00004516
drhc2ce0be2014-05-29 12:36:14 +00004517 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
4518 if( nArg==2 ){
4519 tryToClone(p, azArg[1]);
4520 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004521 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00004522 rc = 1;
4523 }
mistachkine31ae902014-02-06 01:15:29 +00004524 }else
4525
drhc2ce0be2014-05-29 12:36:14 +00004526 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004527 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00004528 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00004529 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00004530 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00004531 data.showHeader = 0;
4532 data.cMode = data.mode = MODE_List;
4533 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00004534 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00004535 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
4536 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00004537 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004538 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004539 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00004540 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00004541 }
4542 }else
4543
drh0e55db12015-02-06 14:51:13 +00004544 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
4545 rc = shell_dbinfo_command(p, nArg, azArg);
4546 }else
4547
drhc2ce0be2014-05-29 12:36:14 +00004548 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00004549 const char *zLike = 0;
4550 int i;
4551 p->preserveRowid = 0;
4552 for(i=1; i<nArg; i++){
4553 if( azArg[i][0]=='-' ){
4554 const char *z = azArg[i]+1;
4555 if( z[0]=='-' ) z++;
4556 if( strcmp(z,"preserve-rowids")==0 ){
4557 p->preserveRowid = 1;
4558 }else
4559 {
4560 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
4561 rc = 1;
4562 goto meta_command_exit;
4563 }
4564 }else if( zLike ){
4565 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? ?LIKE-PATTERN?\n");
4566 rc = 1;
4567 goto meta_command_exit;
4568 }else{
4569 zLike = azArg[i];
4570 }
4571 }
drh05782482013-10-24 15:20:20 +00004572 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00004573 /* When playing back a "dump", the content might appear in an order
4574 ** which causes immediate foreign key constraints to be violated.
4575 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00004576 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
4577 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00004578 p->writableSchema = 0;
drhe611f142017-03-08 11:44:00 +00004579 /* Set writable_schema=ON since doing so forces SQLite to initialize
4580 ** as much of the schema as it can even if the sqlite_master table is
4581 ** corrupt. */
drh56197952011-10-13 16:30:13 +00004582 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00004583 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00004584 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004585 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00004586 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004587 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00004588 );
mistachkin1fe36bb2016-04-04 02:16:44 +00004589 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00004590 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004591 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00004592 );
drh2f464a02011-10-13 00:41:49 +00004593 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00004594 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00004595 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00004596 );
drh4c653a02000-06-07 01:27:47 +00004597 }else{
drhe611f142017-03-08 11:44:00 +00004598 char *zSql;
4599 zSql = sqlite3_mprintf(
4600 "SELECT name, type, sql FROM sqlite_master "
4601 "WHERE tbl_name LIKE %Q AND type=='table'"
4602 " AND sql NOT NULL", zLike);
4603 run_schema_dump_query(p,zSql);
4604 sqlite3_free(zSql);
4605 zSql = sqlite3_mprintf(
4606 "SELECT sql FROM sqlite_master "
4607 "WHERE sql NOT NULL"
4608 " AND type IN ('index','trigger','view')"
4609 " AND tbl_name LIKE %Q", zLike);
4610 run_table_dump_query(p, zSql, 0);
4611 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00004612 }
drh45e29d82006-11-20 16:21:10 +00004613 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00004614 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00004615 p->writableSchema = 0;
4616 }
drh56197952011-10-13 16:30:13 +00004617 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4618 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00004619 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00004620 }else
drh75897232000-05-29 14:26:00 +00004621
drhc2ce0be2014-05-29 12:36:14 +00004622 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
4623 if( nArg==2 ){
4624 p->echoOn = booleanValue(azArg[1]);
4625 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004626 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004627 rc = 1;
4628 }
drhdaffd0e2001-04-11 14:28:42 +00004629 }else
4630
drhc2ce0be2014-05-29 12:36:14 +00004631 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
4632 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00004633 if( strcmp(azArg[1],"full")==0 ){
4634 p->autoEQP = 2;
4635 }else{
4636 p->autoEQP = booleanValue(azArg[1]);
4637 }
drhc2ce0be2014-05-29 12:36:14 +00004638 }else{
drheacd29d2016-04-15 15:03:27 +00004639 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00004640 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00004641 }
drhefbf3b12014-02-28 20:47:24 +00004642 }else
4643
drhd3ac7d92013-01-25 18:33:43 +00004644 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00004645 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00004646 rc = 2;
drh75897232000-05-29 14:26:00 +00004647 }else
4648
drhc2ce0be2014-05-29 12:36:14 +00004649 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00004650 int val = 1;
4651 if( nArg>=2 ){
4652 if( strcmp(azArg[1],"auto")==0 ){
4653 val = 99;
4654 }else{
4655 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00004656 }
drh700c2522016-02-09 18:39:25 +00004657 }
4658 if( val==1 && p->mode!=MODE_Explain ){
4659 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00004660 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00004661 p->autoExplain = 0;
4662 }else if( val==0 ){
4663 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4664 p->autoExplain = 0;
4665 }else if( val==99 ){
4666 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4667 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00004668 }
drh75897232000-05-29 14:26:00 +00004669 }else
4670
drhc1971542014-06-23 23:28:13 +00004671 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004672 ShellState data;
drhc1971542014-06-23 23:28:13 +00004673 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00004674 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00004675 memcpy(&data, p, sizeof(data));
4676 data.showHeader = 0;
4677 data.cMode = data.mode = MODE_Semi;
4678 if( nArg==2 && optionMatch(azArg[1], "indent") ){
4679 data.cMode = data.mode = MODE_Pretty;
4680 nArg = 1;
4681 }
drhc1971542014-06-23 23:28:13 +00004682 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00004683 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00004684 rc = 1;
4685 goto meta_command_exit;
4686 }
4687 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00004688 rc = sqlite3_exec(p->db,
4689 "SELECT sql FROM"
4690 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4691 " FROM sqlite_master UNION ALL"
4692 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00004693 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00004694 "ORDER BY rowid",
4695 callback, &data, &zErrMsg
4696 );
drh56f674c2014-07-18 14:43:29 +00004697 if( rc==SQLITE_OK ){
4698 sqlite3_stmt *pStmt;
4699 rc = sqlite3_prepare_v2(p->db,
4700 "SELECT rowid FROM sqlite_master"
4701 " WHERE name GLOB 'sqlite_stat[134]'",
4702 -1, &pStmt, 0);
4703 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
4704 sqlite3_finalize(pStmt);
4705 }
4706 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004707 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00004708 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004709 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004710 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
4711 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00004712 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00004713 data.zDestTable = "sqlite_stat1";
4714 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
4715 shell_callback, &data,&zErrMsg);
4716 data.zDestTable = "sqlite_stat3";
4717 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
4718 shell_callback, &data,&zErrMsg);
4719 data.zDestTable = "sqlite_stat4";
4720 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
4721 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00004722 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004723 }
drhc1971542014-06-23 23:28:13 +00004724 }else
4725
drhc2ce0be2014-05-29 12:36:14 +00004726 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
4727 if( nArg==2 ){
4728 p->showHeader = booleanValue(azArg[1]);
4729 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004730 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004731 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00004732 }
drh75897232000-05-29 14:26:00 +00004733 }else
4734
drhc2ce0be2014-05-29 12:36:14 +00004735 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004736 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00004737 }else
4738
4739 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00004740 char *zTable; /* Insert data into this table */
4741 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00004742 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00004743 int nCol; /* Number of columns in the table */
4744 int nByte; /* Number of bytes in an SQL string */
4745 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00004746 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00004747 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00004748 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00004749 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00004750 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
4751 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00004752
drhc2ce0be2014-05-29 12:36:14 +00004753 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004754 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00004755 goto meta_command_exit;
4756 }
drh01f37542014-05-31 15:43:33 +00004757 zFile = azArg[1];
4758 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00004759 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00004760 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00004761 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004762 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00004763 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004764 raw_printf(stderr,
4765 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00004766 return 1;
drhfeac5f82004-08-01 00:10:45 +00004767 }
drhdb95f682013-06-26 22:46:00 +00004768 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004769 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00004770 " for import\n");
4771 return 1;
4772 }
mistachkin636bf9f2014-07-19 20:15:16 +00004773 nSep = strlen30(p->rowSeparator);
4774 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004775 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004776 return 1;
4777 }
mistachkine0d68852014-12-11 03:12:33 +00004778 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
4779 /* When importing CSV (only), if the row separator is set to the
4780 ** default output row separator, change it to the default input
4781 ** row separator. This avoids having to maintain different input
4782 ** and output row separators. */
4783 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4784 nSep = strlen30(p->rowSeparator);
4785 }
mistachkin636bf9f2014-07-19 20:15:16 +00004786 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004787 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00004788 " for import\n");
4789 return 1;
4790 }
4791 sCtx.zFile = zFile;
4792 sCtx.nLine = 1;
4793 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004794#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00004795 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00004796 return 1;
4797#else
mistachkin636bf9f2014-07-19 20:15:16 +00004798 sCtx.in = popen(sCtx.zFile+1, "r");
4799 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00004800 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00004801#endif
drh5bde8162013-06-27 14:07:53 +00004802 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00004803 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00004804 xCloser = fclose;
4805 }
mistachkin636bf9f2014-07-19 20:15:16 +00004806 if( p->mode==MODE_Ascii ){
4807 xRead = ascii_read_one_field;
4808 }else{
4809 xRead = csv_read_one_field;
4810 }
4811 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004812 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00004813 return 1;
4814 }
mistachkin636bf9f2014-07-19 20:15:16 +00004815 sCtx.cColSep = p->colSeparator[0];
4816 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00004817 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00004818 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004819 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004820 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004821 return 1;
4822 }
drh4f21c4a2008-12-10 22:15:00 +00004823 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00004824 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004825 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00004826 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00004827 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
4828 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00004829 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00004830 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00004831 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00004832 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00004833 }
drh5bde8162013-06-27 14:07:53 +00004834 if( cSep=='(' ){
4835 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00004836 sqlite3_free(sCtx.z);
4837 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00004838 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00004839 return 1;
4840 }
drhdb95f682013-06-26 22:46:00 +00004841 zCreate = sqlite3_mprintf("%z\n)", zCreate);
4842 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
4843 sqlite3_free(zCreate);
4844 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004845 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00004846 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004847 sqlite3_free(sCtx.z);
4848 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00004849 return 1;
4850 }
drhc7181902014-02-27 15:04:13 +00004851 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004852 }
drhfeac5f82004-08-01 00:10:45 +00004853 sqlite3_free(zSql);
4854 if( rc ){
shane916f9612009-10-23 00:37:15 +00004855 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00004856 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004857 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004858 return 1;
drhfeac5f82004-08-01 00:10:45 +00004859 }
shane916f9612009-10-23 00:37:15 +00004860 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00004861 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00004862 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00004863 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00004864 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00004865 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004866 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004867 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004868 return 1;
4869 }
drhdb95f682013-06-26 22:46:00 +00004870 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00004871 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00004872 for(i=1; i<nCol; i++){
4873 zSql[j++] = ',';
4874 zSql[j++] = '?';
4875 }
4876 zSql[j++] = ')';
4877 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00004878 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004879 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00004880 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004881 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00004882 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00004883 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00004884 return 1;
drhfeac5f82004-08-01 00:10:45 +00004885 }
mistachkin8e189222015-04-19 21:43:16 +00004886 needCommit = sqlite3_get_autocommit(p->db);
4887 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00004888 do{
mistachkin636bf9f2014-07-19 20:15:16 +00004889 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00004890 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00004891 char *z = xRead(&sCtx);
4892 /*
4893 ** Did we reach end-of-file before finding any columns?
4894 ** If so, stop instead of NULL filling the remaining columns.
4895 */
drhdb95f682013-06-26 22:46:00 +00004896 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00004897 /*
4898 ** Did we reach end-of-file OR end-of-line before finding any
4899 ** columns in ASCII mode? If so, stop instead of NULL filling
4900 ** the remaining columns.
4901 */
4902 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00004903 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00004904 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00004905 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00004906 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00004907 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00004908 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00004909 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00004910 }
drhfeac5f82004-08-01 00:10:45 +00004911 }
mistachkin636bf9f2014-07-19 20:15:16 +00004912 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00004913 do{
mistachkin636bf9f2014-07-19 20:15:16 +00004914 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00004915 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00004916 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00004917 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00004918 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00004919 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00004920 }
drhdb95f682013-06-26 22:46:00 +00004921 if( i>=nCol ){
4922 sqlite3_step(pStmt);
4923 rc = sqlite3_reset(pStmt);
4924 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004925 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
4926 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00004927 }
4928 }
mistachkin636bf9f2014-07-19 20:15:16 +00004929 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00004930
mistachkin636bf9f2014-07-19 20:15:16 +00004931 xCloser(sCtx.in);
4932 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00004933 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00004934 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00004935 }else
4936
drhd12602a2016-12-07 15:49:02 +00004937#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00004938 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
4939 char *zSql;
4940 char *zCollist = 0;
4941 sqlite3_stmt *pStmt;
4942 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00004943 int i;
drh16eb5942016-11-03 13:01:38 +00004944 if( nArg!=3 ){
4945 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
4946 rc = 1;
4947 goto meta_command_exit;
4948 }
4949 open_db(p, 0);
4950 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
4951 " WHERE name='%q' AND type='index'", azArg[1]);
4952 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4953 sqlite3_free(zSql);
4954 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4955 tnum = sqlite3_column_int(pStmt, 0);
4956 }
4957 sqlite3_finalize(pStmt);
4958 if( tnum==0 ){
4959 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
4960 rc = 1;
4961 goto meta_command_exit;
4962 }
4963 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
4964 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4965 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00004966 i = 0;
drh16eb5942016-11-03 13:01:38 +00004967 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00004968 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00004969 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00004970 i++;
4971 if( zCol==0 ){
4972 if( sqlite3_column_int(pStmt,1)==-1 ){
4973 zCol = "_ROWID_";
4974 }else{
4975 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
4976 zCol = zLabel;
4977 }
4978 }
drh16eb5942016-11-03 13:01:38 +00004979 if( zCollist==0 ){
4980 zCollist = sqlite3_mprintf("\"%w\"", zCol);
4981 }else{
4982 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
4983 }
4984 }
4985 sqlite3_finalize(pStmt);
4986 zSql = sqlite3_mprintf(
4987 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
4988 azArg[2], zCollist, zCollist);
4989 sqlite3_free(zCollist);
4990 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
4991 if( rc==SQLITE_OK ){
4992 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
4993 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
4994 if( rc ){
4995 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
4996 }else{
4997 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00004998 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00004999 "WARNING: writing to an imposter table will corrupt the index!\n"
5000 );
5001 }
5002 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00005003 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00005004 rc = 1;
5005 }
5006 sqlite3_free(zSql);
5007 }else
5008#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
5009
drhae5e4452007-05-03 17:18:36 +00005010#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00005011 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00005012 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00005013 if( iotrace && iotrace!=stdout ) fclose(iotrace);
5014 iotrace = 0;
5015 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00005016 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00005017 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00005018 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005019 iotrace = stdout;
5020 }else{
5021 iotrace = fopen(azArg[1], "w");
5022 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005023 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00005024 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00005025 rc = 1;
drhb0603412007-02-28 04:47:26 +00005026 }else{
mlcreech3a00f902008-03-04 17:45:01 +00005027 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005028 }
5029 }
5030 }else
drhae5e4452007-05-03 17:18:36 +00005031#endif
drh16eb5942016-11-03 13:01:38 +00005032
drh1a513372015-05-02 17:40:23 +00005033 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
5034 static const struct {
5035 const char *zLimitName; /* Name of a limit */
5036 int limitCode; /* Integer code for that limit */
5037 } aLimit[] = {
5038 { "length", SQLITE_LIMIT_LENGTH },
5039 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
5040 { "column", SQLITE_LIMIT_COLUMN },
5041 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
5042 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
5043 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
5044 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
5045 { "attached", SQLITE_LIMIT_ATTACHED },
5046 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
5047 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
5048 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
5049 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
5050 };
5051 int i, n2;
5052 open_db(p, 0);
5053 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00005054 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005055 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00005056 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
5057 }
5058 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005059 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00005060 rc = 1;
5061 goto meta_command_exit;
5062 }else{
5063 int iLimit = -1;
5064 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00005065 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00005066 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
5067 if( iLimit<0 ){
5068 iLimit = i;
5069 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005070 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00005071 rc = 1;
5072 goto meta_command_exit;
5073 }
5074 }
5075 }
5076 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005077 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00005078 "enter \".limits\" with no arguments for a list.\n",
5079 azArg[1]);
5080 rc = 1;
5081 goto meta_command_exit;
5082 }
5083 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00005084 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
5085 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00005086 }
5087 printf("%20s %d\n", aLimit[iLimit].zLimitName,
5088 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
5089 }
5090 }else
drhb0603412007-02-28 04:47:26 +00005091
dan3c7ebeb2016-12-16 17:28:56 +00005092 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00005093 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00005094 lintDotCommand(p, azArg, nArg);
5095 }else
5096
drh70df4fe2006-06-13 15:12:21 +00005097#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00005098 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00005099 const char *zFile, *zProc;
5100 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00005101 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005102 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00005103 rc = 1;
5104 goto meta_command_exit;
5105 }
drh1e397f82006-06-08 15:28:43 +00005106 zFile = azArg[1];
5107 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00005108 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00005109 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
5110 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005111 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00005112 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00005113 rc = 1;
drh1e397f82006-06-08 15:28:43 +00005114 }
5115 }else
drh70df4fe2006-06-13 15:12:21 +00005116#endif
drh1e397f82006-06-08 15:28:43 +00005117
drhc2ce0be2014-05-29 12:36:14 +00005118 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
5119 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005120 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005121 rc = 1;
5122 }else{
5123 const char *zFile = azArg[1];
5124 output_file_close(p->pLog);
5125 p->pLog = output_file_open(zFile);
5126 }
drh127f9d72010-02-23 01:47:00 +00005127 }else
5128
drhc2ce0be2014-05-29 12:36:14 +00005129 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
5130 const char *zMode = nArg>=2 ? azArg[1] : "";
5131 int n2 = (int)strlen(zMode);
5132 int c2 = zMode[0];
5133 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005134 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00005135 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005136 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005137 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00005138 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005139 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005140 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00005141 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
5142 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005143 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005144 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00005145 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005146 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00005147 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00005148 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005149 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00005150 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00005151 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00005152 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00005153 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005154 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00005155 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00005156 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00005157 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00005158 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00005159 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
5160 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00005161 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
5162 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00005163 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
5164 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00005165 }else {
mistachkinaae280e2015-12-31 19:06:24 +00005166 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00005167 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00005168 rc = 1;
drh75897232000-05-29 14:26:00 +00005169 }
drh700c2522016-02-09 18:39:25 +00005170 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00005171 }else
5172
drhc2ce0be2014-05-29 12:36:14 +00005173 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
5174 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00005175 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
5176 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005177 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005178 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00005179 rc = 1;
5180 }
5181 }else
5182
drh05782482013-10-24 15:20:20 +00005183 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00005184 char *zNewFilename; /* Name of the database file to open */
5185 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00005186 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00005187 /* Close the existing database */
5188 session_close_all(p);
5189 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00005190 p->db = 0;
dan21472212017-03-01 11:30:27 +00005191 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00005192 sqlite3_free(p->zFreeOnClose);
5193 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00005194 /* Check for command-line arguments */
5195 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
5196 const char *z = azArg[iName];
5197 if( optionMatch(z,"new") ){
5198 newFlag = 1;
5199 }else if( z[0]=='-' ){
5200 utf8_printf(stderr, "unknown option: %s\n", z);
5201 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00005202 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00005203 }
drhcd0509e2016-09-16 00:26:08 +00005204 }
5205 /* If a filename is specified, try to open it first */
5206 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
5207 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00005208 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00005209 p->zDbFilename = zNewFilename;
5210 open_db(p, 1);
5211 if( p->db==0 ){
5212 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
5213 sqlite3_free(zNewFilename);
5214 }else{
5215 p->zFreeOnClose = zNewFilename;
5216 }
5217 }
5218 if( p->db==0 ){
5219 /* As a fall-back open a TEMP database */
5220 p->zDbFilename = 0;
5221 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00005222 }
5223 }else
5224
drhc2ce0be2014-05-29 12:36:14 +00005225 if( c=='o'
5226 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
5227 ){
5228 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
5229 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005230 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00005231 rc = 1;
5232 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005233 }
drhc2ce0be2014-05-29 12:36:14 +00005234 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
5235 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005236 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005237 rc = 1;
5238 goto meta_command_exit;
5239 }
5240 p->outCount = 2;
5241 }else{
5242 p->outCount = 0;
5243 }
5244 output_reset(p);
5245 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005246#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005247 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005248 rc = 1;
5249 p->out = stdout;
5250#else
drhc2ce0be2014-05-29 12:36:14 +00005251 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00005252 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005253 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00005254 p->out = stdout;
5255 rc = 1;
5256 }else{
drhc2ce0be2014-05-29 12:36:14 +00005257 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00005258 }
drh8cd5b252015-03-02 22:06:43 +00005259#endif
drh75897232000-05-29 14:26:00 +00005260 }else{
drhc2ce0be2014-05-29 12:36:14 +00005261 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00005262 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00005263 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005264 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00005265 }
drh75897232000-05-29 14:26:00 +00005266 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00005267 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005268 } else {
drhc2ce0be2014-05-29 12:36:14 +00005269 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00005270 }
5271 }
5272 }else
5273
drh078b1fd2012-09-21 13:40:02 +00005274 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
5275 int i;
5276 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00005277 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00005278 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00005279 }
mistachkinaae280e2015-12-31 19:06:24 +00005280 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00005281 }else
5282
drhc2ce0be2014-05-29 12:36:14 +00005283 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00005284 if( nArg >= 2) {
5285 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
5286 }
5287 if( nArg >= 3) {
5288 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
5289 }
5290 }else
5291
drhc2ce0be2014-05-29 12:36:14 +00005292 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00005293 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00005294 }else
5295
drhc2ce0be2014-05-29 12:36:14 +00005296 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
5297 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00005298 if( nArg!=2 ){
5299 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005300 rc = 1;
5301 goto meta_command_exit;
5302 }
drh4e8142c2016-11-11 14:54:22 +00005303 alt = fopen(azArg[1], "rb");
5304 if( alt==0 ){
5305 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
5306 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00005307 }else{
drh4e8142c2016-11-11 14:54:22 +00005308 rc = process_input(p, alt);
5309 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00005310 }
5311 }else
5312
drhc2ce0be2014-05-29 12:36:14 +00005313 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00005314 const char *zSrcFile;
5315 const char *zDb;
5316 sqlite3 *pSrc;
5317 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00005318 int nTimeout = 0;
5319
drh9ff849f2009-02-04 20:55:57 +00005320 if( nArg==2 ){
5321 zSrcFile = azArg[1];
5322 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00005323 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00005324 zSrcFile = azArg[2];
5325 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00005326 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005327 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005328 rc = 1;
5329 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00005330 }
5331 rc = sqlite3_open(zSrcFile, &pSrc);
5332 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005333 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00005334 sqlite3_close(pSrc);
5335 return 1;
5336 }
drh05782482013-10-24 15:20:20 +00005337 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005338 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
5339 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005340 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00005341 sqlite3_close(pSrc);
5342 return 1;
5343 }
drhdc2c4912009-02-04 22:46:47 +00005344 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
5345 || rc==SQLITE_BUSY ){
5346 if( rc==SQLITE_BUSY ){
5347 if( nTimeout++ >= 3 ) break;
5348 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00005349 }
5350 }
5351 sqlite3_backup_finish(pBackup);
5352 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005353 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00005354 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00005355 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00005356 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005357 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005358 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00005359 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005360 }
5361 sqlite3_close(pSrc);
5362 }else
5363
dan8d1edb92014-11-05 09:07:28 +00005364
5365 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
5366 if( nArg==2 ){
5367 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00005368#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00005369 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00005370#endif
dan8d1edb92014-11-05 09:07:28 +00005371 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005372 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00005373 rc = 1;
5374 }
5375 }else
5376
drhc2ce0be2014-05-29 12:36:14 +00005377 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005378 ShellState data;
drh75897232000-05-29 14:26:00 +00005379 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005380 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00005381 memcpy(&data, p, sizeof(data));
5382 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00005383 data.cMode = data.mode = MODE_Semi;
drh4926fec2016-04-13 15:33:42 +00005384 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
5385 data.cMode = data.mode = MODE_Pretty;
5386 nArg--;
5387 if( nArg==2 ) azArg[1] = azArg[2];
5388 }
5389 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00005390 int i;
drhf0693c82011-10-11 20:41:54 +00005391 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00005392 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00005393 char *new_argv[2], *new_colv[2];
5394 new_argv[0] = "CREATE TABLE sqlite_master (\n"
5395 " type text,\n"
5396 " name text,\n"
5397 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00005398 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00005399 " sql text\n"
5400 ")";
5401 new_argv[1] = 0;
5402 new_colv[0] = "sql";
5403 new_colv[1] = 0;
5404 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005405 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00005406 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00005407 char *new_argv[2], *new_colv[2];
5408 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
5409 " type text,\n"
5410 " name text,\n"
5411 " tbl_name text,\n"
5412 " rootpage integer,\n"
5413 " sql text\n"
5414 ")";
5415 new_argv[1] = 0;
5416 new_colv[0] = "sql";
5417 new_colv[1] = 0;
5418 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005419 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00005420 }else{
drhe611f142017-03-08 11:44:00 +00005421 char *zSql;
5422 zSql = sqlite3_mprintf(
drhe0bc4042002-06-25 01:09:11 +00005423 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005424 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005425 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005426 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drhe611f142017-03-08 11:44:00 +00005427 "WHERE lower(tbl_name) LIKE %Q"
drh6ac7a582011-11-04 00:35:56 +00005428 " AND type!='meta' AND sql NOTNULL "
drhe611f142017-03-08 11:44:00 +00005429 "ORDER BY rowid", azArg[1]);
5430 rc = sqlite3_exec(p->db, zSql, callback, &data, &zErrMsg);
5431 sqlite3_free(zSql);
drha18c5682000-10-08 22:20:57 +00005432 }
drhc2ce0be2014-05-29 12:36:14 +00005433 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00005434 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00005435 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005436 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005437 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005438 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005439 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00005440 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00005441 callback, &data, &zErrMsg
5442 );
drhc2ce0be2014-05-29 12:36:14 +00005443 }else{
drh4926fec2016-04-13 15:33:42 +00005444 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00005445 rc = 1;
5446 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005447 }
drh75897232000-05-29 14:26:00 +00005448 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005449 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005450 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005451 rc = 1;
5452 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005453 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00005454 rc = 1;
5455 }else{
5456 rc = 0;
drh75897232000-05-29 14:26:00 +00005457 }
5458 }else
5459
drhabd4c722014-09-20 18:18:33 +00005460#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
5461 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00005462 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00005463 }else
5464#endif
5465
drhe6229612014-08-18 15:08:26 +00005466#if defined(SQLITE_ENABLE_SESSION)
5467 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
5468 OpenSession *pSession = &p->aSession[0];
5469 char **azCmd = &azArg[1];
5470 int iSes = 0;
5471 int nCmd = nArg - 1;
5472 int i;
5473 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00005474 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00005475 if( nArg>=3 ){
5476 for(iSes=0; iSes<p->nSession; iSes++){
5477 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
5478 }
5479 if( iSes<p->nSession ){
5480 pSession = &p->aSession[iSes];
5481 azCmd++;
5482 nCmd--;
5483 }else{
5484 pSession = &p->aSession[0];
5485 iSes = 0;
5486 }
5487 }
5488
drh3a67b042014-08-18 17:56:31 +00005489 /* .session attach TABLE
5490 ** Invoke the sqlite3session_attach() interface to attach a particular
5491 ** table so that it is never filtered.
5492 */
5493 if( strcmp(azCmd[0],"attach")==0 ){
5494 if( nCmd!=2 ) goto session_syntax_error;
5495 if( pSession->p==0 ){
5496 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00005497 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00005498 }else{
5499 rc = sqlite3session_attach(pSession->p, azCmd[1]);
5500 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005501 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005502 rc = 0;
5503 }
5504 }
5505 }else
5506
5507 /* .session changeset FILE
5508 ** .session patchset FILE
5509 ** Write a changeset or patchset into a file. The file is overwritten.
5510 */
5511 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
5512 FILE *out = 0;
5513 if( nCmd!=2 ) goto session_syntax_error;
5514 if( pSession->p==0 ) goto session_not_open;
5515 out = fopen(azCmd[1], "wb");
5516 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005517 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00005518 }else{
5519 int szChng;
5520 void *pChng;
5521 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00005522 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00005523 }else{
drh2967e0c2014-08-19 00:26:17 +00005524 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
5525 }
5526 if( rc ){
5527 printf("Error: error code %d\n", rc);
5528 rc = 0;
drh3a67b042014-08-18 17:56:31 +00005529 }
mistachkin1fe36bb2016-04-04 02:16:44 +00005530 if( pChng
drh3a67b042014-08-18 17:56:31 +00005531 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00005532 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00005533 szChng);
5534 }
5535 sqlite3_free(pChng);
5536 fclose(out);
5537 }
5538 }else
5539
drhe6229612014-08-18 15:08:26 +00005540 /* .session close
5541 ** Close the identified session
5542 */
5543 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00005544 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00005545 if( p->nSession ){
5546 session_close(pSession);
5547 p->aSession[iSes] = p->aSession[--p->nSession];
5548 }
5549 }else
5550
drh03168ca2014-08-18 20:01:31 +00005551 /* .session enable ?BOOLEAN?
5552 ** Query or set the enable flag
5553 */
5554 if( strcmp(azCmd[0], "enable")==0 ){
5555 int ii;
5556 if( nCmd>2 ) goto session_syntax_error;
5557 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5558 if( p->nSession ){
5559 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005560 utf8_printf(p->out, "session %s enable flag = %d\n",
5561 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005562 }
5563 }else
5564
5565 /* .session filter GLOB ....
5566 ** Set a list of GLOB patterns of table names to be excluded.
5567 */
5568 if( strcmp(azCmd[0], "filter")==0 ){
5569 int ii, nByte;
5570 if( nCmd<2 ) goto session_syntax_error;
5571 if( p->nSession ){
5572 for(ii=0; ii<pSession->nFilter; ii++){
5573 sqlite3_free(pSession->azFilter[ii]);
5574 }
5575 sqlite3_free(pSession->azFilter);
5576 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
5577 pSession->azFilter = sqlite3_malloc( nByte );
5578 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005579 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00005580 exit(1);
5581 }
5582 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005583 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00005584 }
5585 pSession->nFilter = ii-1;
5586 }
5587 }else
5588
5589 /* .session indirect ?BOOLEAN?
5590 ** Query or set the indirect flag
5591 */
5592 if( strcmp(azCmd[0], "indirect")==0 ){
5593 int ii;
5594 if( nCmd>2 ) goto session_syntax_error;
5595 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5596 if( p->nSession ){
5597 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005598 utf8_printf(p->out, "session %s indirect flag = %d\n",
5599 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005600 }
5601 }else
5602
5603 /* .session isempty
5604 ** Determine if the session is empty
5605 */
5606 if( strcmp(azCmd[0], "isempty")==0 ){
5607 int ii;
5608 if( nCmd!=1 ) goto session_syntax_error;
5609 if( p->nSession ){
5610 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00005611 utf8_printf(p->out, "session %s isempty flag = %d\n",
5612 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005613 }
5614 }else
5615
drhe6229612014-08-18 15:08:26 +00005616 /* .session list
5617 ** List all currently open sessions
5618 */
5619 if( strcmp(azCmd[0],"list")==0 ){
5620 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00005621 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00005622 }
5623 }else
5624
5625 /* .session open DB NAME
5626 ** Open a new session called NAME on the attached database DB.
5627 ** DB is normally "main".
5628 */
5629 if( strcmp(azCmd[0],"open")==0 ){
5630 char *zName;
5631 if( nCmd!=3 ) goto session_syntax_error;
5632 zName = azCmd[2];
5633 if( zName[0]==0 ) goto session_syntax_error;
5634 for(i=0; i<p->nSession; i++){
5635 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005636 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00005637 goto meta_command_exit;
5638 }
5639 }
5640 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00005641 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00005642 goto meta_command_exit;
5643 }
5644 pSession = &p->aSession[p->nSession];
5645 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
5646 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005647 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005648 rc = 0;
drhe6229612014-08-18 15:08:26 +00005649 goto meta_command_exit;
5650 }
drh03168ca2014-08-18 20:01:31 +00005651 pSession->nFilter = 0;
5652 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00005653 p->nSession++;
5654 pSession->zName = sqlite3_mprintf("%s", zName);
5655 }else
5656 /* If no command name matches, show a syntax error */
5657 session_syntax_error:
5658 session_help(p);
5659 }else
5660#endif
5661
drh340f5822013-06-27 13:01:21 +00005662#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00005663 /* Undocumented commands for internal testing. Subject to change
5664 ** without notice. */
5665 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
5666 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
5667 int i, v;
5668 for(i=1; i<nArg; i++){
5669 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00005670 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00005671 }
5672 }
5673 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
5674 int i; sqlite3_int64 v;
5675 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00005676 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00005677 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00005678 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00005679 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00005680 }
5681 }
5682 }else
drh340f5822013-06-27 13:01:21 +00005683#endif
drh348d19c2013-06-03 12:47:43 +00005684
drhc2ce0be2014-05-29 12:36:14 +00005685 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00005686 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005687 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00005688 rc = 1;
5689 }
drh6976c212014-07-24 12:09:47 +00005690 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00005691 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00005692 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00005693 }
5694 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00005695 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
5696 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00005697 }
drh75897232000-05-29 14:26:00 +00005698 }else
5699
drh1554bc82017-03-08 16:10:34 +00005700 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
5701 const char *zLike = 0; /* Which table to checksum. 0 means everything */
5702 int i; /* Loop counter */
5703 int bSchema = 0; /* Also hash the schema */
5704 int iSize = 224; /* Hash algorithm to use */
5705 int bDebug = 0; /* Only show the query that would have run */
5706 sqlite3_stmt *pStmt; /* For querying tables names */
5707 char *zSql; /* SQL to be run */
5708 ShellText sQuery; /* Set of queries used to read all content */
5709 for(i=1; i<nArg; i++){
5710 const char *z = azArg[i];
5711 if( z[0]=='-' ){
5712 z++;
5713 if( z[0]=='-' ) z++;
5714 if( strcmp(z,"schema")==0 ){
5715 bSchema = 1;
5716 }else
5717 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
5718 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
5719 ){
5720 iSize = atoi(&z[5]);
5721 }else
5722 if( strcmp(z,"debug")==0 ){
5723 bDebug = 1;
5724 }else
5725 {
5726 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
5727 azArg[0], azArg[i]);
5728 raw_printf(stderr, "Should be one of: --schema"
5729 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
5730 rc = 1;
5731 goto meta_command_exit;
5732 }
5733 }else if( zLike ){
5734 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
5735 rc = 1;
5736 goto meta_command_exit;
5737 }else{
5738 zLike = z;
5739 if( sqlite3_strlike("sqlite3_%", zLike, 0)==0 ) bSchema = 1;
5740 }
5741 }
5742 if( bSchema ){
5743 zSql = "SELECT lower(name) FROM sqlite_master"
5744 " WHERE type='table' AND coalesce(rootpage,0)>1"
5745 " UNION ALL SELECT 'sqlite_master'"
5746 " ORDER BY 1 collate nocase";
5747 }else{
5748 zSql = "SELECT lower(name) FROM sqlite_master"
5749 " WHERE type='table' AND coalesce(rootpage,0)>1"
5750 " AND name NOT LIKE 'sqlite_%'"
5751 " ORDER BY 1 collate nocase";
5752 }
5753 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5754 initText(&sQuery);
5755 while( SQLITE_ROW==sqlite3_step(pStmt) ){
5756 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
5757 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
5758 if( strncmp(zTab, "sqlite_",7)!=0 ){
5759 appendText(&sQuery,"SELECT * FROM ", 0);
5760 appendText(&sQuery,zTab,'"');
5761 appendText(&sQuery," NOT INDEXED;", 0);
5762 }else if( strcmp(zTab, "sqlite_master")==0 ){
5763 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
5764 " ORDER BY name;", 0);
5765 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
5766 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
5767 " ORDER BY name;", 0);
5768 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
5769 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
5770 " ORDER BY tbl,idx;", 0);
5771 }else if( strcmp(zTab, "sqlite_stat3")==0
5772 || strcmp(zTab, "sqlite_stat4")==0 ){
5773 appendText(&sQuery, "SELECT * FROM ", 0);
5774 appendText(&sQuery, zTab, 0);
5775 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
5776 }
5777 }
5778 sqlite3_finalize(pStmt);
5779 zSql = sqlite3_mprintf("SELECT lower(hex(sha3_query(%Q,%d))) AS hash;",
5780 sQuery.z, iSize);
5781 freeText(&sQuery);
5782 if( bDebug ){
5783 utf8_printf(p->out, "%s\n", zSql);
5784 }else{
5785 shell_exec(p->db, zSql, shell_callback, p, 0);
5786 }
5787 sqlite3_free(zSql);
5788 }else
5789
drh62cdde52014-05-28 20:22:28 +00005790 if( c=='s'
5791 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00005792 ){
5793 char *zCmd;
drh54027102014-08-06 14:36:53 +00005794 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00005795 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005796 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00005797 rc = 1;
5798 goto meta_command_exit;
5799 }
drhdcb3e3d2014-05-29 03:17:29 +00005800 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00005801 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00005802 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
5803 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00005804 }
drh54027102014-08-06 14:36:53 +00005805 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00005806 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00005807 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00005808 }else
5809
drhc2ce0be2014-05-29 12:36:14 +00005810 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00005811 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00005812 int i;
drhc2ce0be2014-05-29 12:36:14 +00005813 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005814 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00005815 rc = 1;
5816 goto meta_command_exit;
5817 }
drheacd29d2016-04-15 15:03:27 +00005818 utf8_printf(p->out, "%12.12s: %s\n","echo", azBool[p->echoOn!=0]);
5819 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00005820 utf8_printf(p->out, "%12.12s: %s\n","explain",
5821 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00005822 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00005823 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
5824 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00005825 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00005826 raw_printf(p->out, "\n");
5827 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00005828 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00005829 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00005830 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00005831 raw_printf(p->out, "\n");
5832 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00005833 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00005834 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00005835 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00005836 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00005837 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00005838 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00005839 }
mistachkinaae280e2015-12-31 19:06:24 +00005840 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00005841 utf8_printf(p->out, "%12.12s: %s\n", "filename",
5842 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00005843 }else
5844
drhc2ce0be2014-05-29 12:36:14 +00005845 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
5846 if( nArg==2 ){
5847 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00005848 }else if( nArg==1 ){
5849 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00005850 }else{
drh34784902016-02-27 17:12:36 +00005851 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00005852 rc = 1;
5853 }
shaneh642d8b82010-07-28 16:05:34 +00005854 }else
5855
drh6a5a4202016-12-24 21:32:40 +00005856 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
5857 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
5858 || strncmp(azArg[0], "indexes", n)==0) )
5859 ){
drh98781232012-04-23 12:38:05 +00005860 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00005861 char **azResult;
drh98781232012-04-23 12:38:05 +00005862 int nRow, nAlloc;
5863 char *zSql = 0;
5864 int ii;
drh05782482013-10-24 15:20:20 +00005865 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00005866 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00005867 if( rc ) return shellDatabaseError(p->db);
5868
5869 /* Create an SQL statement to query for the list of tables in the
5870 ** main and all attached databases where the table name matches the
5871 ** LIKE pattern bound to variable "?1". */
drh6a5a4202016-12-24 21:32:40 +00005872 if( c=='t' ){
5873 zSql = sqlite3_mprintf(
5874 "SELECT name FROM sqlite_master"
5875 " WHERE type IN ('table','view')"
5876 " AND name NOT LIKE 'sqlite_%%'"
5877 " AND name LIKE ?1");
5878 }else if( nArg>2 ){
5879 /* It is an historical accident that the .indexes command shows an error
5880 ** when called with the wrong number of arguments whereas the .tables
5881 ** command does not. */
5882 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
5883 rc = 1;
5884 goto meta_command_exit;
5885 }else{
5886 zSql = sqlite3_mprintf(
5887 "SELECT name FROM sqlite_master"
5888 " WHERE type='index'"
5889 " AND tbl_name LIKE ?1");
5890 }
drha4b81d22016-12-24 18:04:28 +00005891 for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00005892 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drha4b81d22016-12-24 18:04:28 +00005893 if( zDbName==0 || ii==0 ) continue;
drh6a5a4202016-12-24 21:32:40 +00005894 if( c=='t' ){
drh98781232012-04-23 12:38:05 +00005895 zSql = sqlite3_mprintf(
5896 "%z UNION ALL "
5897 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
5898 " WHERE type IN ('table','view')"
5899 " AND name NOT LIKE 'sqlite_%%'"
5900 " AND name LIKE ?1", zSql, zDbName, zDbName);
drh6a5a4202016-12-24 21:32:40 +00005901 }else{
5902 zSql = sqlite3_mprintf(
5903 "%z UNION ALL "
5904 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
5905 " WHERE type='index'"
5906 " AND tbl_name LIKE ?1", zSql, zDbName, zDbName);
drh98781232012-04-23 12:38:05 +00005907 }
drha50da102000-08-08 20:19:09 +00005908 }
dand95bb392015-09-30 11:19:05 +00005909 rc = sqlite3_finalize(pStmt);
5910 if( zSql && rc==SQLITE_OK ){
5911 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
5912 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5913 }
drh98781232012-04-23 12:38:05 +00005914 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00005915 if( !zSql ) return shellNomemError();
5916 if( rc ) return shellDatabaseError(p->db);
5917
5918 /* Run the SQL statement prepared by the above block. Store the results
5919 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00005920 nRow = nAlloc = 0;
5921 azResult = 0;
5922 if( nArg>1 ){
5923 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00005924 }else{
drh98781232012-04-23 12:38:05 +00005925 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
5926 }
5927 while( sqlite3_step(pStmt)==SQLITE_ROW ){
5928 if( nRow>=nAlloc ){
5929 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00005930 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00005931 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00005932 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00005933 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00005934 break;
5935 }
mistachkin8e189222015-04-19 21:43:16 +00005936 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00005937 azResult = azNew;
5938 }
5939 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00005940 if( 0==azResult[nRow] ){
5941 rc = shellNomemError();
5942 break;
5943 }
5944 nRow++;
drh98781232012-04-23 12:38:05 +00005945 }
dand95bb392015-09-30 11:19:05 +00005946 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
5947 rc = shellDatabaseError(p->db);
5948 }
5949
5950 /* Pretty-print the contents of array azResult[] to the output */
5951 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00005952 int len, maxlen = 0;
5953 int i, j;
5954 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00005955 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00005956 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00005957 if( len>maxlen ) maxlen = len;
5958 }
5959 nPrintCol = 80/(maxlen+2);
5960 if( nPrintCol<1 ) nPrintCol = 1;
5961 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
5962 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00005963 for(j=i; j<nRow; j+=nPrintRow){
5964 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00005965 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
5966 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00005967 }
mistachkinaae280e2015-12-31 19:06:24 +00005968 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00005969 }
5970 }
dand95bb392015-09-30 11:19:05 +00005971
drh98781232012-04-23 12:38:05 +00005972 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
5973 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00005974 }else
5975
drh2db82112016-09-15 21:35:24 +00005976 /* Begin redirecting output to the file "testcase-out.txt" */
5977 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
5978 output_reset(p);
5979 p->out = output_file_open("testcase-out.txt");
5980 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00005981 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00005982 }
drh760c8162016-09-16 02:52:22 +00005983 if( nArg>=2 ){
5984 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
5985 }else{
5986 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
5987 }
drh2db82112016-09-15 21:35:24 +00005988 }else
drh2db82112016-09-15 21:35:24 +00005989
drhd12602a2016-12-07 15:49:02 +00005990#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00005991 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00005992 static const struct {
5993 const char *zCtrlName; /* Name of a test-control option */
5994 int ctrlCode; /* Integer code for that option */
5995 } aCtrl[] = {
5996 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
5997 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
5998 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
5999 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
6000 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
6001 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
6002 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
6003 { "assert", SQLITE_TESTCTRL_ASSERT },
6004 { "always", SQLITE_TESTCTRL_ALWAYS },
6005 { "reserve", SQLITE_TESTCTRL_RESERVE },
6006 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
6007 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00006008 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00006009 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00006010 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00006011 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00006012 };
shaneh96887e12011-02-10 21:08:58 +00006013 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00006014 int rc2 = 0;
6015 int i, n2;
drh05782482013-10-24 15:20:20 +00006016 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00006017
drhd416fe72011-03-17 16:45:50 +00006018 /* convert testctrl text option to value. allow any unique prefix
6019 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00006020 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006021 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00006022 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00006023 if( testctrl<0 ){
6024 testctrl = aCtrl[i].ctrlCode;
6025 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006026 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00006027 testctrl = -1;
6028 break;
6029 }
6030 }
6031 }
drh348d19c2013-06-03 12:47:43 +00006032 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006033 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00006034 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006035 }else{
6036 switch(testctrl){
6037
6038 /* sqlite3_test_control(int, db, int) */
6039 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00006040 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00006041 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006042 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00006043 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006044 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006045 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006046 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006047 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006048 }
6049 break;
6050
6051 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00006052 case SQLITE_TESTCTRL_PRNG_SAVE:
6053 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00006054 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00006055 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00006056 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00006057 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00006058 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006059 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006060 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
6061 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006062 }
6063 break;
6064
6065 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006066 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00006067 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00006068 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006069 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006070 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006071 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006072 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00006073 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006074 }
6075 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00006076
shaneh96887e12011-02-10 21:08:58 +00006077 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006078 case SQLITE_TESTCTRL_ASSERT:
6079 case SQLITE_TESTCTRL_ALWAYS:
6080 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00006081 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006082 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006083 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006084 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006085 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006086 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006087 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006088 }
6089 break;
6090
6091 /* sqlite3_test_control(int, char *) */
6092#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00006093 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00006094 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006095 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00006096 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006097 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006098 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006099 utf8_printf(stderr,
6100 "Error: testctrl %s takes a single char * option\n",
6101 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006102 }
6103 break;
6104#endif
6105
drh1ffede82015-01-30 20:59:27 +00006106 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00006107 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006108 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00006109 azArg[2],
drh8964b342015-01-29 17:54:52 +00006110 integerValue(azArg[3]),
6111 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00006112 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00006113 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006114 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00006115 }
6116 break;
6117
mistachkin1fe36bb2016-04-04 02:16:44 +00006118 case SQLITE_TESTCTRL_BITVEC_TEST:
6119 case SQLITE_TESTCTRL_FAULT_INSTALL:
6120 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
6121 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00006122 default:
mistachkinaae280e2015-12-31 19:06:24 +00006123 utf8_printf(stderr,
6124 "Error: CLI support for testctrl %s not implemented\n",
6125 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006126 break;
6127 }
6128 }
6129 }else
drhf1969722017-02-17 23:52:00 +00006130#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00006131
drhc2ce0be2014-05-29 12:36:14 +00006132 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00006133 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006134 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00006135 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006136
drhc2ce0be2014-05-29 12:36:14 +00006137 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
6138 if( nArg==2 ){
6139 enableTimer = booleanValue(azArg[1]);
6140 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00006141 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00006142 enableTimer = 0;
6143 }
6144 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006145 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006146 rc = 1;
6147 }
shanehe2aa9d72009-11-06 17:20:17 +00006148 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006149
drhc2ce0be2014-05-29 12:36:14 +00006150 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00006151 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006152 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006153 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006154 rc = 1;
6155 goto meta_command_exit;
6156 }
drh657b4a82015-03-19 13:30:41 +00006157 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006158 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00006159#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00006160 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00006161 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00006162 }else{
drh4b363a52016-07-23 20:27:41 +00006163 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006164 }
6165#endif
6166 }else
6167
drhf442e332014-09-10 19:01:14 +00006168#if SQLITE_USER_AUTHENTICATION
6169 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
6170 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006171 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00006172 rc = 1;
6173 goto meta_command_exit;
6174 }
drh7883ecf2014-09-11 16:19:31 +00006175 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00006176 if( strcmp(azArg[1],"login")==0 ){
6177 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00006178 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00006179 rc = 1;
6180 goto meta_command_exit;
6181 }
drhd39c40f2014-09-11 00:27:53 +00006182 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
6183 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00006184 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006185 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00006186 rc = 1;
6187 }
6188 }else if( strcmp(azArg[1],"add")==0 ){
6189 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006190 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006191 rc = 1;
6192 goto meta_command_exit;
6193 }
drhd39c40f2014-09-11 00:27:53 +00006194 rc = sqlite3_user_add(p->db, azArg[2],
6195 azArg[3], (int)strlen(azArg[3]),
6196 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006197 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006198 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006199 rc = 1;
6200 }
6201 }else if( strcmp(azArg[1],"edit")==0 ){
6202 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006203 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006204 rc = 1;
6205 goto meta_command_exit;
6206 }
drhd39c40f2014-09-11 00:27:53 +00006207 rc = sqlite3_user_change(p->db, azArg[2],
6208 azArg[3], (int)strlen(azArg[3]),
6209 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006210 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006211 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006212 rc = 1;
6213 }
6214 }else if( strcmp(azArg[1],"delete")==0 ){
6215 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006216 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00006217 rc = 1;
6218 goto meta_command_exit;
6219 }
6220 rc = sqlite3_user_delete(p->db, azArg[2]);
6221 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006222 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006223 rc = 1;
6224 }
6225 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006226 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00006227 rc = 1;
6228 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00006229 }
drhf442e332014-09-10 19:01:14 +00006230 }else
6231#endif /* SQLITE_USER_AUTHENTICATION */
6232
drh9fd301b2011-06-03 13:28:22 +00006233 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006234 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00006235 sqlite3_libversion(), sqlite3_sourceid());
6236 }else
6237
drh790f2872015-11-28 18:06:36 +00006238 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
6239 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00006240 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00006241 if( p->db ){
6242 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
6243 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00006244 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
6245 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6246 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6247 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00006248 }
6249 }
6250 }else
6251
drhb19e7352016-01-12 19:37:20 +00006252 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
6253 sqlite3_vfs *pVfs;
6254 sqlite3_vfs *pCurrent = 0;
6255 if( p->db ){
6256 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
6257 }
6258 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
6259 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
6260 pVfs==pCurrent ? " <--- CURRENT" : "");
6261 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6262 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6263 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6264 if( pVfs->pNext ){
6265 raw_printf(p->out, "-----------------------------------\n");
6266 }
6267 }
6268 }else
6269
drhde60fc22011-12-14 17:53:36 +00006270 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
6271 const char *zDbName = nArg==2 ? azArg[1] : "main";
6272 char *zVfsName = 0;
6273 if( p->db ){
6274 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
6275 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00006276 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00006277 sqlite3_free(zVfsName);
6278 }
6279 }
6280 }else
6281
drhcef4fc82012-09-21 22:50:45 +00006282#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
6283 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006284 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00006285 }else
6286#endif
6287
drhc2ce0be2014-05-29 12:36:14 +00006288 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00006289 int j;
drh43617e92006-03-06 20:55:46 +00006290 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00006291 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00006292 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00006293 }
6294 }else
6295
6296 {
mistachkinaae280e2015-12-31 19:06:24 +00006297 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00006298 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00006299 rc = 1;
drh75897232000-05-29 14:26:00 +00006300 }
drh67505e72002-04-19 12:34:06 +00006301
drhc2ce0be2014-05-29 12:36:14 +00006302meta_command_exit:
6303 if( p->outCount ){
6304 p->outCount--;
6305 if( p->outCount==0 ) output_reset(p);
6306 }
drh67505e72002-04-19 12:34:06 +00006307 return rc;
drh75897232000-05-29 14:26:00 +00006308}
6309
drh67505e72002-04-19 12:34:06 +00006310/*
drh91a66392007-09-07 01:12:32 +00006311** Return TRUE if a semicolon occurs anywhere in the first N characters
6312** of string z[].
drh324ccef2003-02-05 14:06:20 +00006313*/
drh9f099fd2013-08-06 14:01:46 +00006314static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00006315 int i;
6316 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
6317 return 0;
drh324ccef2003-02-05 14:06:20 +00006318}
6319
6320/*
drh70c7a4b2003-04-26 03:03:06 +00006321** Test to see if a line consists entirely of whitespace.
6322*/
6323static int _all_whitespace(const char *z){
6324 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00006325 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00006326 if( *z=='/' && z[1]=='*' ){
6327 z += 2;
6328 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
6329 if( *z==0 ) return 0;
6330 z++;
6331 continue;
6332 }
6333 if( *z=='-' && z[1]=='-' ){
6334 z += 2;
6335 while( *z && *z!='\n' ){ z++; }
6336 if( *z==0 ) return 1;
6337 continue;
6338 }
6339 return 0;
6340 }
6341 return 1;
6342}
6343
6344/*
drha9b17162003-04-29 18:01:28 +00006345** Return TRUE if the line typed in is an SQL command terminator other
6346** than a semi-colon. The SQL Server style "go" command is understood
6347** as is the Oracle "/".
6348*/
drh9f099fd2013-08-06 14:01:46 +00006349static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00006350 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00006351 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
6352 return 1; /* Oracle */
6353 }
drhf0693c82011-10-11 20:41:54 +00006354 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00006355 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00006356 return 1; /* SQL Server */
6357 }
6358 return 0;
6359}
6360
6361/*
drh233a5312008-12-18 22:25:13 +00006362** Return true if zSql is a complete SQL statement. Return false if it
6363** ends in the middle of a string literal or C-style comment.
6364*/
drh9f099fd2013-08-06 14:01:46 +00006365static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00006366 int rc;
6367 if( zSql==0 ) return 1;
6368 zSql[nSql] = ';';
6369 zSql[nSql+1] = 0;
6370 rc = sqlite3_complete(zSql);
6371 zSql[nSql] = 0;
6372 return rc;
6373}
6374
6375/*
drh4e8142c2016-11-11 14:54:22 +00006376** Run a single line of SQL
6377*/
6378static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
6379 int rc;
6380 char *zErrMsg = 0;
6381
6382 open_db(p, 0);
6383 if( p->backslashOn ) resolve_backslashes(zSql);
6384 BEGIN_TIMER;
6385 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
6386 END_TIMER;
6387 if( rc || zErrMsg ){
6388 char zPrefix[100];
6389 if( in!=0 || !stdin_is_interactive ){
6390 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
6391 "Error: near line %d:", startline);
6392 }else{
6393 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
6394 }
6395 if( zErrMsg!=0 ){
6396 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
6397 sqlite3_free(zErrMsg);
6398 zErrMsg = 0;
6399 }else{
6400 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
6401 }
6402 return 1;
6403 }else if( p->countChanges ){
6404 raw_printf(p->out, "changes: %3d total_changes: %d\n",
6405 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
6406 }
6407 return 0;
6408}
6409
6410
6411/*
drh67505e72002-04-19 12:34:06 +00006412** Read input from *in and process it. If *in==0 then input
6413** is interactive - the user is typing it it. Otherwise, input
6414** is coming from a file or device. A prompt is issued and history
6415** is saved only if input is interactive. An interrupt signal will
6416** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00006417**
6418** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00006419*/
drhdcd87a92014-08-18 13:45:42 +00006420static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00006421 char *zLine = 0; /* A single input line */
6422 char *zSql = 0; /* Accumulated SQL text */
6423 int nLine; /* Length of current line */
6424 int nSql = 0; /* Bytes of zSql[] used */
6425 int nAlloc = 0; /* Allocated zSql[] space */
6426 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00006427 int rc; /* Error code */
6428 int errCnt = 0; /* Number of errors seen */
6429 int lineno = 0; /* Current line number */
6430 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00006431
6432 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
6433 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00006434 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00006435 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00006436 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00006437 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00006438 break;
drhc49f44e2006-10-26 18:15:42 +00006439 }
drh67505e72002-04-19 12:34:06 +00006440 if( seenInterrupt ){
6441 if( in!=0 ) break;
6442 seenInterrupt = 0;
6443 }
drhc28490c2006-10-26 14:25:58 +00006444 lineno++;
drh849a9d92013-12-21 15:46:06 +00006445 if( nSql==0 && _all_whitespace(zLine) ){
6446 if( p->echoOn ) printf("%s\n", zLine);
6447 continue;
6448 }
drh2af0b2d2002-02-21 02:25:02 +00006449 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00006450 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00006451 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00006452 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00006453 break;
6454 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00006455 errCnt++;
6456 }
drhdaffd0e2001-04-11 14:28:42 +00006457 continue;
6458 }
drh9f099fd2013-08-06 14:01:46 +00006459 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00006460 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00006461 }
drh9f099fd2013-08-06 14:01:46 +00006462 nLine = strlen30(zLine);
6463 if( nSql+nLine+2>=nAlloc ){
6464 nAlloc = nSql+nLine+100;
6465 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00006466 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006467 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00006468 exit(1);
6469 }
drhdaffd0e2001-04-11 14:28:42 +00006470 }
drh9f099fd2013-08-06 14:01:46 +00006471 nSqlPrior = nSql;
6472 if( nSql==0 ){
6473 int i;
6474 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00006475 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00006476 memcpy(zSql, zLine+i, nLine+1-i);
6477 startline = lineno;
6478 nSql = nLine-i;
6479 }else{
6480 zSql[nSql++] = '\n';
6481 memcpy(zSql+nSql, zLine, nLine+1);
6482 nSql += nLine;
6483 }
6484 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00006485 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00006486 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006487 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00006488 if( p->outCount ){
6489 output_reset(p);
6490 p->outCount = 0;
6491 }
drh9f099fd2013-08-06 14:01:46 +00006492 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00006493 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00006494 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00006495 }
6496 }
drh4e8142c2016-11-11 14:54:22 +00006497 if( nSql && !_all_whitespace(zSql) ){
6498 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006499 }
drh1f9ca2c2015-08-25 16:57:52 +00006500 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00006501 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00006502 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00006503}
6504
drh67505e72002-04-19 12:34:06 +00006505/*
6506** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00006507** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00006508*/
drhd1459152016-09-16 19:11:03 +00006509static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00006510 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00006511 if( clearFlag ){
6512 free(home_dir);
6513 home_dir = 0;
6514 return 0;
6515 }
drh85e72432012-04-11 11:38:53 +00006516 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00006517
drh4ace5362014-11-10 14:42:28 +00006518#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
6519 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00006520 {
6521 struct passwd *pwent;
6522 uid_t uid = getuid();
6523 if( (pwent=getpwuid(uid)) != NULL) {
6524 home_dir = pwent->pw_dir;
6525 }
drh67505e72002-04-19 12:34:06 +00006526 }
6527#endif
6528
chw65d3c132007-11-12 21:09:10 +00006529#if defined(_WIN32_WCE)
6530 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
6531 */
drh85e72432012-04-11 11:38:53 +00006532 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00006533#else
6534
drh83905c92012-06-21 13:00:37 +00006535#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00006536 if (!home_dir) {
6537 home_dir = getenv("USERPROFILE");
6538 }
6539#endif
6540
drh67505e72002-04-19 12:34:06 +00006541 if (!home_dir) {
6542 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00006543 }
6544
drh83905c92012-06-21 13:00:37 +00006545#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00006546 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00006547 char *zDrive, *zPath;
6548 int n;
6549 zDrive = getenv("HOMEDRIVE");
6550 zPath = getenv("HOMEPATH");
6551 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00006552 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00006553 home_dir = malloc( n );
6554 if( home_dir==0 ) return 0;
6555 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
6556 return home_dir;
6557 }
6558 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00006559 }
6560#endif
6561
chw65d3c132007-11-12 21:09:10 +00006562#endif /* !_WIN32_WCE */
6563
drh67505e72002-04-19 12:34:06 +00006564 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00006565 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00006566 char *z = malloc( n );
6567 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00006568 home_dir = z;
6569 }
drhe98d4fa2002-04-21 19:06:22 +00006570
drh67505e72002-04-19 12:34:06 +00006571 return home_dir;
6572}
6573
6574/*
6575** Read input from the file given by sqliterc_override. Or if that
6576** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00006577**
6578** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00006579*/
drh534f4df2015-02-28 14:03:35 +00006580static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00006581 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00006582 const char *sqliterc_override /* Name of config file. NULL to use default */
6583){
persicom7e2dfdd2002-04-18 02:46:52 +00006584 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00006585 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00006586 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00006587 FILE *in = NULL;
6588
6589 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00006590 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00006591 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006592 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00006593 " cannot read ~/.sqliterc\n");
6594 return;
drhe98d4fa2002-04-21 19:06:22 +00006595 }
drh2f3de322012-06-27 16:41:31 +00006596 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00006597 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
6598 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00006599 }
drha1f9b5e2004-02-14 16:31:02 +00006600 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00006601 if( in ){
drhc28490c2006-10-26 14:25:58 +00006602 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00006603 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00006604 }
drh534f4df2015-02-28 14:03:35 +00006605 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00006606 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00006607 }
drh85e72432012-04-11 11:38:53 +00006608 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00006609}
6610
drh67505e72002-04-19 12:34:06 +00006611/*
drhe1e38c42003-05-04 18:30:59 +00006612** Show available command line options
6613*/
mistachkin1fe36bb2016-04-04 02:16:44 +00006614static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00006615 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00006616 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00006617 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006618 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00006619 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00006620 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00006621 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00006622 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00006623 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00006624#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6625 " -heap SIZE Size of heap for memsys3 or memsys5\n"
6626#endif
drhcc3b4f82012-02-07 14:13:50 +00006627 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00006628 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00006629 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006630 " -line set output mode to 'line'\n"
6631 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00006632 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00006633 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00006634#ifdef SQLITE_ENABLE_MULTIPLEX
6635 " -multiplex enable the multiplexor VFS\n"
6636#endif
mistachkine0d68852014-12-11 03:12:33 +00006637 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00006638 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00006639 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
6640 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00006641 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00006642 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00006643 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00006644 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00006645#ifdef SQLITE_ENABLE_VFSTRACE
6646 " -vfstrace enable tracing of all VFS calls\n"
6647#endif
drhe1e38c42003-05-04 18:30:59 +00006648;
6649static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00006650 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00006651 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00006652 "FILENAME is the name of an SQLite database. A new database is created\n"
6653 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00006654 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00006655 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00006656 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006657 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00006658 }
6659 exit(1);
6660}
6661
6662/*
drh67505e72002-04-19 12:34:06 +00006663** Initialize the state information in data
6664*/
drhdcd87a92014-08-18 13:45:42 +00006665static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00006666 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00006667 data->normalMode = data->cMode = data->mode = MODE_List;
6668 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00006669 memcpy(data->colSeparator,SEP_Column, 2);
6670 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00006671 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00006672 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00006673 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00006674 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00006675 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00006676 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
6677 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00006678}
6679
drh98d312f2012-10-25 15:23:14 +00006680/*
drh5c7976f2014-02-10 19:59:27 +00006681** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00006682*/
6683#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00006684static void printBold(const char *zText){
6685 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
6686 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
6687 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
6688 SetConsoleTextAttribute(out,
6689 FOREGROUND_RED|FOREGROUND_INTENSITY
6690 );
6691 printf("%s", zText);
6692 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00006693}
6694#else
drh5c7976f2014-02-10 19:59:27 +00006695static void printBold(const char *zText){
6696 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00006697}
6698#endif
6699
6700/*
drh98d312f2012-10-25 15:23:14 +00006701** Get the argument to an --option. Throw an error and die if no argument
6702** is available.
6703*/
6704static char *cmdline_option_value(int argc, char **argv, int i){
6705 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00006706 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00006707 argv[0], argv[argc-1]);
6708 exit(1);
6709 }
6710 return argv[i];
6711}
6712
mistachkin1fe36bb2016-04-04 02:16:44 +00006713#ifndef SQLITE_SHELL_IS_UTF8
6714# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
6715# define SQLITE_SHELL_IS_UTF8 (0)
6716# else
6717# define SQLITE_SHELL_IS_UTF8 (1)
6718# endif
6719#endif
6720
6721#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00006722int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00006723#else
6724int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00006725 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00006726#endif
drh75897232000-05-29 14:26:00 +00006727 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00006728 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00006729 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00006730 int i;
drhc28490c2006-10-26 14:25:58 +00006731 int rc = 0;
drhb3735912014-02-10 16:13:42 +00006732 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00006733 int readStdin = 1;
6734 int nCmd = 0;
6735 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00006736
mistachkin1fe36bb2016-04-04 02:16:44 +00006737 setBinaryMode(stdin, 0);
6738 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00006739 stdin_is_interactive = isatty(0);
6740 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00006741
drh69b30ab2014-02-27 15:11:52 +00006742#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00006743 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006744 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00006745 sqlite3_sourceid(), SQLITE_SOURCE_ID);
6746 exit(1);
6747 }
drhc7181902014-02-27 15:04:13 +00006748#endif
persicom7e2dfdd2002-04-18 02:46:52 +00006749 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00006750#if !SQLITE_SHELL_IS_UTF8
6751 sqlite3_initialize();
6752 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
6753 if( argv==0 ){
6754 raw_printf(stderr, "out of memory\n");
6755 exit(1);
6756 }
6757 for(i=0; i<argc; i++){
6758 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
6759 if( argv[i]==0 ){
6760 raw_printf(stderr, "out of memory\n");
6761 exit(1);
6762 }
6763 }
6764#endif
mistachkin1810f222016-04-04 02:33:34 +00006765 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00006766 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00006767
drh44c2eb12003-04-30 11:38:26 +00006768 /* Make sure we have a valid signal handler early, before anything
6769 ** else is done.
6770 */
drh4c504392000-10-16 22:06:40 +00006771#ifdef SIGINT
6772 signal(SIGINT, interrupt_handler);
6773#endif
drh44c2eb12003-04-30 11:38:26 +00006774
drhac5649a2014-11-28 13:35:03 +00006775#ifdef SQLITE_SHELL_DBNAME_PROC
6776 {
6777 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
6778 ** of a C-function that will provide the name of the database file. Use
6779 ** this compile-time option to embed this shell program in larger
6780 ** applications. */
6781 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
6782 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
6783 warnInmemoryDb = 0;
6784 }
6785#endif
6786
drh22fbcb82004-02-01 01:22:50 +00006787 /* Do an initial pass through the command-line argument to locate
6788 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00006789 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00006790 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00006791 */
drh98d312f2012-10-25 15:23:14 +00006792 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00006793 char *z;
drhc28490c2006-10-26 14:25:58 +00006794 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00006795 if( z[0]!='-' ){
6796 if( data.zDbFilename==0 ){
6797 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00006798 }else{
6799 /* Excesss arguments are interpreted as SQL (or dot-commands) and
6800 ** mean that nothing is read from stdin */
6801 readStdin = 0;
6802 nCmd++;
6803 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
6804 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006805 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00006806 exit(1);
6807 }
6808 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00006809 }
drh98d312f2012-10-25 15:23:14 +00006810 }
drhcc3b4f82012-02-07 14:13:50 +00006811 if( z[1]=='-' ) z++;
6812 if( strcmp(z,"-separator")==0
6813 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00006814 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00006815 || strcmp(z,"-cmd")==0
6816 ){
drh98d312f2012-10-25 15:23:14 +00006817 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00006818 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00006819 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00006820 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00006821 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00006822 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00006823 ** we do the actual processing of arguments later in a second pass.
6824 */
shanef69573d2009-10-24 02:06:14 +00006825 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00006826 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00006827#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00006828 const char *zSize;
6829 sqlite3_int64 szHeap;
6830
drh98d312f2012-10-25 15:23:14 +00006831 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00006832 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00006833 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00006834 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00006835#else
6836 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00006837#endif
drh44dec872014-08-30 15:49:25 +00006838 }else if( strcmp(z,"-scratch")==0 ){
6839 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006840 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006841 if( sz>400000 ) sz = 400000;
6842 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00006843 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006844 if( n>10 ) n = 10;
6845 if( n<1 ) n = 1;
6846 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
6847 data.shellFlgs |= SHFLG_Scratch;
6848 }else if( strcmp(z,"-pagecache")==0 ){
6849 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006850 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006851 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00006852 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00006853 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00006854 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
6855 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00006856 data.shellFlgs |= SHFLG_Pagecache;
6857 }else if( strcmp(z,"-lookaside")==0 ){
6858 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006859 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006860 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00006861 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006862 if( n<0 ) n = 0;
6863 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
6864 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00006865#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00006866 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00006867 extern int vfstrace_register(
6868 const char *zTraceName,
6869 const char *zOldVfsName,
6870 int (*xOut)(const char*,void*),
6871 void *pOutArg,
6872 int makeDefault
6873 );
drh2b625e22011-03-16 17:05:28 +00006874 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00006875#endif
drh6f25e892011-07-08 17:02:57 +00006876#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00006877 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00006878 extern int sqlite3_multiple_initialize(const char*,int);
6879 sqlite3_multiplex_initialize(0, 1);
6880#endif
drh7d9f3942013-04-03 01:26:54 +00006881 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00006882 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
6883 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00006884 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00006885 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00006886 if( pVfs ){
6887 sqlite3_vfs_register(pVfs, 1);
6888 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006889 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00006890 exit(1);
6891 }
drh44c2eb12003-04-30 11:38:26 +00006892 }
6893 }
drh98d312f2012-10-25 15:23:14 +00006894 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00006895#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00006896 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00006897 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00006898#else
mistachkinaae280e2015-12-31 19:06:24 +00006899 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00006900 return 1;
drh01b41712005-08-29 23:06:23 +00006901#endif
drh98d312f2012-10-25 15:23:14 +00006902 }
6903 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00006904
drh44c2eb12003-04-30 11:38:26 +00006905 /* Go ahead and open the database file if it already exists. If the
6906 ** file does not exist, delay opening it. This prevents empty database
6907 ** files from being created if a user mistypes the database name argument
6908 ** to the sqlite command-line tool.
6909 */
drhc8d74412004-08-31 23:41:26 +00006910 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00006911 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00006912 }
6913
drh22fbcb82004-02-01 01:22:50 +00006914 /* Process the initialization file if there is one. If no -init option
6915 ** is given on the command line, look for a file named ~/.sqliterc and
6916 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00006917 */
drh534f4df2015-02-28 14:03:35 +00006918 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00006919
drh22fbcb82004-02-01 01:22:50 +00006920 /* Make a second pass through the command-line argument and set
6921 ** options. This second pass is delayed until after the initialization
6922 ** file is processed so that the command-line arguments will override
6923 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00006924 */
drh98d312f2012-10-25 15:23:14 +00006925 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00006926 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00006927 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00006928 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00006929 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00006930 i++;
6931 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006932 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00006933 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006934 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00006935 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006936 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00006937 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00006938 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00006939 }else if( strcmp(z,"-csv")==0 ){
6940 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00006941 memcpy(data.colSeparator,",",2);
6942 }else if( strcmp(z,"-ascii")==0 ){
6943 data.mode = MODE_Ascii;
6944 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00006945 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00006946 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00006947 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00006948 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00006949 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00006950 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00006951 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00006952 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00006953 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00006954 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00006955 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00006956 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00006957 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006958 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00006959 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006960 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00006961 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00006962 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00006963 }else if( strcmp(z,"-eqp")==0 ){
6964 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00006965 }else if( strcmp(z,"-eqpfull")==0 ){
6966 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00006967 }else if( strcmp(z,"-stats")==0 ){
6968 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00006969 }else if( strcmp(z,"-scanstats")==0 ){
6970 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00006971 }else if( strcmp(z,"-backslash")==0 ){
6972 /* Undocumented command-line option: -backslash
6973 ** Causes C-style backslash escapes to be evaluated in SQL statements
6974 ** prior to sending the SQL into SQLite. Useful for injecting
6975 ** crazy bytes in the middle of SQL statements for testing and debugging.
6976 */
6977 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00006978 }else if( strcmp(z,"-bail")==0 ){
6979 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00006980 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00006981 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00006982 return 0;
drhc28490c2006-10-26 14:25:58 +00006983 }else if( strcmp(z,"-interactive")==0 ){
6984 stdin_is_interactive = 1;
6985 }else if( strcmp(z,"-batch")==0 ){
6986 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00006987 }else if( strcmp(z,"-heap")==0 ){
6988 i++;
drh44dec872014-08-30 15:49:25 +00006989 }else if( strcmp(z,"-scratch")==0 ){
6990 i+=2;
6991 }else if( strcmp(z,"-pagecache")==0 ){
6992 i+=2;
6993 }else if( strcmp(z,"-lookaside")==0 ){
6994 i+=2;
drh7d9f3942013-04-03 01:26:54 +00006995 }else if( strcmp(z,"-mmap")==0 ){
6996 i++;
drha7e61d82011-03-12 17:02:57 +00006997 }else if( strcmp(z,"-vfs")==0 ){
6998 i++;
drh6f25e892011-07-08 17:02:57 +00006999#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00007000 }else if( strcmp(z,"-vfstrace")==0 ){
7001 i++;
drh6f25e892011-07-08 17:02:57 +00007002#endif
7003#ifdef SQLITE_ENABLE_MULTIPLEX
7004 }else if( strcmp(z,"-multiplex")==0 ){
7005 i++;
7006#endif
drhcc3b4f82012-02-07 14:13:50 +00007007 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00007008 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00007009 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00007010 /* Run commands that follow -cmd first and separately from commands
7011 ** that simply appear on the command-line. This seems goofy. It would
7012 ** be better if all commands ran in the order that they appear. But
7013 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00007014 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00007015 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00007016 if( z[0]=='.' ){
7017 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00007018 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00007019 }else{
drh05782482013-10-24 15:20:20 +00007020 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00007021 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
7022 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007023 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00007024 if( bail_on_error ) return rc!=0 ? rc : 1;
7025 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007026 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00007027 if( bail_on_error ) return rc;
7028 }
7029 }
drh1e5d0e92000-05-31 23:33:17 +00007030 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007031 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
7032 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00007033 return 1;
7034 }
drh700c2522016-02-09 18:39:25 +00007035 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00007036 }
drh44c2eb12003-04-30 11:38:26 +00007037
drhac5649a2014-11-28 13:35:03 +00007038 if( !readStdin ){
7039 /* Run all arguments that do not begin with '-' as if they were separate
7040 ** command-line inputs, except for the argToSkip argument which contains
7041 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00007042 */
drhac5649a2014-11-28 13:35:03 +00007043 for(i=0; i<nCmd; i++){
7044 if( azCmd[i][0]=='.' ){
7045 rc = do_meta_command(azCmd[i], &data);
7046 if( rc ) return rc==2 ? 0 : rc;
7047 }else{
7048 open_db(&data, 0);
7049 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
7050 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007051 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00007052 return rc!=0 ? rc : 1;
7053 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007054 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00007055 return rc;
7056 }
drh6ff13852001-11-25 13:18:23 +00007057 }
drh75897232000-05-29 14:26:00 +00007058 }
drhac5649a2014-11-28 13:35:03 +00007059 free(azCmd);
drh75897232000-05-29 14:26:00 +00007060 }else{
drh44c2eb12003-04-30 11:38:26 +00007061 /* Run commands received from standard input
7062 */
drhc28490c2006-10-26 14:25:58 +00007063 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00007064 char *zHome;
7065 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00007066 int nHistory;
drh75897232000-05-29 14:26:00 +00007067 printf(
drh743e0032011-12-12 16:51:50 +00007068 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00007069 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00007070 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00007071 );
drhb3735912014-02-10 16:13:42 +00007072 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00007073 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00007074 printBold("transient in-memory database");
7075 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00007076 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00007077 }
drhd1459152016-09-16 19:11:03 +00007078 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00007079 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00007080 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00007081 if( (zHistory = malloc(nHistory))!=0 ){
7082 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
7083 }
drh67505e72002-04-19 12:34:06 +00007084 }
drhf5ed7ad2015-06-15 14:43:25 +00007085 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00007086 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00007087 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00007088 shell_stifle_history(100);
7089 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00007090 free(zHistory);
drh67505e72002-04-19 12:34:06 +00007091 }
drhdaffd0e2001-04-11 14:28:42 +00007092 }else{
drhc28490c2006-10-26 14:25:58 +00007093 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00007094 }
7095 }
drh33048c02001-10-01 14:29:22 +00007096 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00007097 if( data.db ){
drhe6229612014-08-18 15:08:26 +00007098 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00007099 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00007100 }
mistachkin1fe36bb2016-04-04 02:16:44 +00007101 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00007102 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00007103#if !SQLITE_SHELL_IS_UTF8
7104 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
7105 sqlite3_free(argv);
7106#endif
drhc28490c2006-10-26 14:25:58 +00007107 return rc;
drh75897232000-05-29 14:26:00 +00007108}