blob: 2beea32552237c3f9f2c3a0d63440dd1a19d839b [file] [log] [blame]
drh75897232000-05-29 14:26:00 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drh75897232000-05-29 14:26:00 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drh75897232000-05-29 14:26:00 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drh75897232000-05-29 14:26:00 +000010**
11*************************************************************************
12** This file contains code to implement the "sqlite" command line
13** utility for accessing SQLite databases.
drh75897232000-05-29 14:26:00 +000014*/
mistachkina3b2ff52011-09-16 20:16:36 +000015#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS)
shane18e526c2008-12-10 22:30:24 +000016/* This needs to come before any includes for MSVC compiler */
17#define _CRT_SECURE_NO_WARNINGS
18#endif
19
drh36f7dd32011-10-13 16:02:17 +000020/*
mistachkin2318d332015-01-12 18:02:52 +000021** If requested, include the SQLite compiler options file for MSVC.
22*/
23#if defined(INCLUDE_MSVC_H)
24#include "msvc.h"
25#endif
26
27/*
drh8cd5b252015-03-02 22:06:43 +000028** No support for loadable extensions in VxWorks.
29*/
drhada3f2b2015-03-23 21:32:50 +000030#if (defined(__RTP__) || defined(_WRS_KERNEL)) && !SQLITE_OMIT_LOAD_EXTENSION
drh8cd5b252015-03-02 22:06:43 +000031# define SQLITE_OMIT_LOAD_EXTENSION 1
32#endif
33
34/*
drh36f7dd32011-10-13 16:02:17 +000035** Enable large-file support for fopen() and friends on unix.
36*/
37#ifndef SQLITE_DISABLE_LFS
38# define _LARGE_FILE 1
39# ifndef _FILE_OFFSET_BITS
40# define _FILE_OFFSET_BITS 64
41# endif
42# define _LARGEFILE_SOURCE 1
43#endif
44
drh75897232000-05-29 14:26:00 +000045#include <stdlib.h>
46#include <string.h>
47#include <stdio.h>
danielk19772a02e332004-06-05 08:04:36 +000048#include <assert.h>
drh1d482dd2004-05-31 18:23:07 +000049#include "sqlite3.h"
drhf442e332014-09-10 19:01:14 +000050#if SQLITE_USER_AUTHENTICATION
51# include "sqlite3userauth.h"
52#endif
drh75897232000-05-29 14:26:00 +000053#include <ctype.h>
drhb0603412007-02-28 04:47:26 +000054#include <stdarg.h>
persicom7e2dfdd2002-04-18 02:46:52 +000055
drh83905c92012-06-21 13:00:37 +000056#if !defined(_WIN32) && !defined(WIN32)
drh4c504392000-10-16 22:06:40 +000057# include <signal.h>
chw97185482008-11-17 08:05:31 +000058# if !defined(__RTP__) && !defined(_WRS_KERNEL)
59# include <pwd.h>
60# endif
drhdd45df82002-04-18 12:39:03 +000061# include <unistd.h>
62# include <sys/types.h>
drh4c504392000-10-16 22:06:40 +000063#endif
drh75897232000-05-29 14:26:00 +000064
drh0ede9eb2015-01-10 16:49:23 +000065#if HAVE_READLINE
drh8e7e7a22000-05-30 18:45:23 +000066# include <readline/readline.h>
67# include <readline/history.h>
drh81d7fd12010-12-08 00:02:26 +000068#endif
danfd34d6d2015-02-25 10:54:53 +000069
drh0ede9eb2015-01-10 16:49:23 +000070#if HAVE_EDITLINE
drhaaa21b42014-02-11 14:37:51 +000071# include <editline/readline.h>
72#endif
danfd34d6d2015-02-25 10:54:53 +000073
74#if HAVE_EDITLINE || HAVE_READLINE
75
76# define shell_add_history(X) add_history(X)
77# define shell_read_history(X) read_history(X)
78# define shell_write_history(X) write_history(X)
79# define shell_stifle_history(X) stifle_history(X)
80# define shell_readline(X) readline(X)
81
82#elif HAVE_LINENOISE
83
84# include "linenoise.h"
85# define shell_add_history(X) linenoiseHistoryAdd(X)
86# define shell_read_history(X) linenoiseHistoryLoad(X)
87# define shell_write_history(X) linenoiseHistorySave(X)
88# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
89# define shell_readline(X) linenoise(X)
90
91#else
92
mistachkin1fe36bb2016-04-04 02:16:44 +000093# define shell_read_history(X)
danfd34d6d2015-02-25 10:54:53 +000094# define shell_write_history(X)
95# define shell_stifle_history(X)
96
97# define SHELL_USE_LOCAL_GETLINE 1
drh75897232000-05-29 14:26:00 +000098#endif
99
danfd34d6d2015-02-25 10:54:53 +0000100
adamd2e8464a2006-09-06 21:39:40 +0000101#if defined(_WIN32) || defined(WIN32)
102# include <io.h>
drh6976c212014-07-24 12:09:47 +0000103# include <fcntl.h>
mistachkin073664d2015-06-17 18:57:37 +0000104# define isatty(h) _isatty(h)
105# ifndef access
106# define access(f,m) _access((f),(m))
107# endif
108# undef popen
109# define popen _popen
110# undef pclose
111# define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000112#else
mistachkin073664d2015-06-17 18:57:37 +0000113 /* Make sure isatty() has a prototype. */
114 extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000115
mistachkin073664d2015-06-17 18:57:37 +0000116# if !defined(__RTP__) && !defined(_WRS_KERNEL)
117 /* popen and pclose are not C89 functions and so are
118 ** sometimes omitted from the <stdio.h> header */
119 extern FILE *popen(const char*,const char*);
120 extern int pclose(FILE*);
121# else
122# define SQLITE_OMIT_POPEN 1
123# endif
mistachkinf6418892013-08-28 01:54:12 +0000124#endif
drh53371f92013-07-25 17:07:03 +0000125
chw65d3c132007-11-12 21:09:10 +0000126#if defined(_WIN32_WCE)
127/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
128 * thus we always assume that we have a console. That can be
129 * overridden with the -batch command line option.
130 */
131#define isatty(x) 1
132#endif
133
drhf0693c82011-10-11 20:41:54 +0000134/* ctype macros that work with signed characters */
135#define IsSpace(X) isspace((unsigned char)X)
136#define IsDigit(X) isdigit((unsigned char)X)
137#define ToLower(X) (char)tolower((unsigned char)X)
138
mistachkin1fe36bb2016-04-04 02:16:44 +0000139#if defined(_WIN32) || defined(WIN32)
140#include <windows.h>
141
142/* string conversion routines only needed on Win32 */
143extern char *sqlite3_win32_unicode_to_utf8(LPCWSTR);
144extern char *sqlite3_win32_mbcs_to_utf8_v2(const char *, int);
145extern char *sqlite3_win32_utf8_to_mbcs_v2(const char *, int);
mistachkin8145fc62016-09-16 20:39:21 +0000146extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
mistachkin1fe36bb2016-04-04 02:16:44 +0000147#endif
148
drh047d4532015-01-18 20:30:23 +0000149/* On Windows, we normally run with output mode of TEXT so that \n characters
150** are automatically translated into \r\n. However, this behavior needs
151** to be disabled in some cases (ex: when generating CSV output and when
152** rendering quoted strings that contain \n characters). The following
153** routines take care of that.
154*/
155#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000156static void setBinaryMode(FILE *file, int isOutput){
157 if( isOutput ) fflush(file);
158 _setmode(_fileno(file), _O_BINARY);
drh047d4532015-01-18 20:30:23 +0000159}
mistachkin1fe36bb2016-04-04 02:16:44 +0000160static void setTextMode(FILE *file, int isOutput){
161 if( isOutput ) fflush(file);
162 _setmode(_fileno(file), _O_TEXT);
drh047d4532015-01-18 20:30:23 +0000163}
164#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000165# define setBinaryMode(X,Y)
166# define setTextMode(X,Y)
drh047d4532015-01-18 20:30:23 +0000167#endif
168
drh43408312013-10-30 12:43:36 +0000169
170/* True if the timer is enabled */
171static int enableTimer = 0;
172
173/* Return the current wall-clock time */
174static sqlite3_int64 timeOfDay(void){
175 static sqlite3_vfs *clockVfs = 0;
176 sqlite3_int64 t;
177 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
dan3fd415b2015-11-16 08:54:10 +0000178 if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
drh43408312013-10-30 12:43:36 +0000179 clockVfs->xCurrentTimeInt64(clockVfs, &t);
180 }else{
181 double r;
182 clockVfs->xCurrentTime(clockVfs, &r);
183 t = (sqlite3_int64)(r*86400000.0);
184 }
185 return t;
186}
187
drh91eb93c2015-03-03 19:56:20 +0000188#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000189#include <sys/time.h>
190#include <sys/resource.h>
191
drh91eb93c2015-03-03 19:56:20 +0000192/* VxWorks does not support getrusage() as far as we can determine */
193#if defined(_WRS_KERNEL) || defined(__RTP__)
194struct rusage {
195 struct timeval ru_utime; /* user CPU time used */
196 struct timeval ru_stime; /* system CPU time used */
197};
198#define getrusage(A,B) memset(B,0,sizeof(*B))
199#endif
200
drhda108222009-02-25 19:07:24 +0000201/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000202static struct rusage sBegin; /* CPU time at start */
203static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000204
drhda108222009-02-25 19:07:24 +0000205/*
206** Begin timing an operation
207*/
208static void beginTimer(void){
209 if( enableTimer ){
210 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000211 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000212 }
213}
214
215/* Return the difference of two time_structs in seconds */
216static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
mistachkin1fe36bb2016-04-04 02:16:44 +0000217 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
drhda108222009-02-25 19:07:24 +0000218 (double)(pEnd->tv_sec - pStart->tv_sec);
219}
220
221/*
222** Print the timing results.
223*/
224static void endTimer(void){
225 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000226 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000227 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000228 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000229 printf("Run Time: real %.3f user %f sys %f\n",
230 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000231 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
232 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
233 }
234}
shaneb320ccd2009-10-21 03:42:58 +0000235
drhda108222009-02-25 19:07:24 +0000236#define BEGIN_TIMER beginTimer()
237#define END_TIMER endTimer()
238#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000239
240#elif (defined(_WIN32) || defined(WIN32))
241
shaneb320ccd2009-10-21 03:42:58 +0000242/* Saved resource information for the beginning of an operation */
243static HANDLE hProcess;
244static FILETIME ftKernelBegin;
245static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000246static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000247typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
248 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000249static GETPROCTIMES getProcessTimesAddr = NULL;
250
shaneb320ccd2009-10-21 03:42:58 +0000251/*
252** Check to see if we have timer support. Return 1 if necessary
253** support found (or found previously).
254*/
255static int hasTimer(void){
256 if( getProcessTimesAddr ){
257 return 1;
258 } else {
drh4ace5362014-11-10 14:42:28 +0000259 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
260 ** versions. See if the version we are running on has it, and if it
261 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000262 */
263 hProcess = GetCurrentProcess();
264 if( hProcess ){
265 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
266 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000267 getProcessTimesAddr =
268 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000269 if( NULL != getProcessTimesAddr ){
270 return 1;
271 }
mistachkin1fe36bb2016-04-04 02:16:44 +0000272 FreeLibrary(hinstLib);
shaneb320ccd2009-10-21 03:42:58 +0000273 }
274 }
275 }
276 return 0;
277}
278
279/*
280** Begin timing an operation
281*/
282static void beginTimer(void){
283 if( enableTimer && getProcessTimesAddr ){
284 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000285 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
286 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000287 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000288 }
289}
290
291/* Return the difference of two FILETIME structs in seconds */
292static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
293 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
294 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
295 return (double) ((i64End - i64Start) / 10000000.0);
296}
297
298/*
299** Print the timing results.
300*/
301static void endTimer(void){
302 if( enableTimer && getProcessTimesAddr){
303 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000304 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000305 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000306 printf("Run Time: real %.3f user %f sys %f\n",
307 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000308 timeDiff(&ftUserBegin, &ftUserEnd),
309 timeDiff(&ftKernelBegin, &ftKernelEnd));
310 }
311}
312
313#define BEGIN_TIMER beginTimer()
314#define END_TIMER endTimer()
315#define HAS_TIMER hasTimer()
316
drhda108222009-02-25 19:07:24 +0000317#else
mistachkin1fe36bb2016-04-04 02:16:44 +0000318#define BEGIN_TIMER
drhda108222009-02-25 19:07:24 +0000319#define END_TIMER
320#define HAS_TIMER 0
321#endif
322
shanec0688ea2009-03-05 03:48:06 +0000323/*
324** Used to prevent warnings about unused parameters
325*/
326#define UNUSED_PARAMETER(x) (void)(x)
327
drhe91d16b2008-12-08 18:27:31 +0000328/*
drhc49f44e2006-10-26 18:15:42 +0000329** If the following flag is set, then command execution stops
330** at an error if we are not interactive.
331*/
332static int bail_on_error = 0;
333
334/*
drhc28490c2006-10-26 14:25:58 +0000335** Threat stdin as an interactive input if the following variable
336** is true. Otherwise, assume stdin is connected to a file or pipe.
337*/
338static int stdin_is_interactive = 1;
339
340/*
drhe05461c2015-12-30 13:36:57 +0000341** On Windows systems we have to know if standard output is a console
342** in order to translate UTF-8 into MBCS. The following variable is
343** true if translation is required.
344*/
345static int stdout_is_console = 1;
346
347/*
drh4c504392000-10-16 22:06:40 +0000348** The following is the open SQLite database. We make a pointer
349** to this database a static variable so that it can be accessed
350** by the SIGINT handler to interrupt database processing.
351*/
mistachkin8e189222015-04-19 21:43:16 +0000352static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000353
354/*
drh67505e72002-04-19 12:34:06 +0000355** True if an interrupt (Control-C) has been received.
356*/
drh43617e92006-03-06 20:55:46 +0000357static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000358
359/*
persicom7e2dfdd2002-04-18 02:46:52 +0000360** This is the name of our program. It is set in main(), used
361** in a number of other places, mostly for error messages.
362*/
363static char *Argv0;
364
365/*
366** Prompt strings. Initialized in main. Settable with
367** .prompt main continue
368*/
369static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
370static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
371
drhb0603412007-02-28 04:47:26 +0000372/*
mistachkin710b33b2016-01-03 18:59:28 +0000373** Render output like fprintf(). Except, if the output is going to the
374** console and if this is running on a Windows machine, translate the
375** output from UTF-8 into MBCS.
376*/
377#if defined(_WIN32) || defined(WIN32)
378void utf8_printf(FILE *out, const char *zFormat, ...){
379 va_list ap;
380 va_start(ap, zFormat);
381 if( stdout_is_console && (out==stdout || out==stderr) ){
mistachkin710b33b2016-01-03 18:59:28 +0000382 char *z1 = sqlite3_vmprintf(zFormat, ap);
mistachkin1fe36bb2016-04-04 02:16:44 +0000383 char *z2 = sqlite3_win32_utf8_to_mbcs_v2(z1, 0);
mistachkin710b33b2016-01-03 18:59:28 +0000384 sqlite3_free(z1);
385 fputs(z2, out);
386 sqlite3_free(z2);
387 }else{
388 vfprintf(out, zFormat, ap);
389 }
390 va_end(ap);
391}
392#elif !defined(utf8_printf)
393# define utf8_printf fprintf
394#endif
395
396/*
397** Render output like fprintf(). This should not be used on anything that
398** includes string formatting (e.g. "%s").
399*/
400#if !defined(raw_printf)
401# define raw_printf fprintf
402#endif
403
404/*
drhb0603412007-02-28 04:47:26 +0000405** Write I/O traces to the following stream.
406*/
rsebe0a9092007-07-30 18:24:38 +0000407#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000408static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000409#endif
drhb0603412007-02-28 04:47:26 +0000410
411/*
412** This routine works like printf in that its first argument is a
413** format string and subsequent arguments are values to be substituted
414** in place of % fields. The result of formatting this string
415** is written to iotrace.
416*/
rsebe0a9092007-07-30 18:24:38 +0000417#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000418static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000419 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000420 char *z;
drhb0603412007-02-28 04:47:26 +0000421 if( iotrace==0 ) return;
422 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000423 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000424 va_end(ap);
mistachkin710b33b2016-01-03 18:59:28 +0000425 utf8_printf(iotrace, "%s", z);
drhf075cd02007-02-28 06:14:25 +0000426 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000427}
rsebe0a9092007-07-30 18:24:38 +0000428#endif
drhb0603412007-02-28 04:47:26 +0000429
drh44c2eb12003-04-30 11:38:26 +0000430
persicom7e2dfdd2002-04-18 02:46:52 +0000431/*
drh83965662003-04-17 02:54:13 +0000432** Determines if a string is a number of not.
433*/
danielk19772e588c72005-12-09 14:25:08 +0000434static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000435 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000436 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000437 return 0;
438 }
439 z++;
440 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000441 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000442 if( *z=='.' ){
443 z++;
drhf0693c82011-10-11 20:41:54 +0000444 if( !IsDigit(*z) ) return 0;
445 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000446 if( realnum ) *realnum = 1;
447 }
448 if( *z=='e' || *z=='E' ){
449 z++;
450 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000451 if( !IsDigit(*z) ) return 0;
452 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000453 if( realnum ) *realnum = 1;
454 }
455 return *z==0;
456}
drh83965662003-04-17 02:54:13 +0000457
458/*
drhe05461c2015-12-30 13:36:57 +0000459** Compute a string length that is limited to what can be stored in
460** lower 30 bits of a 32-bit signed integer.
461*/
462static int strlen30(const char *z){
463 const char *z2 = z;
464 while( *z2 ){ z2++; }
465 return 0x3fffffff & (int)(z2 - z);
466}
467
468/*
drhfeac5f82004-08-01 00:10:45 +0000469** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000470** the text in memory obtained from malloc() and returns a pointer
471** to the text. NULL is returned at end of file, or if malloc()
472** fails.
473**
drh9f099fd2013-08-06 14:01:46 +0000474** If zLine is not NULL then it is a malloced buffer returned from
475** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000476*/
drh9f099fd2013-08-06 14:01:46 +0000477static char *local_getline(char *zLine, FILE *in){
478 int nLine = zLine==0 ? 0 : 100;
479 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000480
drhb07028f2011-10-14 21:49:18 +0000481 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000482 if( n+100>nLine ){
483 nLine = nLine*2 + 100;
484 zLine = realloc(zLine, nLine);
485 if( zLine==0 ) return 0;
486 }
drhdaffd0e2001-04-11 14:28:42 +0000487 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000488 if( n==0 ){
489 free(zLine);
490 return 0;
491 }
492 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000493 break;
494 }
drh9f099fd2013-08-06 14:01:46 +0000495 while( zLine[n] ) n++;
496 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000497 n--;
shaneh13b36022009-12-17 21:07:15 +0000498 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000499 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000500 break;
drh8e7e7a22000-05-30 18:45:23 +0000501 }
502 }
drhe05461c2015-12-30 13:36:57 +0000503#if defined(_WIN32) || defined(WIN32)
mistachkin1fe36bb2016-04-04 02:16:44 +0000504 /* For interactive input on Windows systems, translate the
drhe05461c2015-12-30 13:36:57 +0000505 ** multi-byte characterset characters into UTF-8. */
drhfc8b40f2016-09-07 10:10:18 +0000506 if( stdin_is_interactive && in==stdin ){
mistachkin1fe36bb2016-04-04 02:16:44 +0000507 char *zTrans = sqlite3_win32_mbcs_to_utf8_v2(zLine, 0);
drhe05461c2015-12-30 13:36:57 +0000508 if( zTrans ){
509 int nTrans = strlen30(zTrans)+1;
510 if( nTrans>nLine ){
511 zLine = realloc(zLine, nTrans);
512 if( zLine==0 ){
513 sqlite3_free(zTrans);
514 return 0;
515 }
516 }
517 memcpy(zLine, zTrans, nTrans);
518 sqlite3_free(zTrans);
519 }
520 }
521#endif /* defined(_WIN32) || defined(WIN32) */
drh8e7e7a22000-05-30 18:45:23 +0000522 return zLine;
523}
524
525/*
drhc28490c2006-10-26 14:25:58 +0000526** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000527**
drh9f099fd2013-08-06 14:01:46 +0000528** If in==0 then read from standard input and prompt before each line.
529** If isContinuation is true, then a continuation prompt is appropriate.
530** If isContinuation is zero, then the main prompt should be used.
531**
532** If zPrior is not NULL then it is a buffer from a prior call to this
533** routine that can be reused.
534**
535** The result is stored in space obtained from malloc() and must either
536** be freed by the caller or else passed back into this routine via the
537** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000538*/
drh9f099fd2013-08-06 14:01:46 +0000539static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000540 char *zPrompt;
541 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000542 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000543 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000544 }else{
drh9f099fd2013-08-06 14:01:46 +0000545 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000546#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000547 printf("%s", zPrompt);
548 fflush(stdout);
549 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000550#else
551 free(zPrior);
552 zResult = shell_readline(zPrompt);
553 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000554#endif
drh9f099fd2013-08-06 14:01:46 +0000555 }
drh8e7e7a22000-05-30 18:45:23 +0000556 return zResult;
557}
drhf42d3182017-03-08 12:25:18 +0000558/*
559** A variable length string to which one can append text.
560*/
561typedef struct ShellText ShellText;
562struct ShellText {
563 char *z;
564 int n;
565 int nAlloc;
566};
567
568/*
569** Initialize and destroy a ShellText object
570*/
571static void initText(ShellText *p){
572 memset(p, 0, sizeof(*p));
573}
574static void freeText(ShellText *p){
575 free(p->z);
576 initText(p);
577}
578
579/* zIn is either a pointer to a NULL-terminated string in memory obtained
580** from malloc(), or a NULL pointer. The string pointed to by zAppend is
581** added to zIn, and the result returned in memory obtained from malloc().
582** zIn, if it was not NULL, is freed.
583**
584** If the third argument, quote, is not '\0', then it is used as a
585** quote character for zAppend.
586*/
587static void appendText(ShellText *p, char const *zAppend, char quote){
588 int len;
589 int i;
590 int nAppend = strlen30(zAppend);
591
592 len = nAppend+p->n+1;
593 if( quote ){
594 len += 2;
595 for(i=0; i<nAppend; i++){
596 if( zAppend[i]==quote ) len++;
597 }
598 }
599
600 if( p->n+len>=p->nAlloc ){
601 p->nAlloc = p->nAlloc*2 + len + 20;
602 p->z = realloc(p->z, p->nAlloc);
603 if( p->z==0 ){
604 memset(p, 0, sizeof(*p));
605 return;
606 }
607 }
608
609 if( quote ){
610 char *zCsr = p->z+p->n;
611 *zCsr++ = quote;
612 for(i=0; i<nAppend; i++){
613 *zCsr++ = zAppend[i];
614 if( zAppend[i]==quote ) *zCsr++ = quote;
615 }
616 *zCsr++ = quote;
617 p->n = (int)(zCsr - p->z);
618 *zCsr = '\0';
619 }else{
620 memcpy(p->z+p->n, zAppend, nAppend);
621 p->n += nAppend;
622 p->z[p->n] = '\0';
623 }
624}
625
626/*
627** Attempt to determine if identifier zName needs to be quoted, either
628** because it contains non-alphanumeric characters, or because it is an
629** SQLite keyword. Be conservative in this estimate: When in doubt assume
630** that quoting is required.
631**
632** Return '"' if quoting is required. Return 0 if no quoting is required.
633*/
634static char quoteChar(const char *zName){
635 /* All SQLite keywords, in alphabetical order */
636 static const char *azKeywords[] = {
637 "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS",
638 "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY",
639 "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT",
640 "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE",
641 "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE",
642 "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH",
643 "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN",
644 "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF",
645 "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER",
646 "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY",
647 "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL",
648 "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA",
649 "PRIMARY", "QUERY", "RAISE", "RECURSIVE", "REFERENCES", "REGEXP",
650 "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT",
651 "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP",
652 "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE",
653 "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE",
654 "WITH", "WITHOUT",
655 };
656 int i, lwr, upr, mid, c;
657 if( !isalpha((unsigned char)zName[0]) && zName[0]!='_' ) return '"';
658 for(i=0; zName[i]; i++){
659 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ) return '"';
660 }
661 lwr = 0;
662 upr = sizeof(azKeywords)/sizeof(azKeywords[0]) - 1;
663 while( lwr<=upr ){
664 mid = (lwr+upr)/2;
665 c = sqlite3_stricmp(azKeywords[mid], zName);
666 if( c==0 ) return '"';
667 if( c<0 ){
668 lwr = mid+1;
669 }else{
670 upr = mid-1;
671 }
672 }
673 return 0;
674}
drh8e7e7a22000-05-30 18:45:23 +0000675
drh1554bc82017-03-08 16:10:34 +0000676/******************************************************************************
677** SHA3 hash implementation copied from ../ext/misc/shathree.c
678*/
679typedef sqlite3_uint64 u64;
680/*
681** Macros to determine whether the machine is big or little endian,
682** and whether or not that determination is run-time or compile-time.
683**
684** For best performance, an attempt is made to guess at the byte-order
685** using C-preprocessor macros. If that is unsuccessful, or if
686** -DSHA3_BYTEORDER=0 is set, then byte-order is determined
687** at run-time.
688*/
689#ifndef SHA3_BYTEORDER
690# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
691 defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
692 defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
693 defined(__arm__)
694# define SHA3_BYTEORDER 1234
695# elif defined(sparc) || defined(__ppc__)
696# define SHA3_BYTEORDER 4321
697# else
698# define SHA3_BYTEORDER 0
699# endif
700#endif
701
702
703/*
704** State structure for a SHA3 hash in progress
705*/
706typedef struct SHA3Context SHA3Context;
707struct SHA3Context {
708 union {
709 u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */
710 unsigned char x[1600]; /* ... or 1600 bytes */
711 } u;
712 unsigned nRate; /* Bytes of input accepted per Keccak iteration */
713 unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */
714 unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */
715};
716
717/*
718** A single step of the Keccak mixing function for a 1600-bit state
719*/
720static void KeccakF1600Step(SHA3Context *p){
721 int i;
722 u64 B0, B1, B2, B3, B4;
723 u64 C0, C1, C2, C3, C4;
724 u64 D0, D1, D2, D3, D4;
725 static const u64 RC[] = {
726 0x0000000000000001ULL, 0x0000000000008082ULL,
727 0x800000000000808aULL, 0x8000000080008000ULL,
728 0x000000000000808bULL, 0x0000000080000001ULL,
729 0x8000000080008081ULL, 0x8000000000008009ULL,
730 0x000000000000008aULL, 0x0000000000000088ULL,
731 0x0000000080008009ULL, 0x000000008000000aULL,
732 0x000000008000808bULL, 0x800000000000008bULL,
733 0x8000000000008089ULL, 0x8000000000008003ULL,
734 0x8000000000008002ULL, 0x8000000000000080ULL,
735 0x000000000000800aULL, 0x800000008000000aULL,
736 0x8000000080008081ULL, 0x8000000000008080ULL,
737 0x0000000080000001ULL, 0x8000000080008008ULL
738 };
739# define A00 (p->u.s[0])
740# define A01 (p->u.s[1])
741# define A02 (p->u.s[2])
742# define A03 (p->u.s[3])
743# define A04 (p->u.s[4])
744# define A10 (p->u.s[5])
745# define A11 (p->u.s[6])
746# define A12 (p->u.s[7])
747# define A13 (p->u.s[8])
748# define A14 (p->u.s[9])
749# define A20 (p->u.s[10])
750# define A21 (p->u.s[11])
751# define A22 (p->u.s[12])
752# define A23 (p->u.s[13])
753# define A24 (p->u.s[14])
754# define A30 (p->u.s[15])
755# define A31 (p->u.s[16])
756# define A32 (p->u.s[17])
757# define A33 (p->u.s[18])
758# define A34 (p->u.s[19])
759# define A40 (p->u.s[20])
760# define A41 (p->u.s[21])
761# define A42 (p->u.s[22])
762# define A43 (p->u.s[23])
763# define A44 (p->u.s[24])
764# define ROL64(a,x) ((a<<x)|(a>>(64-x)))
765
766 for(i=0; i<24; i+=4){
767 C0 = A00^A10^A20^A30^A40;
768 C1 = A01^A11^A21^A31^A41;
769 C2 = A02^A12^A22^A32^A42;
770 C3 = A03^A13^A23^A33^A43;
771 C4 = A04^A14^A24^A34^A44;
772 D0 = C4^ROL64(C1, 1);
773 D1 = C0^ROL64(C2, 1);
774 D2 = C1^ROL64(C3, 1);
775 D3 = C2^ROL64(C4, 1);
776 D4 = C3^ROL64(C0, 1);
777
778 B0 = (A00^D0);
779 B1 = ROL64((A11^D1), 44);
780 B2 = ROL64((A22^D2), 43);
781 B3 = ROL64((A33^D3), 21);
782 B4 = ROL64((A44^D4), 14);
783 A00 = B0 ^((~B1)& B2 );
784 A00 ^= RC[i];
785 A11 = B1 ^((~B2)& B3 );
786 A22 = B2 ^((~B3)& B4 );
787 A33 = B3 ^((~B4)& B0 );
788 A44 = B4 ^((~B0)& B1 );
789
790 B2 = ROL64((A20^D0), 3);
791 B3 = ROL64((A31^D1), 45);
792 B4 = ROL64((A42^D2), 61);
793 B0 = ROL64((A03^D3), 28);
794 B1 = ROL64((A14^D4), 20);
795 A20 = B0 ^((~B1)& B2 );
796 A31 = B1 ^((~B2)& B3 );
797 A42 = B2 ^((~B3)& B4 );
798 A03 = B3 ^((~B4)& B0 );
799 A14 = B4 ^((~B0)& B1 );
800
801 B4 = ROL64((A40^D0), 18);
802 B0 = ROL64((A01^D1), 1);
803 B1 = ROL64((A12^D2), 6);
804 B2 = ROL64((A23^D3), 25);
805 B3 = ROL64((A34^D4), 8);
806 A40 = B0 ^((~B1)& B2 );
807 A01 = B1 ^((~B2)& B3 );
808 A12 = B2 ^((~B3)& B4 );
809 A23 = B3 ^((~B4)& B0 );
810 A34 = B4 ^((~B0)& B1 );
811
812 B1 = ROL64((A10^D0), 36);
813 B2 = ROL64((A21^D1), 10);
814 B3 = ROL64((A32^D2), 15);
815 B4 = ROL64((A43^D3), 56);
816 B0 = ROL64((A04^D4), 27);
817 A10 = B0 ^((~B1)& B2 );
818 A21 = B1 ^((~B2)& B3 );
819 A32 = B2 ^((~B3)& B4 );
820 A43 = B3 ^((~B4)& B0 );
821 A04 = B4 ^((~B0)& B1 );
822
823 B3 = ROL64((A30^D0), 41);
824 B4 = ROL64((A41^D1), 2);
825 B0 = ROL64((A02^D2), 62);
826 B1 = ROL64((A13^D3), 55);
827 B2 = ROL64((A24^D4), 39);
828 A30 = B0 ^((~B1)& B2 );
829 A41 = B1 ^((~B2)& B3 );
830 A02 = B2 ^((~B3)& B4 );
831 A13 = B3 ^((~B4)& B0 );
832 A24 = B4 ^((~B0)& B1 );
833
834 C0 = A00^A20^A40^A10^A30;
835 C1 = A11^A31^A01^A21^A41;
836 C2 = A22^A42^A12^A32^A02;
837 C3 = A33^A03^A23^A43^A13;
838 C4 = A44^A14^A34^A04^A24;
839 D0 = C4^ROL64(C1, 1);
840 D1 = C0^ROL64(C2, 1);
841 D2 = C1^ROL64(C3, 1);
842 D3 = C2^ROL64(C4, 1);
843 D4 = C3^ROL64(C0, 1);
844
845 B0 = (A00^D0);
846 B1 = ROL64((A31^D1), 44);
847 B2 = ROL64((A12^D2), 43);
848 B3 = ROL64((A43^D3), 21);
849 B4 = ROL64((A24^D4), 14);
850 A00 = B0 ^((~B1)& B2 );
851 A00 ^= RC[i+1];
852 A31 = B1 ^((~B2)& B3 );
853 A12 = B2 ^((~B3)& B4 );
854 A43 = B3 ^((~B4)& B0 );
855 A24 = B4 ^((~B0)& B1 );
856
857 B2 = ROL64((A40^D0), 3);
858 B3 = ROL64((A21^D1), 45);
859 B4 = ROL64((A02^D2), 61);
860 B0 = ROL64((A33^D3), 28);
861 B1 = ROL64((A14^D4), 20);
862 A40 = B0 ^((~B1)& B2 );
863 A21 = B1 ^((~B2)& B3 );
864 A02 = B2 ^((~B3)& B4 );
865 A33 = B3 ^((~B4)& B0 );
866 A14 = B4 ^((~B0)& B1 );
867
868 B4 = ROL64((A30^D0), 18);
869 B0 = ROL64((A11^D1), 1);
870 B1 = ROL64((A42^D2), 6);
871 B2 = ROL64((A23^D3), 25);
872 B3 = ROL64((A04^D4), 8);
873 A30 = B0 ^((~B1)& B2 );
874 A11 = B1 ^((~B2)& B3 );
875 A42 = B2 ^((~B3)& B4 );
876 A23 = B3 ^((~B4)& B0 );
877 A04 = B4 ^((~B0)& B1 );
878
879 B1 = ROL64((A20^D0), 36);
880 B2 = ROL64((A01^D1), 10);
881 B3 = ROL64((A32^D2), 15);
882 B4 = ROL64((A13^D3), 56);
883 B0 = ROL64((A44^D4), 27);
884 A20 = B0 ^((~B1)& B2 );
885 A01 = B1 ^((~B2)& B3 );
886 A32 = B2 ^((~B3)& B4 );
887 A13 = B3 ^((~B4)& B0 );
888 A44 = B4 ^((~B0)& B1 );
889
890 B3 = ROL64((A10^D0), 41);
891 B4 = ROL64((A41^D1), 2);
892 B0 = ROL64((A22^D2), 62);
893 B1 = ROL64((A03^D3), 55);
894 B2 = ROL64((A34^D4), 39);
895 A10 = B0 ^((~B1)& B2 );
896 A41 = B1 ^((~B2)& B3 );
897 A22 = B2 ^((~B3)& B4 );
898 A03 = B3 ^((~B4)& B0 );
899 A34 = B4 ^((~B0)& B1 );
900
901 C0 = A00^A40^A30^A20^A10;
902 C1 = A31^A21^A11^A01^A41;
903 C2 = A12^A02^A42^A32^A22;
904 C3 = A43^A33^A23^A13^A03;
905 C4 = A24^A14^A04^A44^A34;
906 D0 = C4^ROL64(C1, 1);
907 D1 = C0^ROL64(C2, 1);
908 D2 = C1^ROL64(C3, 1);
909 D3 = C2^ROL64(C4, 1);
910 D4 = C3^ROL64(C0, 1);
911
912 B0 = (A00^D0);
913 B1 = ROL64((A21^D1), 44);
914 B2 = ROL64((A42^D2), 43);
915 B3 = ROL64((A13^D3), 21);
916 B4 = ROL64((A34^D4), 14);
917 A00 = B0 ^((~B1)& B2 );
918 A00 ^= RC[i+2];
919 A21 = B1 ^((~B2)& B3 );
920 A42 = B2 ^((~B3)& B4 );
921 A13 = B3 ^((~B4)& B0 );
922 A34 = B4 ^((~B0)& B1 );
923
924 B2 = ROL64((A30^D0), 3);
925 B3 = ROL64((A01^D1), 45);
926 B4 = ROL64((A22^D2), 61);
927 B0 = ROL64((A43^D3), 28);
928 B1 = ROL64((A14^D4), 20);
929 A30 = B0 ^((~B1)& B2 );
930 A01 = B1 ^((~B2)& B3 );
931 A22 = B2 ^((~B3)& B4 );
932 A43 = B3 ^((~B4)& B0 );
933 A14 = B4 ^((~B0)& B1 );
934
935 B4 = ROL64((A10^D0), 18);
936 B0 = ROL64((A31^D1), 1);
937 B1 = ROL64((A02^D2), 6);
938 B2 = ROL64((A23^D3), 25);
939 B3 = ROL64((A44^D4), 8);
940 A10 = B0 ^((~B1)& B2 );
941 A31 = B1 ^((~B2)& B3 );
942 A02 = B2 ^((~B3)& B4 );
943 A23 = B3 ^((~B4)& B0 );
944 A44 = B4 ^((~B0)& B1 );
945
946 B1 = ROL64((A40^D0), 36);
947 B2 = ROL64((A11^D1), 10);
948 B3 = ROL64((A32^D2), 15);
949 B4 = ROL64((A03^D3), 56);
950 B0 = ROL64((A24^D4), 27);
951 A40 = B0 ^((~B1)& B2 );
952 A11 = B1 ^((~B2)& B3 );
953 A32 = B2 ^((~B3)& B4 );
954 A03 = B3 ^((~B4)& B0 );
955 A24 = B4 ^((~B0)& B1 );
956
957 B3 = ROL64((A20^D0), 41);
958 B4 = ROL64((A41^D1), 2);
959 B0 = ROL64((A12^D2), 62);
960 B1 = ROL64((A33^D3), 55);
961 B2 = ROL64((A04^D4), 39);
962 A20 = B0 ^((~B1)& B2 );
963 A41 = B1 ^((~B2)& B3 );
964 A12 = B2 ^((~B3)& B4 );
965 A33 = B3 ^((~B4)& B0 );
966 A04 = B4 ^((~B0)& B1 );
967
968 C0 = A00^A30^A10^A40^A20;
969 C1 = A21^A01^A31^A11^A41;
970 C2 = A42^A22^A02^A32^A12;
971 C3 = A13^A43^A23^A03^A33;
972 C4 = A34^A14^A44^A24^A04;
973 D0 = C4^ROL64(C1, 1);
974 D1 = C0^ROL64(C2, 1);
975 D2 = C1^ROL64(C3, 1);
976 D3 = C2^ROL64(C4, 1);
977 D4 = C3^ROL64(C0, 1);
978
979 B0 = (A00^D0);
980 B1 = ROL64((A01^D1), 44);
981 B2 = ROL64((A02^D2), 43);
982 B3 = ROL64((A03^D3), 21);
983 B4 = ROL64((A04^D4), 14);
984 A00 = B0 ^((~B1)& B2 );
985 A00 ^= RC[i+3];
986 A01 = B1 ^((~B2)& B3 );
987 A02 = B2 ^((~B3)& B4 );
988 A03 = B3 ^((~B4)& B0 );
989 A04 = B4 ^((~B0)& B1 );
990
991 B2 = ROL64((A10^D0), 3);
992 B3 = ROL64((A11^D1), 45);
993 B4 = ROL64((A12^D2), 61);
994 B0 = ROL64((A13^D3), 28);
995 B1 = ROL64((A14^D4), 20);
996 A10 = B0 ^((~B1)& B2 );
997 A11 = B1 ^((~B2)& B3 );
998 A12 = B2 ^((~B3)& B4 );
999 A13 = B3 ^((~B4)& B0 );
1000 A14 = B4 ^((~B0)& B1 );
1001
1002 B4 = ROL64((A20^D0), 18);
1003 B0 = ROL64((A21^D1), 1);
1004 B1 = ROL64((A22^D2), 6);
1005 B2 = ROL64((A23^D3), 25);
1006 B3 = ROL64((A24^D4), 8);
1007 A20 = B0 ^((~B1)& B2 );
1008 A21 = B1 ^((~B2)& B3 );
1009 A22 = B2 ^((~B3)& B4 );
1010 A23 = B3 ^((~B4)& B0 );
1011 A24 = B4 ^((~B0)& B1 );
1012
1013 B1 = ROL64((A30^D0), 36);
1014 B2 = ROL64((A31^D1), 10);
1015 B3 = ROL64((A32^D2), 15);
1016 B4 = ROL64((A33^D3), 56);
1017 B0 = ROL64((A34^D4), 27);
1018 A30 = B0 ^((~B1)& B2 );
1019 A31 = B1 ^((~B2)& B3 );
1020 A32 = B2 ^((~B3)& B4 );
1021 A33 = B3 ^((~B4)& B0 );
1022 A34 = B4 ^((~B0)& B1 );
1023
1024 B3 = ROL64((A40^D0), 41);
1025 B4 = ROL64((A41^D1), 2);
1026 B0 = ROL64((A42^D2), 62);
1027 B1 = ROL64((A43^D3), 55);
1028 B2 = ROL64((A44^D4), 39);
1029 A40 = B0 ^((~B1)& B2 );
1030 A41 = B1 ^((~B2)& B3 );
1031 A42 = B2 ^((~B3)& B4 );
1032 A43 = B3 ^((~B4)& B0 );
1033 A44 = B4 ^((~B0)& B1 );
1034 }
1035}
1036
1037/*
1038** Initialize a new hash. iSize determines the size of the hash
1039** in bits and should be one of 224, 256, 384, or 512. Or iSize
1040** can be zero to use the default hash size of 256 bits.
1041*/
1042static void SHA3Init(SHA3Context *p, int iSize){
1043 memset(p, 0, sizeof(*p));
1044 if( iSize>=128 && iSize<=512 ){
1045 p->nRate = (1600 - ((iSize + 31)&~31)*2)/8;
1046 }else{
1047 p->nRate = (1600 - 2*256)/8;
1048 }
1049#if SHA3_BYTEORDER==1234
1050 /* Known to be little-endian at compile-time. No-op */
1051#elif SHA3_BYTEORDER==4321
1052 p->ixMask = 7; /* Big-endian */
1053#else
1054 {
1055 static unsigned int one = 1;
1056 if( 1==*(unsigned char*)&one ){
1057 /* Little endian. No byte swapping. */
1058 p->ixMask = 0;
1059 }else{
1060 /* Big endian. Byte swap. */
1061 p->ixMask = 7;
1062 }
1063 }
1064#endif
1065}
1066
1067/*
1068** Make consecutive calls to the SHA3Update function to add new content
1069** to the hash
1070*/
1071static void SHA3Update(
1072 SHA3Context *p,
1073 const unsigned char *aData,
1074 unsigned int nData
1075){
1076 unsigned int i = 0;
1077#if SHA3_BYTEORDER==1234
1078 if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){
1079 for(; i+7<nData; i+=8){
1080 p->u.s[p->nLoaded/8] ^= *(u64*)&aData[i];
1081 p->nLoaded += 8;
1082 if( p->nLoaded>=p->nRate ){
1083 KeccakF1600Step(p);
1084 p->nLoaded = 0;
1085 }
1086 }
1087 }
1088#endif
1089 for(; i<nData; i++){
1090#if SHA3_BYTEORDER==1234
1091 p->u.x[p->nLoaded] ^= aData[i];
1092#elif SHA3_BYTEORDER==4321
1093 p->u.x[p->nLoaded^0x07] ^= aData[i];
1094#else
1095 p->u.x[p->nLoaded^p->ixMask] ^= aData[i];
1096#endif
1097 p->nLoaded++;
1098 if( p->nLoaded==p->nRate ){
1099 KeccakF1600Step(p);
1100 p->nLoaded = 0;
1101 }
1102 }
1103}
1104
1105/*
1106** After all content has been added, invoke SHA3Final() to compute
1107** the final hash. The function returns a pointer to the binary
1108** hash value.
1109*/
1110static unsigned char *SHA3Final(SHA3Context *p){
1111 unsigned int i;
1112 if( p->nLoaded==p->nRate-1 ){
1113 const unsigned char c1 = 0x86;
1114 SHA3Update(p, &c1, 1);
1115 }else{
1116 const unsigned char c2 = 0x06;
1117 const unsigned char c3 = 0x80;
1118 SHA3Update(p, &c2, 1);
1119 p->nLoaded = p->nRate - 1;
1120 SHA3Update(p, &c3, 1);
1121 }
1122 for(i=0; i<p->nRate; i++){
1123 p->u.x[i+p->nRate] = p->u.x[i^p->ixMask];
1124 }
1125 return &p->u.x[p->nRate];
1126}
1127
1128/*
1129** Implementation of the sha3(X,SIZE) function.
1130**
1131** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default
1132** size is 256. If X is a BLOB, it is hashed as is.
1133** For all other non-NULL types of input, X is converted into a UTF-8 string
1134** and the string is hashed without the trailing 0x00 terminator. The hash
1135** of a NULL value is NULL.
1136*/
1137static void sha3Func(
1138 sqlite3_context *context,
1139 int argc,
1140 sqlite3_value **argv
1141){
1142 SHA3Context cx;
1143 int eType = sqlite3_value_type(argv[0]);
1144 int nByte = sqlite3_value_bytes(argv[0]);
1145 int iSize;
1146 if( argc==1 ){
1147 iSize = 256;
1148 }else{
1149 iSize = sqlite3_value_int(argv[1]);
1150 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1151 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1152 "384 512", -1);
1153 return;
1154 }
1155 }
1156 if( eType==SQLITE_NULL ) return;
1157 SHA3Init(&cx, iSize);
1158 if( eType==SQLITE_BLOB ){
1159 SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte);
1160 }else{
1161 SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte);
1162 }
1163 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1164}
1165
1166/* Compute a string using sqlite3_vsnprintf() with a maximum length
1167** of 50 bytes and add it to the hash.
1168*/
1169static void hash_step_vformat(
1170 SHA3Context *p, /* Add content to this context */
1171 const char *zFormat,
1172 ...
1173){
1174 va_list ap;
1175 int n;
1176 char zBuf[50];
1177 va_start(ap, zFormat);
1178 sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap);
1179 va_end(ap);
1180 n = (int)strlen(zBuf);
1181 SHA3Update(p, (unsigned char*)zBuf, n);
1182}
1183
1184/*
1185** Implementation of the sha3_query(SQL,SIZE) function.
1186**
1187** This function compiles and runs the SQL statement(s) given in the
1188** argument. The results are hashed using a SIZE-bit SHA3. The default
1189** size is 256.
1190**
1191** The format of the byte stream that is hashed is summarized as follows:
1192**
1193** S<n>:<sql>
1194** R
1195** N
1196** I<int>
1197** F<ieee-float>
1198** B<size>:<bytes>
1199** T<size>:<text>
1200**
1201** <sql> is the original SQL text for each statement run and <n> is
1202** the size of that text. The SQL text is UTF-8. A single R character
1203** occurs before the start of each row. N means a NULL value.
1204** I mean an 8-byte little-endian integer <int>. F is a floating point
1205** number with an 8-byte little-endian IEEE floating point value <ieee-float>.
1206** B means blobs of <size> bytes. T means text rendered as <size>
1207** bytes of UTF-8. The <n> and <size> values are expressed as an ASCII
1208** text integers.
1209**
1210** For each SQL statement in the X input, there is one S segment. Each
1211** S segment is followed by zero or more R segments, one for each row in the
1212** result set. After each R, there are one or more N, I, F, B, or T segments,
1213** one for each column in the result set. Segments are concatentated directly
1214** with no delimiters of any kind.
1215*/
1216static void sha3QueryFunc(
1217 sqlite3_context *context,
1218 int argc,
1219 sqlite3_value **argv
1220){
1221 sqlite3 *db = sqlite3_context_db_handle(context);
1222 const char *zSql = (const char*)sqlite3_value_text(argv[0]);
1223 sqlite3_stmt *pStmt = 0;
1224 int nCol; /* Number of columns in the result set */
1225 int i; /* Loop counter */
1226 int rc;
1227 int n;
1228 const char *z;
1229 SHA3Context cx;
1230 int iSize;
1231
1232 if( argc==1 ){
1233 iSize = 256;
1234 }else{
1235 iSize = sqlite3_value_int(argv[1]);
1236 if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){
1237 sqlite3_result_error(context, "SHA3 size should be one of: 224 256 "
1238 "384 512", -1);
1239 return;
1240 }
1241 }
1242 if( zSql==0 ) return;
1243 SHA3Init(&cx, iSize);
1244 while( zSql[0] ){
1245 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql);
1246 if( rc ){
1247 char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s",
1248 zSql, sqlite3_errmsg(db));
1249 sqlite3_finalize(pStmt);
1250 sqlite3_result_error(context, zMsg, -1);
1251 sqlite3_free(zMsg);
1252 return;
1253 }
1254 if( !sqlite3_stmt_readonly(pStmt) ){
1255 char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt));
1256 sqlite3_finalize(pStmt);
1257 sqlite3_result_error(context, zMsg, -1);
1258 sqlite3_free(zMsg);
1259 return;
1260 }
1261 nCol = sqlite3_column_count(pStmt);
1262 z = sqlite3_sql(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00001263 if( z==0 ){
1264 sqlite3_finalize(pStmt);
1265 continue;
1266 }
drh1554bc82017-03-08 16:10:34 +00001267 n = (int)strlen(z);
1268 hash_step_vformat(&cx,"S%d:",n);
1269 SHA3Update(&cx,(unsigned char*)z,n);
1270
1271 /* Compute a hash over the result of the query */
1272 while( SQLITE_ROW==sqlite3_step(pStmt) ){
1273 SHA3Update(&cx,(const unsigned char*)"R",1);
1274 for(i=0; i<nCol; i++){
1275 switch( sqlite3_column_type(pStmt,i) ){
1276 case SQLITE_NULL: {
1277 SHA3Update(&cx, (const unsigned char*)"N",1);
1278 break;
1279 }
1280 case SQLITE_INTEGER: {
1281 sqlite3_uint64 u;
1282 int j;
1283 unsigned char x[9];
1284 sqlite3_int64 v = sqlite3_column_int64(pStmt,i);
1285 memcpy(&u, &v, 8);
1286 for(j=8; j>=1; j--){
1287 x[j] = u & 0xff;
1288 u >>= 8;
1289 }
1290 x[0] = 'I';
1291 SHA3Update(&cx, x, 9);
1292 break;
1293 }
1294 case SQLITE_FLOAT: {
1295 sqlite3_uint64 u;
1296 int j;
1297 unsigned char x[9];
1298 double r = sqlite3_column_double(pStmt,i);
1299 memcpy(&u, &r, 8);
1300 for(j=8; j>=1; j--){
1301 x[j] = u & 0xff;
1302 u >>= 8;
1303 }
1304 x[0] = 'F';
1305 SHA3Update(&cx,x,9);
1306 break;
1307 }
1308 case SQLITE_TEXT: {
1309 int n2 = sqlite3_column_bytes(pStmt, i);
1310 const unsigned char *z2 = sqlite3_column_text(pStmt, i);
1311 hash_step_vformat(&cx,"T%d:",n2);
1312 SHA3Update(&cx, z2, n2);
1313 break;
1314 }
1315 case SQLITE_BLOB: {
1316 int n2 = sqlite3_column_bytes(pStmt, i);
1317 const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
1318 hash_step_vformat(&cx,"B%d:",n2);
1319 SHA3Update(&cx, z2, n2);
1320 break;
1321 }
1322 }
1323 }
1324 }
1325 sqlite3_finalize(pStmt);
1326 }
1327 sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT);
1328}
1329/* End of SHA3 hashing logic copy/pasted from ../ext/misc/shathree.c
1330********************************************************************************/
1331
drhe6229612014-08-18 15:08:26 +00001332#if defined(SQLITE_ENABLE_SESSION)
1333/*
1334** State information for a single open session
1335*/
1336typedef struct OpenSession OpenSession;
1337struct OpenSession {
1338 char *zName; /* Symbolic name for this session */
1339 int nFilter; /* Number of xFilter rejection GLOB patterns */
1340 char **azFilter; /* Array of xFilter rejection GLOB patterns */
1341 sqlite3_session *p; /* The open session */
1342};
1343#endif
1344
drhdcd87a92014-08-18 13:45:42 +00001345/*
mistachkin1fe36bb2016-04-04 02:16:44 +00001346** Shell output mode information from before ".explain on",
drhdcd87a92014-08-18 13:45:42 +00001347** saved so that it can be restored by ".explain off"
1348*/
1349typedef struct SavedModeInfo SavedModeInfo;
1350struct SavedModeInfo {
1351 int valid; /* Is there legit data in here? */
1352 int mode; /* Mode prior to ".explain on" */
1353 int showHeader; /* The ".header" setting prior to ".explain on" */
1354 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +00001355};
drh45e29d82006-11-20 16:21:10 +00001356
drh8e7e7a22000-05-30 18:45:23 +00001357/*
drhdcd87a92014-08-18 13:45:42 +00001358** State information about the database connection is contained in an
1359** instance of the following structure.
drh75897232000-05-29 14:26:00 +00001360*/
drhdcd87a92014-08-18 13:45:42 +00001361typedef struct ShellState ShellState;
1362struct ShellState {
shane626a6e42009-10-22 17:30:15 +00001363 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +00001364 int echoOn; /* True to echo input commands */
drh700c2522016-02-09 18:39:25 +00001365 int autoExplain; /* Automatically turn on .explain mode */
drhc2ce0be2014-05-29 12:36:14 +00001366 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +00001367 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +00001368 int scanstatsOn; /* True to display scan stats before each finalize */
drhdf12f1c2015-12-07 21:46:19 +00001369 int countChanges; /* True to display change counts */
drh9569f602015-04-16 15:05:04 +00001370 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +00001371 int outCount; /* Revert to stdout when reaching zero */
drhe611f142017-03-08 11:44:00 +00001372 int preserveRowid; /* Preserver ROWID values on a ".dump" command */
drh28bd4bc2000-06-15 15:57:22 +00001373 int cnt; /* Number of records displayed so far */
1374 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +00001375 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +00001376 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +00001377 int mode; /* An output mode setting */
drh700c2522016-02-09 18:39:25 +00001378 int cMode; /* temporary output mode for the current query */
1379 int normalMode; /* Output mode before ".explain on" */
drh45e29d82006-11-20 16:21:10 +00001380 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +00001381 int showHeader; /* True to show column names in List or Column mode */
drh760c8162016-09-16 02:52:22 +00001382 int nCheck; /* Number of ".check" commands run */
drh44dec872014-08-30 15:49:25 +00001383 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +00001384 char *zDestTable; /* Name of destination table when MODE_Insert */
drh760c8162016-09-16 02:52:22 +00001385 char zTestcase[30]; /* Name of current test case */
mistachkin636bf9f2014-07-19 20:15:16 +00001386 char colSeparator[20]; /* Column separator character for several modes */
1387 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +00001388 int colWidth[100]; /* Requested width of each column when in column mode*/
1389 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +00001390 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +00001391 ** the database */
drh44c2eb12003-04-30 11:38:26 +00001392 char outfile[FILENAME_MAX]; /* Filename for *out */
1393 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +00001394 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +00001395 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +00001396 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +00001397 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +00001398 int *aiIndent; /* Array of indents used in MODE_Explain */
1399 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +00001400 int iIndent; /* Index of current op in aiIndent[] */
drhe6229612014-08-18 15:08:26 +00001401#if defined(SQLITE_ENABLE_SESSION)
1402 int nSession; /* Number of active sessions */
1403 OpenSession aSession[4]; /* Array of sessions. [0] is in focus. */
1404#endif
drh75897232000-05-29 14:26:00 +00001405};
1406
1407/*
drh44dec872014-08-30 15:49:25 +00001408** These are the allowed shellFlgs values
1409*/
1410#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
1411#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
1412#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
1413
1414/*
drh75897232000-05-29 14:26:00 +00001415** These are the allowed modes.
1416*/
drh967e8b72000-06-21 13:59:10 +00001417#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +00001418#define MODE_Column 1 /* One record per line in neat columns */
1419#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +00001420#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
1421#define MODE_Html 4 /* Generate an XHTML table */
1422#define MODE_Insert 5 /* Generate SQL "insert" statements */
drh41f5f6e2016-10-21 17:39:30 +00001423#define MODE_Quote 6 /* Quote values as for SQL */
1424#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */
1425#define MODE_Csv 8 /* Quote strings, numbers are plain */
1426#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */
1427#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */
1428#define MODE_Pretty 11 /* Pretty-print schemas */
persicom7e2dfdd2002-04-18 02:46:52 +00001429
drh66ce4d02008-02-15 17:38:06 +00001430static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +00001431 "line",
1432 "column",
1433 "list",
1434 "semi",
1435 "html",
drhfeac5f82004-08-01 00:10:45 +00001436 "insert",
drh41f5f6e2016-10-21 17:39:30 +00001437 "quote",
drhfeac5f82004-08-01 00:10:45 +00001438 "tcl",
drh8e64d1c2004-10-07 00:32:39 +00001439 "csv",
drh66ce4d02008-02-15 17:38:06 +00001440 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +00001441 "ascii",
drh4926fec2016-04-13 15:33:42 +00001442 "prettyprint",
persicom7e2dfdd2002-04-18 02:46:52 +00001443};
drh75897232000-05-29 14:26:00 +00001444
1445/*
mistachkinfad42082014-07-24 22:13:12 +00001446** These are the column/row/line separators used by the various
1447** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +00001448*/
mistachkinfad42082014-07-24 22:13:12 +00001449#define SEP_Column "|"
1450#define SEP_Row "\n"
1451#define SEP_Tab "\t"
1452#define SEP_Space " "
1453#define SEP_Comma ","
1454#define SEP_CrLf "\r\n"
1455#define SEP_Unit "\x1F"
1456#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +00001457
1458/*
drh75897232000-05-29 14:26:00 +00001459** Number of elements in an array
1460*/
drh902b9ee2008-12-05 17:17:07 +00001461#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +00001462
1463/*
drh127f9d72010-02-23 01:47:00 +00001464** A callback for the sqlite3_log() interface.
1465*/
1466static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +00001467 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +00001468 if( p->pLog==0 ) return;
mistachkinaae280e2015-12-31 19:06:24 +00001469 utf8_printf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
drh127f9d72010-02-23 01:47:00 +00001470 fflush(p->pLog);
1471}
1472
1473/*
shane626a6e42009-10-22 17:30:15 +00001474** Output the given string as a hex-encoded blob (eg. X'1234' )
1475*/
1476static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
1477 int i;
1478 char *zBlob = (char *)pBlob;
mistachkinaae280e2015-12-31 19:06:24 +00001479 raw_printf(out,"X'");
1480 for(i=0; i<nBlob; i++){ raw_printf(out,"%02x",zBlob[i]&0xff); }
1481 raw_printf(out,"'");
shane626a6e42009-10-22 17:30:15 +00001482}
1483
1484/*
drh28bd4bc2000-06-15 15:57:22 +00001485** Output the given string as a quoted string using SQL quoting conventions.
1486*/
1487static void output_quoted_string(FILE *out, const char *z){
1488 int i;
1489 int nSingle = 0;
mistachkin1fe36bb2016-04-04 02:16:44 +00001490 setBinaryMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001491 for(i=0; z[i]; i++){
1492 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +00001493 }
1494 if( nSingle==0 ){
drhe05461c2015-12-30 13:36:57 +00001495 utf8_printf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +00001496 }else{
mistachkinaae280e2015-12-31 19:06:24 +00001497 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001498 while( *z ){
1499 for(i=0; z[i] && z[i]!='\''; i++){}
1500 if( i==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00001501 raw_printf(out,"''");
drh28bd4bc2000-06-15 15:57:22 +00001502 z++;
1503 }else if( z[i]=='\'' ){
drhe05461c2015-12-30 13:36:57 +00001504 utf8_printf(out,"%.*s''",i,z);
drh28bd4bc2000-06-15 15:57:22 +00001505 z += i+1;
1506 }else{
drhe05461c2015-12-30 13:36:57 +00001507 utf8_printf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +00001508 break;
1509 }
1510 }
mistachkinaae280e2015-12-31 19:06:24 +00001511 raw_printf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +00001512 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001513 setTextMode(out, 1);
drh28bd4bc2000-06-15 15:57:22 +00001514}
1515
1516/*
drhfeac5f82004-08-01 00:10:45 +00001517** Output the given string as a quoted according to C or TCL quoting rules.
1518*/
1519static void output_c_string(FILE *out, const char *z){
1520 unsigned int c;
1521 fputc('"', out);
1522 while( (c = *(z++))!=0 ){
1523 if( c=='\\' ){
1524 fputc(c, out);
1525 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +00001526 }else if( c=='"' ){
1527 fputc('\\', out);
1528 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +00001529 }else if( c=='\t' ){
1530 fputc('\\', out);
1531 fputc('t', out);
1532 }else if( c=='\n' ){
1533 fputc('\\', out);
1534 fputc('n', out);
1535 }else if( c=='\r' ){
1536 fputc('\\', out);
1537 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +00001538 }else if( !isprint(c&0xff) ){
mistachkinaae280e2015-12-31 19:06:24 +00001539 raw_printf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +00001540 }else{
1541 fputc(c, out);
1542 }
1543 }
1544 fputc('"', out);
1545}
1546
1547/*
drhc08a4f12000-06-15 16:49:48 +00001548** Output the given string with characters that are special to
1549** HTML escaped.
1550*/
1551static void output_html_string(FILE *out, const char *z){
1552 int i;
drhc3d6ba42014-01-13 20:38:35 +00001553 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +00001554 while( *z ){
mistachkin1fe36bb2016-04-04 02:16:44 +00001555 for(i=0; z[i]
1556 && z[i]!='<'
1557 && z[i]!='&'
1558 && z[i]!='>'
1559 && z[i]!='\"'
shane43d9cb22009-10-21 14:11:48 +00001560 && z[i]!='\'';
1561 i++){}
drhc08a4f12000-06-15 16:49:48 +00001562 if( i>0 ){
drhe05461c2015-12-30 13:36:57 +00001563 utf8_printf(out,"%.*s",i,z);
drhc08a4f12000-06-15 16:49:48 +00001564 }
1565 if( z[i]=='<' ){
mistachkinaae280e2015-12-31 19:06:24 +00001566 raw_printf(out,"&lt;");
drhc08a4f12000-06-15 16:49:48 +00001567 }else if( z[i]=='&' ){
mistachkinaae280e2015-12-31 19:06:24 +00001568 raw_printf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +00001569 }else if( z[i]=='>' ){
mistachkinaae280e2015-12-31 19:06:24 +00001570 raw_printf(out,"&gt;");
shane43d9cb22009-10-21 14:11:48 +00001571 }else if( z[i]=='\"' ){
mistachkinaae280e2015-12-31 19:06:24 +00001572 raw_printf(out,"&quot;");
shane43d9cb22009-10-21 14:11:48 +00001573 }else if( z[i]=='\'' ){
mistachkinaae280e2015-12-31 19:06:24 +00001574 raw_printf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +00001575 }else{
1576 break;
1577 }
1578 z += i + 1;
1579 }
1580}
1581
1582/*
drhc49f44e2006-10-26 18:15:42 +00001583** If a field contains any character identified by a 1 in the following
1584** array, then the string must be quoted for CSV.
1585*/
1586static const char needCsvQuote[] = {
mistachkin1fe36bb2016-04-04 02:16:44 +00001587 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1588 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1589 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1590 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1591 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1592 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1593 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1594 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
1599 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1600 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1601 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1602 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
drhc49f44e2006-10-26 18:15:42 +00001603};
1604
1605/*
mistachkindd11f2d2014-12-11 04:49:46 +00001606** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +00001607** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +00001608** the null value. Strings are quoted if necessary. The separator
1609** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +00001610*/
drhdcd87a92014-08-18 13:45:42 +00001611static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +00001612 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +00001613 if( z==0 ){
drhe05461c2015-12-30 13:36:57 +00001614 utf8_printf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +00001615 }else{
drhc49f44e2006-10-26 18:15:42 +00001616 int i;
mistachkin636bf9f2014-07-19 20:15:16 +00001617 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +00001618 for(i=0; z[i]; i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00001619 if( needCsvQuote[((unsigned char*)z)[i]]
1620 || (z[i]==p->colSeparator[0] &&
mistachkin636bf9f2014-07-19 20:15:16 +00001621 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +00001622 i = 0;
1623 break;
1624 }
1625 }
1626 if( i==0 ){
1627 putc('"', out);
1628 for(i=0; z[i]; i++){
1629 if( z[i]=='"' ) putc('"', out);
1630 putc(z[i], out);
1631 }
1632 putc('"', out);
1633 }else{
drhe05461c2015-12-30 13:36:57 +00001634 utf8_printf(out, "%s", z);
drhc49f44e2006-10-26 18:15:42 +00001635 }
drh8e64d1c2004-10-07 00:32:39 +00001636 }
1637 if( bSep ){
drhe05461c2015-12-30 13:36:57 +00001638 utf8_printf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001639 }
1640}
1641
danielk19774af00c62005-01-23 23:43:21 +00001642#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +00001643/*
drh4c504392000-10-16 22:06:40 +00001644** This routine runs when the user presses Ctrl-C
1645*/
1646static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +00001647 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +00001648 seenInterrupt++;
1649 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +00001650 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +00001651}
danielk19774af00c62005-01-23 23:43:21 +00001652#endif
drh4c504392000-10-16 22:06:40 +00001653
drha0daa752016-09-16 11:53:10 +00001654#ifndef SQLITE_OMIT_AUTHORIZATION
drh4c504392000-10-16 22:06:40 +00001655/*
drhde613c62016-04-04 17:23:10 +00001656** When the ".auth ON" is set, the following authorizer callback is
1657** invoked. It always returns SQLITE_OK.
1658*/
1659static int shellAuth(
1660 void *pClientData,
1661 int op,
1662 const char *zA1,
1663 const char *zA2,
1664 const char *zA3,
1665 const char *zA4
1666){
1667 ShellState *p = (ShellState*)pClientData;
1668 static const char *azAction[] = { 0,
1669 "CREATE_INDEX", "CREATE_TABLE", "CREATE_TEMP_INDEX",
1670 "CREATE_TEMP_TABLE", "CREATE_TEMP_TRIGGER", "CREATE_TEMP_VIEW",
1671 "CREATE_TRIGGER", "CREATE_VIEW", "DELETE",
1672 "DROP_INDEX", "DROP_TABLE", "DROP_TEMP_INDEX",
1673 "DROP_TEMP_TABLE", "DROP_TEMP_TRIGGER", "DROP_TEMP_VIEW",
1674 "DROP_TRIGGER", "DROP_VIEW", "INSERT",
1675 "PRAGMA", "READ", "SELECT",
1676 "TRANSACTION", "UPDATE", "ATTACH",
1677 "DETACH", "ALTER_TABLE", "REINDEX",
1678 "ANALYZE", "CREATE_VTABLE", "DROP_VTABLE",
1679 "FUNCTION", "SAVEPOINT", "RECURSIVE"
1680 };
1681 int i;
1682 const char *az[4];
1683 az[0] = zA1;
1684 az[1] = zA2;
1685 az[2] = zA3;
1686 az[3] = zA4;
mistachkin8145fc62016-09-16 20:39:21 +00001687 utf8_printf(p->out, "authorizer: %s", azAction[op]);
drhde613c62016-04-04 17:23:10 +00001688 for(i=0; i<4; i++){
1689 raw_printf(p->out, " ");
1690 if( az[i] ){
1691 output_c_string(p->out, az[i]);
1692 }else{
1693 raw_printf(p->out, "NULL");
1694 }
1695 }
1696 raw_printf(p->out, "\n");
1697 return SQLITE_OK;
1698}
drha0daa752016-09-16 11:53:10 +00001699#endif
mistachkin8145fc62016-09-16 20:39:21 +00001700
drh79f20e92016-12-13 23:22:39 +00001701/*
1702** Print a schema statement. Part of MODE_Semi and MODE_Pretty output.
1703**
1704** This routine converts some CREATE TABLE statements for shadow tables
1705** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements.
1706*/
1707static void printSchemaLine(FILE *out, const char *z, const char *zTail){
1708 if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){
1709 utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail);
1710 }else{
1711 utf8_printf(out, "%s%s", z, zTail);
1712 }
1713}
1714static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){
1715 char c = z[n];
1716 z[n] = 0;
1717 printSchemaLine(out, z, zTail);
1718 z[n] = c;
1719}
drhde613c62016-04-04 17:23:10 +00001720
1721/*
shane626a6e42009-10-22 17:30:15 +00001722** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +00001723** invokes for each row of a query result.
1724*/
drh4ace5362014-11-10 14:42:28 +00001725static int shell_callback(
1726 void *pArg,
1727 int nArg, /* Number of result columns */
1728 char **azArg, /* Text of each result column */
1729 char **azCol, /* Column names */
1730 int *aiType /* Column types */
1731){
drh75897232000-05-29 14:26:00 +00001732 int i;
drhdcd87a92014-08-18 13:45:42 +00001733 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +00001734
drh700c2522016-02-09 18:39:25 +00001735 switch( p->cMode ){
drh75897232000-05-29 14:26:00 +00001736 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +00001737 int w = 5;
drh6a535342001-10-19 16:44:56 +00001738 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +00001739 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +00001740 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +00001741 if( len>w ) w = len;
1742 }
drhe05461c2015-12-30 13:36:57 +00001743 if( p->cnt++>0 ) utf8_printf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001744 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001745 utf8_printf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +00001746 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +00001747 }
1748 break;
1749 }
danielk19770d78bae2008-01-03 07:09:48 +00001750 case MODE_Explain:
drh75897232000-05-29 14:26:00 +00001751 case MODE_Column: {
drh700c2522016-02-09 18:39:25 +00001752 static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13};
1753 const int *colWidth;
1754 int showHdr;
1755 char *rowSep;
1756 if( p->cMode==MODE_Column ){
1757 colWidth = p->colWidth;
1758 showHdr = p->showHeader;
1759 rowSep = p->rowSeparator;
1760 }else{
1761 colWidth = aExplainWidths;
1762 showHdr = 1;
mistachkin6d945552016-02-09 20:31:50 +00001763 rowSep = SEP_Row;
drh700c2522016-02-09 18:39:25 +00001764 }
drha0c66f52000-07-29 13:20:21 +00001765 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +00001766 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +00001767 int w, n;
1768 if( i<ArraySize(p->colWidth) ){
drh700c2522016-02-09 18:39:25 +00001769 w = colWidth[i];
drh75897232000-05-29 14:26:00 +00001770 }else{
danielk19770d78bae2008-01-03 07:09:48 +00001771 w = 0;
drh75897232000-05-29 14:26:00 +00001772 }
drh078b1fd2012-09-21 13:40:02 +00001773 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +00001774 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +00001775 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +00001776 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +00001777 if( w<n ) w = n;
1778 }
1779 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +00001780 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +00001781 }
drh700c2522016-02-09 18:39:25 +00001782 if( showHdr ){
drh078b1fd2012-09-21 13:40:02 +00001783 if( w<0 ){
drhe05461c2015-12-30 13:36:57 +00001784 utf8_printf(p->out,"%*.*s%s",-w,-w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001785 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001786 }else{
drhe05461c2015-12-30 13:36:57 +00001787 utf8_printf(p->out,"%-*.*s%s",w,w,azCol[i],
drh700c2522016-02-09 18:39:25 +00001788 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001789 }
drha0c66f52000-07-29 13:20:21 +00001790 }
1791 }
drh700c2522016-02-09 18:39:25 +00001792 if( showHdr ){
drha0c66f52000-07-29 13:20:21 +00001793 for(i=0; i<nArg; i++){
1794 int w;
1795 if( i<ArraySize(p->actualWidth) ){
1796 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +00001797 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +00001798 }else{
1799 w = 10;
1800 }
mistachkinaae280e2015-12-31 19:06:24 +00001801 utf8_printf(p->out,"%-*.*s%s",w,w,
drhe05461c2015-12-30 13:36:57 +00001802 "----------------------------------------------------------"
drha0c66f52000-07-29 13:20:21 +00001803 "----------------------------------------------------------",
drh700c2522016-02-09 18:39:25 +00001804 i==nArg-1 ? rowSep : " ");
drha0c66f52000-07-29 13:20:21 +00001805 }
drh75897232000-05-29 14:26:00 +00001806 }
1807 }
drh6a535342001-10-19 16:44:56 +00001808 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001809 for(i=0; i<nArg; i++){
1810 int w;
drha0c66f52000-07-29 13:20:21 +00001811 if( i<ArraySize(p->actualWidth) ){
1812 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +00001813 }else{
1814 w = 10;
1815 }
drh700c2522016-02-09 18:39:25 +00001816 if( p->cMode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +00001817 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +00001818 }
dana98bf362013-11-13 18:35:01 +00001819 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +00001820 if( p->iIndent<p->nIndent ){
mistachkinaae280e2015-12-31 19:06:24 +00001821 utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +00001822 }
danc4650bb2013-11-18 08:41:06 +00001823 p->iIndent++;
dana98bf362013-11-13 18:35:01 +00001824 }
drh078b1fd2012-09-21 13:40:02 +00001825 if( w<0 ){
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 }else{
drhe05461c2015-12-30 13:36:57 +00001830 utf8_printf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +00001831 azArg[i] ? azArg[i] : p->nullValue,
drh700c2522016-02-09 18:39:25 +00001832 i==nArg-1 ? rowSep : " ");
drh078b1fd2012-09-21 13:40:02 +00001833 }
drh75897232000-05-29 14:26:00 +00001834 }
1835 break;
1836 }
drh4926fec2016-04-13 15:33:42 +00001837 case MODE_Semi: { /* .schema and .fullschema output */
drh79f20e92016-12-13 23:22:39 +00001838 printSchemaLine(p->out, azArg[0], ";\n");
drh4926fec2016-04-13 15:33:42 +00001839 break;
1840 }
1841 case MODE_Pretty: { /* .schema and .fullschema with --indent */
1842 char *z;
drh07d683f2016-04-13 21:00:36 +00001843 int j;
drh4926fec2016-04-13 15:33:42 +00001844 int nParen = 0;
1845 char cEnd = 0;
1846 char c;
1847 int nLine = 0;
1848 assert( nArg==1 );
1849 if( azArg[0]==0 ) break;
1850 if( sqlite3_strlike("CREATE VIEW%", azArg[0], 0)==0
1851 || sqlite3_strlike("CREATE TRIG%", azArg[0], 0)==0
1852 ){
1853 utf8_printf(p->out, "%s;\n", azArg[0]);
1854 break;
1855 }
1856 z = sqlite3_mprintf("%s", azArg[0]);
1857 j = 0;
1858 for(i=0; IsSpace(z[i]); i++){}
1859 for(; (c = z[i])!=0; i++){
1860 if( IsSpace(c) ){
1861 if( IsSpace(z[j-1]) || z[j-1]=='(' ) continue;
1862 }else if( (c=='(' || c==')') && j>0 && IsSpace(z[j-1]) ){
1863 j--;
1864 }
1865 z[j++] = c;
1866 }
1867 while( j>0 && IsSpace(z[j-1]) ){ j--; }
1868 z[j] = 0;
1869 if( strlen30(z)>=79 ){
drh07d683f2016-04-13 21:00:36 +00001870 for(i=j=0; (c = z[i])!=0; i++){
drh4926fec2016-04-13 15:33:42 +00001871 if( c==cEnd ){
1872 cEnd = 0;
1873 }else if( c=='"' || c=='\'' || c=='`' ){
1874 cEnd = c;
1875 }else if( c=='[' ){
1876 cEnd = ']';
1877 }else if( c=='(' ){
1878 nParen++;
1879 }else if( c==')' ){
1880 nParen--;
1881 if( nLine>0 && nParen==0 && j>0 ){
drh79f20e92016-12-13 23:22:39 +00001882 printSchemaLineN(p->out, z, j, "\n");
drh4926fec2016-04-13 15:33:42 +00001883 j = 0;
1884 }
1885 }
1886 z[j++] = c;
1887 if( nParen==1 && (c=='(' || c==',' || c=='\n') ){
1888 if( c=='\n' ) j--;
drh79f20e92016-12-13 23:22:39 +00001889 printSchemaLineN(p->out, z, j, "\n ");
drh4926fec2016-04-13 15:33:42 +00001890 j = 0;
1891 nLine++;
1892 while( IsSpace(z[i+1]) ){ i++; }
1893 }
1894 }
1895 z[j] = 0;
1896 }
drh79f20e92016-12-13 23:22:39 +00001897 printSchemaLine(p->out, z, ";\n");
drh4926fec2016-04-13 15:33:42 +00001898 sqlite3_free(z);
1899 break;
1900 }
drh75897232000-05-29 14:26:00 +00001901 case MODE_List: {
1902 if( p->cnt++==0 && p->showHeader ){
1903 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00001904 utf8_printf(p->out,"%s%s",azCol[i],
mistachkin636bf9f2014-07-19 20:15:16 +00001905 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +00001906 }
1907 }
drh6a535342001-10-19 16:44:56 +00001908 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +00001909 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +00001910 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +00001911 if( z==0 ) z = p->nullValue;
drhe05461c2015-12-30 13:36:57 +00001912 utf8_printf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +00001913 if( i<nArg-1 ){
drhe05461c2015-12-30 13:36:57 +00001914 utf8_printf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +00001915 }else{
drhe05461c2015-12-30 13:36:57 +00001916 utf8_printf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +00001917 }
drh75897232000-05-29 14:26:00 +00001918 }
1919 break;
1920 }
drh1e5d0e92000-05-31 23:33:17 +00001921 case MODE_Html: {
1922 if( p->cnt++==0 && p->showHeader ){
mistachkinaae280e2015-12-31 19:06:24 +00001923 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001924 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001925 raw_printf(p->out,"<TH>");
shane43d9cb22009-10-21 14:11:48 +00001926 output_html_string(p->out, azCol[i]);
mistachkinaae280e2015-12-31 19:06:24 +00001927 raw_printf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +00001928 }
mistachkinaae280e2015-12-31 19:06:24 +00001929 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001930 }
drh6a535342001-10-19 16:44:56 +00001931 if( azArg==0 ) break;
mistachkinaae280e2015-12-31 19:06:24 +00001932 raw_printf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +00001933 for(i=0; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00001934 raw_printf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +00001935 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00001936 raw_printf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +00001937 }
mistachkinaae280e2015-12-31 19:06:24 +00001938 raw_printf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +00001939 break;
1940 }
drhfeac5f82004-08-01 00:10:45 +00001941 case MODE_Tcl: {
1942 if( p->cnt++==0 && p->showHeader ){
1943 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001944 output_c_string(p->out,azCol[i] ? azCol[i] : "");
drhe05461c2015-12-30 13:36:57 +00001945 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001946 }
drhe05461c2015-12-30 13:36:57 +00001947 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001948 }
1949 if( azArg==0 ) break;
1950 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +00001951 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
drhe05461c2015-12-30 13:36:57 +00001952 if(i<nArg-1) utf8_printf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00001953 }
drhe05461c2015-12-30 13:36:57 +00001954 utf8_printf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +00001955 break;
1956 }
drh8e64d1c2004-10-07 00:32:39 +00001957 case MODE_Csv: {
mistachkin1fe36bb2016-04-04 02:16:44 +00001958 setBinaryMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001959 if( p->cnt++==0 && p->showHeader ){
1960 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +00001961 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +00001962 }
drhe05461c2015-12-30 13:36:57 +00001963 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001964 }
drh40253262014-10-17 21:35:05 +00001965 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +00001966 for(i=0; i<nArg; i++){
1967 output_csv(p, azArg[i], i<nArg-1);
1968 }
drhe05461c2015-12-30 13:36:57 +00001969 utf8_printf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +00001970 }
mistachkin1fe36bb2016-04-04 02:16:44 +00001971 setTextMode(p->out, 1);
drh8e64d1c2004-10-07 00:32:39 +00001972 break;
1973 }
drh41f5f6e2016-10-21 17:39:30 +00001974 case MODE_Quote:
drh28bd4bc2000-06-15 15:57:22 +00001975 case MODE_Insert: {
drh6a535342001-10-19 16:44:56 +00001976 if( azArg==0 ) break;
drh41f5f6e2016-10-21 17:39:30 +00001977 if( p->cMode==MODE_Insert ){
1978 utf8_printf(p->out,"INSERT INTO %s",p->zDestTable);
1979 if( p->showHeader ){
1980 raw_printf(p->out,"(");
1981 for(i=0; i<nArg; i++){
1982 char *zSep = i>0 ? ",": "";
1983 utf8_printf(p->out, "%s%s", zSep, azCol[i]);
1984 }
1985 raw_printf(p->out,")");
mistachkin151c75a2015-04-07 21:16:40 +00001986 }
drh41f5f6e2016-10-21 17:39:30 +00001987 raw_printf(p->out," VALUES(");
drh59ce2c42016-11-03 13:12:28 +00001988 }else if( p->cnt==0 && p->showHeader ){
1989 for(i=0; i<nArg; i++){
mistachkin2f9a6132016-11-11 05:19:45 +00001990 if( i>0 ) raw_printf(p->out, ",");
drh59ce2c42016-11-03 13:12:28 +00001991 output_quoted_string(p->out, azCol[i]);
1992 }
mistachkin2f9a6132016-11-11 05:19:45 +00001993 raw_printf(p->out,"\n");
mistachkin151c75a2015-04-07 21:16:40 +00001994 }
drh59ce2c42016-11-03 13:12:28 +00001995 p->cnt++;
drh28bd4bc2000-06-15 15:57:22 +00001996 for(i=0; i<nArg; i++){
1997 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +00001998 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
mistachkinaae280e2015-12-31 19:06:24 +00001999 utf8_printf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +00002000 }else if( aiType && aiType[i]==SQLITE_TEXT ){
mistachkinaae280e2015-12-31 19:06:24 +00002001 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shanead6b8d02009-10-22 18:12:58 +00002002 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00002003 }else if( aiType && (aiType[i]==SQLITE_INTEGER
2004 || aiType[i]==SQLITE_FLOAT) ){
drhe05461c2015-12-30 13:36:57 +00002005 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00002006 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
2007 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
2008 int nBlob = sqlite3_column_bytes(p->pStmt, i);
mistachkinaae280e2015-12-31 19:06:24 +00002009 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
shane626a6e42009-10-22 17:30:15 +00002010 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00002011 }else if( isNumber(azArg[i], 0) ){
drhe05461c2015-12-30 13:36:57 +00002012 utf8_printf(p->out,"%s%s",zSep, azArg[i]);
drh28bd4bc2000-06-15 15:57:22 +00002013 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002014 if( zSep[0] ) utf8_printf(p->out,"%s",zSep);
drh28bd4bc2000-06-15 15:57:22 +00002015 output_quoted_string(p->out, azArg[i]);
2016 }
2017 }
drh41f5f6e2016-10-21 17:39:30 +00002018 raw_printf(p->out,p->cMode==MODE_Quote?"\n":");\n");
drh6a535342001-10-19 16:44:56 +00002019 break;
drh28bd4bc2000-06-15 15:57:22 +00002020 }
mistachkin636bf9f2014-07-19 20:15:16 +00002021 case MODE_Ascii: {
2022 if( p->cnt++==0 && p->showHeader ){
2023 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002024 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2025 utf8_printf(p->out,"%s",azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +00002026 }
drhe05461c2015-12-30 13:36:57 +00002027 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002028 }
2029 if( azArg==0 ) break;
2030 for(i=0; i<nArg; i++){
drhe05461c2015-12-30 13:36:57 +00002031 if( i>0 ) utf8_printf(p->out, "%s", p->colSeparator);
2032 utf8_printf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00002033 }
drhe05461c2015-12-30 13:36:57 +00002034 utf8_printf(p->out, "%s", p->rowSeparator);
mistachkin636bf9f2014-07-19 20:15:16 +00002035 break;
2036 }
persicom1d0b8722002-04-18 02:53:04 +00002037 }
drh75897232000-05-29 14:26:00 +00002038 return 0;
2039}
2040
2041/*
shane626a6e42009-10-22 17:30:15 +00002042** This is the callback routine that the SQLite library
2043** invokes for each row of a query result.
2044*/
2045static int callback(void *pArg, int nArg, char **azArg, char **azCol){
2046 /* since we don't have type info, call the shell_callback with a NULL value */
2047 return shell_callback(pArg, nArg, azArg, azCol, NULL);
2048}
2049
drhf42d3182017-03-08 12:25:18 +00002050
shane626a6e42009-10-22 17:30:15 +00002051/*
drhdcd87a92014-08-18 13:45:42 +00002052** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00002053** the name of the table given. Escape any quote characters in the
2054** table name.
2055*/
drhdcd87a92014-08-18 13:45:42 +00002056static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00002057 int i, n;
drhf42d3182017-03-08 12:25:18 +00002058 int cQuote;
drh33048c02001-10-01 14:29:22 +00002059 char *z;
2060
2061 if( p->zDestTable ){
2062 free(p->zDestTable);
2063 p->zDestTable = 0;
2064 }
2065 if( zName==0 ) return;
drhf42d3182017-03-08 12:25:18 +00002066 cQuote = quoteChar(zName);
2067 n = strlen30(zName);
2068 if( cQuote ) n += 2;
drh33048c02001-10-01 14:29:22 +00002069 z = p->zDestTable = malloc( n+1 );
2070 if( z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002071 raw_printf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00002072 exit(1);
2073 }
2074 n = 0;
drhf42d3182017-03-08 12:25:18 +00002075 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002076 for(i=0; zName[i]; i++){
2077 z[n++] = zName[i];
drhf42d3182017-03-08 12:25:18 +00002078 if( zName[i]==cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002079 }
drhf42d3182017-03-08 12:25:18 +00002080 if( cQuote ) z[n++] = cQuote;
drh33048c02001-10-01 14:29:22 +00002081 z[n] = 0;
2082}
2083
drhdd3d4592004-08-30 01:54:05 +00002084
2085/*
drhb21a8e42012-01-28 21:08:51 +00002086** Execute a query statement that will generate SQL output. Print
2087** the result columns, comma-separated, on a line and then add a
2088** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00002089**
drhb21a8e42012-01-28 21:08:51 +00002090** If the number of columns is 1 and that column contains text "--"
mistachkin1fe36bb2016-04-04 02:16:44 +00002091** then write the semicolon on a separate line. That way, if a
drhb21a8e42012-01-28 21:08:51 +00002092** "--" comment occurs at the end of the statement, the comment
2093** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00002094*/
drh157e29a2009-05-21 15:15:00 +00002095static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00002096 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00002097 const char *zSelect, /* SELECT statement to extract content */
2098 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00002099){
drhdd3d4592004-08-30 01:54:05 +00002100 sqlite3_stmt *pSelect;
2101 int rc;
drhb21a8e42012-01-28 21:08:51 +00002102 int nResult;
2103 int i;
2104 const char *z;
drhc7181902014-02-27 15:04:13 +00002105 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00002106 if( rc!=SQLITE_OK || !pSelect ){
mistachkinaae280e2015-12-31 19:06:24 +00002107 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2108 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002109 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00002110 return rc;
2111 }
2112 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00002113 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00002114 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00002115 if( zFirstRow ){
drhe05461c2015-12-30 13:36:57 +00002116 utf8_printf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00002117 zFirstRow = 0;
2118 }
drhb21a8e42012-01-28 21:08:51 +00002119 z = (const char*)sqlite3_column_text(pSelect, 0);
drhe05461c2015-12-30 13:36:57 +00002120 utf8_printf(p->out, "%s", z);
mistachkin1fe36bb2016-04-04 02:16:44 +00002121 for(i=1; i<nResult; i++){
drhe05461c2015-12-30 13:36:57 +00002122 utf8_printf(p->out, ",%s", sqlite3_column_text(pSelect, i));
drhb21a8e42012-01-28 21:08:51 +00002123 }
2124 if( z==0 ) z = "";
2125 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
2126 if( z[0] ){
mistachkinaae280e2015-12-31 19:06:24 +00002127 raw_printf(p->out, "\n;\n");
drhb21a8e42012-01-28 21:08:51 +00002128 }else{
mistachkinaae280e2015-12-31 19:06:24 +00002129 raw_printf(p->out, ";\n");
mistachkin1fe36bb2016-04-04 02:16:44 +00002130 }
drhdd3d4592004-08-30 01:54:05 +00002131 rc = sqlite3_step(pSelect);
2132 }
drh2f464a02011-10-13 00:41:49 +00002133 rc = sqlite3_finalize(pSelect);
2134 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00002135 utf8_printf(p->out, "/**** ERROR: (%d) %s *****/\n", rc,
2136 sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00002137 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00002138 }
2139 return rc;
drhdd3d4592004-08-30 01:54:05 +00002140}
2141
shane626a6e42009-10-22 17:30:15 +00002142/*
2143** Allocate space and save off current error string.
2144*/
2145static char *save_err_msg(
2146 sqlite3 *db /* Database to query */
2147){
2148 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
drhf3cdcdc2015-04-29 16:50:28 +00002149 char *zErrMsg = sqlite3_malloc64(nErrMsg);
shane626a6e42009-10-22 17:30:15 +00002150 if( zErrMsg ){
2151 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
2152 }
2153 return zErrMsg;
2154}
2155
drh34784902016-02-27 17:12:36 +00002156#ifdef __linux__
2157/*
2158** Attempt to display I/O stats on Linux using /proc/PID/io
2159*/
2160static void displayLinuxIoStats(FILE *out){
2161 FILE *in;
2162 char z[200];
2163 sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
2164 in = fopen(z, "rb");
2165 if( in==0 ) return;
2166 while( fgets(z, sizeof(z), in)!=0 ){
2167 static const struct {
2168 const char *zPattern;
2169 const char *zDesc;
2170 } aTrans[] = {
drhfc1a84c2016-02-27 19:19:22 +00002171 { "rchar: ", "Bytes received by read():" },
2172 { "wchar: ", "Bytes sent to write():" },
2173 { "syscr: ", "Read() system calls:" },
2174 { "syscw: ", "Write() system calls:" },
2175 { "read_bytes: ", "Bytes read from storage:" },
2176 { "write_bytes: ", "Bytes written to storage:" },
2177 { "cancelled_write_bytes: ", "Cancelled write bytes:" },
drh34784902016-02-27 17:12:36 +00002178 };
2179 int i;
2180 for(i=0; i<ArraySize(aTrans); i++){
2181 int n = (int)strlen(aTrans[i].zPattern);
2182 if( strncmp(aTrans[i].zPattern, z, n)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00002183 utf8_printf(out, "%-36s %s", aTrans[i].zDesc, &z[n]);
drh34784902016-02-27 17:12:36 +00002184 break;
2185 }
2186 }
2187 }
2188 fclose(in);
mistachkin1fe36bb2016-04-04 02:16:44 +00002189}
drh34784902016-02-27 17:12:36 +00002190#endif
2191
2192
shane626a6e42009-10-22 17:30:15 +00002193/*
shaneh642d8b82010-07-28 16:05:34 +00002194** Display memory stats.
2195*/
2196static int display_stats(
2197 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00002198 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00002199 int bReset /* True to reset the stats */
2200){
2201 int iCur;
2202 int iHiwtr;
2203
2204 if( pArg && pArg->out ){
mistachkin1fe36bb2016-04-04 02:16:44 +00002205
shaneh642d8b82010-07-28 16:05:34 +00002206 iHiwtr = iCur = -1;
2207 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002208 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002209 "Memory Used: %d (max %d) bytes\n",
2210 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002211 iHiwtr = iCur = -1;
2212 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002213 raw_printf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002214 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002215 if( pArg->shellFlgs & SHFLG_Pagecache ){
2216 iHiwtr = iCur = -1;
2217 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002218 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002219 "Number of Pcache Pages Used: %d (max %d) pages\n",
2220 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002221 }
shaneh642d8b82010-07-28 16:05:34 +00002222 iHiwtr = iCur = -1;
2223 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002224 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002225 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
2226 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002227 if( pArg->shellFlgs & SHFLG_Scratch ){
2228 iHiwtr = iCur = -1;
2229 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002230 raw_printf(pArg->out,
2231 "Number of Scratch Allocations Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002232 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00002233 }
shaneh642d8b82010-07-28 16:05:34 +00002234 iHiwtr = iCur = -1;
2235 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002236 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002237 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
2238 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002239 iHiwtr = iCur = -1;
2240 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002241 raw_printf(pArg->out, "Largest 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_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002245 raw_printf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00002246 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002247 iHiwtr = iCur = -1;
2248 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002249 raw_printf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
drh4ace5362014-11-10 14:42:28 +00002250 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002251#ifdef YYTRACKMAXSTACKDEPTH
2252 iHiwtr = iCur = -1;
2253 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002254 raw_printf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002255 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00002256#endif
2257 }
2258
2259 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00002260 if( pArg->shellFlgs & SHFLG_Lookaside ){
2261 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00002262 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
2263 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002264 raw_printf(pArg->out,
2265 "Lookaside Slots Used: %d (max %d)\n",
drh4ace5362014-11-10 14:42:28 +00002266 iCur, iHiwtr);
2267 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
2268 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002269 raw_printf(pArg->out, "Successful lookaside attempts: %d\n",
2270 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002271 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
2272 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002273 raw_printf(pArg->out, "Lookaside failures due to size: %d\n",
2274 iHiwtr);
drh4ace5362014-11-10 14:42:28 +00002275 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
2276 &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002277 raw_printf(pArg->out, "Lookaside failures due to OOM: %d\n",
2278 iHiwtr);
drh44dec872014-08-30 15:49:25 +00002279 }
shaneh642d8b82010-07-28 16:05:34 +00002280 iHiwtr = iCur = -1;
2281 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002282 raw_printf(pArg->out, "Pager Heap Usage: %d bytes\n",
2283 iCur);
drh4ace5362014-11-10 14:42:28 +00002284 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00002285 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
mistachkinaae280e2015-12-31 19:06:24 +00002286 raw_printf(pArg->out, "Page cache hits: %d\n", iCur);
drhc78e6e42011-09-23 18:58:23 +00002287 iHiwtr = iCur = -1;
2288 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002289 raw_printf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002290 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00002291 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
mistachkin1fe36bb2016-04-04 02:16:44 +00002292 raw_printf(pArg->out, "Page cache writes: %d\n", iCur);
drhfbbcd5d2012-03-24 20:09:33 +00002293 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00002294 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002295 raw_printf(pArg->out, "Schema Heap Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002296 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002297 iHiwtr = iCur = -1;
2298 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002299 raw_printf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",
mistachkin1fe36bb2016-04-04 02:16:44 +00002300 iCur);
shaneh642d8b82010-07-28 16:05:34 +00002301 }
2302
2303 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00002304 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
2305 bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002306 raw_printf(pArg->out, "Fullscan Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002307 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002308 raw_printf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00002309 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002310 raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00002311 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
mistachkinaae280e2015-12-31 19:06:24 +00002312 raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00002313 }
2314
drh34784902016-02-27 17:12:36 +00002315#ifdef __linux__
2316 displayLinuxIoStats(pArg->out);
2317#endif
2318
dan5a790282015-08-07 20:06:14 +00002319 /* Do not remove this machine readable comment: extra-stats-output-here */
2320
shaneh642d8b82010-07-28 16:05:34 +00002321 return 0;
2322}
2323
2324/*
dan8d1edb92014-11-05 09:07:28 +00002325** Display scan stats.
2326*/
2327static void display_scanstats(
2328 sqlite3 *db, /* Database to query */
2329 ShellState *pArg /* Pointer to ShellState */
2330){
drhf5ed7ad2015-06-15 14:43:25 +00002331#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
2332 UNUSED_PARAMETER(db);
2333 UNUSED_PARAMETER(pArg);
2334#else
drh15f23c22014-11-06 12:46:16 +00002335 int i, k, n, mx;
mistachkinaae280e2015-12-31 19:06:24 +00002336 raw_printf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00002337 mx = 0;
2338 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00002339 double rEstLoop = 1.0;
2340 for(i=n=0; 1; i++){
2341 sqlite3_stmt *p = pArg->pStmt;
2342 sqlite3_int64 nLoop, nVisit;
2343 double rEst;
2344 int iSid;
2345 const char *zExplain;
2346 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
2347 break;
2348 }
2349 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00002350 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00002351 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00002352 if( n==0 ){
2353 rEstLoop = (double)nLoop;
mistachkinaae280e2015-12-31 19:06:24 +00002354 if( k>0 ) raw_printf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00002355 }
drh42f30bc2014-11-06 12:08:21 +00002356 n++;
2357 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
2358 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
2359 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
drhe05461c2015-12-30 13:36:57 +00002360 utf8_printf(pArg->out, "Loop %2d: %s\n", n, zExplain);
drh42f30bc2014-11-06 12:08:21 +00002361 rEstLoop *= rEst;
mistachkin1fe36bb2016-04-04 02:16:44 +00002362 raw_printf(pArg->out,
drh4ace5362014-11-10 14:42:28 +00002363 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00002364 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00002365 );
dan8d1edb92014-11-05 09:07:28 +00002366 }
dan8d1edb92014-11-05 09:07:28 +00002367 }
mistachkinaae280e2015-12-31 19:06:24 +00002368 raw_printf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00002369#endif
dan8d1edb92014-11-05 09:07:28 +00002370}
2371
2372/*
dana98bf362013-11-13 18:35:01 +00002373** Parameter azArray points to a zero-terminated array of strings. zStr
2374** points to a single nul-terminated string. Return non-zero if zStr
2375** is equal, according to strcmp(), to any of the strings in the array.
2376** Otherwise, return zero.
2377*/
2378static int str_in_array(const char *zStr, const char **azArray){
2379 int i;
2380 for(i=0; azArray[i]; i++){
2381 if( 0==strcmp(zStr, azArray[i]) ) return 1;
2382 }
2383 return 0;
2384}
2385
2386/*
2387** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00002388** and populate the ShellState.aiIndent[] array with the number of
mistachkin1fe36bb2016-04-04 02:16:44 +00002389** spaces each opcode should be indented before it is output.
dana98bf362013-11-13 18:35:01 +00002390**
2391** The indenting rules are:
2392**
2393** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
2394** all opcodes that occur between the p2 jump destination and the opcode
2395** itself by 2 spaces.
2396**
drh01752bc2013-11-14 23:59:33 +00002397** * For each "Goto", if the jump destination is earlier in the program
2398** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00002399** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00002400** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00002401** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00002402** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00002403*/
drhdcd87a92014-08-18 13:45:42 +00002404static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00002405 const char *zSql; /* The text of the SQL statement */
2406 const char *z; /* Used to check if this is an EXPLAIN */
2407 int *abYield = 0; /* True if op is an OP_Yield */
2408 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00002409 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00002410
drh8ad0de32014-03-20 18:45:27 +00002411 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
2412 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00002413 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
2414 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00002415 const char *azGoto[] = { "Goto", 0 };
2416
2417 /* Try to figure out if this is really an EXPLAIN statement. If this
2418 ** cannot be verified, return early. */
drh87a24aa2016-02-09 20:04:07 +00002419 if( sqlite3_column_count(pSql)!=8 ){
2420 p->cMode = p->mode;
2421 return;
2422 }
dana98bf362013-11-13 18:35:01 +00002423 zSql = sqlite3_sql(pSql);
2424 if( zSql==0 ) return;
2425 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
drh87a24aa2016-02-09 20:04:07 +00002426 if( sqlite3_strnicmp(z, "explain", 7) ){
2427 p->cMode = p->mode;
2428 return;
2429 }
dana98bf362013-11-13 18:35:01 +00002430
2431 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
2432 int i;
danc4650bb2013-11-18 08:41:06 +00002433 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00002434 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00002435
2436 /* Set p2 to the P2 field of the current opcode. Then, assuming that
2437 ** p2 is an instruction address, set variable p2op to the index of that
2438 ** instruction in the aiIndent[] array. p2 and p2op may be different if
2439 ** the current instruction is part of a sub-program generated by an
2440 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00002441 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00002442 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00002443
2444 /* Grow the p->aiIndent array as required */
2445 if( iOp>=nAlloc ){
drh87a24aa2016-02-09 20:04:07 +00002446 if( iOp==0 ){
2447 /* Do further verfication that this is explain output. Abort if
2448 ** it is not */
2449 static const char *explainCols[] = {
2450 "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment" };
2451 int jj;
2452 for(jj=0; jj<ArraySize(explainCols); jj++){
2453 if( strcmp(sqlite3_column_name(pSql,jj),explainCols[jj])!=0 ){
2454 p->cMode = p->mode;
2455 sqlite3_reset(pSql);
2456 return;
2457 }
2458 }
2459 }
dana98bf362013-11-13 18:35:01 +00002460 nAlloc += 100;
drhf3cdcdc2015-04-29 16:50:28 +00002461 p->aiIndent = (int*)sqlite3_realloc64(p->aiIndent, nAlloc*sizeof(int));
2462 abYield = (int*)sqlite3_realloc64(abYield, nAlloc*sizeof(int));
dana98bf362013-11-13 18:35:01 +00002463 }
2464 abYield[iOp] = str_in_array(zOp, azYield);
2465 p->aiIndent[iOp] = 0;
2466 p->nIndent = iOp+1;
2467
2468 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00002469 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002470 }
drhfe705102014-03-06 13:38:37 +00002471 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
2472 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
2473 ){
drheacd29d2016-04-15 15:03:27 +00002474 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00002475 }
2476 }
2477
danc4650bb2013-11-18 08:41:06 +00002478 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002479 sqlite3_free(abYield);
2480 sqlite3_reset(pSql);
2481}
2482
2483/*
2484** Free the array allocated by explain_data_prepare().
2485*/
drhdcd87a92014-08-18 13:45:42 +00002486static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00002487 sqlite3_free(p->aiIndent);
2488 p->aiIndent = 0;
2489 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00002490 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00002491}
2492
2493/*
drheacd29d2016-04-15 15:03:27 +00002494** Disable and restore .wheretrace and .selecttrace settings.
2495*/
2496#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2497extern int sqlite3SelectTrace;
2498static int savedSelectTrace;
2499#endif
2500#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2501extern int sqlite3WhereTrace;
2502static int savedWhereTrace;
2503#endif
2504static void disable_debug_trace_modes(void){
2505#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2506 savedSelectTrace = sqlite3SelectTrace;
2507 sqlite3SelectTrace = 0;
2508#endif
2509#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2510 savedWhereTrace = sqlite3WhereTrace;
2511 sqlite3WhereTrace = 0;
2512#endif
2513}
2514static void restore_debug_trace_modes(void){
2515#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
2516 sqlite3SelectTrace = savedSelectTrace;
2517#endif
2518#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
2519 sqlite3WhereTrace = savedWhereTrace;
2520#endif
2521}
2522
2523/*
2524** Run a prepared statement
2525*/
2526static void exec_prepared_stmt(
2527 ShellState *pArg, /* Pointer to ShellState */
2528 sqlite3_stmt *pStmt, /* Statment to run */
2529 int (*xCallback)(void*,int,char**,char**,int*) /* Callback function */
2530){
2531 int rc;
2532
2533 /* perform the first step. this will tell us if we
2534 ** have a result set or not and how wide it is.
2535 */
2536 rc = sqlite3_step(pStmt);
2537 /* if we have a result set... */
2538 if( SQLITE_ROW == rc ){
2539 /* if we have a callback... */
2540 if( xCallback ){
2541 /* allocate space for col name ptr, value ptr, and type */
2542 int nCol = sqlite3_column_count(pStmt);
2543 void *pData = sqlite3_malloc64(3*nCol*sizeof(const char*) + 1);
2544 if( !pData ){
2545 rc = SQLITE_NOMEM;
2546 }else{
2547 char **azCols = (char **)pData; /* Names of result columns */
2548 char **azVals = &azCols[nCol]; /* Results */
2549 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
2550 int i, x;
2551 assert(sizeof(int) <= sizeof(char *));
2552 /* save off ptrs to column names */
2553 for(i=0; i<nCol; i++){
2554 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
2555 }
2556 do{
2557 /* extract the data and data types */
2558 for(i=0; i<nCol; i++){
2559 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
2560 if( x==SQLITE_BLOB && pArg && pArg->cMode==MODE_Insert ){
2561 azVals[i] = "";
2562 }else{
2563 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
2564 }
2565 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
2566 rc = SQLITE_NOMEM;
2567 break; /* from for */
2568 }
2569 } /* end for */
2570
2571 /* if data and types extracted successfully... */
2572 if( SQLITE_ROW == rc ){
2573 /* call the supplied callback with the result row data */
2574 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
2575 rc = SQLITE_ABORT;
2576 }else{
2577 rc = sqlite3_step(pStmt);
2578 }
2579 }
2580 } while( SQLITE_ROW == rc );
2581 sqlite3_free(pData);
2582 }
2583 }else{
2584 do{
2585 rc = sqlite3_step(pStmt);
2586 } while( rc == SQLITE_ROW );
2587 }
2588 }
2589}
2590
2591/*
mistachkin1fe36bb2016-04-04 02:16:44 +00002592** Execute a statement or set of statements. Print
2593** any result rows/columns depending on the current mode
shane626a6e42009-10-22 17:30:15 +00002594** set via the supplied callback.
2595**
mistachkin1fe36bb2016-04-04 02:16:44 +00002596** This is very similar to SQLite's built-in sqlite3_exec()
2597** function except it takes a slightly different callback
shane626a6e42009-10-22 17:30:15 +00002598** and callback data argument.
2599*/
2600static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00002601 sqlite3 *db, /* An open database */
2602 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00002603 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00002604 /* (not the same as sqlite3_exec) */
2605 ShellState *pArg, /* Pointer to ShellState */
2606 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00002607){
dan4564ced2010-01-05 04:59:56 +00002608 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
2609 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00002610 int rc2;
dan4564ced2010-01-05 04:59:56 +00002611 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00002612
2613 if( pzErrMsg ){
2614 *pzErrMsg = NULL;
2615 }
2616
shaneb9fc17d2009-10-22 21:23:35 +00002617 while( zSql[0] && (SQLITE_OK == rc) ){
drheacd29d2016-04-15 15:03:27 +00002618 static const char *zStmtSql;
shaneb9fc17d2009-10-22 21:23:35 +00002619 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
2620 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00002621 if( pzErrMsg ){
2622 *pzErrMsg = save_err_msg(db);
2623 }
2624 }else{
shaneb9fc17d2009-10-22 21:23:35 +00002625 if( !pStmt ){
2626 /* this happens for a comment or white-space */
2627 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002628 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00002629 continue;
2630 }
drheacd29d2016-04-15 15:03:27 +00002631 zStmtSql = sqlite3_sql(pStmt);
drh60275612016-11-03 02:25:30 +00002632 if( zStmtSql==0 ) zStmtSql = "";
drheacd29d2016-04-15 15:03:27 +00002633 while( IsSpace(zStmtSql[0]) ) zStmtSql++;
shane626a6e42009-10-22 17:30:15 +00002634
shaneh642d8b82010-07-28 16:05:34 +00002635 /* save off the prepared statment handle and reset row count */
2636 if( pArg ){
2637 pArg->pStmt = pStmt;
2638 pArg->cnt = 0;
2639 }
2640
shanehb7977c52010-01-18 18:17:10 +00002641 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00002642 if( pArg && pArg->echoOn ){
drhe05461c2015-12-30 13:36:57 +00002643 utf8_printf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00002644 }
shanehb7977c52010-01-18 18:17:10 +00002645
drhefbf3b12014-02-28 20:47:24 +00002646 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
drheacd29d2016-04-15 15:03:27 +00002647 if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){
drhefbf3b12014-02-28 20:47:24 +00002648 sqlite3_stmt *pExplain;
drheacd29d2016-04-15 15:03:27 +00002649 char *zEQP;
2650 disable_debug_trace_modes();
2651 zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s", zStmtSql);
drhefbf3b12014-02-28 20:47:24 +00002652 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2653 if( rc==SQLITE_OK ){
2654 while( sqlite3_step(pExplain)==SQLITE_ROW ){
mistachkinaae280e2015-12-31 19:06:24 +00002655 raw_printf(pArg->out,"--EQP-- %d,",sqlite3_column_int(pExplain, 0));
2656 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
2657 raw_printf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
drhe05461c2015-12-30 13:36:57 +00002658 utf8_printf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
drhefbf3b12014-02-28 20:47:24 +00002659 }
2660 }
2661 sqlite3_finalize(pExplain);
2662 sqlite3_free(zEQP);
drheacd29d2016-04-15 15:03:27 +00002663 if( pArg->autoEQP>=2 ){
2664 /* Also do an EXPLAIN for ".eqp full" mode */
2665 zEQP = sqlite3_mprintf("EXPLAIN %s", zStmtSql);
2666 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
2667 if( rc==SQLITE_OK ){
2668 pArg->cMode = MODE_Explain;
2669 explain_data_prepare(pArg, pExplain);
2670 exec_prepared_stmt(pArg, pExplain, xCallback);
2671 explain_data_delete(pArg);
2672 }
2673 sqlite3_finalize(pExplain);
2674 sqlite3_free(zEQP);
2675 }
2676 restore_debug_trace_modes();
drhefbf3b12014-02-28 20:47:24 +00002677 }
2678
drh700c2522016-02-09 18:39:25 +00002679 if( pArg ){
2680 pArg->cMode = pArg->mode;
drh87a24aa2016-02-09 20:04:07 +00002681 if( pArg->autoExplain
2682 && sqlite3_column_count(pStmt)==8
drheacd29d2016-04-15 15:03:27 +00002683 && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0
drh700c2522016-02-09 18:39:25 +00002684 ){
2685 pArg->cMode = MODE_Explain;
2686 }
mistachkin1fe36bb2016-04-04 02:16:44 +00002687
drh700c2522016-02-09 18:39:25 +00002688 /* If the shell is currently in ".explain" mode, gather the extra
2689 ** data required to add indents to the output.*/
2690 if( pArg->cMode==MODE_Explain ){
2691 explain_data_prepare(pArg, pStmt);
2692 }
dana98bf362013-11-13 18:35:01 +00002693 }
2694
drheacd29d2016-04-15 15:03:27 +00002695 exec_prepared_stmt(pArg, pStmt, xCallback);
dana98bf362013-11-13 18:35:01 +00002696 explain_data_delete(pArg);
2697
shaneh642d8b82010-07-28 16:05:34 +00002698 /* print usage stats if stats on */
2699 if( pArg && pArg->statsOn ){
2700 display_stats(db, pArg, 0);
2701 }
2702
dan8d1edb92014-11-05 09:07:28 +00002703 /* print loop-counters if required */
2704 if( pArg && pArg->scanstatsOn ){
2705 display_scanstats(db, pArg);
2706 }
2707
mistachkin1fe36bb2016-04-04 02:16:44 +00002708 /* Finalize the statement just executed. If this fails, save a
dan4564ced2010-01-05 04:59:56 +00002709 ** copy of the error message. Otherwise, set zSql to point to the
2710 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00002711 rc2 = sqlite3_finalize(pStmt);
2712 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00002713 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00002714 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00002715 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00002716 }else if( pzErrMsg ){
2717 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00002718 }
shaneh642d8b82010-07-28 16:05:34 +00002719
2720 /* clear saved stmt handle */
2721 if( pArg ){
2722 pArg->pStmt = NULL;
2723 }
shane626a6e42009-10-22 17:30:15 +00002724 }
shaneb9fc17d2009-10-22 21:23:35 +00002725 } /* end while */
shane626a6e42009-10-22 17:30:15 +00002726
2727 return rc;
2728}
2729
drhe611f142017-03-08 11:44:00 +00002730/*
2731** Release memory previously allocated by tableColumnList().
2732*/
2733static void freeColumnList(char **azCol){
2734 int i;
2735 for(i=1; azCol[i]; i++){
2736 sqlite3_free(azCol[i]);
2737 }
2738 /* azCol[0] is a static string */
2739 sqlite3_free(azCol);
2740}
2741
2742/*
2743** Return a list of pointers to strings which are the names of all
2744** columns in table zTab. The memory to hold the names is dynamically
2745** allocated and must be released by the caller using a subsequent call
2746** to freeColumnList().
2747**
2748** The azCol[0] entry is usually NULL. However, if zTab contains a rowid
2749** value that needs to be preserved, then azCol[0] is filled in with the
2750** name of the rowid column.
2751**
2752** The first regular column in the table is azCol[1]. The list is terminated
2753** by an entry with azCol[i]==0.
2754*/
2755static char **tableColumnList(ShellState *p, const char *zTab){
2756 char **azCol = 0;
2757 sqlite3_stmt *pStmt;
2758 char *zSql;
2759 int nCol = 0;
2760 int nAlloc = 0;
2761 int nPK = 0; /* Number of PRIMARY KEY columns seen */
2762 int isIPK = 0; /* True if one PRIMARY KEY column of type INTEGER */
2763 int preserveRowid = p->preserveRowid;
2764 int rc;
2765
2766 zSql = sqlite3_mprintf("PRAGMA table_info=%Q", zTab);
2767 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2768 sqlite3_free(zSql);
2769 if( rc ) return 0;
2770 while( sqlite3_step(pStmt)==SQLITE_ROW ){
2771 if( nCol>=nAlloc-2 ){
2772 nAlloc = nAlloc*2 + nCol + 10;
2773 azCol = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0]));
2774 if( azCol==0 ){
2775 raw_printf(stderr, "Error: out of memory\n");
2776 exit(1);
2777 }
2778 }
2779 azCol[++nCol] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1));
2780 if( sqlite3_column_int(pStmt, 5) ){
2781 nPK++;
2782 if( nPK==1
2783 && sqlite3_stricmp((const char*)sqlite3_column_text(pStmt,2),
2784 "INTEGER")==0
2785 ){
2786 isIPK = 1;
2787 }else{
2788 isIPK = 0;
2789 }
2790 }
2791 }
2792 sqlite3_finalize(pStmt);
2793 azCol[0] = 0;
2794 azCol[nCol+1] = 0;
2795
2796 /* The decision of whether or not a rowid really needs to be preserved
2797 ** is tricky. We never need to preserve a rowid for a WITHOUT ROWID table
2798 ** or a table with an INTEGER PRIMARY KEY. We are unable to preserve
2799 ** rowids on tables where the rowid is inaccessible because there are other
2800 ** columns in the table named "rowid", "_rowid_", and "oid".
2801 */
2802 if( preserveRowid && isIPK ){
2803 /* If a single PRIMARY KEY column with type INTEGER was seen, then it
2804 ** might be an alise for the ROWID. But it might also be a WITHOUT ROWID
2805 ** table or a INTEGER PRIMARY KEY DESC column, neither of which are
2806 ** ROWID aliases. To distinguish these cases, check to see if
2807 ** there is a "pk" entry in "PRAGMA index_list". There will be
2808 ** no "pk" index if the PRIMARY KEY really is an alias for the ROWID.
2809 */
2810 zSql = sqlite3_mprintf("SELECT 1 FROM pragma_index_list(%Q)"
2811 " WHERE origin='pk'", zTab);
2812 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2813 sqlite3_free(zSql);
2814 if( rc ){
2815 freeColumnList(azCol);
2816 return 0;
2817 }
2818 rc = sqlite3_step(pStmt);
2819 sqlite3_finalize(pStmt);
2820 preserveRowid = rc==SQLITE_ROW;
2821 }
2822 if( preserveRowid ){
2823 /* Only preserve the rowid if we can find a name to use for the
2824 ** rowid */
2825 static char *azRowid[] = { "rowid", "_rowid_", "oid" };
2826 int i, j;
2827 for(j=0; j<3; j++){
2828 for(i=1; i<=nCol; i++){
2829 if( sqlite3_stricmp(azRowid[j],azCol[i])==0 ) break;
2830 }
2831 if( i>nCol ){
2832 /* At this point, we know that azRowid[j] is not the name of any
2833 ** ordinary column in the table. Verify that azRowid[j] is a valid
2834 ** name for the rowid before adding it to azCol[0]. WITHOUT ROWID
2835 ** tables will fail this last check */
2836 int rc;
2837 rc = sqlite3_table_column_metadata(p->db,0,zTab,azRowid[j],0,0,0,0,0);
2838 if( rc==SQLITE_OK ) azCol[0] = azRowid[j];
2839 break;
2840 }
2841 }
2842 }
2843 return azCol;
2844}
2845
drh33048c02001-10-01 14:29:22 +00002846/*
drh4c653a02000-06-07 01:27:47 +00002847** This is a different callback routine used for dumping the database.
2848** Each row received by this callback consists of a table name,
2849** the table type ("index" or "table") and SQL to create the table.
2850** This routine should print text sufficient to recreate the table.
2851*/
2852static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00002853 int rc;
2854 const char *zTable;
2855 const char *zType;
2856 const char *zSql;
drhdcd87a92014-08-18 13:45:42 +00002857 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00002858
drh902b9ee2008-12-05 17:17:07 +00002859 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00002860 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00002861 zTable = azArg[0];
2862 zType = azArg[1];
2863 zSql = azArg[2];
mistachkin1fe36bb2016-04-04 02:16:44 +00002864
drh00b950d2005-09-11 02:03:03 +00002865 if( strcmp(zTable, "sqlite_sequence")==0 ){
drhe611f142017-03-08 11:44:00 +00002866 raw_printf(p->out, "DELETE FROM sqlite_sequence;\n");
drh7ed10322013-08-07 16:04:27 +00002867 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00002868 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh00b950d2005-09-11 02:03:03 +00002869 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
2870 return 0;
drh45e29d82006-11-20 16:21:10 +00002871 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
2872 char *zIns;
2873 if( !p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00002874 raw_printf(p->out, "PRAGMA writable_schema=ON;\n");
drh45e29d82006-11-20 16:21:10 +00002875 p->writableSchema = 1;
2876 }
2877 zIns = sqlite3_mprintf(
2878 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
2879 "VALUES('table','%q','%q',0,'%q');",
2880 zTable, zTable, zSql);
drhe05461c2015-12-30 13:36:57 +00002881 utf8_printf(p->out, "%s\n", zIns);
drh45e29d82006-11-20 16:21:10 +00002882 sqlite3_free(zIns);
2883 return 0;
drh00b950d2005-09-11 02:03:03 +00002884 }else{
drh79f20e92016-12-13 23:22:39 +00002885 printSchemaLine(p->out, zSql, ";\n");
drhf8eb96a2005-02-03 00:42:34 +00002886 }
danielk19772a02e332004-06-05 08:04:36 +00002887
2888 if( strcmp(zType, "table")==0 ){
drhf42d3182017-03-08 12:25:18 +00002889 ShellText sSelect;
2890 ShellText sTable;
drhe611f142017-03-08 11:44:00 +00002891 char **azCol;
2892 int i;
2893 char *savedDestTable;
2894 int savedMode;
mistachkin1fe36bb2016-04-04 02:16:44 +00002895
drhe611f142017-03-08 11:44:00 +00002896 azCol = tableColumnList(p, zTable);
2897 if( azCol==0 ){
2898 p->nErr++;
2899 return 0;
danielk19772a02e332004-06-05 08:04:36 +00002900 }
2901
drhbf92ec02012-03-22 12:50:34 +00002902 /* Always quote the table name, even if it appears to be pure ascii,
2903 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
drhf42d3182017-03-08 12:25:18 +00002904 initText(&sTable);
2905 appendText(&sTable, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00002906 /* If preserving the rowid, add a column list after the table name.
2907 ** In other words: "INSERT INTO tab(rowid,a,b,c,...) VALUES(...)"
2908 ** instead of the usual "INSERT INTO tab VALUES(...)".
2909 */
2910 if( azCol[0] ){
2911 appendText(&sTable, "(", 0);
2912 appendText(&sTable, azCol[0], 0);
2913 for(i=1; azCol[i]; i++){
2914 appendText(&sTable, ",", 0);
drhf42d3182017-03-08 12:25:18 +00002915 appendText(&sTable, azCol[i], quoteChar(azCol[i]));
danielk19772a02e332004-06-05 08:04:36 +00002916 }
drhe611f142017-03-08 11:44:00 +00002917 appendText(&sTable, ")", 0);
danielk19772a02e332004-06-05 08:04:36 +00002918 }
danielk19772a02e332004-06-05 08:04:36 +00002919
drhe611f142017-03-08 11:44:00 +00002920 /* Build an appropriate SELECT statement */
drhf42d3182017-03-08 12:25:18 +00002921 initText(&sSelect);
drhe611f142017-03-08 11:44:00 +00002922 appendText(&sSelect, "SELECT ", 0);
2923 if( azCol[0] ){
2924 appendText(&sSelect, azCol[0], 0);
2925 appendText(&sSelect, ",", 0);
drhdd3d4592004-08-30 01:54:05 +00002926 }
drhe611f142017-03-08 11:44:00 +00002927 for(i=1; azCol[i]; i++){
drhf42d3182017-03-08 12:25:18 +00002928 appendText(&sSelect, azCol[i], quoteChar(azCol[i]));
drhe611f142017-03-08 11:44:00 +00002929 if( azCol[i+1] ){
2930 appendText(&sSelect, ",", 0);
2931 }
2932 }
2933 freeColumnList(azCol);
2934 appendText(&sSelect, " FROM ", 0);
drhf42d3182017-03-08 12:25:18 +00002935 appendText(&sSelect, zTable, quoteChar(zTable));
drhe611f142017-03-08 11:44:00 +00002936
2937 savedDestTable = p->zDestTable;
2938 savedMode = p->mode;
2939 p->zDestTable = sTable.z;
2940 p->mode = p->cMode = MODE_Insert;
2941 rc = shell_exec(p->db, sSelect.z, shell_callback, p, 0);
2942 p->zDestTable = savedDestTable;
2943 p->mode = savedMode;
drhf42d3182017-03-08 12:25:18 +00002944 freeText(&sTable);
2945 freeText(&sSelect);
drhe611f142017-03-08 11:44:00 +00002946 if( rc ) p->nErr++;
drh4c653a02000-06-07 01:27:47 +00002947 }
drh4c653a02000-06-07 01:27:47 +00002948 return 0;
2949}
2950
2951/*
drh45e29d82006-11-20 16:21:10 +00002952** Run zQuery. Use dump_callback() as the callback routine so that
2953** the contents of the query are output as SQL statements.
2954**
drhdd3d4592004-08-30 01:54:05 +00002955** If we get a SQLITE_CORRUPT error, rerun the query after appending
2956** "ORDER BY rowid DESC" to the end.
2957*/
2958static int run_schema_dump_query(
mistachkin1fe36bb2016-04-04 02:16:44 +00002959 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00002960 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00002961){
2962 int rc;
drh2f464a02011-10-13 00:41:49 +00002963 char *zErr = 0;
2964 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00002965 if( rc==SQLITE_CORRUPT ){
2966 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00002967 int len = strlen30(zQuery);
mistachkinaae280e2015-12-31 19:06:24 +00002968 raw_printf(p->out, "/****** CORRUPTION ERROR *******/\n");
drh2f464a02011-10-13 00:41:49 +00002969 if( zErr ){
mistachkinaae280e2015-12-31 19:06:24 +00002970 utf8_printf(p->out, "/****** %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00002971 sqlite3_free(zErr);
2972 zErr = 0;
2973 }
drhdd3d4592004-08-30 01:54:05 +00002974 zQ2 = malloc( len+100 );
2975 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00002976 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00002977 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
2978 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00002979 utf8_printf(p->out, "/****** ERROR: %s ******/\n", zErr);
drh2f464a02011-10-13 00:41:49 +00002980 }else{
2981 rc = SQLITE_CORRUPT;
2982 }
2983 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00002984 free(zQ2);
2985 }
2986 return rc;
2987}
2988
2989/*
drh75897232000-05-29 14:26:00 +00002990** Text of a help message
2991*/
persicom1d0b8722002-04-18 02:53:04 +00002992static char zHelp[] =
drha0daa752016-09-16 11:53:10 +00002993#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00002994 ".auth ON|OFF Show authorizer callbacks\n"
drha0daa752016-09-16 11:53:10 +00002995#endif
drh9ff849f2009-02-04 20:55:57 +00002996 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00002997 ".bail on|off Stop after hitting an error. Default OFF\n"
mistachkinf21979d2015-01-18 05:35:01 +00002998 ".binary on|off Turn binary output on or off. Default OFF\n"
drhdf12f1c2015-12-07 21:46:19 +00002999 ".changes on|off Show number of rows changed by SQL\n"
drh2db82112016-09-15 21:35:24 +00003000 ".check GLOB Fail if output since .testcase does not match\n"
drh4bbcf102014-02-06 02:46:08 +00003001 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00003002 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00003003 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00003004 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00003005 " If TABLE specified, only dump tables matching\n"
3006 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00003007 ".echo on|off Turn command echo on or off\n"
drheacd29d2016-04-15 15:03:27 +00003008 ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00003009 ".exit Exit this program\n"
drh700c2522016-02-09 18:39:25 +00003010 ".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"
drh4926fec2016-04-13 15:33:42 +00003011 ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00003012 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00003013 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00003014 ".import FILE TABLE Import data from FILE into TABLE\n"
drh16eb5942016-11-03 13:01:38 +00003015#ifndef SQLITE_OMIT_TEST_CONTROL
3016 ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n"
3017#endif
drh0e55db12015-02-06 14:51:13 +00003018 ".indexes ?TABLE? Show names of all indexes\n"
3019 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00003020 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00003021#ifdef SQLITE_ENABLE_IOTRACE
3022 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
3023#endif
drh1a513372015-05-02 17:40:23 +00003024 ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n"
drh3fd9f332016-12-16 18:41:11 +00003025 ".lint OPTIONS Report potential schema issues. Options:\n"
3026 " fkey-indexes Find missing foreign key indexes\n"
drh70df4fe2006-06-13 15:12:21 +00003027#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00003028 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00003029#endif
drh127f9d72010-02-23 01:47:00 +00003030 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00003031 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00003032 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00003033 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00003034 " column Left-aligned columns. (See .width)\n"
3035 " html HTML <table> code\n"
3036 " insert SQL insert statements for TABLE\n"
3037 " line One value per line\n"
drh0c5cd962017-02-14 21:47:46 +00003038 " list Values delimited by \"|\"\n"
drh41f5f6e2016-10-21 17:39:30 +00003039 " quote Escape answers as for SQL\n"
drhb860bc92004-08-04 15:16:55 +00003040 " tabs Tab-separated values\n"
3041 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00003042 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00003043 ".once FILENAME Output for the next SQL command only to FILENAME\n"
mistachkin8145fc62016-09-16 20:39:21 +00003044 ".open ?--new? ?FILE? Close existing database and reopen FILE\n"
drhcd0509e2016-09-16 00:26:08 +00003045 " The --new starts with an empty file\n"
drhc2ce0be2014-05-29 12:36:14 +00003046 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00003047 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003048 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00003049 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00003050 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00003051 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00003052 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00003053 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh4926fec2016-04-13 15:33:42 +00003054 ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n"
3055 " Add --indent for pretty-printing\n"
mistachkine0d68852014-12-11 03:12:33 +00003056 ".separator COL ?ROW? Change the column separator and optionally the row\n"
3057 " separator for both the output mode and .import\n"
drhe6229612014-08-18 15:08:26 +00003058#if defined(SQLITE_ENABLE_SESSION)
3059 ".session CMD ... Create or control sessions\n"
3060#endif
drh1554bc82017-03-08 16:10:34 +00003061 ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n"
drh62cdde52014-05-28 20:22:28 +00003062 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00003063 ".show Show the current values for various settings\n"
drh34784902016-02-27 17:12:36 +00003064 ".stats ?on|off? Show stats or turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00003065 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00003066 ".tables ?TABLE? List names of tables\n"
3067 " If TABLE specified, only list tables matching\n"
3068 " LIKE pattern TABLE.\n"
drh760c8162016-09-16 02:52:22 +00003069 ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n"
drh2dfbbca2000-07-28 14:32:48 +00003070 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00003071 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00003072 ".trace FILE|off Output each SQL statement as it is run\n"
drh790f2872015-11-28 18:06:36 +00003073 ".vfsinfo ?AUX? Information about the top-level VFS\n"
drhb19e7352016-01-12 19:37:20 +00003074 ".vfslist List all available VFSes\n"
drhde60fc22011-12-14 17:53:36 +00003075 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00003076 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00003077 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00003078;
3079
drhe6229612014-08-18 15:08:26 +00003080#if defined(SQLITE_ENABLE_SESSION)
3081/*
3082** Print help information for the ".sessions" command
3083*/
3084void session_help(ShellState *p){
mistachkin899c5c92016-04-03 20:50:02 +00003085 raw_printf(p->out,
drhe6229612014-08-18 15:08:26 +00003086 ".session ?NAME? SUBCOMMAND ?ARGS...?\n"
3087 "If ?NAME? is omitted, the first defined session is used.\n"
3088 "Subcommands:\n"
3089 " attach TABLE Attach TABLE\n"
3090 " changeset FILE Write a changeset into FILE\n"
3091 " close Close one session\n"
3092 " enable ?BOOLEAN? Set or query the enable bit\n"
mistachkin1fe36bb2016-04-04 02:16:44 +00003093 " filter GLOB... Reject tables matching GLOBs\n"
drhe6229612014-08-18 15:08:26 +00003094 " indirect ?BOOLEAN? Mark or query the indirect status\n"
3095 " isempty Query whether the session is empty\n"
3096 " list List currently open session names\n"
3097 " open DB NAME Open a new session on DB\n"
3098 " patchset FILE Write a patchset into FILE\n"
3099 );
3100}
3101#endif
3102
3103
drhdaffd0e2001-04-11 14:28:42 +00003104/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00003105static int process_input(ShellState *p, FILE *in);
drh2db82112016-09-15 21:35:24 +00003106
drh2db82112016-09-15 21:35:24 +00003107/*
dan11da0022016-12-17 08:18:05 +00003108** Read the content of file zName into memory obtained from sqlite3_malloc64()
3109** and return a pointer to the buffer. The caller is responsible for freeing
3110** the memory.
drh2db82112016-09-15 21:35:24 +00003111**
dan11da0022016-12-17 08:18:05 +00003112** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes
3113** read.
3114**
3115** For convenience, a nul-terminator byte is always appended to the data read
3116** from the file before the buffer is returned. This byte is not included in
3117** the final value of (*pnByte), if applicable.
3118**
3119** NULL is returned if any error is encountered. The final value of *pnByte
3120** is undefined in this case.
drh2db82112016-09-15 21:35:24 +00003121*/
dan11da0022016-12-17 08:18:05 +00003122static char *readFile(const char *zName, int *pnByte){
drh2db82112016-09-15 21:35:24 +00003123 FILE *in = fopen(zName, "rb");
3124 long nIn;
drhd1459152016-09-16 19:11:03 +00003125 size_t nRead;
drh2db82112016-09-15 21:35:24 +00003126 char *pBuf;
3127 if( in==0 ) return 0;
3128 fseek(in, 0, SEEK_END);
3129 nIn = ftell(in);
3130 rewind(in);
drhd1459152016-09-16 19:11:03 +00003131 pBuf = sqlite3_malloc64( nIn+1 );
drh2db82112016-09-15 21:35:24 +00003132 if( pBuf==0 ) return 0;
drhd1459152016-09-16 19:11:03 +00003133 nRead = fread(pBuf, nIn, 1, in);
3134 fclose(in);
3135 if( nRead!=1 ){
drh2db82112016-09-15 21:35:24 +00003136 sqlite3_free(pBuf);
3137 return 0;
3138 }
drhd1459152016-09-16 19:11:03 +00003139 pBuf[nIn] = 0;
dan11da0022016-12-17 08:18:05 +00003140 if( pnByte ) *pnByte = nIn;
drh2db82112016-09-15 21:35:24 +00003141 return pBuf;
3142}
3143
drhba5b0932014-07-24 12:39:59 +00003144/*
3145** Implementation of the "readfile(X)" SQL function. The entire content
3146** of the file named X is read and returned as a BLOB. NULL is returned
3147** if the file does not exist or is unreadable.
3148*/
3149static void readfileFunc(
3150 sqlite3_context *context,
3151 int argc,
3152 sqlite3_value **argv
3153){
3154 const char *zName;
drhba5b0932014-07-24 12:39:59 +00003155 void *pBuf;
dan11da0022016-12-17 08:18:05 +00003156 int nBuf;
drhba5b0932014-07-24 12:39:59 +00003157
drhf5ed7ad2015-06-15 14:43:25 +00003158 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003159 zName = (const char*)sqlite3_value_text(argv[0]);
3160 if( zName==0 ) return;
dan11da0022016-12-17 08:18:05 +00003161 pBuf = readFile(zName, &nBuf);
3162 if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free);
drhba5b0932014-07-24 12:39:59 +00003163}
3164
3165/*
3166** Implementation of the "writefile(X,Y)" SQL function. The argument Y
3167** is written into file X. The number of bytes written is returned. Or
3168** NULL is returned if something goes wrong, such as being unable to open
3169** file X for writing.
3170*/
3171static void writefileFunc(
3172 sqlite3_context *context,
3173 int argc,
3174 sqlite3_value **argv
3175){
3176 FILE *out;
3177 const char *z;
drhba5b0932014-07-24 12:39:59 +00003178 sqlite3_int64 rc;
3179 const char *zFile;
3180
drhf5ed7ad2015-06-15 14:43:25 +00003181 UNUSED_PARAMETER(argc);
drhba5b0932014-07-24 12:39:59 +00003182 zFile = (const char*)sqlite3_value_text(argv[0]);
3183 if( zFile==0 ) return;
3184 out = fopen(zFile, "wb");
3185 if( out==0 ) return;
3186 z = (const char*)sqlite3_value_blob(argv[1]);
3187 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00003188 rc = 0;
3189 }else{
drh490fe862014-08-11 14:21:32 +00003190 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00003191 }
3192 fclose(out);
3193 sqlite3_result_int64(context, rc);
3194}
drhdaffd0e2001-04-11 14:28:42 +00003195
drhe6229612014-08-18 15:08:26 +00003196#if defined(SQLITE_ENABLE_SESSION)
3197/*
3198** Close a single OpenSession object and release all of its associated
3199** resources.
3200*/
3201static void session_close(OpenSession *pSession){
3202 int i;
3203 sqlite3session_delete(pSession->p);
3204 sqlite3_free(pSession->zName);
3205 for(i=0; i<pSession->nFilter; i++){
3206 sqlite3_free(pSession->azFilter[i]);
3207 }
3208 sqlite3_free(pSession->azFilter);
3209 memset(pSession, 0, sizeof(OpenSession));
3210}
3211#endif
3212
3213/*
drh51b55a32016-04-04 12:38:05 +00003214** Close all OpenSession objects and release all associated resources.
drhe6229612014-08-18 15:08:26 +00003215*/
drhe6229612014-08-18 15:08:26 +00003216#if defined(SQLITE_ENABLE_SESSION)
drh51b55a32016-04-04 12:38:05 +00003217static void session_close_all(ShellState *p){
drhe6229612014-08-18 15:08:26 +00003218 int i;
3219 for(i=0; i<p->nSession; i++){
3220 session_close(&p->aSession[i]);
3221 }
3222 p->nSession = 0;
drhe6229612014-08-18 15:08:26 +00003223}
drh51b55a32016-04-04 12:38:05 +00003224#else
3225# define session_close_all(X)
3226#endif
drhe6229612014-08-18 15:08:26 +00003227
drh75897232000-05-29 14:26:00 +00003228/*
drh03168ca2014-08-18 20:01:31 +00003229** Implementation of the xFilter function for an open session. Omit
3230** any tables named by ".session filter" but let all other table through.
3231*/
3232#if defined(SQLITE_ENABLE_SESSION)
3233static int session_filter(void *pCtx, const char *zTab){
3234 OpenSession *pSession = (OpenSession*)pCtx;
3235 int i;
3236 for(i=0; i<pSession->nFilter; i++){
3237 if( sqlite3_strglob(pSession->azFilter[i], zTab)==0 ) return 0;
3238 }
3239 return 1;
3240}
3241#endif
3242
3243/*
drh44c2eb12003-04-30 11:38:26 +00003244** Make sure the database is open. If it is not, then open it. If
3245** the database fails to open, print an error message and exit.
3246*/
drhdcd87a92014-08-18 13:45:42 +00003247static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00003248 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00003249 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00003250 sqlite3_open(p->zDbFilename, &p->db);
mistachkin8e189222015-04-19 21:43:16 +00003251 globalDb = p->db;
mistachkin8e189222015-04-19 21:43:16 +00003252 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00003253 utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00003254 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00003255 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00003256 exit(1);
drh44c2eb12003-04-30 11:38:26 +00003257 }
drhc2e87a32006-06-27 15:16:14 +00003258#ifndef SQLITE_OMIT_LOAD_EXTENSION
3259 sqlite3_enable_load_extension(p->db, 1);
3260#endif
mistachkin8e189222015-04-19 21:43:16 +00003261 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003262 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003263 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00003264 writefileFunc, 0, 0);
drh1554bc82017-03-08 16:10:34 +00003265 sqlite3_create_function(p->db, "sha3", 1, SQLITE_UTF8, 0,
3266 sha3Func, 0, 0);
3267 sqlite3_create_function(p->db, "sha3", 2, SQLITE_UTF8, 0,
3268 sha3Func, 0, 0);
3269 sqlite3_create_function(p->db, "sha3_query", 1, SQLITE_UTF8, 0,
3270 sha3QueryFunc, 0, 0);
3271 sqlite3_create_function(p->db, "sha3_query", 2, SQLITE_UTF8, 0,
3272 sha3QueryFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00003273 }
3274}
3275
3276/*
drhfeac5f82004-08-01 00:10:45 +00003277** Do C-language style dequoting.
3278**
mistachkinf21979d2015-01-18 05:35:01 +00003279** \a -> alarm
3280** \b -> backspace
drhfeac5f82004-08-01 00:10:45 +00003281** \t -> tab
3282** \n -> newline
mistachkinf21979d2015-01-18 05:35:01 +00003283** \v -> vertical tab
3284** \f -> form feed
drhfeac5f82004-08-01 00:10:45 +00003285** \r -> carriage return
mistachkinf21979d2015-01-18 05:35:01 +00003286** \s -> space
drh4c56b992013-06-27 13:26:55 +00003287** \" -> "
mistachkinf21979d2015-01-18 05:35:01 +00003288** \' -> '
drhfeac5f82004-08-01 00:10:45 +00003289** \\ -> backslash
mistachkinf21979d2015-01-18 05:35:01 +00003290** \NNN -> ascii character NNN in octal
drhfeac5f82004-08-01 00:10:45 +00003291*/
3292static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00003293 int i, j;
3294 char c;
drhc2ce0be2014-05-29 12:36:14 +00003295 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00003296 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00003297 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00003298 c = z[++i];
mistachkinf21979d2015-01-18 05:35:01 +00003299 if( c=='a' ){
3300 c = '\a';
3301 }else if( c=='b' ){
3302 c = '\b';
drhfeac5f82004-08-01 00:10:45 +00003303 }else if( c=='t' ){
3304 c = '\t';
mistachkinf21979d2015-01-18 05:35:01 +00003305 }else if( c=='n' ){
3306 c = '\n';
3307 }else if( c=='v' ){
3308 c = '\v';
3309 }else if( c=='f' ){
3310 c = '\f';
drhfeac5f82004-08-01 00:10:45 +00003311 }else if( c=='r' ){
3312 c = '\r';
mistachkinf21979d2015-01-18 05:35:01 +00003313 }else if( c=='"' ){
3314 c = '"';
3315 }else if( c=='\'' ){
3316 c = '\'';
drh4c56b992013-06-27 13:26:55 +00003317 }else if( c=='\\' ){
3318 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00003319 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00003320 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00003321 if( z[i+1]>='0' && z[i+1]<='7' ){
3322 i++;
3323 c = (c<<3) + z[i] - '0';
3324 if( z[i+1]>='0' && z[i+1]<='7' ){
3325 i++;
3326 c = (c<<3) + z[i] - '0';
3327 }
3328 }
3329 }
3330 }
3331 z[j] = c;
3332 }
drhc2ce0be2014-05-29 12:36:14 +00003333 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00003334}
3335
3336/*
drh348d19c2013-06-03 12:47:43 +00003337** Return the value of a hexadecimal digit. Return -1 if the input
3338** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00003339*/
drh348d19c2013-06-03 12:47:43 +00003340static int hexDigitValue(char c){
3341 if( c>='0' && c<='9' ) return c - '0';
3342 if( c>='a' && c<='f' ) return c - 'a' + 10;
3343 if( c>='A' && c<='F' ) return c - 'A' + 10;
3344 return -1;
drhc28490c2006-10-26 14:25:58 +00003345}
3346
3347/*
drh7d9f3942013-04-03 01:26:54 +00003348** Interpret zArg as an integer value, possibly with suffixes.
3349*/
3350static sqlite3_int64 integerValue(const char *zArg){
3351 sqlite3_int64 v = 0;
3352 static const struct { char *zSuffix; int iMult; } aMult[] = {
3353 { "KiB", 1024 },
3354 { "MiB", 1024*1024 },
3355 { "GiB", 1024*1024*1024 },
3356 { "KB", 1000 },
3357 { "MB", 1000000 },
3358 { "GB", 1000000000 },
3359 { "K", 1000 },
3360 { "M", 1000000 },
3361 { "G", 1000000000 },
3362 };
3363 int i;
3364 int isNeg = 0;
3365 if( zArg[0]=='-' ){
3366 isNeg = 1;
3367 zArg++;
3368 }else if( zArg[0]=='+' ){
3369 zArg++;
3370 }
drh348d19c2013-06-03 12:47:43 +00003371 if( zArg[0]=='0' && zArg[1]=='x' ){
3372 int x;
3373 zArg += 2;
3374 while( (x = hexDigitValue(zArg[0]))>=0 ){
3375 v = (v<<4) + x;
3376 zArg++;
3377 }
3378 }else{
3379 while( IsDigit(zArg[0]) ){
3380 v = v*10 + zArg[0] - '0';
3381 zArg++;
3382 }
drh7d9f3942013-04-03 01:26:54 +00003383 }
drhc2bed0a2013-05-24 11:57:50 +00003384 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00003385 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
3386 v *= aMult[i].iMult;
3387 break;
3388 }
3389 }
3390 return isNeg? -v : v;
3391}
3392
3393/*
drh348d19c2013-06-03 12:47:43 +00003394** Interpret zArg as either an integer or a boolean value. Return 1 or 0
3395** for TRUE and FALSE. Return the integer value if appropriate.
3396*/
3397static int booleanValue(char *zArg){
3398 int i;
3399 if( zArg[0]=='0' && zArg[1]=='x' ){
3400 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
3401 }else{
3402 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
3403 }
3404 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
3405 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
3406 return 1;
3407 }
3408 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
3409 return 0;
3410 }
mistachkinaae280e2015-12-31 19:06:24 +00003411 utf8_printf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
drh348d19c2013-06-03 12:47:43 +00003412 zArg);
3413 return 0;
3414}
3415
3416/*
drh42f64e52012-04-04 16:56:23 +00003417** Close an output file, assuming it is not stderr or stdout
3418*/
3419static void output_file_close(FILE *f){
3420 if( f && f!=stdout && f!=stderr ) fclose(f);
3421}
3422
3423/*
3424** Try to open an output file. The names "stdout" and "stderr" are
mistachkin1fe36bb2016-04-04 02:16:44 +00003425** recognized and do the right thing. NULL is returned if the output
drh42f64e52012-04-04 16:56:23 +00003426** filename is "off".
3427*/
3428static FILE *output_file_open(const char *zFile){
3429 FILE *f;
3430 if( strcmp(zFile,"stdout")==0 ){
3431 f = stdout;
3432 }else if( strcmp(zFile, "stderr")==0 ){
3433 f = stderr;
3434 }else if( strcmp(zFile, "off")==0 ){
3435 f = 0;
3436 }else{
3437 f = fopen(zFile, "wb");
3438 if( f==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003439 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003440 }
3441 }
3442 return f;
3443}
3444
drhd12602a2016-12-07 15:49:02 +00003445#if !defined(SQLITE_UNTESTABLE)
drhc10b9da2016-11-20 17:59:59 +00003446#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003447/*
3448** A routine for handling output from sqlite3_trace().
3449*/
drh4b363a52016-07-23 20:27:41 +00003450static int sql_trace_callback(
3451 unsigned mType,
3452 void *pArg,
3453 void *pP,
3454 void *pX
3455){
drh42f64e52012-04-04 16:56:23 +00003456 FILE *f = (FILE*)pArg;
drhb0df5402016-08-01 17:06:44 +00003457 UNUSED_PARAMETER(mType);
3458 UNUSED_PARAMETER(pP);
drh4b2590e2014-08-19 19:28:00 +00003459 if( f ){
drh4b363a52016-07-23 20:27:41 +00003460 const char *z = (const char*)pX;
drh4b2590e2014-08-19 19:28:00 +00003461 int i = (int)strlen(z);
3462 while( i>0 && z[i-1]==';' ){ i--; }
drhe05461c2015-12-30 13:36:57 +00003463 utf8_printf(f, "%.*s;\n", i, z);
drh4b2590e2014-08-19 19:28:00 +00003464 }
drh4b363a52016-07-23 20:27:41 +00003465 return 0;
drh42f64e52012-04-04 16:56:23 +00003466}
drhc10b9da2016-11-20 17:59:59 +00003467#endif
3468#endif
drh42f64e52012-04-04 16:56:23 +00003469
3470/*
drhd8621b92012-04-17 09:09:33 +00003471** A no-op routine that runs with the ".breakpoint" doc-command. This is
3472** a useful spot to set a debugger breakpoint.
3473*/
3474static void test_breakpoint(void){
3475 static int nCall = 0;
3476 nCall++;
3477}
3478
3479/*
mistachkin636bf9f2014-07-19 20:15:16 +00003480** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00003481*/
mistachkin636bf9f2014-07-19 20:15:16 +00003482typedef struct ImportCtx ImportCtx;
3483struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00003484 const char *zFile; /* Name of the input file */
3485 FILE *in; /* Read the CSV text from this input stream */
3486 char *z; /* Accumulated text for a field */
3487 int n; /* Number of bytes in z */
3488 int nAlloc; /* Space allocated for z[] */
3489 int nLine; /* Current line number */
3490 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00003491 int cColSep; /* The column separator character. (Usually ",") */
3492 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00003493};
3494
3495/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00003496static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00003497 if( p->n+1>=p->nAlloc ){
3498 p->nAlloc += p->nAlloc + 100;
drhf3cdcdc2015-04-29 16:50:28 +00003499 p->z = sqlite3_realloc64(p->z, p->nAlloc);
drhdb95f682013-06-26 22:46:00 +00003500 if( p->z==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003501 raw_printf(stderr, "out of memory\n");
drhdb95f682013-06-26 22:46:00 +00003502 exit(1);
3503 }
3504 }
3505 p->z[p->n++] = (char)c;
3506}
3507
3508/* Read a single field of CSV text. Compatible with rfc4180 and extended
3509** with the option of having a separator other than ",".
3510**
3511** + Input comes from p->in.
3512** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003513** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003514** + Use p->cSep as the column separator. The default is ",".
3515** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00003516** + Keep track of the line number in p->nLine.
3517** + Store the character that terminates the field in p->cTerm. Store
3518** EOF on end-of-file.
3519** + Report syntax errors on stderr
3520*/
mistachkin44723ce2015-03-21 02:22:37 +00003521static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003522 int c;
3523 int cSep = p->cColSep;
3524 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00003525 p->n = 0;
3526 c = fgetc(p->in);
3527 if( c==EOF || seenInterrupt ){
3528 p->cTerm = EOF;
3529 return 0;
3530 }
3531 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00003532 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00003533 int startLine = p->nLine;
3534 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00003535 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00003536 while( 1 ){
3537 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00003538 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00003539 if( c==cQuote ){
3540 if( pc==cQuote ){
3541 pc = 0;
3542 continue;
3543 }
3544 }
3545 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00003546 || (c==rSep && pc==cQuote)
3547 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00003548 || (c==EOF && pc==cQuote)
3549 ){
3550 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00003551 p->cTerm = c;
3552 break;
3553 }
3554 if( pc==cQuote && c!='\r' ){
mistachkinaae280e2015-12-31 19:06:24 +00003555 utf8_printf(stderr, "%s:%d: unescaped %c character\n",
drhdb95f682013-06-26 22:46:00 +00003556 p->zFile, p->nLine, cQuote);
3557 }
3558 if( c==EOF ){
mistachkinaae280e2015-12-31 19:06:24 +00003559 utf8_printf(stderr, "%s:%d: unterminated %c-quoted field\n",
drhdb95f682013-06-26 22:46:00 +00003560 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00003561 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00003562 break;
3563 }
mistachkin636bf9f2014-07-19 20:15:16 +00003564 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00003565 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00003566 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00003567 }
drhdb95f682013-06-26 22:46:00 +00003568 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00003569 while( c!=EOF && c!=cSep && c!=rSep ){
3570 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00003571 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00003572 }
mistachkin636bf9f2014-07-19 20:15:16 +00003573 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00003574 p->nLine++;
drh3852b682014-02-26 13:53:34 +00003575 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00003576 }
drhdb95f682013-06-26 22:46:00 +00003577 p->cTerm = c;
3578 }
drh8dd675e2013-07-12 21:09:24 +00003579 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00003580 return p->z;
3581}
3582
mistachkin636bf9f2014-07-19 20:15:16 +00003583/* Read a single field of ASCII delimited text.
3584**
3585** + Input comes from p->in.
3586** + Store results in p->z of length p->n. Space to hold p->z comes
drhf3cdcdc2015-04-29 16:50:28 +00003587** from sqlite3_malloc64().
mistachkin636bf9f2014-07-19 20:15:16 +00003588** + Use p->cSep as the column separator. The default is "\x1F".
3589** + Use p->rSep as the row separator. The default is "\x1E".
3590** + Keep track of the row number in p->nLine.
3591** + Store the character that terminates the field in p->cTerm. Store
3592** EOF on end-of-file.
3593** + Report syntax errors on stderr
3594*/
mistachkin44723ce2015-03-21 02:22:37 +00003595static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00003596 int c;
3597 int cSep = p->cColSep;
3598 int rSep = p->cRowSep;
3599 p->n = 0;
3600 c = fgetc(p->in);
3601 if( c==EOF || seenInterrupt ){
3602 p->cTerm = EOF;
3603 return 0;
3604 }
3605 while( c!=EOF && c!=cSep && c!=rSep ){
3606 import_append_char(p, c);
3607 c = fgetc(p->in);
3608 }
3609 if( c==rSep ){
3610 p->nLine++;
3611 }
3612 p->cTerm = c;
3613 if( p->z ) p->z[p->n] = 0;
3614 return p->z;
3615}
3616
drhdb95f682013-06-26 22:46:00 +00003617/*
drh4bbcf102014-02-06 02:46:08 +00003618** Try to transfer data for table zTable. If an error is seen while
3619** moving forward, try to go backwards. The backwards movement won't
3620** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00003621*/
mistachkine31ae902014-02-06 01:15:29 +00003622static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00003623 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003624 sqlite3 *newDb,
3625 const char *zTable
3626){
mistachkin1fe36bb2016-04-04 02:16:44 +00003627 sqlite3_stmt *pQuery = 0;
drh3350ce92014-02-06 00:49:12 +00003628 sqlite3_stmt *pInsert = 0;
3629 char *zQuery = 0;
3630 char *zInsert = 0;
3631 int rc;
3632 int i, j, n;
3633 int nTable = (int)strlen(zTable);
3634 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00003635 int cnt = 0;
3636 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00003637
3638 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
3639 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3640 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003641 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003642 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3643 zQuery);
3644 goto end_data_xfer;
3645 }
3646 n = sqlite3_column_count(pQuery);
drhf3cdcdc2015-04-29 16:50:28 +00003647 zInsert = sqlite3_malloc64(200 + nTable + n*3);
drh3350ce92014-02-06 00:49:12 +00003648 if( zInsert==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003649 raw_printf(stderr, "out of memory\n");
drh3350ce92014-02-06 00:49:12 +00003650 goto end_data_xfer;
3651 }
3652 sqlite3_snprintf(200+nTable,zInsert,
3653 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
3654 i = (int)strlen(zInsert);
3655 for(j=1; j<n; j++){
3656 memcpy(zInsert+i, ",?", 2);
3657 i += 2;
3658 }
3659 memcpy(zInsert+i, ");", 3);
3660 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
3661 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003662 utf8_printf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003663 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
3664 zQuery);
3665 goto end_data_xfer;
3666 }
3667 for(k=0; k<2; k++){
3668 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3669 for(i=0; i<n; i++){
3670 switch( sqlite3_column_type(pQuery, i) ){
3671 case SQLITE_NULL: {
3672 sqlite3_bind_null(pInsert, i+1);
3673 break;
3674 }
3675 case SQLITE_INTEGER: {
3676 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
3677 break;
3678 }
3679 case SQLITE_FLOAT: {
3680 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
3681 break;
3682 }
3683 case SQLITE_TEXT: {
3684 sqlite3_bind_text(pInsert, i+1,
3685 (const char*)sqlite3_column_text(pQuery,i),
3686 -1, SQLITE_STATIC);
3687 break;
3688 }
3689 case SQLITE_BLOB: {
3690 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
3691 sqlite3_column_bytes(pQuery,i),
3692 SQLITE_STATIC);
3693 break;
3694 }
3695 }
3696 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00003697 rc = sqlite3_step(pInsert);
3698 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
mistachkinaae280e2015-12-31 19:06:24 +00003699 utf8_printf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
drh4bbcf102014-02-06 02:46:08 +00003700 sqlite3_errmsg(newDb));
3701 }
drh3350ce92014-02-06 00:49:12 +00003702 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00003703 cnt++;
3704 if( (cnt%spinRate)==0 ){
3705 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
3706 fflush(stdout);
3707 }
drh3350ce92014-02-06 00:49:12 +00003708 } /* End while */
3709 if( rc==SQLITE_DONE ) break;
3710 sqlite3_finalize(pQuery);
3711 sqlite3_free(zQuery);
3712 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
3713 zTable);
3714 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3715 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003716 utf8_printf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
drh4bbcf102014-02-06 02:46:08 +00003717 break;
drh3350ce92014-02-06 00:49:12 +00003718 }
3719 } /* End for(k=0...) */
3720
3721end_data_xfer:
3722 sqlite3_finalize(pQuery);
3723 sqlite3_finalize(pInsert);
3724 sqlite3_free(zQuery);
3725 sqlite3_free(zInsert);
3726}
3727
3728
3729/*
3730** Try to transfer all rows of the schema that match zWhere. For
3731** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00003732** If an error is encountered while moving forward through the
3733** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00003734*/
mistachkine31ae902014-02-06 01:15:29 +00003735static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00003736 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00003737 sqlite3 *newDb,
3738 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00003739 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00003740){
3741 sqlite3_stmt *pQuery = 0;
3742 char *zQuery = 0;
3743 int rc;
3744 const unsigned char *zName;
3745 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00003746 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00003747
3748 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3749 " WHERE %s", zWhere);
3750 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3751 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003752 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003753 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3754 zQuery);
3755 goto end_schema_xfer;
3756 }
3757 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3758 zName = sqlite3_column_text(pQuery, 0);
3759 zSql = sqlite3_column_text(pQuery, 1);
3760 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003761 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3762 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003763 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003764 sqlite3_free(zErrMsg);
3765 zErrMsg = 0;
3766 }
drh3350ce92014-02-06 00:49:12 +00003767 if( xForEach ){
3768 xForEach(p, newDb, (const char*)zName);
3769 }
3770 printf("done\n");
3771 }
3772 if( rc!=SQLITE_DONE ){
3773 sqlite3_finalize(pQuery);
3774 sqlite3_free(zQuery);
3775 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
3776 " WHERE %s ORDER BY rowid DESC", zWhere);
3777 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
3778 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003779 utf8_printf(stderr, "Error: (%d) %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00003780 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
3781 zQuery);
3782 goto end_schema_xfer;
3783 }
3784 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
3785 zName = sqlite3_column_text(pQuery, 0);
3786 zSql = sqlite3_column_text(pQuery, 1);
3787 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00003788 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
3789 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00003790 utf8_printf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
drh4bbcf102014-02-06 02:46:08 +00003791 sqlite3_free(zErrMsg);
3792 zErrMsg = 0;
3793 }
drh3350ce92014-02-06 00:49:12 +00003794 if( xForEach ){
3795 xForEach(p, newDb, (const char*)zName);
3796 }
3797 printf("done\n");
3798 }
3799 }
3800end_schema_xfer:
3801 sqlite3_finalize(pQuery);
3802 sqlite3_free(zQuery);
3803}
3804
3805/*
3806** Open a new database file named "zNewDb". Try to recover as much information
3807** as possible out of the main database (which might be corrupt) and write it
3808** into zNewDb.
3809*/
drhdcd87a92014-08-18 13:45:42 +00003810static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00003811 int rc;
3812 sqlite3 *newDb = 0;
3813 if( access(zNewDb,0)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00003814 utf8_printf(stderr, "File \"%s\" already exists.\n", zNewDb);
drh3350ce92014-02-06 00:49:12 +00003815 return;
3816 }
3817 rc = sqlite3_open(zNewDb, &newDb);
3818 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00003819 utf8_printf(stderr, "Cannot create output database: %s\n",
drh3350ce92014-02-06 00:49:12 +00003820 sqlite3_errmsg(newDb));
3821 }else{
drh54d0d2d2014-04-03 00:32:13 +00003822 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003823 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00003824 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
3825 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00003826 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00003827 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00003828 }
3829 sqlite3_close(newDb);
3830}
3831
3832/*
drhc2ce0be2014-05-29 12:36:14 +00003833** Change the output file back to stdout
3834*/
drhdcd87a92014-08-18 13:45:42 +00003835static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00003836 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003837#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00003838 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00003839#endif
drhc2ce0be2014-05-29 12:36:14 +00003840 }else{
3841 output_file_close(p->out);
3842 }
3843 p->outfile[0] = 0;
3844 p->out = stdout;
3845}
3846
3847/*
drhf7502f02015-02-06 14:19:44 +00003848** Run an SQL command and return the single integer result.
3849*/
3850static int db_int(ShellState *p, const char *zSql){
3851 sqlite3_stmt *pStmt;
3852 int res = 0;
3853 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3854 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
3855 res = sqlite3_column_int(pStmt,0);
3856 }
3857 sqlite3_finalize(pStmt);
3858 return res;
3859}
3860
3861/*
3862** Convert a 2-byte or 4-byte big-endian integer into a native integer
3863*/
drha0620ac2016-07-13 13:05:13 +00003864static unsigned int get2byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003865 return (a[0]<<8) + a[1];
3866}
drha0620ac2016-07-13 13:05:13 +00003867static unsigned int get4byteInt(unsigned char *a){
drhf7502f02015-02-06 14:19:44 +00003868 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
3869}
3870
3871/*
3872** Implementation of the ".info" command.
3873**
3874** Return 1 on error, 2 to exit, and 0 otherwise.
3875*/
drh0e55db12015-02-06 14:51:13 +00003876static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00003877 static const struct { const char *zName; int ofst; } aField[] = {
3878 { "file change counter:", 24 },
3879 { "database page count:", 28 },
3880 { "freelist page count:", 36 },
3881 { "schema cookie:", 40 },
3882 { "schema format:", 44 },
3883 { "default cache size:", 48 },
3884 { "autovacuum top root:", 52 },
3885 { "incremental vacuum:", 64 },
3886 { "text encoding:", 56 },
3887 { "user version:", 60 },
3888 { "application id:", 68 },
3889 { "software version:", 96 },
3890 };
drh0e55db12015-02-06 14:51:13 +00003891 static const struct { const char *zName; const char *zSql; } aQuery[] = {
3892 { "number of tables:",
3893 "SELECT count(*) FROM %s WHERE type='table'" },
3894 { "number of indexes:",
3895 "SELECT count(*) FROM %s WHERE type='index'" },
3896 { "number of triggers:",
3897 "SELECT count(*) FROM %s WHERE type='trigger'" },
3898 { "number of views:",
3899 "SELECT count(*) FROM %s WHERE type='view'" },
3900 { "schema size:",
3901 "SELECT total(length(sql)) FROM %s" },
3902 };
mistachkinbfe8bd52015-11-17 19:17:14 +00003903 sqlite3_file *pFile = 0;
drh0e55db12015-02-06 14:51:13 +00003904 int i;
3905 char *zSchemaTab;
3906 char *zDb = nArg>=2 ? azArg[1] : "main";
3907 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00003908 open_db(p, 0);
3909 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00003910 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00003911 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
3912 return 1;
3913 }
3914 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
3915 if( i!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00003916 raw_printf(stderr, "unable to read database header\n");
drhf7502f02015-02-06 14:19:44 +00003917 return 1;
3918 }
3919 i = get2byteInt(aHdr+16);
3920 if( i==1 ) i = 65536;
mistachkinaae280e2015-12-31 19:06:24 +00003921 utf8_printf(p->out, "%-20s %d\n", "database page size:", i);
3922 utf8_printf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
3923 utf8_printf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
3924 utf8_printf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
drhf5ed7ad2015-06-15 14:43:25 +00003925 for(i=0; i<ArraySize(aField); i++){
drhf7502f02015-02-06 14:19:44 +00003926 int ofst = aField[i].ofst;
3927 unsigned int val = get4byteInt(aHdr + ofst);
mistachkinaae280e2015-12-31 19:06:24 +00003928 utf8_printf(p->out, "%-20s %u", aField[i].zName, val);
drhf7502f02015-02-06 14:19:44 +00003929 switch( ofst ){
3930 case 56: {
mistachkin1fe36bb2016-04-04 02:16:44 +00003931 if( val==1 ) raw_printf(p->out, " (utf8)");
3932 if( val==2 ) raw_printf(p->out, " (utf16le)");
3933 if( val==3 ) raw_printf(p->out, " (utf16be)");
drhf7502f02015-02-06 14:19:44 +00003934 }
3935 }
mistachkinaae280e2015-12-31 19:06:24 +00003936 raw_printf(p->out, "\n");
drhf7502f02015-02-06 14:19:44 +00003937 }
drh0e55db12015-02-06 14:51:13 +00003938 if( zDb==0 ){
3939 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
3940 }else if( strcmp(zDb,"temp")==0 ){
3941 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
3942 }else{
3943 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
3944 }
drhf5ed7ad2015-06-15 14:43:25 +00003945 for(i=0; i<ArraySize(aQuery); i++){
drh0e55db12015-02-06 14:51:13 +00003946 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
3947 int val = db_int(p, zSql);
3948 sqlite3_free(zSql);
drhe05461c2015-12-30 13:36:57 +00003949 utf8_printf(p->out, "%-20s %d\n", aQuery[i].zName, val);
drh0e55db12015-02-06 14:51:13 +00003950 }
3951 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00003952 return 0;
3953}
3954
dand95bb392015-09-30 11:19:05 +00003955/*
3956** Print the current sqlite3_errmsg() value to stderr and return 1.
3957*/
3958static int shellDatabaseError(sqlite3 *db){
3959 const char *zErr = sqlite3_errmsg(db);
mistachkinaae280e2015-12-31 19:06:24 +00003960 utf8_printf(stderr, "Error: %s\n", zErr);
dand95bb392015-09-30 11:19:05 +00003961 return 1;
3962}
3963
3964/*
3965** Print an out-of-memory message to stderr and return 1.
3966*/
3967static int shellNomemError(void){
mistachkinaae280e2015-12-31 19:06:24 +00003968 raw_printf(stderr, "Error: out of memory\n");
dand95bb392015-09-30 11:19:05 +00003969 return 1;
3970}
drhf7502f02015-02-06 14:19:44 +00003971
drh2db82112016-09-15 21:35:24 +00003972/*
3973** Compare the pattern in zGlob[] against the text in z[]. Return TRUE
3974** if they match and FALSE (0) if they do not match.
3975**
3976** Globbing rules:
3977**
3978** '*' Matches any sequence of zero or more characters.
3979**
3980** '?' Matches exactly one character.
3981**
3982** [...] Matches one character from the enclosed list of
3983** characters.
3984**
3985** [^...] Matches one character not in the enclosed list.
3986**
3987** '#' Matches any sequence of one or more digits with an
3988** optional + or - sign in front
3989**
3990** ' ' Any span of whitespace matches any other span of
3991** whitespace.
3992**
3993** Extra whitespace at the end of z[] is ignored.
3994*/
3995static int testcase_glob(const char *zGlob, const char *z){
3996 int c, c2;
3997 int invert;
3998 int seen;
3999
4000 while( (c = (*(zGlob++)))!=0 ){
4001 if( IsSpace(c) ){
4002 if( !IsSpace(*z) ) return 0;
4003 while( IsSpace(*zGlob) ) zGlob++;
4004 while( IsSpace(*z) ) z++;
4005 }else if( c=='*' ){
4006 while( (c=(*(zGlob++))) == '*' || c=='?' ){
4007 if( c=='?' && (*(z++))==0 ) return 0;
4008 }
4009 if( c==0 ){
4010 return 1;
4011 }else if( c=='[' ){
4012 while( *z && testcase_glob(zGlob-1,z)==0 ){
4013 z++;
4014 }
4015 return (*z)!=0;
4016 }
4017 while( (c2 = (*(z++)))!=0 ){
4018 while( c2!=c ){
4019 c2 = *(z++);
4020 if( c2==0 ) return 0;
4021 }
4022 if( testcase_glob(zGlob,z) ) return 1;
4023 }
4024 return 0;
4025 }else if( c=='?' ){
4026 if( (*(z++))==0 ) return 0;
4027 }else if( c=='[' ){
4028 int prior_c = 0;
4029 seen = 0;
4030 invert = 0;
4031 c = *(z++);
4032 if( c==0 ) return 0;
4033 c2 = *(zGlob++);
4034 if( c2=='^' ){
4035 invert = 1;
4036 c2 = *(zGlob++);
4037 }
4038 if( c2==']' ){
4039 if( c==']' ) seen = 1;
4040 c2 = *(zGlob++);
4041 }
4042 while( c2 && c2!=']' ){
4043 if( c2=='-' && zGlob[0]!=']' && zGlob[0]!=0 && prior_c>0 ){
4044 c2 = *(zGlob++);
4045 if( c>=prior_c && c<=c2 ) seen = 1;
4046 prior_c = 0;
4047 }else{
4048 if( c==c2 ){
4049 seen = 1;
4050 }
4051 prior_c = c2;
4052 }
4053 c2 = *(zGlob++);
4054 }
4055 if( c2==0 || (seen ^ invert)==0 ) return 0;
4056 }else if( c=='#' ){
4057 if( (z[0]=='-' || z[0]=='+') && IsDigit(z[1]) ) z++;
4058 if( !IsDigit(z[0]) ) return 0;
4059 z++;
4060 while( IsDigit(z[0]) ){ z++; }
4061 }else{
4062 if( c!=(*(z++)) ) return 0;
4063 }
4064 }
4065 while( IsSpace(*z) ){ z++; }
4066 return *z==0;
4067}
drh2db82112016-09-15 21:35:24 +00004068
4069
drhf7502f02015-02-06 14:19:44 +00004070/*
drh4926fec2016-04-13 15:33:42 +00004071** Compare the string as a command-line option with either one or two
4072** initial "-" characters.
4073*/
4074static int optionMatch(const char *zStr, const char *zOpt){
4075 if( zStr[0]!='-' ) return 0;
4076 zStr++;
4077 if( zStr[0]=='-' ) zStr++;
4078 return strcmp(zStr, zOpt)==0;
4079}
4080
4081/*
drhcd0509e2016-09-16 00:26:08 +00004082** Delete a file.
4083*/
4084int shellDeleteFile(const char *zFilename){
4085 int rc;
4086#ifdef _WIN32
mistachkin8145fc62016-09-16 20:39:21 +00004087 wchar_t *z = sqlite3_win32_utf8_to_unicode(zFilename);
drhcd0509e2016-09-16 00:26:08 +00004088 rc = _wunlink(z);
4089 sqlite3_free(z);
4090#else
4091 rc = unlink(zFilename);
4092#endif
4093 return rc;
4094}
4095
dan35ac58e2016-12-14 19:28:27 +00004096
dan35ac58e2016-12-14 19:28:27 +00004097/*
dandd9e0be2016-12-16 16:44:27 +00004098** The implementation of SQL scalar function fkey_collate_clause(), used
dan3c7ebeb2016-12-16 17:28:56 +00004099** by the ".lint fkey-indexes" command. This scalar function is always
dandd9e0be2016-12-16 16:44:27 +00004100** called with four arguments - the parent table name, the parent column name,
4101** the child table name and the child column name.
dan35ac58e2016-12-14 19:28:27 +00004102**
4103** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col')
4104**
4105** If either of the named tables or columns do not exist, this function
4106** returns an empty string. An empty string is also returned if both tables
4107** and columns exist but have the same default collation sequence. Or,
4108** if both exist but the default collation sequences are different, this
4109** function returns the string " COLLATE <parent-collation>", where
4110** <parent-collation> is the default collation sequence of the parent column.
4111*/
4112static void shellFkeyCollateClause(
4113 sqlite3_context *pCtx,
4114 int nVal,
4115 sqlite3_value **apVal
4116){
4117 sqlite3 *db = sqlite3_context_db_handle(pCtx);
4118 const char *zParent;
4119 const char *zParentCol;
4120 const char *zParentSeq;
4121 const char *zChild;
4122 const char *zChildCol;
drh96ada592016-12-29 19:48:46 +00004123 const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */
dan35ac58e2016-12-14 19:28:27 +00004124 int rc;
4125
4126 assert( nVal==4 );
4127 zParent = (const char*)sqlite3_value_text(apVal[0]);
4128 zParentCol = (const char*)sqlite3_value_text(apVal[1]);
4129 zChild = (const char*)sqlite3_value_text(apVal[2]);
4130 zChildCol = (const char*)sqlite3_value_text(apVal[3]);
4131
4132 sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC);
4133 rc = sqlite3_table_column_metadata(
4134 db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0
4135 );
4136 if( rc==SQLITE_OK ){
4137 rc = sqlite3_table_column_metadata(
4138 db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0
4139 );
4140 }
4141
4142 if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){
4143 char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq);
4144 sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT);
4145 sqlite3_free(z);
4146 }
4147}
4148
4149
4150/*
dan3c7ebeb2016-12-16 17:28:56 +00004151** The implementation of dot-command ".lint fkey-indexes".
dan35ac58e2016-12-14 19:28:27 +00004152*/
dan3c7ebeb2016-12-16 17:28:56 +00004153static int lintFkeyIndexes(
dan35ac58e2016-12-14 19:28:27 +00004154 ShellState *pState, /* Current shell tool state */
4155 char **azArg, /* Array of arguments passed to dot command */
4156 int nArg /* Number of entries in azArg[] */
4157){
dandd9e0be2016-12-16 16:44:27 +00004158 sqlite3 *db = pState->db; /* Database handle to query "main" db of */
4159 FILE *out = pState->out; /* Stream to write non-error output to */
danf9647b62016-12-15 06:01:40 +00004160 int bVerbose = 0; /* If -verbose is present */
4161 int bGroupByParent = 0; /* If -groupbyparent is present */
dandd9e0be2016-12-16 16:44:27 +00004162 int i; /* To iterate through azArg[] */
4163 const char *zIndent = ""; /* How much to indent CREATE INDEX by */
4164 int rc; /* Return code */
4165 sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */
dan35ac58e2016-12-14 19:28:27 +00004166
dandd9e0be2016-12-16 16:44:27 +00004167 /*
4168 ** This SELECT statement returns one row for each foreign key constraint
4169 ** in the schema of the main database. The column values are:
4170 **
4171 ** 0. The text of an SQL statement similar to:
4172 **
4173 ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?"
4174 **
4175 ** This is the same SELECT that the foreign keys implementation needs
4176 ** to run internally on child tables. If there is an index that can
4177 ** be used to optimize this query, then it can also be used by the FK
4178 ** implementation to optimize DELETE or UPDATE statements on the parent
4179 ** table.
4180 **
4181 ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by
4182 ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema
4183 ** contains an index that can be used to optimize the query.
4184 **
4185 ** 2. Human readable text that describes the child table and columns. e.g.
4186 **
4187 ** "child_table(child_key1, child_key2)"
4188 **
4189 ** 3. Human readable text that describes the parent table and columns. e.g.
4190 **
4191 ** "parent_table(parent_key1, parent_key2)"
4192 **
4193 ** 4. A full CREATE INDEX statement for an index that could be used to
4194 ** optimize DELETE or UPDATE statements on the parent table. e.g.
4195 **
4196 ** "CREATE INDEX child_table_child_key ON child_table(child_key)"
4197 **
4198 ** 5. The name of the parent table.
4199 **
4200 ** These six values are used by the C logic below to generate the report.
4201 */
dan35ac58e2016-12-14 19:28:27 +00004202 const char *zSql =
dandd9e0be2016-12-16 16:44:27 +00004203 "SELECT "
4204 " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
4205 " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
4206 " || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')"
dan35ac58e2016-12-14 19:28:27 +00004207 ", "
dandd9e0be2016-12-16 16:44:27 +00004208 " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
dan35ac58e2016-12-14 19:28:27 +00004209 " || group_concat('*=?', ' AND ') || ')'"
4210 ", "
dandd9e0be2016-12-16 16:44:27 +00004211 " s.name || '(' || group_concat(f.[from], ', ') || ')'"
dan35ac58e2016-12-14 19:28:27 +00004212 ", "
dandd9e0be2016-12-16 16:44:27 +00004213 " f.[table] || '(' || group_concat(COALESCE(f.[to], "
4214 " (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)"
dan35ac58e2016-12-14 19:28:27 +00004215 " )) || ')'"
4216 ", "
dandd9e0be2016-12-16 16:44:27 +00004217 " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
4218 " || ' ON ' || quote(s.name) || '('"
4219 " || group_concat(quote(f.[from]) ||"
4220 " fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')"
dan35ac58e2016-12-14 19:28:27 +00004221 " || ');'"
danf9647b62016-12-15 06:01:40 +00004222 ", "
dandd9e0be2016-12-16 16:44:27 +00004223 " f.[table] "
dan35ac58e2016-12-14 19:28:27 +00004224
dandd9e0be2016-12-16 16:44:27 +00004225 "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
4226 "GROUP BY s.name, f.id "
4227 "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
dan35ac58e2016-12-14 19:28:27 +00004228 ;
4229
dan3c7ebeb2016-12-16 17:28:56 +00004230 for(i=2; i<nArg; i++){
drh344a1bf2016-12-22 14:53:25 +00004231 int n = (int)strlen(azArg[i]);
danf9647b62016-12-15 06:01:40 +00004232 if( n>1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){
4233 bVerbose = 1;
4234 }
4235 else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){
4236 bGroupByParent = 1;
4237 zIndent = " ";
4238 }
4239 else{
dan3c7ebeb2016-12-16 17:28:56 +00004240 raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n",
4241 azArg[0], azArg[1]
4242 );
danf9647b62016-12-15 06:01:40 +00004243 return SQLITE_ERROR;
4244 }
dan35ac58e2016-12-14 19:28:27 +00004245 }
dan35ac58e2016-12-14 19:28:27 +00004246
4247 /* Register the fkey_collate_clause() SQL function */
dandd9e0be2016-12-16 16:44:27 +00004248 rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8,
4249 0, shellFkeyCollateClause, 0, 0
4250 );
dan35ac58e2016-12-14 19:28:27 +00004251
4252
4253 if( rc==SQLITE_OK ){
4254 rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0);
4255 }
danf9647b62016-12-15 06:01:40 +00004256 if( rc==SQLITE_OK ){
4257 sqlite3_bind_int(pSql, 1, bGroupByParent);
4258 }
dan35ac58e2016-12-14 19:28:27 +00004259
4260 if( rc==SQLITE_OK ){
4261 int rc2;
danf9647b62016-12-15 06:01:40 +00004262 char *zPrev = 0;
dan35ac58e2016-12-14 19:28:27 +00004263 while( SQLITE_ROW==sqlite3_step(pSql) ){
4264 int res = -1;
4265 sqlite3_stmt *pExplain = 0;
4266 const char *zEQP = (const char*)sqlite3_column_text(pSql, 0);
4267 const char *zGlob = (const char*)sqlite3_column_text(pSql, 1);
4268 const char *zFrom = (const char*)sqlite3_column_text(pSql, 2);
4269 const char *zTarget = (const char*)sqlite3_column_text(pSql, 3);
4270 const char *zCI = (const char*)sqlite3_column_text(pSql, 4);
danf9647b62016-12-15 06:01:40 +00004271 const char *zParent = (const char*)sqlite3_column_text(pSql, 5);
dan35ac58e2016-12-14 19:28:27 +00004272
4273 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
4274 if( rc!=SQLITE_OK ) break;
4275 if( SQLITE_ROW==sqlite3_step(pExplain) ){
4276 const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3);
4277 res = (0==sqlite3_strglob(zGlob, zPlan));
4278 }
4279 rc = sqlite3_finalize(pExplain);
4280 if( rc!=SQLITE_OK ) break;
4281
4282 if( res<0 ){
4283 raw_printf(stderr, "Error: internal error");
4284 break;
danf9647b62016-12-15 06:01:40 +00004285 }else{
4286 if( bGroupByParent
4287 && (bVerbose || res==0)
4288 && (zPrev==0 || sqlite3_stricmp(zParent, zPrev))
4289 ){
4290 raw_printf(out, "-- Parent table %s\n", zParent);
4291 sqlite3_free(zPrev);
4292 zPrev = sqlite3_mprintf("%s", zParent);
4293 }
4294
4295 if( res==0 ){
4296 raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget);
4297 }else if( bVerbose ){
4298 raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n",
4299 zIndent, zFrom, zTarget
4300 );
4301 }
dan35ac58e2016-12-14 19:28:27 +00004302 }
4303 }
danf9647b62016-12-15 06:01:40 +00004304 sqlite3_free(zPrev);
dan35ac58e2016-12-14 19:28:27 +00004305
4306 if( rc!=SQLITE_OK ){
4307 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4308 }
4309
4310 rc2 = sqlite3_finalize(pSql);
4311 if( rc==SQLITE_OK && rc2!=SQLITE_OK ){
4312 rc = rc2;
4313 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4314 }
4315 }else{
4316 raw_printf(stderr, "%s\n", sqlite3_errmsg(db));
4317 }
4318
4319 return rc;
4320}
dan3c7ebeb2016-12-16 17:28:56 +00004321
dan35ac58e2016-12-14 19:28:27 +00004322/*
dan3c7ebeb2016-12-16 17:28:56 +00004323** Implementation of ".lint" dot command.
4324*/
4325static int lintDotCommand(
4326 ShellState *pState, /* Current shell tool state */
4327 char **azArg, /* Array of arguments passed to dot command */
4328 int nArg /* Number of entries in azArg[] */
4329){
4330 int n;
drh96ada592016-12-29 19:48:46 +00004331 n = (nArg>=2 ? (int)strlen(azArg[1]) : 0);
dan3c7ebeb2016-12-16 17:28:56 +00004332 if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage;
4333 return lintFkeyIndexes(pState, azArg, nArg);
4334
4335 usage:
4336 raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]);
4337 raw_printf(stderr, "Where sub-commands are:\n");
4338 raw_printf(stderr, " fkey-indexes\n");
4339 return SQLITE_ERROR;
4340}
4341
dan35ac58e2016-12-14 19:28:27 +00004342
drhcd0509e2016-09-16 00:26:08 +00004343/*
drh75897232000-05-29 14:26:00 +00004344** If an input line begins with "." then invoke this routine to
4345** process that line.
drh67505e72002-04-19 12:34:06 +00004346**
drh47ad6842006-11-08 12:25:42 +00004347** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00004348*/
drhdcd87a92014-08-18 13:45:42 +00004349static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00004350 int h = 1;
drh75897232000-05-29 14:26:00 +00004351 int nArg = 0;
4352 int n, c;
drh67505e72002-04-19 12:34:06 +00004353 int rc = 0;
drh75897232000-05-29 14:26:00 +00004354 char *azArg[50];
4355
4356 /* Parse the input line into tokens.
4357 */
mistachkin8e189222015-04-19 21:43:16 +00004358 while( zLine[h] && nArg<ArraySize(azArg) ){
4359 while( IsSpace(zLine[h]) ){ h++; }
4360 if( zLine[h]==0 ) break;
4361 if( zLine[h]=='\'' || zLine[h]=='"' ){
4362 int delim = zLine[h++];
4363 azArg[nArg++] = &zLine[h];
mistachkin1fe36bb2016-04-04 02:16:44 +00004364 while( zLine[h] && zLine[h]!=delim ){
mistachkin8e189222015-04-19 21:43:16 +00004365 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
mistachkin1fe36bb2016-04-04 02:16:44 +00004366 h++;
drh4c56b992013-06-27 13:26:55 +00004367 }
mistachkin8e189222015-04-19 21:43:16 +00004368 if( zLine[h]==delim ){
4369 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00004370 }
drhfeac5f82004-08-01 00:10:45 +00004371 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004372 }else{
mistachkin8e189222015-04-19 21:43:16 +00004373 azArg[nArg++] = &zLine[h];
4374 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
4375 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00004376 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00004377 }
4378 }
4379
4380 /* Process the input line.
4381 */
shane9bd1b442009-10-23 01:27:39 +00004382 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00004383 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00004384 c = azArg[0][0];
drhde613c62016-04-04 17:23:10 +00004385
drha0daa752016-09-16 11:53:10 +00004386#ifndef SQLITE_OMIT_AUTHORIZATION
drhde613c62016-04-04 17:23:10 +00004387 if( c=='a' && strncmp(azArg[0], "auth", n)==0 ){
4388 if( nArg!=2 ){
4389 raw_printf(stderr, "Usage: .auth ON|OFF\n");
4390 rc = 1;
4391 goto meta_command_exit;
4392 }
4393 open_db(p, 0);
4394 if( booleanValue(azArg[1]) ){
4395 sqlite3_set_authorizer(p->db, shellAuth, p);
4396 }else{
4397 sqlite3_set_authorizer(p->db, 0, 0);
4398 }
4399 }else
drha0daa752016-09-16 11:53:10 +00004400#endif
drhde613c62016-04-04 17:23:10 +00004401
drh5c7976f2014-02-10 19:59:27 +00004402 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
4403 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
4404 ){
drhbc46f022013-01-23 18:53:23 +00004405 const char *zDestFile = 0;
4406 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00004407 sqlite3 *pDest;
4408 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00004409 int j;
4410 for(j=1; j<nArg; j++){
4411 const char *z = azArg[j];
4412 if( z[0]=='-' ){
4413 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00004414 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00004415 {
mistachkinaae280e2015-12-31 19:06:24 +00004416 utf8_printf(stderr, "unknown option: %s\n", azArg[j]);
drhbc46f022013-01-23 18:53:23 +00004417 return 1;
4418 }
4419 }else if( zDestFile==0 ){
4420 zDestFile = azArg[j];
4421 }else if( zDb==0 ){
4422 zDb = zDestFile;
4423 zDestFile = azArg[j];
4424 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004425 raw_printf(stderr, "too many arguments to .backup\n");
drhbc46f022013-01-23 18:53:23 +00004426 return 1;
4427 }
drh9ff849f2009-02-04 20:55:57 +00004428 }
drhbc46f022013-01-23 18:53:23 +00004429 if( zDestFile==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004430 raw_printf(stderr, "missing FILENAME argument on .backup\n");
drhbc46f022013-01-23 18:53:23 +00004431 return 1;
4432 }
4433 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00004434 rc = sqlite3_open(zDestFile, &pDest);
4435 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004436 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00004437 sqlite3_close(pDest);
4438 return 1;
4439 }
drh05782482013-10-24 15:20:20 +00004440 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00004441 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
4442 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004443 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
drh9ff849f2009-02-04 20:55:57 +00004444 sqlite3_close(pDest);
4445 return 1;
4446 }
4447 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
4448 sqlite3_backup_finish(pBackup);
4449 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00004450 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00004451 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004452 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00004453 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00004454 }
4455 sqlite3_close(pDest);
4456 }else
4457
drhc2ce0be2014-05-29 12:36:14 +00004458 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
4459 if( nArg==2 ){
4460 bail_on_error = booleanValue(azArg[1]);
4461 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004462 raw_printf(stderr, "Usage: .bail on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004463 rc = 1;
4464 }
drhc49f44e2006-10-26 18:15:42 +00004465 }else
4466
mistachkinf21979d2015-01-18 05:35:01 +00004467 if( c=='b' && n>=3 && strncmp(azArg[0], "binary", n)==0 ){
4468 if( nArg==2 ){
mistachkinbdffff92015-01-19 20:22:33 +00004469 if( booleanValue(azArg[1]) ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004470 setBinaryMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004471 }else{
mistachkin1fe36bb2016-04-04 02:16:44 +00004472 setTextMode(p->out, 1);
mistachkinbdffff92015-01-19 20:22:33 +00004473 }
mistachkinf21979d2015-01-18 05:35:01 +00004474 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004475 raw_printf(stderr, "Usage: .binary on|off\n");
mistachkinf21979d2015-01-18 05:35:01 +00004476 rc = 1;
4477 }
4478 }else
4479
drhd8621b92012-04-17 09:09:33 +00004480 /* The undocumented ".breakpoint" command causes a call to the no-op
4481 ** routine named test_breakpoint().
4482 */
4483 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
4484 test_breakpoint();
4485 }else
4486
drhdf12f1c2015-12-07 21:46:19 +00004487 if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){
4488 if( nArg==2 ){
4489 p->countChanges = booleanValue(azArg[1]);
4490 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004491 raw_printf(stderr, "Usage: .changes on|off\n");
drhdf12f1c2015-12-07 21:46:19 +00004492 rc = 1;
4493 }
4494 }else
4495
drh2db82112016-09-15 21:35:24 +00004496 /* Cancel output redirection, if it is currently set (by .testcase)
4497 ** Then read the content of the testcase-out.txt file and compare against
4498 ** azArg[1]. If there are differences, report an error and exit.
4499 */
4500 if( c=='c' && n>=3 && strncmp(azArg[0], "check", n)==0 ){
4501 char *zRes = 0;
4502 output_reset(p);
4503 if( nArg!=2 ){
4504 raw_printf(stderr, "Usage: .check GLOB-PATTERN\n");
drh760c8162016-09-16 02:52:22 +00004505 rc = 2;
dan11da0022016-12-17 08:18:05 +00004506 }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){
drh2db82112016-09-15 21:35:24 +00004507 raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n");
4508 rc = 2;
4509 }else if( testcase_glob(azArg[1],zRes)==0 ){
mistachkin8145fc62016-09-16 20:39:21 +00004510 utf8_printf(stderr,
drh760c8162016-09-16 02:52:22 +00004511 "testcase-%s FAILED\n Expected: [%s]\n Got: [%s]\n",
4512 p->zTestcase, azArg[1], zRes);
drh2db82112016-09-15 21:35:24 +00004513 rc = 2;
drh760c8162016-09-16 02:52:22 +00004514 }else{
mistachkin8145fc62016-09-16 20:39:21 +00004515 utf8_printf(stdout, "testcase-%s ok\n", p->zTestcase);
drh760c8162016-09-16 02:52:22 +00004516 p->nCheck++;
drh2db82112016-09-15 21:35:24 +00004517 }
4518 sqlite3_free(zRes);
4519 }else
drh2db82112016-09-15 21:35:24 +00004520
drhc2ce0be2014-05-29 12:36:14 +00004521 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
4522 if( nArg==2 ){
4523 tryToClone(p, azArg[1]);
4524 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004525 raw_printf(stderr, "Usage: .clone FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00004526 rc = 1;
4527 }
mistachkine31ae902014-02-06 01:15:29 +00004528 }else
4529
drhc2ce0be2014-05-29 12:36:14 +00004530 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004531 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00004532 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00004533 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00004534 memcpy(&data, p, sizeof(data));
drhb20a61b2016-12-24 18:18:58 +00004535 data.showHeader = 0;
4536 data.cMode = data.mode = MODE_List;
4537 sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": ");
drh0b2110c2004-10-26 00:08:10 +00004538 data.cnt = 0;
drhb20a61b2016-12-24 18:18:58 +00004539 sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list",
4540 callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00004541 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00004542 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004543 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00004544 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00004545 }
4546 }else
4547
drh0e55db12015-02-06 14:51:13 +00004548 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
4549 rc = shell_dbinfo_command(p, nArg, azArg);
4550 }else
4551
drhc2ce0be2014-05-29 12:36:14 +00004552 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drhe611f142017-03-08 11:44:00 +00004553 const char *zLike = 0;
4554 int i;
4555 p->preserveRowid = 0;
4556 for(i=1; i<nArg; i++){
4557 if( azArg[i][0]=='-' ){
4558 const char *z = azArg[i]+1;
4559 if( z[0]=='-' ) z++;
4560 if( strcmp(z,"preserve-rowids")==0 ){
4561 p->preserveRowid = 1;
4562 }else
4563 {
4564 raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]);
4565 rc = 1;
4566 goto meta_command_exit;
4567 }
4568 }else if( zLike ){
4569 raw_printf(stderr, "Usage: .dump ?--preserve-rowids? ?LIKE-PATTERN?\n");
4570 rc = 1;
4571 goto meta_command_exit;
4572 }else{
4573 zLike = azArg[i];
4574 }
4575 }
drh05782482013-10-24 15:20:20 +00004576 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00004577 /* When playing back a "dump", the content might appear in an order
4578 ** which causes immediate foreign key constraints to be violated.
4579 ** So disable foreign-key constraint enforcement to prevent problems. */
mistachkinaae280e2015-12-31 19:06:24 +00004580 raw_printf(p->out, "PRAGMA foreign_keys=OFF;\n");
4581 raw_printf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00004582 p->writableSchema = 0;
drhe611f142017-03-08 11:44:00 +00004583 /* Set writable_schema=ON since doing so forces SQLite to initialize
4584 ** as much of the schema as it can even if the sqlite_master table is
4585 ** corrupt. */
drh56197952011-10-13 16:30:13 +00004586 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00004587 p->nErr = 0;
drhe611f142017-03-08 11:44:00 +00004588 if( zLike==0 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00004589 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00004590 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004591 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00004592 );
mistachkin1fe36bb2016-04-04 02:16:44 +00004593 run_schema_dump_query(p,
drh4f324762009-05-21 14:51:03 +00004594 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00004595 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00004596 );
drh2f464a02011-10-13 00:41:49 +00004597 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00004598 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00004599 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00004600 );
drh4c653a02000-06-07 01:27:47 +00004601 }else{
drhe611f142017-03-08 11:44:00 +00004602 char *zSql;
4603 zSql = sqlite3_mprintf(
4604 "SELECT name, type, sql FROM sqlite_master "
4605 "WHERE tbl_name LIKE %Q AND type=='table'"
4606 " AND sql NOT NULL", zLike);
4607 run_schema_dump_query(p,zSql);
4608 sqlite3_free(zSql);
4609 zSql = sqlite3_mprintf(
4610 "SELECT sql FROM sqlite_master "
4611 "WHERE sql NOT NULL"
4612 " AND type IN ('index','trigger','view')"
4613 " AND tbl_name LIKE %Q", zLike);
4614 run_table_dump_query(p, zSql, 0);
4615 sqlite3_free(zSql);
drh4c653a02000-06-07 01:27:47 +00004616 }
drh45e29d82006-11-20 16:21:10 +00004617 if( p->writableSchema ){
mistachkinaae280e2015-12-31 19:06:24 +00004618 raw_printf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00004619 p->writableSchema = 0;
4620 }
drh56197952011-10-13 16:30:13 +00004621 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
4622 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
mistachkinaae280e2015-12-31 19:06:24 +00004623 raw_printf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00004624 }else
drh75897232000-05-29 14:26:00 +00004625
drhc2ce0be2014-05-29 12:36:14 +00004626 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
4627 if( nArg==2 ){
4628 p->echoOn = booleanValue(azArg[1]);
4629 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004630 raw_printf(stderr, "Usage: .echo on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004631 rc = 1;
4632 }
drhdaffd0e2001-04-11 14:28:42 +00004633 }else
4634
drhc2ce0be2014-05-29 12:36:14 +00004635 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
4636 if( nArg==2 ){
drheacd29d2016-04-15 15:03:27 +00004637 if( strcmp(azArg[1],"full")==0 ){
4638 p->autoEQP = 2;
4639 }else{
4640 p->autoEQP = booleanValue(azArg[1]);
4641 }
drhc2ce0be2014-05-29 12:36:14 +00004642 }else{
drheacd29d2016-04-15 15:03:27 +00004643 raw_printf(stderr, "Usage: .eqp on|off|full\n");
drhc2ce0be2014-05-29 12:36:14 +00004644 rc = 1;
mistachkin1fe36bb2016-04-04 02:16:44 +00004645 }
drhefbf3b12014-02-28 20:47:24 +00004646 }else
4647
drhd3ac7d92013-01-25 18:33:43 +00004648 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00004649 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00004650 rc = 2;
drh75897232000-05-29 14:26:00 +00004651 }else
4652
drhc2ce0be2014-05-29 12:36:14 +00004653 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drh700c2522016-02-09 18:39:25 +00004654 int val = 1;
4655 if( nArg>=2 ){
4656 if( strcmp(azArg[1],"auto")==0 ){
4657 val = 99;
4658 }else{
4659 val = booleanValue(azArg[1]);
persicom7e2dfdd2002-04-18 02:46:52 +00004660 }
drh700c2522016-02-09 18:39:25 +00004661 }
4662 if( val==1 && p->mode!=MODE_Explain ){
4663 p->normalMode = p->mode;
danielk19770d78bae2008-01-03 07:09:48 +00004664 p->mode = MODE_Explain;
drh700c2522016-02-09 18:39:25 +00004665 p->autoExplain = 0;
4666 }else if( val==0 ){
4667 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4668 p->autoExplain = 0;
4669 }else if( val==99 ){
4670 if( p->mode==MODE_Explain ) p->mode = p->normalMode;
4671 p->autoExplain = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00004672 }
drh75897232000-05-29 14:26:00 +00004673 }else
4674
drhc1971542014-06-23 23:28:13 +00004675 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00004676 ShellState data;
drhc1971542014-06-23 23:28:13 +00004677 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00004678 int doStats = 0;
drh4926fec2016-04-13 15:33:42 +00004679 memcpy(&data, p, sizeof(data));
4680 data.showHeader = 0;
4681 data.cMode = data.mode = MODE_Semi;
4682 if( nArg==2 && optionMatch(azArg[1], "indent") ){
4683 data.cMode = data.mode = MODE_Pretty;
4684 nArg = 1;
4685 }
drhc1971542014-06-23 23:28:13 +00004686 if( nArg!=1 ){
drh4926fec2016-04-13 15:33:42 +00004687 raw_printf(stderr, "Usage: .fullschema ?--indent?\n");
drhc1971542014-06-23 23:28:13 +00004688 rc = 1;
4689 goto meta_command_exit;
4690 }
4691 open_db(p, 0);
drhc1971542014-06-23 23:28:13 +00004692 rc = sqlite3_exec(p->db,
4693 "SELECT sql FROM"
4694 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
4695 " FROM sqlite_master UNION ALL"
4696 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00004697 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00004698 "ORDER BY rowid",
4699 callback, &data, &zErrMsg
4700 );
drh56f674c2014-07-18 14:43:29 +00004701 if( rc==SQLITE_OK ){
4702 sqlite3_stmt *pStmt;
4703 rc = sqlite3_prepare_v2(p->db,
4704 "SELECT rowid FROM sqlite_master"
4705 " WHERE name GLOB 'sqlite_stat[134]'",
4706 -1, &pStmt, 0);
4707 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
4708 sqlite3_finalize(pStmt);
4709 }
4710 if( doStats==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004711 raw_printf(p->out, "/* No STAT tables available */\n");
drh56f674c2014-07-18 14:43:29 +00004712 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004713 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004714 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
4715 callback, &data, &zErrMsg);
drh700c2522016-02-09 18:39:25 +00004716 data.cMode = data.mode = MODE_Insert;
drh56f674c2014-07-18 14:43:29 +00004717 data.zDestTable = "sqlite_stat1";
4718 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
4719 shell_callback, &data,&zErrMsg);
4720 data.zDestTable = "sqlite_stat3";
4721 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
4722 shell_callback, &data,&zErrMsg);
4723 data.zDestTable = "sqlite_stat4";
4724 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
4725 shell_callback, &data, &zErrMsg);
mistachkinaae280e2015-12-31 19:06:24 +00004726 raw_printf(p->out, "ANALYZE sqlite_master;\n");
drh56f674c2014-07-18 14:43:29 +00004727 }
drhc1971542014-06-23 23:28:13 +00004728 }else
4729
drhc2ce0be2014-05-29 12:36:14 +00004730 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
4731 if( nArg==2 ){
4732 p->showHeader = booleanValue(azArg[1]);
4733 }else{
mistachkinaae280e2015-12-31 19:06:24 +00004734 raw_printf(stderr, "Usage: .headers on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00004735 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00004736 }
drh75897232000-05-29 14:26:00 +00004737 }else
4738
drhc2ce0be2014-05-29 12:36:14 +00004739 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004740 utf8_printf(p->out, "%s", zHelp);
drhc2ce0be2014-05-29 12:36:14 +00004741 }else
4742
4743 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00004744 char *zTable; /* Insert data into this table */
4745 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00004746 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00004747 int nCol; /* Number of columns in the table */
4748 int nByte; /* Number of bytes in an SQL string */
4749 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00004750 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00004751 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00004752 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00004753 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00004754 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
4755 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00004756
drhc2ce0be2014-05-29 12:36:14 +00004757 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00004758 raw_printf(stderr, "Usage: .import FILE TABLE\n");
drhc2ce0be2014-05-29 12:36:14 +00004759 goto meta_command_exit;
4760 }
drh01f37542014-05-31 15:43:33 +00004761 zFile = azArg[1];
4762 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00004763 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00004764 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00004765 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004766 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00004767 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004768 raw_printf(stderr,
4769 "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00004770 return 1;
drhfeac5f82004-08-01 00:10:45 +00004771 }
drhdb95f682013-06-26 22:46:00 +00004772 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004773 raw_printf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00004774 " for import\n");
4775 return 1;
4776 }
mistachkin636bf9f2014-07-19 20:15:16 +00004777 nSep = strlen30(p->rowSeparator);
4778 if( nSep==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004779 raw_printf(stderr, "Error: non-null row separator required for import\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004780 return 1;
4781 }
mistachkine0d68852014-12-11 03:12:33 +00004782 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
4783 /* When importing CSV (only), if the row separator is set to the
4784 ** default output row separator, change it to the default input
4785 ** row separator. This avoids having to maintain different input
4786 ** and output row separators. */
4787 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
4788 nSep = strlen30(p->rowSeparator);
4789 }
mistachkin636bf9f2014-07-19 20:15:16 +00004790 if( nSep>1 ){
mistachkinaae280e2015-12-31 19:06:24 +00004791 raw_printf(stderr, "Error: multi-character row separators not allowed"
mistachkin636bf9f2014-07-19 20:15:16 +00004792 " for import\n");
4793 return 1;
4794 }
4795 sCtx.zFile = zFile;
4796 sCtx.nLine = 1;
4797 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00004798#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00004799 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00004800 return 1;
4801#else
mistachkin636bf9f2014-07-19 20:15:16 +00004802 sCtx.in = popen(sCtx.zFile+1, "r");
4803 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00004804 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00004805#endif
drh5bde8162013-06-27 14:07:53 +00004806 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00004807 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00004808 xCloser = fclose;
4809 }
mistachkin636bf9f2014-07-19 20:15:16 +00004810 if( p->mode==MODE_Ascii ){
4811 xRead = ascii_read_one_field;
4812 }else{
4813 xRead = csv_read_one_field;
4814 }
4815 if( sCtx.in==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004816 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00004817 return 1;
4818 }
mistachkin636bf9f2014-07-19 20:15:16 +00004819 sCtx.cColSep = p->colSeparator[0];
4820 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00004821 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00004822 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004823 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004824 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004825 return 1;
4826 }
drh4f21c4a2008-12-10 22:15:00 +00004827 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00004828 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00004829 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00004830 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00004831 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
4832 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00004833 while( xRead(&sCtx) ){
drhd8c22ac2016-02-25 13:33:02 +00004834 zCreate = sqlite3_mprintf("%z%c\n \"%w\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00004835 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00004836 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00004837 }
drh5bde8162013-06-27 14:07:53 +00004838 if( cSep=='(' ){
4839 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00004840 sqlite3_free(sCtx.z);
4841 xCloser(sCtx.in);
mistachkinaae280e2015-12-31 19:06:24 +00004842 utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00004843 return 1;
4844 }
drhdb95f682013-06-26 22:46:00 +00004845 zCreate = sqlite3_mprintf("%z\n)", zCreate);
4846 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
4847 sqlite3_free(zCreate);
4848 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004849 utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00004850 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004851 sqlite3_free(sCtx.z);
4852 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00004853 return 1;
4854 }
drhc7181902014-02-27 15:04:13 +00004855 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004856 }
drhfeac5f82004-08-01 00:10:45 +00004857 sqlite3_free(zSql);
4858 if( rc ){
shane916f9612009-10-23 00:37:15 +00004859 if (pStmt) sqlite3_finalize(pStmt);
mistachkinaae280e2015-12-31 19:06:24 +00004860 utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00004861 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004862 return 1;
drhfeac5f82004-08-01 00:10:45 +00004863 }
shane916f9612009-10-23 00:37:15 +00004864 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00004865 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00004866 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00004867 if( nCol==0 ) return 0; /* no columns, no error */
drhf3cdcdc2015-04-29 16:50:28 +00004868 zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00004869 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00004870 raw_printf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00004871 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00004872 return 1;
4873 }
drhdb95f682013-06-26 22:46:00 +00004874 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00004875 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00004876 for(i=1; i<nCol; i++){
4877 zSql[j++] = ',';
4878 zSql[j++] = '?';
4879 }
4880 zSql[j++] = ')';
4881 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00004882 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00004883 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00004884 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00004885 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00004886 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00004887 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00004888 return 1;
drhfeac5f82004-08-01 00:10:45 +00004889 }
mistachkin8e189222015-04-19 21:43:16 +00004890 needCommit = sqlite3_get_autocommit(p->db);
4891 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00004892 do{
mistachkin636bf9f2014-07-19 20:15:16 +00004893 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00004894 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00004895 char *z = xRead(&sCtx);
4896 /*
4897 ** Did we reach end-of-file before finding any columns?
4898 ** If so, stop instead of NULL filling the remaining columns.
4899 */
drhdb95f682013-06-26 22:46:00 +00004900 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00004901 /*
4902 ** Did we reach end-of-file OR end-of-line before finding any
4903 ** columns in ASCII mode? If so, stop instead of NULL filling
4904 ** the remaining columns.
4905 */
4906 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00004907 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00004908 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
mistachkinaae280e2015-12-31 19:06:24 +00004909 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00004910 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00004911 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00004912 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00004913 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00004914 }
drhfeac5f82004-08-01 00:10:45 +00004915 }
mistachkin636bf9f2014-07-19 20:15:16 +00004916 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00004917 do{
mistachkin636bf9f2014-07-19 20:15:16 +00004918 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00004919 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00004920 }while( sCtx.cTerm==sCtx.cColSep );
mistachkinaae280e2015-12-31 19:06:24 +00004921 utf8_printf(stderr, "%s:%d: expected %d columns but found %d - "
drhdb95f682013-06-26 22:46:00 +00004922 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00004923 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00004924 }
drhdb95f682013-06-26 22:46:00 +00004925 if( i>=nCol ){
4926 sqlite3_step(pStmt);
4927 rc = sqlite3_reset(pStmt);
4928 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00004929 utf8_printf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile,
4930 startLine, sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00004931 }
4932 }
mistachkin636bf9f2014-07-19 20:15:16 +00004933 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00004934
mistachkin636bf9f2014-07-19 20:15:16 +00004935 xCloser(sCtx.in);
4936 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00004937 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00004938 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00004939 }else
4940
drhd12602a2016-12-07 15:49:02 +00004941#ifndef SQLITE_UNTESTABLE
drh16eb5942016-11-03 13:01:38 +00004942 if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){
4943 char *zSql;
4944 char *zCollist = 0;
4945 sqlite3_stmt *pStmt;
4946 int tnum = 0;
drh59ce2c42016-11-03 13:12:28 +00004947 int i;
drh16eb5942016-11-03 13:01:38 +00004948 if( nArg!=3 ){
4949 utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n");
4950 rc = 1;
4951 goto meta_command_exit;
4952 }
4953 open_db(p, 0);
4954 zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master"
4955 " WHERE name='%q' AND type='index'", azArg[1]);
4956 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4957 sqlite3_free(zSql);
4958 if( sqlite3_step(pStmt)==SQLITE_ROW ){
4959 tnum = sqlite3_column_int(pStmt, 0);
4960 }
4961 sqlite3_finalize(pStmt);
4962 if( tnum==0 ){
4963 utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
4964 rc = 1;
4965 goto meta_command_exit;
4966 }
4967 zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
4968 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
4969 sqlite3_free(zSql);
drh59ce2c42016-11-03 13:12:28 +00004970 i = 0;
drh16eb5942016-11-03 13:01:38 +00004971 while( sqlite3_step(pStmt)==SQLITE_ROW ){
drh59ce2c42016-11-03 13:12:28 +00004972 char zLabel[20];
drh16eb5942016-11-03 13:01:38 +00004973 const char *zCol = (const char*)sqlite3_column_text(pStmt,2);
drh59ce2c42016-11-03 13:12:28 +00004974 i++;
4975 if( zCol==0 ){
4976 if( sqlite3_column_int(pStmt,1)==-1 ){
4977 zCol = "_ROWID_";
4978 }else{
4979 sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i);
4980 zCol = zLabel;
4981 }
4982 }
drh16eb5942016-11-03 13:01:38 +00004983 if( zCollist==0 ){
4984 zCollist = sqlite3_mprintf("\"%w\"", zCol);
4985 }else{
4986 zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol);
4987 }
4988 }
4989 sqlite3_finalize(pStmt);
4990 zSql = sqlite3_mprintf(
4991 "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID",
4992 azArg[2], zCollist, zCollist);
4993 sqlite3_free(zCollist);
4994 rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
4995 if( rc==SQLITE_OK ){
4996 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
4997 sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0);
4998 if( rc ){
4999 utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db));
5000 }else{
5001 utf8_printf(stdout, "%s;\n", zSql);
mistachkin2f9a6132016-11-11 05:19:45 +00005002 raw_printf(stdout,
drh16eb5942016-11-03 13:01:38 +00005003 "WARNING: writing to an imposter table will corrupt the index!\n"
5004 );
5005 }
5006 }else{
mistachkin2f9a6132016-11-11 05:19:45 +00005007 raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc);
drh16eb5942016-11-03 13:01:38 +00005008 rc = 1;
5009 }
5010 sqlite3_free(zSql);
5011 }else
5012#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */
5013
drhae5e4452007-05-03 17:18:36 +00005014#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00005015 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00005016 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00005017 if( iotrace && iotrace!=stdout ) fclose(iotrace);
5018 iotrace = 0;
5019 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00005020 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00005021 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00005022 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005023 iotrace = stdout;
5024 }else{
5025 iotrace = fopen(azArg[1], "w");
5026 if( iotrace==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005027 utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00005028 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00005029 rc = 1;
drhb0603412007-02-28 04:47:26 +00005030 }else{
mlcreech3a00f902008-03-04 17:45:01 +00005031 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00005032 }
5033 }
5034 }else
drhae5e4452007-05-03 17:18:36 +00005035#endif
drh16eb5942016-11-03 13:01:38 +00005036
drh1a513372015-05-02 17:40:23 +00005037 if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){
5038 static const struct {
5039 const char *zLimitName; /* Name of a limit */
5040 int limitCode; /* Integer code for that limit */
5041 } aLimit[] = {
5042 { "length", SQLITE_LIMIT_LENGTH },
5043 { "sql_length", SQLITE_LIMIT_SQL_LENGTH },
5044 { "column", SQLITE_LIMIT_COLUMN },
5045 { "expr_depth", SQLITE_LIMIT_EXPR_DEPTH },
5046 { "compound_select", SQLITE_LIMIT_COMPOUND_SELECT },
5047 { "vdbe_op", SQLITE_LIMIT_VDBE_OP },
5048 { "function_arg", SQLITE_LIMIT_FUNCTION_ARG },
5049 { "attached", SQLITE_LIMIT_ATTACHED },
5050 { "like_pattern_length", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
5051 { "variable_number", SQLITE_LIMIT_VARIABLE_NUMBER },
5052 { "trigger_depth", SQLITE_LIMIT_TRIGGER_DEPTH },
5053 { "worker_threads", SQLITE_LIMIT_WORKER_THREADS },
5054 };
5055 int i, n2;
5056 open_db(p, 0);
5057 if( nArg==1 ){
drhf5ed7ad2015-06-15 14:43:25 +00005058 for(i=0; i<ArraySize(aLimit); i++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005059 printf("%20s %d\n", aLimit[i].zLimitName,
drh1a513372015-05-02 17:40:23 +00005060 sqlite3_limit(p->db, aLimit[i].limitCode, -1));
5061 }
5062 }else if( nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005063 raw_printf(stderr, "Usage: .limit NAME ?NEW-VALUE?\n");
drh1a513372015-05-02 17:40:23 +00005064 rc = 1;
5065 goto meta_command_exit;
5066 }else{
5067 int iLimit = -1;
5068 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00005069 for(i=0; i<ArraySize(aLimit); i++){
drh1a513372015-05-02 17:40:23 +00005070 if( sqlite3_strnicmp(aLimit[i].zLimitName, azArg[1], n2)==0 ){
5071 if( iLimit<0 ){
5072 iLimit = i;
5073 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005074 utf8_printf(stderr, "ambiguous limit: \"%s\"\n", azArg[1]);
drh1a513372015-05-02 17:40:23 +00005075 rc = 1;
5076 goto meta_command_exit;
5077 }
5078 }
5079 }
5080 if( iLimit<0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005081 utf8_printf(stderr, "unknown limit: \"%s\"\n"
drh1a513372015-05-02 17:40:23 +00005082 "enter \".limits\" with no arguments for a list.\n",
5083 azArg[1]);
5084 rc = 1;
5085 goto meta_command_exit;
5086 }
5087 if( nArg==3 ){
mistachkin2c1820c2015-05-08 01:04:39 +00005088 sqlite3_limit(p->db, aLimit[iLimit].limitCode,
5089 (int)integerValue(azArg[2]));
drh1a513372015-05-02 17:40:23 +00005090 }
5091 printf("%20s %d\n", aLimit[iLimit].zLimitName,
5092 sqlite3_limit(p->db, aLimit[iLimit].limitCode, -1));
5093 }
5094 }else
drhb0603412007-02-28 04:47:26 +00005095
dan3c7ebeb2016-12-16 17:28:56 +00005096 if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){
drh3fd9f332016-12-16 18:41:11 +00005097 open_db(p, 0);
dan3c7ebeb2016-12-16 17:28:56 +00005098 lintDotCommand(p, azArg, nArg);
5099 }else
5100
drh70df4fe2006-06-13 15:12:21 +00005101#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00005102 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00005103 const char *zFile, *zProc;
5104 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00005105 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005106 raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
drhc2ce0be2014-05-29 12:36:14 +00005107 rc = 1;
5108 goto meta_command_exit;
5109 }
drh1e397f82006-06-08 15:28:43 +00005110 zFile = azArg[1];
5111 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00005112 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00005113 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
5114 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005115 utf8_printf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00005116 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00005117 rc = 1;
drh1e397f82006-06-08 15:28:43 +00005118 }
5119 }else
drh70df4fe2006-06-13 15:12:21 +00005120#endif
drh1e397f82006-06-08 15:28:43 +00005121
drhc2ce0be2014-05-29 12:36:14 +00005122 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
5123 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005124 raw_printf(stderr, "Usage: .log FILENAME\n");
drhc2ce0be2014-05-29 12:36:14 +00005125 rc = 1;
5126 }else{
5127 const char *zFile = azArg[1];
5128 output_file_close(p->pLog);
5129 p->pLog = output_file_open(zFile);
5130 }
drh127f9d72010-02-23 01:47:00 +00005131 }else
5132
drhc2ce0be2014-05-29 12:36:14 +00005133 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
5134 const char *zMode = nArg>=2 ? azArg[1] : "";
5135 int n2 = (int)strlen(zMode);
5136 int c2 = zMode[0];
5137 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005138 p->mode = MODE_Line;
drh7aee83b2017-01-27 01:52:42 +00005139 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005140 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005141 p->mode = MODE_Column;
drh7aee83b2017-01-27 01:52:42 +00005142 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005143 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00005144 p->mode = MODE_List;
drh7aee83b2017-01-27 01:52:42 +00005145 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Column);
5146 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005147 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00005148 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00005149 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005150 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00005151 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drh7aee83b2017-01-27 01:52:42 +00005152 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
drhc2ce0be2014-05-29 12:36:14 +00005153 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00005154 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00005155 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00005156 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00005157 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00005158 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00005159 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00005160 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00005161 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00005162 set_table_name(p, nArg>=3 ? azArg[2] : "table");
drh41f5f6e2016-10-21 17:39:30 +00005163 }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){
5164 p->mode = MODE_Quote;
mistachkin636bf9f2014-07-19 20:15:16 +00005165 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
5166 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00005167 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
5168 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00005169 }else {
mistachkinaae280e2015-12-31 19:06:24 +00005170 raw_printf(stderr, "Error: mode should be one of: "
drh36f49d02016-11-23 23:18:45 +00005171 "ascii column csv html insert line list quote tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00005172 rc = 1;
drh75897232000-05-29 14:26:00 +00005173 }
drh700c2522016-02-09 18:39:25 +00005174 p->cMode = p->mode;
drh75897232000-05-29 14:26:00 +00005175 }else
5176
drhc2ce0be2014-05-29 12:36:14 +00005177 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
5178 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00005179 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
5180 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00005181 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005182 raw_printf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00005183 rc = 1;
5184 }
5185 }else
5186
drh05782482013-10-24 15:20:20 +00005187 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
drhcd0509e2016-09-16 00:26:08 +00005188 char *zNewFilename; /* Name of the database file to open */
5189 int iName = 1; /* Index in azArg[] of the filename */
drh760c8162016-09-16 02:52:22 +00005190 int newFlag = 0; /* True to delete file before opening */
drhcd0509e2016-09-16 00:26:08 +00005191 /* Close the existing database */
5192 session_close_all(p);
5193 sqlite3_close(p->db);
drh05782482013-10-24 15:20:20 +00005194 p->db = 0;
dan21472212017-03-01 11:30:27 +00005195 p->zDbFilename = 0;
drhcd0509e2016-09-16 00:26:08 +00005196 sqlite3_free(p->zFreeOnClose);
5197 p->zFreeOnClose = 0;
drh760c8162016-09-16 02:52:22 +00005198 /* Check for command-line arguments */
5199 for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
5200 const char *z = azArg[iName];
5201 if( optionMatch(z,"new") ){
5202 newFlag = 1;
5203 }else if( z[0]=='-' ){
5204 utf8_printf(stderr, "unknown option: %s\n", z);
5205 rc = 1;
mistachkin8145fc62016-09-16 20:39:21 +00005206 goto meta_command_exit;
drh760c8162016-09-16 02:52:22 +00005207 }
drhcd0509e2016-09-16 00:26:08 +00005208 }
5209 /* If a filename is specified, try to open it first */
5210 zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0;
5211 if( zNewFilename ){
drh760c8162016-09-16 02:52:22 +00005212 if( newFlag ) shellDeleteFile(zNewFilename);
drhcd0509e2016-09-16 00:26:08 +00005213 p->zDbFilename = zNewFilename;
5214 open_db(p, 1);
5215 if( p->db==0 ){
5216 utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename);
5217 sqlite3_free(zNewFilename);
5218 }else{
5219 p->zFreeOnClose = zNewFilename;
5220 }
5221 }
5222 if( p->db==0 ){
5223 /* As a fall-back open a TEMP database */
5224 p->zDbFilename = 0;
5225 open_db(p, 0);
drh05782482013-10-24 15:20:20 +00005226 }
5227 }else
5228
drhc2ce0be2014-05-29 12:36:14 +00005229 if( c=='o'
5230 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
5231 ){
5232 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
5233 if( nArg>2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005234 utf8_printf(stderr, "Usage: .%s FILE\n", azArg[0]);
drhc2ce0be2014-05-29 12:36:14 +00005235 rc = 1;
5236 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005237 }
drhc2ce0be2014-05-29 12:36:14 +00005238 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
5239 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005240 raw_printf(stderr, "Usage: .once FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005241 rc = 1;
5242 goto meta_command_exit;
5243 }
5244 p->outCount = 2;
5245 }else{
5246 p->outCount = 0;
5247 }
5248 output_reset(p);
5249 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00005250#ifdef SQLITE_OMIT_POPEN
mistachkinaae280e2015-12-31 19:06:24 +00005251 raw_printf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00005252 rc = 1;
5253 p->out = stdout;
5254#else
drhc2ce0be2014-05-29 12:36:14 +00005255 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00005256 if( p->out==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005257 utf8_printf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00005258 p->out = stdout;
5259 rc = 1;
5260 }else{
drhc2ce0be2014-05-29 12:36:14 +00005261 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00005262 }
drh8cd5b252015-03-02 22:06:43 +00005263#endif
drh75897232000-05-29 14:26:00 +00005264 }else{
drhc2ce0be2014-05-29 12:36:14 +00005265 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00005266 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00005267 if( strcmp(zFile,"off")!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005268 utf8_printf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00005269 }
drh75897232000-05-29 14:26:00 +00005270 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00005271 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00005272 } else {
drhc2ce0be2014-05-29 12:36:14 +00005273 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00005274 }
5275 }
5276 }else
5277
drh078b1fd2012-09-21 13:40:02 +00005278 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
5279 int i;
5280 for(i=1; i<nArg; i++){
mistachkinaae280e2015-12-31 19:06:24 +00005281 if( i>1 ) raw_printf(p->out, " ");
drhe05461c2015-12-30 13:36:57 +00005282 utf8_printf(p->out, "%s", azArg[i]);
drh078b1fd2012-09-21 13:40:02 +00005283 }
mistachkinaae280e2015-12-31 19:06:24 +00005284 raw_printf(p->out, "\n");
drh078b1fd2012-09-21 13:40:02 +00005285 }else
5286
drhc2ce0be2014-05-29 12:36:14 +00005287 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00005288 if( nArg >= 2) {
5289 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
5290 }
5291 if( nArg >= 3) {
5292 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
5293 }
5294 }else
5295
drhc2ce0be2014-05-29 12:36:14 +00005296 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00005297 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00005298 }else
5299
drhc2ce0be2014-05-29 12:36:14 +00005300 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
5301 FILE *alt;
drh4e8142c2016-11-11 14:54:22 +00005302 if( nArg!=2 ){
5303 raw_printf(stderr, "Usage: .read FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005304 rc = 1;
5305 goto meta_command_exit;
5306 }
drh4e8142c2016-11-11 14:54:22 +00005307 alt = fopen(azArg[1], "rb");
5308 if( alt==0 ){
5309 utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
5310 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00005311 }else{
drh4e8142c2016-11-11 14:54:22 +00005312 rc = process_input(p, alt);
5313 fclose(alt);
drhdaffd0e2001-04-11 14:28:42 +00005314 }
5315 }else
5316
drhc2ce0be2014-05-29 12:36:14 +00005317 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00005318 const char *zSrcFile;
5319 const char *zDb;
5320 sqlite3 *pSrc;
5321 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00005322 int nTimeout = 0;
5323
drh9ff849f2009-02-04 20:55:57 +00005324 if( nArg==2 ){
5325 zSrcFile = azArg[1];
5326 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00005327 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00005328 zSrcFile = azArg[2];
5329 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00005330 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005331 raw_printf(stderr, "Usage: .restore ?DB? FILE\n");
drhc2ce0be2014-05-29 12:36:14 +00005332 rc = 1;
5333 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00005334 }
5335 rc = sqlite3_open(zSrcFile, &pSrc);
5336 if( rc!=SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005337 utf8_printf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00005338 sqlite3_close(pSrc);
5339 return 1;
5340 }
drh05782482013-10-24 15:20:20 +00005341 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00005342 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
5343 if( pBackup==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00005344 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
drh9ff849f2009-02-04 20:55:57 +00005345 sqlite3_close(pSrc);
5346 return 1;
5347 }
drhdc2c4912009-02-04 22:46:47 +00005348 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
5349 || rc==SQLITE_BUSY ){
5350 if( rc==SQLITE_BUSY ){
5351 if( nTimeout++ >= 3 ) break;
5352 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00005353 }
5354 }
5355 sqlite3_backup_finish(pBackup);
5356 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00005357 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00005358 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
mistachkinaae280e2015-12-31 19:06:24 +00005359 raw_printf(stderr, "Error: source database is busy\n");
shane9bd1b442009-10-23 01:27:39 +00005360 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005361 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005362 utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00005363 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00005364 }
5365 sqlite3_close(pSrc);
5366 }else
5367
dan8d1edb92014-11-05 09:07:28 +00005368
5369 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
5370 if( nArg==2 ){
5371 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00005372#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
mistachkinaae280e2015-12-31 19:06:24 +00005373 raw_printf(stderr, "Warning: .scanstats not available in this build.\n");
drh15f23c22014-11-06 12:46:16 +00005374#endif
dan8d1edb92014-11-05 09:07:28 +00005375 }else{
mistachkinaae280e2015-12-31 19:06:24 +00005376 raw_printf(stderr, "Usage: .scanstats on|off\n");
dan8d1edb92014-11-05 09:07:28 +00005377 rc = 1;
5378 }
5379 }else
5380
drhc2ce0be2014-05-29 12:36:14 +00005381 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00005382 ShellState data;
drh75897232000-05-29 14:26:00 +00005383 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00005384 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00005385 memcpy(&data, p, sizeof(data));
5386 data.showHeader = 0;
drh700c2522016-02-09 18:39:25 +00005387 data.cMode = data.mode = MODE_Semi;
drh4926fec2016-04-13 15:33:42 +00005388 if( nArg>=2 && optionMatch(azArg[1], "indent") ){
5389 data.cMode = data.mode = MODE_Pretty;
5390 nArg--;
5391 if( nArg==2 ) azArg[1] = azArg[2];
5392 }
5393 if( nArg==2 && azArg[1][0]!='-' ){
drhc8d74412004-08-31 23:41:26 +00005394 int i;
drhf0693c82011-10-11 20:41:54 +00005395 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00005396 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00005397 char *new_argv[2], *new_colv[2];
5398 new_argv[0] = "CREATE TABLE sqlite_master (\n"
5399 " type text,\n"
5400 " name text,\n"
5401 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00005402 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00005403 " sql text\n"
5404 ")";
5405 new_argv[1] = 0;
5406 new_colv[0] = "sql";
5407 new_colv[1] = 0;
5408 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005409 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00005410 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00005411 char *new_argv[2], *new_colv[2];
5412 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
5413 " type text,\n"
5414 " name text,\n"
5415 " tbl_name text,\n"
5416 " rootpage integer,\n"
5417 " sql text\n"
5418 ")";
5419 new_argv[1] = 0;
5420 new_colv[0] = "sql";
5421 new_colv[1] = 0;
5422 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00005423 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00005424 }else{
drhe611f142017-03-08 11:44:00 +00005425 char *zSql;
5426 zSql = sqlite3_mprintf(
drhe0bc4042002-06-25 01:09:11 +00005427 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005428 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005429 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005430 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drhe611f142017-03-08 11:44:00 +00005431 "WHERE lower(tbl_name) LIKE %Q"
drh6ac7a582011-11-04 00:35:56 +00005432 " AND type!='meta' AND sql NOTNULL "
drhe611f142017-03-08 11:44:00 +00005433 "ORDER BY rowid", azArg[1]);
5434 rc = sqlite3_exec(p->db, zSql, callback, &data, &zErrMsg);
5435 sqlite3_free(zSql);
drha18c5682000-10-08 22:20:57 +00005436 }
drhc2ce0be2014-05-29 12:36:14 +00005437 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00005438 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00005439 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00005440 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00005441 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00005442 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00005443 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00005444 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00005445 callback, &data, &zErrMsg
5446 );
drhc2ce0be2014-05-29 12:36:14 +00005447 }else{
drh4926fec2016-04-13 15:33:42 +00005448 raw_printf(stderr, "Usage: .schema ?--indent? ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00005449 rc = 1;
5450 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00005451 }
drh75897232000-05-29 14:26:00 +00005452 if( zErrMsg ){
mistachkinaae280e2015-12-31 19:06:24 +00005453 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00005454 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00005455 rc = 1;
5456 }else if( rc != SQLITE_OK ){
mistachkinaae280e2015-12-31 19:06:24 +00005457 raw_printf(stderr,"Error: querying schema information\n");
shane9bd1b442009-10-23 01:27:39 +00005458 rc = 1;
5459 }else{
5460 rc = 0;
drh75897232000-05-29 14:26:00 +00005461 }
5462 }else
5463
drhabd4c722014-09-20 18:18:33 +00005464#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
5465 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
drh2b44fd92017-02-17 01:43:51 +00005466 sqlite3SelectTrace = (int)integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00005467 }else
5468#endif
5469
drhe6229612014-08-18 15:08:26 +00005470#if defined(SQLITE_ENABLE_SESSION)
5471 if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){
5472 OpenSession *pSession = &p->aSession[0];
5473 char **azCmd = &azArg[1];
5474 int iSes = 0;
5475 int nCmd = nArg - 1;
5476 int i;
5477 if( nArg<=1 ) goto session_syntax_error;
drh3a67b042014-08-18 17:56:31 +00005478 open_db(p, 0);
drhe6229612014-08-18 15:08:26 +00005479 if( nArg>=3 ){
5480 for(iSes=0; iSes<p->nSession; iSes++){
5481 if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break;
5482 }
5483 if( iSes<p->nSession ){
5484 pSession = &p->aSession[iSes];
5485 azCmd++;
5486 nCmd--;
5487 }else{
5488 pSession = &p->aSession[0];
5489 iSes = 0;
5490 }
5491 }
5492
drh3a67b042014-08-18 17:56:31 +00005493 /* .session attach TABLE
5494 ** Invoke the sqlite3session_attach() interface to attach a particular
5495 ** table so that it is never filtered.
5496 */
5497 if( strcmp(azCmd[0],"attach")==0 ){
5498 if( nCmd!=2 ) goto session_syntax_error;
5499 if( pSession->p==0 ){
5500 session_not_open:
mistachkin899c5c92016-04-03 20:50:02 +00005501 raw_printf(stderr, "ERROR: No sessions are open\n");
drh3a67b042014-08-18 17:56:31 +00005502 }else{
5503 rc = sqlite3session_attach(pSession->p, azCmd[1]);
5504 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005505 raw_printf(stderr, "ERROR: sqlite3session_attach() returns %d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005506 rc = 0;
5507 }
5508 }
5509 }else
5510
5511 /* .session changeset FILE
5512 ** .session patchset FILE
5513 ** Write a changeset or patchset into a file. The file is overwritten.
5514 */
5515 if( strcmp(azCmd[0],"changeset")==0 || strcmp(azCmd[0],"patchset")==0 ){
5516 FILE *out = 0;
5517 if( nCmd!=2 ) goto session_syntax_error;
5518 if( pSession->p==0 ) goto session_not_open;
5519 out = fopen(azCmd[1], "wb");
5520 if( out==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005521 utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]);
drh3a67b042014-08-18 17:56:31 +00005522 }else{
5523 int szChng;
5524 void *pChng;
5525 if( azCmd[0][0]=='c' ){
drh2967e0c2014-08-19 00:26:17 +00005526 rc = sqlite3session_changeset(pSession->p, &szChng, &pChng);
drh3a67b042014-08-18 17:56:31 +00005527 }else{
drh2967e0c2014-08-19 00:26:17 +00005528 rc = sqlite3session_patchset(pSession->p, &szChng, &pChng);
5529 }
5530 if( rc ){
5531 printf("Error: error code %d\n", rc);
5532 rc = 0;
drh3a67b042014-08-18 17:56:31 +00005533 }
mistachkin1fe36bb2016-04-04 02:16:44 +00005534 if( pChng
drh3a67b042014-08-18 17:56:31 +00005535 && fwrite(pChng, szChng, 1, out)!=1 ){
mistachkin899c5c92016-04-03 20:50:02 +00005536 raw_printf(stderr, "ERROR: Failed to write entire %d-byte output\n",
drh3a67b042014-08-18 17:56:31 +00005537 szChng);
5538 }
5539 sqlite3_free(pChng);
5540 fclose(out);
5541 }
5542 }else
5543
drhe6229612014-08-18 15:08:26 +00005544 /* .session close
5545 ** Close the identified session
5546 */
5547 if( strcmp(azCmd[0], "close")==0 ){
drh03168ca2014-08-18 20:01:31 +00005548 if( nCmd!=1 ) goto session_syntax_error;
drhe6229612014-08-18 15:08:26 +00005549 if( p->nSession ){
5550 session_close(pSession);
5551 p->aSession[iSes] = p->aSession[--p->nSession];
5552 }
5553 }else
5554
drh03168ca2014-08-18 20:01:31 +00005555 /* .session enable ?BOOLEAN?
5556 ** Query or set the enable flag
5557 */
5558 if( strcmp(azCmd[0], "enable")==0 ){
5559 int ii;
5560 if( nCmd>2 ) goto session_syntax_error;
5561 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5562 if( p->nSession ){
5563 ii = sqlite3session_enable(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005564 utf8_printf(p->out, "session %s enable flag = %d\n",
5565 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005566 }
5567 }else
5568
5569 /* .session filter GLOB ....
5570 ** Set a list of GLOB patterns of table names to be excluded.
5571 */
5572 if( strcmp(azCmd[0], "filter")==0 ){
5573 int ii, nByte;
5574 if( nCmd<2 ) goto session_syntax_error;
5575 if( p->nSession ){
5576 for(ii=0; ii<pSession->nFilter; ii++){
5577 sqlite3_free(pSession->azFilter[ii]);
5578 }
5579 sqlite3_free(pSession->azFilter);
5580 nByte = sizeof(pSession->azFilter[0])*(nCmd-1);
5581 pSession->azFilter = sqlite3_malloc( nByte );
5582 if( pSession->azFilter==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005583 raw_printf(stderr, "Error: out or memory\n");
drh03168ca2014-08-18 20:01:31 +00005584 exit(1);
5585 }
5586 for(ii=1; ii<nCmd; ii++){
mistachkin1fe36bb2016-04-04 02:16:44 +00005587 pSession->azFilter[ii-1] = sqlite3_mprintf("%s", azCmd[ii]);
drh03168ca2014-08-18 20:01:31 +00005588 }
5589 pSession->nFilter = ii-1;
5590 }
5591 }else
5592
5593 /* .session indirect ?BOOLEAN?
5594 ** Query or set the indirect flag
5595 */
5596 if( strcmp(azCmd[0], "indirect")==0 ){
5597 int ii;
5598 if( nCmd>2 ) goto session_syntax_error;
5599 ii = nCmd==1 ? -1 : booleanValue(azCmd[1]);
5600 if( p->nSession ){
5601 ii = sqlite3session_indirect(pSession->p, ii);
mistachkin899c5c92016-04-03 20:50:02 +00005602 utf8_printf(p->out, "session %s indirect flag = %d\n",
5603 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005604 }
5605 }else
5606
5607 /* .session isempty
5608 ** Determine if the session is empty
5609 */
5610 if( strcmp(azCmd[0], "isempty")==0 ){
5611 int ii;
5612 if( nCmd!=1 ) goto session_syntax_error;
5613 if( p->nSession ){
5614 ii = sqlite3session_isempty(pSession->p);
mistachkin899c5c92016-04-03 20:50:02 +00005615 utf8_printf(p->out, "session %s isempty flag = %d\n",
5616 pSession->zName, ii);
drh03168ca2014-08-18 20:01:31 +00005617 }
5618 }else
5619
drhe6229612014-08-18 15:08:26 +00005620 /* .session list
5621 ** List all currently open sessions
5622 */
5623 if( strcmp(azCmd[0],"list")==0 ){
5624 for(i=0; i<p->nSession; i++){
mistachkin899c5c92016-04-03 20:50:02 +00005625 utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName);
drhe6229612014-08-18 15:08:26 +00005626 }
5627 }else
5628
5629 /* .session open DB NAME
5630 ** Open a new session called NAME on the attached database DB.
5631 ** DB is normally "main".
5632 */
5633 if( strcmp(azCmd[0],"open")==0 ){
5634 char *zName;
5635 if( nCmd!=3 ) goto session_syntax_error;
5636 zName = azCmd[2];
5637 if( zName[0]==0 ) goto session_syntax_error;
5638 for(i=0; i<p->nSession; i++){
5639 if( strcmp(p->aSession[i].zName,zName)==0 ){
mistachkin899c5c92016-04-03 20:50:02 +00005640 utf8_printf(stderr, "Session \"%s\" already exists\n", zName);
drhe6229612014-08-18 15:08:26 +00005641 goto meta_command_exit;
5642 }
5643 }
5644 if( p->nSession>=ArraySize(p->aSession) ){
mistachkin899c5c92016-04-03 20:50:02 +00005645 raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession));
drhe6229612014-08-18 15:08:26 +00005646 goto meta_command_exit;
5647 }
5648 pSession = &p->aSession[p->nSession];
5649 rc = sqlite3session_create(p->db, azCmd[1], &pSession->p);
5650 if( rc ){
mistachkin899c5c92016-04-03 20:50:02 +00005651 raw_printf(stderr, "Cannot open session: error code=%d\n", rc);
drh3a67b042014-08-18 17:56:31 +00005652 rc = 0;
drhe6229612014-08-18 15:08:26 +00005653 goto meta_command_exit;
5654 }
drh03168ca2014-08-18 20:01:31 +00005655 pSession->nFilter = 0;
5656 sqlite3session_table_filter(pSession->p, session_filter, pSession);
drhe6229612014-08-18 15:08:26 +00005657 p->nSession++;
5658 pSession->zName = sqlite3_mprintf("%s", zName);
5659 }else
5660 /* If no command name matches, show a syntax error */
5661 session_syntax_error:
5662 session_help(p);
5663 }else
5664#endif
5665
drh340f5822013-06-27 13:01:21 +00005666#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00005667 /* Undocumented commands for internal testing. Subject to change
5668 ** without notice. */
5669 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
5670 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
5671 int i, v;
5672 for(i=1; i<nArg; i++){
5673 v = booleanValue(azArg[i]);
drhe05461c2015-12-30 13:36:57 +00005674 utf8_printf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
drh348d19c2013-06-03 12:47:43 +00005675 }
5676 }
5677 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
5678 int i; sqlite3_int64 v;
5679 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00005680 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00005681 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00005682 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drhe05461c2015-12-30 13:36:57 +00005683 utf8_printf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00005684 }
5685 }
5686 }else
drh340f5822013-06-27 13:01:21 +00005687#endif
drh348d19c2013-06-03 12:47:43 +00005688
drhc2ce0be2014-05-29 12:36:14 +00005689 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00005690 if( nArg<2 || nArg>3 ){
mistachkinaae280e2015-12-31 19:06:24 +00005691 raw_printf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00005692 rc = 1;
5693 }
drh6976c212014-07-24 12:09:47 +00005694 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00005695 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00005696 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00005697 }
5698 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00005699 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
5700 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh6976c212014-07-24 12:09:47 +00005701 }
drh75897232000-05-29 14:26:00 +00005702 }else
5703
drh1554bc82017-03-08 16:10:34 +00005704 if( c=='s' && n>=4 && strncmp(azArg[0],"sha3sum",n)==0 ){
5705 const char *zLike = 0; /* Which table to checksum. 0 means everything */
5706 int i; /* Loop counter */
5707 int bSchema = 0; /* Also hash the schema */
drh3ee83ef2017-03-08 17:56:54 +00005708 int bSeparate = 0; /* Hash each table separately */
drh1554bc82017-03-08 16:10:34 +00005709 int iSize = 224; /* Hash algorithm to use */
5710 int bDebug = 0; /* Only show the query that would have run */
5711 sqlite3_stmt *pStmt; /* For querying tables names */
5712 char *zSql; /* SQL to be run */
drh3ee83ef2017-03-08 17:56:54 +00005713 char *zSep; /* Separator */
5714 ShellText sSql; /* Complete SQL for the query to run the hash */
drh1554bc82017-03-08 16:10:34 +00005715 ShellText sQuery; /* Set of queries used to read all content */
5716 for(i=1; i<nArg; i++){
5717 const char *z = azArg[i];
5718 if( z[0]=='-' ){
5719 z++;
5720 if( z[0]=='-' ) z++;
5721 if( strcmp(z,"schema")==0 ){
5722 bSchema = 1;
5723 }else
5724 if( strcmp(z,"sha3-224")==0 || strcmp(z,"sha3-256")==0
5725 || strcmp(z,"sha3-384")==0 || strcmp(z,"sha3-512")==0
5726 ){
5727 iSize = atoi(&z[5]);
5728 }else
5729 if( strcmp(z,"debug")==0 ){
5730 bDebug = 1;
5731 }else
5732 {
5733 utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n",
drh3ee83ef2017-03-08 17:56:54 +00005734 azArg[i], azArg[0]);
drh1554bc82017-03-08 16:10:34 +00005735 raw_printf(stderr, "Should be one of: --schema"
5736 " --sha3-224 --sha3-255 --sha3-384 --sha3-512\n");
5737 rc = 1;
5738 goto meta_command_exit;
5739 }
5740 }else if( zLike ){
5741 raw_printf(stderr, "Usage: .sha3sum ?OPTIONS? ?LIKE-PATTERN?\n");
5742 rc = 1;
5743 goto meta_command_exit;
5744 }else{
5745 zLike = z;
drh3ee83ef2017-03-08 17:56:54 +00005746 bSeparate = 1;
5747 if( sqlite3_strlike("sqlite_%", zLike, 0)==0 ) bSchema = 1;
drh1554bc82017-03-08 16:10:34 +00005748 }
5749 }
5750 if( bSchema ){
5751 zSql = "SELECT lower(name) FROM sqlite_master"
5752 " WHERE type='table' AND coalesce(rootpage,0)>1"
5753 " UNION ALL SELECT 'sqlite_master'"
5754 " ORDER BY 1 collate nocase";
5755 }else{
5756 zSql = "SELECT lower(name) FROM sqlite_master"
5757 " WHERE type='table' AND coalesce(rootpage,0)>1"
5758 " AND name NOT LIKE 'sqlite_%'"
5759 " ORDER BY 1 collate nocase";
5760 }
5761 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5762 initText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00005763 initText(&sSql);
5764 appendText(&sSql, "WITH [sha3sum$query](a,b) AS(",0);
5765 zSep = "VALUES(";
drh1554bc82017-03-08 16:10:34 +00005766 while( SQLITE_ROW==sqlite3_step(pStmt) ){
5767 const char *zTab = (const char*)sqlite3_column_text(pStmt,0);
5768 if( zLike && sqlite3_strlike(zLike, zTab, 0)!=0 ) continue;
5769 if( strncmp(zTab, "sqlite_",7)!=0 ){
5770 appendText(&sQuery,"SELECT * FROM ", 0);
5771 appendText(&sQuery,zTab,'"');
5772 appendText(&sQuery," NOT INDEXED;", 0);
5773 }else if( strcmp(zTab, "sqlite_master")==0 ){
5774 appendText(&sQuery,"SELECT type,name,tbl_name,sql FROM sqlite_master"
5775 " ORDER BY name;", 0);
5776 }else if( strcmp(zTab, "sqlite_sequence")==0 ){
5777 appendText(&sQuery,"SELECT name,seq FROM sqlite_sequence"
5778 " ORDER BY name;", 0);
5779 }else if( strcmp(zTab, "sqlite_stat1")==0 ){
5780 appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
5781 " ORDER BY tbl,idx;", 0);
5782 }else if( strcmp(zTab, "sqlite_stat3")==0
5783 || strcmp(zTab, "sqlite_stat4")==0 ){
5784 appendText(&sQuery, "SELECT * FROM ", 0);
5785 appendText(&sQuery, zTab, 0);
5786 appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
5787 }
drh3ee83ef2017-03-08 17:56:54 +00005788 appendText(&sSql, zSep, 0);
5789 appendText(&sSql, sQuery.z, '\'');
5790 sQuery.n = 0;
5791 appendText(&sSql, ",", 0);
5792 appendText(&sSql, zTab, '\'');
5793 zSep = "),(";
drh1554bc82017-03-08 16:10:34 +00005794 }
5795 sqlite3_finalize(pStmt);
drh3ee83ef2017-03-08 17:56:54 +00005796 if( bSeparate ){
5797 zSql = sqlite3_mprintf(
5798 "%s))"
5799 " SELECT lower(hex(sha3_query(a,%d))) AS hash, b AS label"
5800 " FROM [sha3sum$query]",
5801 sSql.z, iSize);
5802 }else{
5803 zSql = sqlite3_mprintf(
5804 "%s))"
5805 " SELECT lower(hex(sha3_query(group_concat(a,''),%d))) AS hash"
5806 " FROM [sha3sum$query]",
5807 sSql.z, iSize);
5808 }
drh1554bc82017-03-08 16:10:34 +00005809 freeText(&sQuery);
drh3ee83ef2017-03-08 17:56:54 +00005810 freeText(&sSql);
drh1554bc82017-03-08 16:10:34 +00005811 if( bDebug ){
5812 utf8_printf(p->out, "%s\n", zSql);
5813 }else{
5814 shell_exec(p->db, zSql, shell_callback, p, 0);
5815 }
5816 sqlite3_free(zSql);
5817 }else
5818
drh62cdde52014-05-28 20:22:28 +00005819 if( c=='s'
5820 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00005821 ){
5822 char *zCmd;
drh54027102014-08-06 14:36:53 +00005823 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00005824 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00005825 raw_printf(stderr, "Usage: .system COMMAND\n");
drhc2ce0be2014-05-29 12:36:14 +00005826 rc = 1;
5827 goto meta_command_exit;
5828 }
drhdcb3e3d2014-05-29 03:17:29 +00005829 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00005830 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00005831 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
5832 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00005833 }
drh54027102014-08-06 14:36:53 +00005834 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00005835 sqlite3_free(zCmd);
mistachkinaae280e2015-12-31 19:06:24 +00005836 if( x ) raw_printf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00005837 }else
5838
drhc2ce0be2014-05-29 12:36:14 +00005839 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
drheacd29d2016-04-15 15:03:27 +00005840 static const char *azBool[] = { "off", "on", "full", "unk" };
persicom7e2dfdd2002-04-18 02:46:52 +00005841 int i;
drhc2ce0be2014-05-29 12:36:14 +00005842 if( nArg!=1 ){
mistachkinaae280e2015-12-31 19:06:24 +00005843 raw_printf(stderr, "Usage: .show\n");
drhc2ce0be2014-05-29 12:36:14 +00005844 rc = 1;
5845 goto meta_command_exit;
5846 }
drheacd29d2016-04-15 15:03:27 +00005847 utf8_printf(p->out, "%12.12s: %s\n","echo", azBool[p->echoOn!=0]);
5848 utf8_printf(p->out, "%12.12s: %s\n","eqp", azBool[p->autoEQP&3]);
drh700c2522016-02-09 18:39:25 +00005849 utf8_printf(p->out, "%12.12s: %s\n","explain",
5850 p->mode==MODE_Explain ? "on" : p->autoExplain ? "auto" : "off");
drheacd29d2016-04-15 15:03:27 +00005851 utf8_printf(p->out,"%12.12s: %s\n","headers", azBool[p->showHeader!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00005852 utf8_printf(p->out, "%12.12s: %s\n","mode", modeDescr[p->mode]);
5853 utf8_printf(p->out, "%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00005854 output_c_string(p->out, p->nullValue);
mistachkinaae280e2015-12-31 19:06:24 +00005855 raw_printf(p->out, "\n");
5856 utf8_printf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00005857 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkinaae280e2015-12-31 19:06:24 +00005858 utf8_printf(p->out,"%12.12s: ", "colseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00005859 output_c_string(p->out, p->colSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00005860 raw_printf(p->out, "\n");
5861 utf8_printf(p->out,"%12.12s: ", "rowseparator");
mistachkin636bf9f2014-07-19 20:15:16 +00005862 output_c_string(p->out, p->rowSeparator);
mistachkinaae280e2015-12-31 19:06:24 +00005863 raw_printf(p->out, "\n");
drheacd29d2016-04-15 15:03:27 +00005864 utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]);
mistachkinaae280e2015-12-31 19:06:24 +00005865 utf8_printf(p->out, "%12.12s: ", "width");
persicom7e2dfdd2002-04-18 02:46:52 +00005866 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
mistachkinaae280e2015-12-31 19:06:24 +00005867 raw_printf(p->out, "%d ", p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00005868 }
mistachkinaae280e2015-12-31 19:06:24 +00005869 raw_printf(p->out, "\n");
drhcd0509e2016-09-16 00:26:08 +00005870 utf8_printf(p->out, "%12.12s: %s\n", "filename",
5871 p->zDbFilename ? p->zDbFilename : "");
persicom7e2dfdd2002-04-18 02:46:52 +00005872 }else
5873
drhc2ce0be2014-05-29 12:36:14 +00005874 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
5875 if( nArg==2 ){
5876 p->statsOn = booleanValue(azArg[1]);
drh34784902016-02-27 17:12:36 +00005877 }else if( nArg==1 ){
5878 display_stats(p->db, p, 0);
drhc2ce0be2014-05-29 12:36:14 +00005879 }else{
drh34784902016-02-27 17:12:36 +00005880 raw_printf(stderr, "Usage: .stats ?on|off?\n");
drhc2ce0be2014-05-29 12:36:14 +00005881 rc = 1;
5882 }
shaneh642d8b82010-07-28 16:05:34 +00005883 }else
5884
drh6a5a4202016-12-24 21:32:40 +00005885 if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0)
5886 || (c=='i' && (strncmp(azArg[0], "indices", n)==0
5887 || strncmp(azArg[0], "indexes", n)==0) )
5888 ){
drh98781232012-04-23 12:38:05 +00005889 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00005890 char **azResult;
drh98781232012-04-23 12:38:05 +00005891 int nRow, nAlloc;
5892 char *zSql = 0;
5893 int ii;
drh05782482013-10-24 15:20:20 +00005894 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00005895 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
dand95bb392015-09-30 11:19:05 +00005896 if( rc ) return shellDatabaseError(p->db);
5897
5898 /* Create an SQL statement to query for the list of tables in the
5899 ** main and all attached databases where the table name matches the
5900 ** LIKE pattern bound to variable "?1". */
drh6a5a4202016-12-24 21:32:40 +00005901 if( c=='t' ){
5902 zSql = sqlite3_mprintf(
5903 "SELECT name FROM sqlite_master"
5904 " WHERE type IN ('table','view')"
5905 " AND name NOT LIKE 'sqlite_%%'"
5906 " AND name LIKE ?1");
5907 }else if( nArg>2 ){
5908 /* It is an historical accident that the .indexes command shows an error
5909 ** when called with the wrong number of arguments whereas the .tables
5910 ** command does not. */
5911 raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
5912 rc = 1;
5913 goto meta_command_exit;
5914 }else{
5915 zSql = sqlite3_mprintf(
5916 "SELECT name FROM sqlite_master"
5917 " WHERE type='index'"
5918 " AND tbl_name LIKE ?1");
5919 }
drha4b81d22016-12-24 18:04:28 +00005920 for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){
drh98781232012-04-23 12:38:05 +00005921 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
drha4b81d22016-12-24 18:04:28 +00005922 if( zDbName==0 || ii==0 ) continue;
drh6a5a4202016-12-24 21:32:40 +00005923 if( c=='t' ){
drh98781232012-04-23 12:38:05 +00005924 zSql = sqlite3_mprintf(
5925 "%z UNION ALL "
5926 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
5927 " WHERE type IN ('table','view')"
5928 " AND name NOT LIKE 'sqlite_%%'"
5929 " AND name LIKE ?1", zSql, zDbName, zDbName);
drh6a5a4202016-12-24 21:32:40 +00005930 }else{
5931 zSql = sqlite3_mprintf(
5932 "%z UNION ALL "
5933 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
5934 " WHERE type='index'"
5935 " AND tbl_name LIKE ?1", zSql, zDbName, zDbName);
drh98781232012-04-23 12:38:05 +00005936 }
drha50da102000-08-08 20:19:09 +00005937 }
dand95bb392015-09-30 11:19:05 +00005938 rc = sqlite3_finalize(pStmt);
5939 if( zSql && rc==SQLITE_OK ){
5940 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
5941 if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
5942 }
drh98781232012-04-23 12:38:05 +00005943 sqlite3_free(zSql);
dand95bb392015-09-30 11:19:05 +00005944 if( !zSql ) return shellNomemError();
5945 if( rc ) return shellDatabaseError(p->db);
5946
5947 /* Run the SQL statement prepared by the above block. Store the results
5948 ** as an array of nul-terminated strings in azResult[]. */
drh98781232012-04-23 12:38:05 +00005949 nRow = nAlloc = 0;
5950 azResult = 0;
5951 if( nArg>1 ){
5952 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00005953 }else{
drh98781232012-04-23 12:38:05 +00005954 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
5955 }
5956 while( sqlite3_step(pStmt)==SQLITE_ROW ){
5957 if( nRow>=nAlloc ){
5958 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00005959 int n2 = nAlloc*2 + 10;
drhf3cdcdc2015-04-29 16:50:28 +00005960 azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00005961 if( azNew==0 ){
dand95bb392015-09-30 11:19:05 +00005962 rc = shellNomemError();
drh98781232012-04-23 12:38:05 +00005963 break;
5964 }
mistachkin8e189222015-04-19 21:43:16 +00005965 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00005966 azResult = azNew;
5967 }
5968 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
dand95bb392015-09-30 11:19:05 +00005969 if( 0==azResult[nRow] ){
5970 rc = shellNomemError();
5971 break;
5972 }
5973 nRow++;
drh98781232012-04-23 12:38:05 +00005974 }
dand95bb392015-09-30 11:19:05 +00005975 if( sqlite3_finalize(pStmt)!=SQLITE_OK ){
5976 rc = shellDatabaseError(p->db);
5977 }
5978
5979 /* Pretty-print the contents of array azResult[] to the output */
5980 if( rc==0 && nRow>0 ){
drhe3710332000-09-29 13:30:53 +00005981 int len, maxlen = 0;
5982 int i, j;
5983 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00005984 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00005985 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00005986 if( len>maxlen ) maxlen = len;
5987 }
5988 nPrintCol = 80/(maxlen+2);
5989 if( nPrintCol<1 ) nPrintCol = 1;
5990 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
5991 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00005992 for(j=i; j<nRow; j+=nPrintRow){
5993 char *zSp = j<nPrintRow ? "" : " ";
drhe05461c2015-12-30 13:36:57 +00005994 utf8_printf(p->out, "%s%-*s", zSp, maxlen,
5995 azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00005996 }
mistachkinaae280e2015-12-31 19:06:24 +00005997 raw_printf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00005998 }
5999 }
dand95bb392015-09-30 11:19:05 +00006000
drh98781232012-04-23 12:38:05 +00006001 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
6002 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00006003 }else
6004
drh2db82112016-09-15 21:35:24 +00006005 /* Begin redirecting output to the file "testcase-out.txt" */
6006 if( c=='t' && strcmp(azArg[0],"testcase")==0 ){
6007 output_reset(p);
6008 p->out = output_file_open("testcase-out.txt");
6009 if( p->out==0 ){
mistachkin2f9a6132016-11-11 05:19:45 +00006010 raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n");
drh2db82112016-09-15 21:35:24 +00006011 }
drh760c8162016-09-16 02:52:22 +00006012 if( nArg>=2 ){
6013 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]);
6014 }else{
6015 sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "?");
6016 }
drh2db82112016-09-15 21:35:24 +00006017 }else
drh2db82112016-09-15 21:35:24 +00006018
drhd12602a2016-12-07 15:49:02 +00006019#ifndef SQLITE_UNTESTABLE
shaneh96887e12011-02-10 21:08:58 +00006020 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00006021 static const struct {
6022 const char *zCtrlName; /* Name of a test-control option */
6023 int ctrlCode; /* Integer code for that option */
6024 } aCtrl[] = {
6025 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
6026 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
6027 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
6028 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
6029 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
6030 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
6031 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
6032 { "assert", SQLITE_TESTCTRL_ASSERT },
6033 { "always", SQLITE_TESTCTRL_ALWAYS },
6034 { "reserve", SQLITE_TESTCTRL_RESERVE },
6035 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
6036 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00006037 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00006038 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00006039 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00006040 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00006041 };
shaneh96887e12011-02-10 21:08:58 +00006042 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00006043 int rc2 = 0;
6044 int i, n2;
drh05782482013-10-24 15:20:20 +00006045 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00006046
drhd416fe72011-03-17 16:45:50 +00006047 /* convert testctrl text option to value. allow any unique prefix
6048 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00006049 n2 = strlen30(azArg[1]);
drhf5ed7ad2015-06-15 14:43:25 +00006050 for(i=0; i<ArraySize(aCtrl); i++){
mistachkin8e189222015-04-19 21:43:16 +00006051 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00006052 if( testctrl<0 ){
6053 testctrl = aCtrl[i].ctrlCode;
6054 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006055 utf8_printf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00006056 testctrl = -1;
6057 break;
6058 }
6059 }
6060 }
drh348d19c2013-06-03 12:47:43 +00006061 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006062 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
mistachkinaae280e2015-12-31 19:06:24 +00006063 utf8_printf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006064 }else{
6065 switch(testctrl){
6066
6067 /* sqlite3_test_control(int, db, int) */
6068 case SQLITE_TESTCTRL_OPTIMIZATIONS:
mistachkin1fe36bb2016-04-04 02:16:44 +00006069 case SQLITE_TESTCTRL_RESERVE:
shaneh96887e12011-02-10 21:08:58 +00006070 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006071 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00006072 rc2 = sqlite3_test_control(testctrl, p->db, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006073 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006074 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006075 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006076 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006077 }
6078 break;
6079
6080 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00006081 case SQLITE_TESTCTRL_PRNG_SAVE:
6082 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00006083 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00006084 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00006085 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00006086 rc2 = sqlite3_test_control(testctrl);
mistachkinaae280e2015-12-31 19:06:24 +00006087 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006088 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006089 utf8_printf(stderr,"Error: testctrl %s takes no options\n",
6090 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006091 }
6092 break;
6093
6094 /* sqlite3_test_control(int, uint) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006095 case SQLITE_TESTCTRL_PENDING_BYTE:
shaneh96887e12011-02-10 21:08:58 +00006096 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00006097 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006098 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006099 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006100 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006101 utf8_printf(stderr,"Error: testctrl %s takes a single unsigned"
drhd416fe72011-03-17 16:45:50 +00006102 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006103 }
6104 break;
mistachkin1fe36bb2016-04-04 02:16:44 +00006105
shaneh96887e12011-02-10 21:08:58 +00006106 /* sqlite3_test_control(int, int) */
mistachkin1fe36bb2016-04-04 02:16:44 +00006107 case SQLITE_TESTCTRL_ASSERT:
6108 case SQLITE_TESTCTRL_ALWAYS:
6109 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00006110 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006111 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00006112 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006113 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006114 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006115 utf8_printf(stderr,"Error: testctrl %s takes a single int option\n",
drhd416fe72011-03-17 16:45:50 +00006116 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006117 }
6118 break;
6119
6120 /* sqlite3_test_control(int, char *) */
6121#ifdef SQLITE_N_KEYWORD
mistachkin1fe36bb2016-04-04 02:16:44 +00006122 case SQLITE_TESTCTRL_ISKEYWORD:
shaneh96887e12011-02-10 21:08:58 +00006123 if( nArg==3 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006124 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00006125 rc2 = sqlite3_test_control(testctrl, opt);
mistachkinaae280e2015-12-31 19:06:24 +00006126 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00006127 } else {
mistachkinaae280e2015-12-31 19:06:24 +00006128 utf8_printf(stderr,
6129 "Error: testctrl %s takes a single char * option\n",
6130 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006131 }
6132 break;
6133#endif
6134
drh1ffede82015-01-30 20:59:27 +00006135 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00006136 if( nArg==5 ){
mistachkin1fe36bb2016-04-04 02:16:44 +00006137 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00006138 azArg[2],
drh8964b342015-01-29 17:54:52 +00006139 integerValue(azArg[3]),
6140 integerValue(azArg[4]));
mistachkinaae280e2015-12-31 19:06:24 +00006141 raw_printf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00006142 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006143 raw_printf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00006144 }
6145 break;
6146
mistachkin1fe36bb2016-04-04 02:16:44 +00006147 case SQLITE_TESTCTRL_BITVEC_TEST:
6148 case SQLITE_TESTCTRL_FAULT_INSTALL:
6149 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
6150 case SQLITE_TESTCTRL_SCRATCHMALLOC:
shaneh96887e12011-02-10 21:08:58 +00006151 default:
mistachkinaae280e2015-12-31 19:06:24 +00006152 utf8_printf(stderr,
6153 "Error: CLI support for testctrl %s not implemented\n",
6154 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00006155 break;
6156 }
6157 }
6158 }else
drhf1969722017-02-17 23:52:00 +00006159#endif /* !defined(SQLITE_UNTESTABLE) */
shaneh96887e12011-02-10 21:08:58 +00006160
drhc2ce0be2014-05-29 12:36:14 +00006161 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00006162 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006163 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00006164 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006165
drhc2ce0be2014-05-29 12:36:14 +00006166 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
6167 if( nArg==2 ){
6168 enableTimer = booleanValue(azArg[1]);
6169 if( enableTimer && !HAS_TIMER ){
mistachkinaae280e2015-12-31 19:06:24 +00006170 raw_printf(stderr, "Error: timer not available on this system.\n");
drhc2ce0be2014-05-29 12:36:14 +00006171 enableTimer = 0;
6172 }
6173 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006174 raw_printf(stderr, "Usage: .timer on|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006175 rc = 1;
6176 }
shanehe2aa9d72009-11-06 17:20:17 +00006177 }else
mistachkin1fe36bb2016-04-04 02:16:44 +00006178
drhc2ce0be2014-05-29 12:36:14 +00006179 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00006180 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00006181 if( nArg!=2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006182 raw_printf(stderr, "Usage: .trace FILE|off\n");
drhc2ce0be2014-05-29 12:36:14 +00006183 rc = 1;
6184 goto meta_command_exit;
6185 }
drh657b4a82015-03-19 13:30:41 +00006186 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006187 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00006188#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00006189 if( p->traceOut==0 ){
drh4b363a52016-07-23 20:27:41 +00006190 sqlite3_trace_v2(p->db, 0, 0, 0);
drh42f64e52012-04-04 16:56:23 +00006191 }else{
drh4b363a52016-07-23 20:27:41 +00006192 sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut);
drh42f64e52012-04-04 16:56:23 +00006193 }
6194#endif
6195 }else
6196
drhf442e332014-09-10 19:01:14 +00006197#if SQLITE_USER_AUTHENTICATION
6198 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
6199 if( nArg<2 ){
mistachkinaae280e2015-12-31 19:06:24 +00006200 raw_printf(stderr, "Usage: .user SUBCOMMAND ...\n");
drhf442e332014-09-10 19:01:14 +00006201 rc = 1;
6202 goto meta_command_exit;
6203 }
drh7883ecf2014-09-11 16:19:31 +00006204 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00006205 if( strcmp(azArg[1],"login")==0 ){
6206 if( nArg!=4 ){
mistachkinaae280e2015-12-31 19:06:24 +00006207 raw_printf(stderr, "Usage: .user login USER PASSWORD\n");
drhf442e332014-09-10 19:01:14 +00006208 rc = 1;
6209 goto meta_command_exit;
6210 }
drhd39c40f2014-09-11 00:27:53 +00006211 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
6212 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00006213 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006214 utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]);
drhf442e332014-09-10 19:01:14 +00006215 rc = 1;
6216 }
6217 }else if( strcmp(azArg[1],"add")==0 ){
6218 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006219 raw_printf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006220 rc = 1;
6221 goto meta_command_exit;
6222 }
drhd39c40f2014-09-11 00:27:53 +00006223 rc = sqlite3_user_add(p->db, azArg[2],
6224 azArg[3], (int)strlen(azArg[3]),
6225 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006226 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006227 raw_printf(stderr, "User-Add failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006228 rc = 1;
6229 }
6230 }else if( strcmp(azArg[1],"edit")==0 ){
6231 if( nArg!=5 ){
mistachkinaae280e2015-12-31 19:06:24 +00006232 raw_printf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00006233 rc = 1;
6234 goto meta_command_exit;
6235 }
drhd39c40f2014-09-11 00:27:53 +00006236 rc = sqlite3_user_change(p->db, azArg[2],
6237 azArg[3], (int)strlen(azArg[3]),
6238 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00006239 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006240 raw_printf(stderr, "User-Edit failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006241 rc = 1;
6242 }
6243 }else if( strcmp(azArg[1],"delete")==0 ){
6244 if( nArg!=3 ){
mistachkinaae280e2015-12-31 19:06:24 +00006245 raw_printf(stderr, "Usage: .user delete USER\n");
drhf442e332014-09-10 19:01:14 +00006246 rc = 1;
6247 goto meta_command_exit;
6248 }
6249 rc = sqlite3_user_delete(p->db, azArg[2]);
6250 if( rc ){
mistachkinaae280e2015-12-31 19:06:24 +00006251 raw_printf(stderr, "User-Delete failed: %d\n", rc);
drhf442e332014-09-10 19:01:14 +00006252 rc = 1;
6253 }
6254 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006255 raw_printf(stderr, "Usage: .user login|add|edit|delete ...\n");
drhf442e332014-09-10 19:01:14 +00006256 rc = 1;
6257 goto meta_command_exit;
mistachkin1fe36bb2016-04-04 02:16:44 +00006258 }
drhf442e332014-09-10 19:01:14 +00006259 }else
6260#endif /* SQLITE_USER_AUTHENTICATION */
6261
drh9fd301b2011-06-03 13:28:22 +00006262 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006263 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00006264 sqlite3_libversion(), sqlite3_sourceid());
6265 }else
6266
drh790f2872015-11-28 18:06:36 +00006267 if( c=='v' && strncmp(azArg[0], "vfsinfo", n)==0 ){
6268 const char *zDbName = nArg==2 ? azArg[1] : "main";
drh38305ab2017-01-22 16:34:35 +00006269 sqlite3_vfs *pVfs = 0;
drh790f2872015-11-28 18:06:36 +00006270 if( p->db ){
6271 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFS_POINTER, &pVfs);
6272 if( pVfs ){
mistachkinaae280e2015-12-31 19:06:24 +00006273 utf8_printf(p->out, "vfs.zName = \"%s\"\n", pVfs->zName);
6274 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6275 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6276 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
drh790f2872015-11-28 18:06:36 +00006277 }
6278 }
6279 }else
6280
drhb19e7352016-01-12 19:37:20 +00006281 if( c=='v' && strncmp(azArg[0], "vfslist", n)==0 ){
6282 sqlite3_vfs *pVfs;
6283 sqlite3_vfs *pCurrent = 0;
6284 if( p->db ){
6285 sqlite3_file_control(p->db, "main", SQLITE_FCNTL_VFS_POINTER, &pCurrent);
6286 }
6287 for(pVfs=sqlite3_vfs_find(0); pVfs; pVfs=pVfs->pNext){
6288 utf8_printf(p->out, "vfs.zName = \"%s\"%s\n", pVfs->zName,
6289 pVfs==pCurrent ? " <--- CURRENT" : "");
6290 raw_printf(p->out, "vfs.iVersion = %d\n", pVfs->iVersion);
6291 raw_printf(p->out, "vfs.szOsFile = %d\n", pVfs->szOsFile);
6292 raw_printf(p->out, "vfs.mxPathname = %d\n", pVfs->mxPathname);
6293 if( pVfs->pNext ){
6294 raw_printf(p->out, "-----------------------------------\n");
6295 }
6296 }
6297 }else
6298
drhde60fc22011-12-14 17:53:36 +00006299 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
6300 const char *zDbName = nArg==2 ? azArg[1] : "main";
6301 char *zVfsName = 0;
6302 if( p->db ){
6303 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
6304 if( zVfsName ){
mistachkinaae280e2015-12-31 19:06:24 +00006305 utf8_printf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00006306 sqlite3_free(zVfsName);
6307 }
6308 }
6309 }else
6310
drhcef4fc82012-09-21 22:50:45 +00006311#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
6312 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
drhc2ce0be2014-05-29 12:36:14 +00006313 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00006314 }else
6315#endif
6316
drhc2ce0be2014-05-29 12:36:14 +00006317 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00006318 int j;
drh43617e92006-03-06 20:55:46 +00006319 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00006320 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00006321 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00006322 }
6323 }else
6324
6325 {
mistachkinaae280e2015-12-31 19:06:24 +00006326 utf8_printf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00006327 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00006328 rc = 1;
drh75897232000-05-29 14:26:00 +00006329 }
drh67505e72002-04-19 12:34:06 +00006330
drhc2ce0be2014-05-29 12:36:14 +00006331meta_command_exit:
6332 if( p->outCount ){
6333 p->outCount--;
6334 if( p->outCount==0 ) output_reset(p);
6335 }
drh67505e72002-04-19 12:34:06 +00006336 return rc;
drh75897232000-05-29 14:26:00 +00006337}
6338
drh67505e72002-04-19 12:34:06 +00006339/*
drh91a66392007-09-07 01:12:32 +00006340** Return TRUE if a semicolon occurs anywhere in the first N characters
6341** of string z[].
drh324ccef2003-02-05 14:06:20 +00006342*/
drh9f099fd2013-08-06 14:01:46 +00006343static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00006344 int i;
6345 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
6346 return 0;
drh324ccef2003-02-05 14:06:20 +00006347}
6348
6349/*
drh70c7a4b2003-04-26 03:03:06 +00006350** Test to see if a line consists entirely of whitespace.
6351*/
6352static int _all_whitespace(const char *z){
6353 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00006354 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00006355 if( *z=='/' && z[1]=='*' ){
6356 z += 2;
6357 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
6358 if( *z==0 ) return 0;
6359 z++;
6360 continue;
6361 }
6362 if( *z=='-' && z[1]=='-' ){
6363 z += 2;
6364 while( *z && *z!='\n' ){ z++; }
6365 if( *z==0 ) return 1;
6366 continue;
6367 }
6368 return 0;
6369 }
6370 return 1;
6371}
6372
6373/*
drha9b17162003-04-29 18:01:28 +00006374** Return TRUE if the line typed in is an SQL command terminator other
6375** than a semi-colon. The SQL Server style "go" command is understood
6376** as is the Oracle "/".
6377*/
drh9f099fd2013-08-06 14:01:46 +00006378static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00006379 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00006380 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
6381 return 1; /* Oracle */
6382 }
drhf0693c82011-10-11 20:41:54 +00006383 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00006384 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00006385 return 1; /* SQL Server */
6386 }
6387 return 0;
6388}
6389
6390/*
drh233a5312008-12-18 22:25:13 +00006391** Return true if zSql is a complete SQL statement. Return false if it
6392** ends in the middle of a string literal or C-style comment.
6393*/
drh9f099fd2013-08-06 14:01:46 +00006394static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00006395 int rc;
6396 if( zSql==0 ) return 1;
6397 zSql[nSql] = ';';
6398 zSql[nSql+1] = 0;
6399 rc = sqlite3_complete(zSql);
6400 zSql[nSql] = 0;
6401 return rc;
6402}
6403
6404/*
drh4e8142c2016-11-11 14:54:22 +00006405** Run a single line of SQL
6406*/
6407static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
6408 int rc;
6409 char *zErrMsg = 0;
6410
6411 open_db(p, 0);
6412 if( p->backslashOn ) resolve_backslashes(zSql);
6413 BEGIN_TIMER;
6414 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
6415 END_TIMER;
6416 if( rc || zErrMsg ){
6417 char zPrefix[100];
6418 if( in!=0 || !stdin_is_interactive ){
6419 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
6420 "Error: near line %d:", startline);
6421 }else{
6422 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
6423 }
6424 if( zErrMsg!=0 ){
6425 utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg);
6426 sqlite3_free(zErrMsg);
6427 zErrMsg = 0;
6428 }else{
6429 utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
6430 }
6431 return 1;
6432 }else if( p->countChanges ){
6433 raw_printf(p->out, "changes: %3d total_changes: %d\n",
6434 sqlite3_changes(p->db), sqlite3_total_changes(p->db));
6435 }
6436 return 0;
6437}
6438
6439
6440/*
drh67505e72002-04-19 12:34:06 +00006441** Read input from *in and process it. If *in==0 then input
6442** is interactive - the user is typing it it. Otherwise, input
6443** is coming from a file or device. A prompt is issued and history
6444** is saved only if input is interactive. An interrupt signal will
6445** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00006446**
6447** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00006448*/
drhdcd87a92014-08-18 13:45:42 +00006449static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00006450 char *zLine = 0; /* A single input line */
6451 char *zSql = 0; /* Accumulated SQL text */
6452 int nLine; /* Length of current line */
6453 int nSql = 0; /* Bytes of zSql[] used */
6454 int nAlloc = 0; /* Allocated zSql[] space */
6455 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
drh9f099fd2013-08-06 14:01:46 +00006456 int rc; /* Error code */
6457 int errCnt = 0; /* Number of errors seen */
6458 int lineno = 0; /* Current line number */
6459 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00006460
6461 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
6462 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00006463 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00006464 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00006465 /* End of input */
drhfc8b40f2016-09-07 10:10:18 +00006466 if( in==0 && stdin_is_interactive ) printf("\n");
drh9b8d3572012-04-21 11:33:39 +00006467 break;
drhc49f44e2006-10-26 18:15:42 +00006468 }
drh67505e72002-04-19 12:34:06 +00006469 if( seenInterrupt ){
6470 if( in!=0 ) break;
6471 seenInterrupt = 0;
6472 }
drhc28490c2006-10-26 14:25:58 +00006473 lineno++;
drh849a9d92013-12-21 15:46:06 +00006474 if( nSql==0 && _all_whitespace(zLine) ){
6475 if( p->echoOn ) printf("%s\n", zLine);
6476 continue;
6477 }
drh2af0b2d2002-02-21 02:25:02 +00006478 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00006479 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00006480 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00006481 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00006482 break;
6483 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00006484 errCnt++;
6485 }
drhdaffd0e2001-04-11 14:28:42 +00006486 continue;
6487 }
drh9f099fd2013-08-06 14:01:46 +00006488 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00006489 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00006490 }
drh9f099fd2013-08-06 14:01:46 +00006491 nLine = strlen30(zLine);
6492 if( nSql+nLine+2>=nAlloc ){
6493 nAlloc = nSql+nLine+100;
6494 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00006495 if( zSql==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006496 raw_printf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00006497 exit(1);
6498 }
drhdaffd0e2001-04-11 14:28:42 +00006499 }
drh9f099fd2013-08-06 14:01:46 +00006500 nSqlPrior = nSql;
6501 if( nSql==0 ){
6502 int i;
6503 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00006504 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00006505 memcpy(zSql, zLine+i, nLine+1-i);
6506 startline = lineno;
6507 nSql = nLine-i;
6508 }else{
6509 zSql[nSql++] = '\n';
6510 memcpy(zSql+nSql, zLine, nLine+1);
6511 nSql += nLine;
6512 }
6513 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00006514 && sqlite3_complete(zSql) ){
drh4e8142c2016-11-11 14:54:22 +00006515 errCnt += runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006516 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00006517 if( p->outCount ){
6518 output_reset(p);
6519 p->outCount = 0;
6520 }
drh9f099fd2013-08-06 14:01:46 +00006521 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00006522 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00006523 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00006524 }
6525 }
drh4e8142c2016-11-11 14:54:22 +00006526 if( nSql && !_all_whitespace(zSql) ){
6527 runOneSqlLine(p, zSql, in, startline);
drhdaffd0e2001-04-11 14:28:42 +00006528 }
drh1f9ca2c2015-08-25 16:57:52 +00006529 free(zSql);
danielk19772ac27622007-07-03 05:31:16 +00006530 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00006531 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00006532}
6533
drh67505e72002-04-19 12:34:06 +00006534/*
6535** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00006536** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00006537*/
drhd1459152016-09-16 19:11:03 +00006538static char *find_home_dir(int clearFlag){
drh85e72432012-04-11 11:38:53 +00006539 static char *home_dir = NULL;
drhd1459152016-09-16 19:11:03 +00006540 if( clearFlag ){
6541 free(home_dir);
6542 home_dir = 0;
6543 return 0;
6544 }
drh85e72432012-04-11 11:38:53 +00006545 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00006546
drh4ace5362014-11-10 14:42:28 +00006547#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
6548 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00006549 {
6550 struct passwd *pwent;
6551 uid_t uid = getuid();
6552 if( (pwent=getpwuid(uid)) != NULL) {
6553 home_dir = pwent->pw_dir;
6554 }
drh67505e72002-04-19 12:34:06 +00006555 }
6556#endif
6557
chw65d3c132007-11-12 21:09:10 +00006558#if defined(_WIN32_WCE)
6559 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
6560 */
drh85e72432012-04-11 11:38:53 +00006561 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00006562#else
6563
drh83905c92012-06-21 13:00:37 +00006564#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00006565 if (!home_dir) {
6566 home_dir = getenv("USERPROFILE");
6567 }
6568#endif
6569
drh67505e72002-04-19 12:34:06 +00006570 if (!home_dir) {
6571 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00006572 }
6573
drh83905c92012-06-21 13:00:37 +00006574#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00006575 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00006576 char *zDrive, *zPath;
6577 int n;
6578 zDrive = getenv("HOMEDRIVE");
6579 zPath = getenv("HOMEPATH");
6580 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00006581 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00006582 home_dir = malloc( n );
6583 if( home_dir==0 ) return 0;
6584 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
6585 return home_dir;
6586 }
6587 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00006588 }
6589#endif
6590
chw65d3c132007-11-12 21:09:10 +00006591#endif /* !_WIN32_WCE */
6592
drh67505e72002-04-19 12:34:06 +00006593 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00006594 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00006595 char *z = malloc( n );
6596 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00006597 home_dir = z;
6598 }
drhe98d4fa2002-04-21 19:06:22 +00006599
drh67505e72002-04-19 12:34:06 +00006600 return home_dir;
6601}
6602
6603/*
6604** Read input from the file given by sqliterc_override. Or if that
6605** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00006606**
6607** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00006608*/
drh534f4df2015-02-28 14:03:35 +00006609static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00006610 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00006611 const char *sqliterc_override /* Name of config file. NULL to use default */
6612){
persicom7e2dfdd2002-04-18 02:46:52 +00006613 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00006614 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00006615 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00006616 FILE *in = NULL;
6617
6618 if (sqliterc == NULL) {
drhd1459152016-09-16 19:11:03 +00006619 home_dir = find_home_dir(0);
drhe98d4fa2002-04-21 19:06:22 +00006620 if( home_dir==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006621 raw_printf(stderr, "-- warning: cannot find home directory;"
drh534f4df2015-02-28 14:03:35 +00006622 " cannot read ~/.sqliterc\n");
6623 return;
drhe98d4fa2002-04-21 19:06:22 +00006624 }
drh2f3de322012-06-27 16:41:31 +00006625 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00006626 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
6627 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00006628 }
drha1f9b5e2004-02-14 16:31:02 +00006629 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00006630 if( in ){
drhc28490c2006-10-26 14:25:58 +00006631 if( stdin_is_interactive ){
mistachkinaae280e2015-12-31 19:06:24 +00006632 utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00006633 }
drh534f4df2015-02-28 14:03:35 +00006634 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00006635 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00006636 }
drh85e72432012-04-11 11:38:53 +00006637 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00006638}
6639
drh67505e72002-04-19 12:34:06 +00006640/*
drhe1e38c42003-05-04 18:30:59 +00006641** Show available command line options
6642*/
mistachkin1fe36bb2016-04-04 02:16:44 +00006643static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00006644 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00006645 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00006646 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006647 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00006648 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00006649 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00006650 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00006651 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00006652 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00006653#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
6654 " -heap SIZE Size of heap for memsys3 or memsys5\n"
6655#endif
drhcc3b4f82012-02-07 14:13:50 +00006656 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00006657 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00006658 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00006659 " -line set output mode to 'line'\n"
6660 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00006661 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00006662 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00006663#ifdef SQLITE_ENABLE_MULTIPLEX
6664 " -multiplex enable the multiplexor VFS\n"
6665#endif
mistachkine0d68852014-12-11 03:12:33 +00006666 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00006667 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00006668 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
6669 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00006670 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00006671 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00006672 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00006673 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00006674#ifdef SQLITE_ENABLE_VFSTRACE
6675 " -vfstrace enable tracing of all VFS calls\n"
6676#endif
drhe1e38c42003-05-04 18:30:59 +00006677;
6678static void usage(int showDetail){
mistachkinaae280e2015-12-31 19:06:24 +00006679 utf8_printf(stderr,
mistachkin1fe36bb2016-04-04 02:16:44 +00006680 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
drh80e8be92006-08-29 12:04:19 +00006681 "FILENAME is the name of an SQLite database. A new database is created\n"
6682 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00006683 if( showDetail ){
mistachkinaae280e2015-12-31 19:06:24 +00006684 utf8_printf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00006685 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006686 raw_printf(stderr, "Use the -help option for additional information\n");
drhe1e38c42003-05-04 18:30:59 +00006687 }
6688 exit(1);
6689}
6690
6691/*
drh67505e72002-04-19 12:34:06 +00006692** Initialize the state information in data
6693*/
drhdcd87a92014-08-18 13:45:42 +00006694static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00006695 memset(data, 0, sizeof(*data));
drh700c2522016-02-09 18:39:25 +00006696 data->normalMode = data->cMode = data->mode = MODE_List;
6697 data->autoExplain = 1;
mistachkinfad42082014-07-24 22:13:12 +00006698 memcpy(data->colSeparator,SEP_Column, 2);
6699 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00006700 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00006701 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00006702 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00006703 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00006704 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00006705 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
6706 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00006707}
6708
drh98d312f2012-10-25 15:23:14 +00006709/*
drh5c7976f2014-02-10 19:59:27 +00006710** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00006711*/
6712#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00006713static void printBold(const char *zText){
6714 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
6715 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
6716 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
6717 SetConsoleTextAttribute(out,
6718 FOREGROUND_RED|FOREGROUND_INTENSITY
6719 );
6720 printf("%s", zText);
6721 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00006722}
6723#else
drh5c7976f2014-02-10 19:59:27 +00006724static void printBold(const char *zText){
6725 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00006726}
6727#endif
6728
6729/*
drh98d312f2012-10-25 15:23:14 +00006730** Get the argument to an --option. Throw an error and die if no argument
6731** is available.
6732*/
6733static char *cmdline_option_value(int argc, char **argv, int i){
6734 if( i==argc ){
mistachkinaae280e2015-12-31 19:06:24 +00006735 utf8_printf(stderr, "%s: Error: missing argument to %s\n",
drh98d312f2012-10-25 15:23:14 +00006736 argv[0], argv[argc-1]);
6737 exit(1);
6738 }
6739 return argv[i];
6740}
6741
mistachkin1fe36bb2016-04-04 02:16:44 +00006742#ifndef SQLITE_SHELL_IS_UTF8
6743# if (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)
6744# define SQLITE_SHELL_IS_UTF8 (0)
6745# else
6746# define SQLITE_SHELL_IS_UTF8 (1)
6747# endif
6748#endif
6749
6750#if SQLITE_SHELL_IS_UTF8
mistachkin44723ce2015-03-21 02:22:37 +00006751int SQLITE_CDECL main(int argc, char **argv){
mistachkin1fe36bb2016-04-04 02:16:44 +00006752#else
6753int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
mistachkin1810f222016-04-04 02:33:34 +00006754 char **argv;
mistachkin1fe36bb2016-04-04 02:16:44 +00006755#endif
drh75897232000-05-29 14:26:00 +00006756 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00006757 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00006758 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00006759 int i;
drhc28490c2006-10-26 14:25:58 +00006760 int rc = 0;
drhb3735912014-02-10 16:13:42 +00006761 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00006762 int readStdin = 1;
6763 int nCmd = 0;
6764 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00006765
mistachkin1fe36bb2016-04-04 02:16:44 +00006766 setBinaryMode(stdin, 0);
6767 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
mistachkin1810f222016-04-04 02:33:34 +00006768 stdin_is_interactive = isatty(0);
6769 stdout_is_console = isatty(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00006770
drh69b30ab2014-02-27 15:11:52 +00006771#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00006772 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006773 utf8_printf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
drh52784bd2011-05-18 17:15:06 +00006774 sqlite3_sourceid(), SQLITE_SOURCE_ID);
6775 exit(1);
6776 }
drhc7181902014-02-27 15:04:13 +00006777#endif
persicom7e2dfdd2002-04-18 02:46:52 +00006778 main_init(&data);
mistachkin1fe36bb2016-04-04 02:16:44 +00006779#if !SQLITE_SHELL_IS_UTF8
6780 sqlite3_initialize();
6781 argv = sqlite3_malloc64(sizeof(argv[0])*argc);
6782 if( argv==0 ){
6783 raw_printf(stderr, "out of memory\n");
6784 exit(1);
6785 }
6786 for(i=0; i<argc; i++){
6787 argv[i] = sqlite3_win32_unicode_to_utf8(wargv[i]);
6788 if( argv[i]==0 ){
6789 raw_printf(stderr, "out of memory\n");
6790 exit(1);
6791 }
6792 }
6793#endif
mistachkin1810f222016-04-04 02:33:34 +00006794 assert( argc>=1 && argv && argv[0] );
mistachkin1fe36bb2016-04-04 02:16:44 +00006795 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00006796
drh44c2eb12003-04-30 11:38:26 +00006797 /* Make sure we have a valid signal handler early, before anything
6798 ** else is done.
6799 */
drh4c504392000-10-16 22:06:40 +00006800#ifdef SIGINT
6801 signal(SIGINT, interrupt_handler);
6802#endif
drh44c2eb12003-04-30 11:38:26 +00006803
drhac5649a2014-11-28 13:35:03 +00006804#ifdef SQLITE_SHELL_DBNAME_PROC
6805 {
6806 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
6807 ** of a C-function that will provide the name of the database file. Use
6808 ** this compile-time option to embed this shell program in larger
6809 ** applications. */
6810 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
6811 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
6812 warnInmemoryDb = 0;
6813 }
6814#endif
6815
drh22fbcb82004-02-01 01:22:50 +00006816 /* Do an initial pass through the command-line argument to locate
6817 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00006818 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00006819 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00006820 */
drh98d312f2012-10-25 15:23:14 +00006821 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00006822 char *z;
drhc28490c2006-10-26 14:25:58 +00006823 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00006824 if( z[0]!='-' ){
6825 if( data.zDbFilename==0 ){
6826 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00006827 }else{
6828 /* Excesss arguments are interpreted as SQL (or dot-commands) and
6829 ** mean that nothing is read from stdin */
6830 readStdin = 0;
6831 nCmd++;
6832 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
6833 if( azCmd==0 ){
mistachkinaae280e2015-12-31 19:06:24 +00006834 raw_printf(stderr, "out of memory\n");
drhac5649a2014-11-28 13:35:03 +00006835 exit(1);
6836 }
6837 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00006838 }
drh98d312f2012-10-25 15:23:14 +00006839 }
drhcc3b4f82012-02-07 14:13:50 +00006840 if( z[1]=='-' ) z++;
6841 if( strcmp(z,"-separator")==0
6842 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00006843 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00006844 || strcmp(z,"-cmd")==0
6845 ){
drh98d312f2012-10-25 15:23:14 +00006846 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00006847 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00006848 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00006849 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00006850 /* Need to check for batch mode here to so we can avoid printing
mistachkin1fe36bb2016-04-04 02:16:44 +00006851 ** informational messages (like from process_sqliterc) before
drh98d312f2012-10-25 15:23:14 +00006852 ** we do the actual processing of arguments later in a second pass.
6853 */
shanef69573d2009-10-24 02:06:14 +00006854 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00006855 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00006856#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00006857 const char *zSize;
6858 sqlite3_int64 szHeap;
6859
drh98d312f2012-10-25 15:23:14 +00006860 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00006861 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00006862 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00006863 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
drhc530b9c2016-07-25 11:27:22 +00006864#else
6865 (void)cmdline_option_value(argc, argv, ++i);
drh9c88d682010-12-17 14:03:01 +00006866#endif
drh44dec872014-08-30 15:49:25 +00006867 }else if( strcmp(z,"-scratch")==0 ){
6868 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006869 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006870 if( sz>400000 ) sz = 400000;
6871 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00006872 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006873 if( n>10 ) n = 10;
6874 if( n<1 ) n = 1;
6875 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
6876 data.shellFlgs |= SHFLG_Scratch;
6877 }else if( strcmp(z,"-pagecache")==0 ){
6878 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006879 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006880 if( sz>70000 ) sz = 70000;
drh3d38cec2015-11-11 15:28:52 +00006881 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00006882 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh3d38cec2015-11-11 15:28:52 +00006883 sqlite3_config(SQLITE_CONFIG_PAGECACHE,
6884 (n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
drh44dec872014-08-30 15:49:25 +00006885 data.shellFlgs |= SHFLG_Pagecache;
6886 }else if( strcmp(z,"-lookaside")==0 ){
6887 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00006888 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006889 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00006890 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00006891 if( n<0 ) n = 0;
6892 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
6893 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00006894#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00006895 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00006896 extern int vfstrace_register(
6897 const char *zTraceName,
6898 const char *zOldVfsName,
6899 int (*xOut)(const char*,void*),
6900 void *pOutArg,
6901 int makeDefault
6902 );
drh2b625e22011-03-16 17:05:28 +00006903 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00006904#endif
drh6f25e892011-07-08 17:02:57 +00006905#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00006906 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00006907 extern int sqlite3_multiple_initialize(const char*,int);
6908 sqlite3_multiplex_initialize(0, 1);
6909#endif
drh7d9f3942013-04-03 01:26:54 +00006910 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00006911 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
6912 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00006913 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00006914 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00006915 if( pVfs ){
6916 sqlite3_vfs_register(pVfs, 1);
6917 }else{
mistachkinaae280e2015-12-31 19:06:24 +00006918 utf8_printf(stderr, "no such VFS: \"%s\"\n", argv[i]);
drha7e61d82011-03-12 17:02:57 +00006919 exit(1);
6920 }
drh44c2eb12003-04-30 11:38:26 +00006921 }
6922 }
drh98d312f2012-10-25 15:23:14 +00006923 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00006924#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00006925 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00006926 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00006927#else
mistachkinaae280e2015-12-31 19:06:24 +00006928 utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0);
shane86f5bdb2009-10-24 02:00:07 +00006929 return 1;
drh01b41712005-08-29 23:06:23 +00006930#endif
drh98d312f2012-10-25 15:23:14 +00006931 }
6932 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00006933
drh44c2eb12003-04-30 11:38:26 +00006934 /* Go ahead and open the database file if it already exists. If the
6935 ** file does not exist, delay opening it. This prevents empty database
6936 ** files from being created if a user mistypes the database name argument
6937 ** to the sqlite command-line tool.
6938 */
drhc8d74412004-08-31 23:41:26 +00006939 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00006940 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00006941 }
6942
drh22fbcb82004-02-01 01:22:50 +00006943 /* Process the initialization file if there is one. If no -init option
6944 ** is given on the command line, look for a file named ~/.sqliterc and
6945 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00006946 */
drh534f4df2015-02-28 14:03:35 +00006947 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00006948
drh22fbcb82004-02-01 01:22:50 +00006949 /* Make a second pass through the command-line argument and set
6950 ** options. This second pass is delayed until after the initialization
6951 ** file is processed so that the command-line arguments will override
6952 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00006953 */
drh98d312f2012-10-25 15:23:14 +00006954 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00006955 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00006956 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00006957 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00006958 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00006959 i++;
6960 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006961 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00006962 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006963 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00006964 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006965 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00006966 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00006967 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00006968 }else if( strcmp(z,"-csv")==0 ){
6969 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00006970 memcpy(data.colSeparator,",",2);
6971 }else if( strcmp(z,"-ascii")==0 ){
6972 data.mode = MODE_Ascii;
6973 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00006974 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00006975 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00006976 SEP_Record);
drh22fbcb82004-02-01 01:22:50 +00006977 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00006978 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
drh98d312f2012-10-25 15:23:14 +00006979 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00006980 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00006981 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00006982 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00006983 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00006984 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00006985 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00006986 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006987 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00006988 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00006989 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00006990 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00006991 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00006992 }else if( strcmp(z,"-eqp")==0 ){
6993 data.autoEQP = 1;
drheacd29d2016-04-15 15:03:27 +00006994 }else if( strcmp(z,"-eqpfull")==0 ){
6995 data.autoEQP = 2;
shaneh642d8b82010-07-28 16:05:34 +00006996 }else if( strcmp(z,"-stats")==0 ){
6997 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00006998 }else if( strcmp(z,"-scanstats")==0 ){
6999 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00007000 }else if( strcmp(z,"-backslash")==0 ){
7001 /* Undocumented command-line option: -backslash
7002 ** Causes C-style backslash escapes to be evaluated in SQL statements
7003 ** prior to sending the SQL into SQLite. Useful for injecting
7004 ** crazy bytes in the middle of SQL statements for testing and debugging.
7005 */
7006 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00007007 }else if( strcmp(z,"-bail")==0 ){
7008 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00007009 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00007010 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00007011 return 0;
drhc28490c2006-10-26 14:25:58 +00007012 }else if( strcmp(z,"-interactive")==0 ){
7013 stdin_is_interactive = 1;
7014 }else if( strcmp(z,"-batch")==0 ){
7015 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00007016 }else if( strcmp(z,"-heap")==0 ){
7017 i++;
drh44dec872014-08-30 15:49:25 +00007018 }else if( strcmp(z,"-scratch")==0 ){
7019 i+=2;
7020 }else if( strcmp(z,"-pagecache")==0 ){
7021 i+=2;
7022 }else if( strcmp(z,"-lookaside")==0 ){
7023 i+=2;
drh7d9f3942013-04-03 01:26:54 +00007024 }else if( strcmp(z,"-mmap")==0 ){
7025 i++;
drha7e61d82011-03-12 17:02:57 +00007026 }else if( strcmp(z,"-vfs")==0 ){
7027 i++;
drh6f25e892011-07-08 17:02:57 +00007028#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00007029 }else if( strcmp(z,"-vfstrace")==0 ){
7030 i++;
drh6f25e892011-07-08 17:02:57 +00007031#endif
7032#ifdef SQLITE_ENABLE_MULTIPLEX
7033 }else if( strcmp(z,"-multiplex")==0 ){
7034 i++;
7035#endif
drhcc3b4f82012-02-07 14:13:50 +00007036 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00007037 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00007038 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00007039 /* Run commands that follow -cmd first and separately from commands
7040 ** that simply appear on the command-line. This seems goofy. It would
7041 ** be better if all commands ran in the order that they appear. But
7042 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00007043 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00007044 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00007045 if( z[0]=='.' ){
7046 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00007047 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00007048 }else{
drh05782482013-10-24 15:20:20 +00007049 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00007050 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
7051 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007052 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhcc3b4f82012-02-07 14:13:50 +00007053 if( bail_on_error ) return rc!=0 ? rc : 1;
7054 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007055 utf8_printf(stderr,"Error: unable to process SQL \"%s\"\n", z);
drhcc3b4f82012-02-07 14:13:50 +00007056 if( bail_on_error ) return rc;
7057 }
7058 }
drh1e5d0e92000-05-31 23:33:17 +00007059 }else{
mistachkinaae280e2015-12-31 19:06:24 +00007060 utf8_printf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
7061 raw_printf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00007062 return 1;
7063 }
drh700c2522016-02-09 18:39:25 +00007064 data.cMode = data.mode;
drh1e5d0e92000-05-31 23:33:17 +00007065 }
drh44c2eb12003-04-30 11:38:26 +00007066
drhac5649a2014-11-28 13:35:03 +00007067 if( !readStdin ){
7068 /* Run all arguments that do not begin with '-' as if they were separate
7069 ** command-line inputs, except for the argToSkip argument which contains
7070 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00007071 */
drhac5649a2014-11-28 13:35:03 +00007072 for(i=0; i<nCmd; i++){
7073 if( azCmd[i][0]=='.' ){
7074 rc = do_meta_command(azCmd[i], &data);
7075 if( rc ) return rc==2 ? 0 : rc;
7076 }else{
7077 open_db(&data, 0);
7078 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
7079 if( zErrMsg!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007080 utf8_printf(stderr,"Error: %s\n", zErrMsg);
drhac5649a2014-11-28 13:35:03 +00007081 return rc!=0 ? rc : 1;
7082 }else if( rc!=0 ){
mistachkinaae280e2015-12-31 19:06:24 +00007083 utf8_printf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
drhac5649a2014-11-28 13:35:03 +00007084 return rc;
7085 }
drh6ff13852001-11-25 13:18:23 +00007086 }
drh75897232000-05-29 14:26:00 +00007087 }
drhac5649a2014-11-28 13:35:03 +00007088 free(azCmd);
drh75897232000-05-29 14:26:00 +00007089 }else{
drh44c2eb12003-04-30 11:38:26 +00007090 /* Run commands received from standard input
7091 */
drhc28490c2006-10-26 14:25:58 +00007092 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00007093 char *zHome;
7094 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00007095 int nHistory;
drh75897232000-05-29 14:26:00 +00007096 printf(
drh743e0032011-12-12 16:51:50 +00007097 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00007098 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00007099 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00007100 );
drhb3735912014-02-10 16:13:42 +00007101 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00007102 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00007103 printBold("transient in-memory database");
7104 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00007105 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00007106 }
drhd1459152016-09-16 19:11:03 +00007107 zHome = find_home_dir(0);
drhea678832008-12-10 19:26:22 +00007108 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00007109 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00007110 if( (zHistory = malloc(nHistory))!=0 ){
7111 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
7112 }
drh67505e72002-04-19 12:34:06 +00007113 }
drhf5ed7ad2015-06-15 14:43:25 +00007114 if( zHistory ){ shell_read_history(zHistory); }
drhc28490c2006-10-26 14:25:58 +00007115 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00007116 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00007117 shell_stifle_history(100);
7118 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00007119 free(zHistory);
drh67505e72002-04-19 12:34:06 +00007120 }
drhdaffd0e2001-04-11 14:28:42 +00007121 }else{
drhc28490c2006-10-26 14:25:58 +00007122 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00007123 }
7124 }
drh33048c02001-10-01 14:29:22 +00007125 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00007126 if( data.db ){
drhe6229612014-08-18 15:08:26 +00007127 session_close_all(&data);
drhe14cd932010-12-08 03:28:17 +00007128 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00007129 }
mistachkin1fe36bb2016-04-04 02:16:44 +00007130 sqlite3_free(data.zFreeOnClose);
drhd1459152016-09-16 19:11:03 +00007131 find_home_dir(1);
mistachkin1fe36bb2016-04-04 02:16:44 +00007132#if !SQLITE_SHELL_IS_UTF8
7133 for(i=0; i<argc; i++) sqlite3_free(argv[i]);
7134 sqlite3_free(argv);
7135#endif
drhc28490c2006-10-26 14:25:58 +00007136 return rc;
drh75897232000-05-29 14:26:00 +00007137}