blob: dbe652d48e0c2cb0c6f1d51ba4fe80f1622f1a08 [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
93# define shell_read_history(X)
94# 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>
shane18e526c2008-12-10 22:30:24 +0000104#define isatty(h) _isatty(h)
drh07901eb2014-02-28 19:37:45 +0000105#ifndef access
106# define access(f,m) _access((f),(m))
107#endif
drh67ceaa62012-08-27 21:19:03 +0000108#undef popen
drh53371f92013-07-25 17:07:03 +0000109#define popen _popen
drh67ceaa62012-08-27 21:19:03 +0000110#undef pclose
drh12cd6cf2013-06-29 15:40:22 +0000111#define pclose _pclose
adamd2e8464a2006-09-06 21:39:40 +0000112#else
drh4328c8b2003-04-26 02:50:11 +0000113/* Make sure isatty() has a prototype.
114*/
drhb2acc3b2011-10-13 16:36:29 +0000115extern int isatty(int);
drh4328c8b2003-04-26 02:50:11 +0000116
drh8cd5b252015-03-02 22:06:43 +0000117#if !defined(__RTP__) && !defined(_WRS_KERNEL)
118 /* popen and pclose are not C89 functions and so are sometimes omitted from
119 ** the <stdio.h> header */
120 extern FILE *popen(const char*,const char*);
121 extern int pclose(FILE*);
122#else
123# define SQLITE_OMIT_POPEN 1
124#endif
125
mistachkinf6418892013-08-28 01:54:12 +0000126#endif
drh53371f92013-07-25 17:07:03 +0000127
chw65d3c132007-11-12 21:09:10 +0000128#if defined(_WIN32_WCE)
129/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty()
130 * thus we always assume that we have a console. That can be
131 * overridden with the -batch command line option.
132 */
133#define isatty(x) 1
134#endif
135
drhf0693c82011-10-11 20:41:54 +0000136/* ctype macros that work with signed characters */
137#define IsSpace(X) isspace((unsigned char)X)
138#define IsDigit(X) isdigit((unsigned char)X)
139#define ToLower(X) (char)tolower((unsigned char)X)
140
drh047d4532015-01-18 20:30:23 +0000141/* On Windows, we normally run with output mode of TEXT so that \n characters
142** are automatically translated into \r\n. However, this behavior needs
143** to be disabled in some cases (ex: when generating CSV output and when
144** rendering quoted strings that contain \n characters). The following
145** routines take care of that.
146*/
147#if defined(_WIN32) || defined(WIN32)
mistachkine4a0d792015-01-27 21:24:33 +0000148static void setBinaryMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000149 fflush(out);
150 _setmode(_fileno(out), _O_BINARY);
151}
mistachkine4a0d792015-01-27 21:24:33 +0000152static void setTextMode(FILE *out){
drh047d4532015-01-18 20:30:23 +0000153 fflush(out);
154 _setmode(_fileno(out), _O_TEXT);
155}
156#else
157# define setBinaryMode(X)
158# define setTextMode(X)
159#endif
160
drh43408312013-10-30 12:43:36 +0000161
162/* True if the timer is enabled */
163static int enableTimer = 0;
164
165/* Return the current wall-clock time */
166static sqlite3_int64 timeOfDay(void){
167 static sqlite3_vfs *clockVfs = 0;
168 sqlite3_int64 t;
169 if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
170 if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){
171 clockVfs->xCurrentTimeInt64(clockVfs, &t);
172 }else{
173 double r;
174 clockVfs->xCurrentTime(clockVfs, &r);
175 t = (sqlite3_int64)(r*86400000.0);
176 }
177 return t;
178}
179
drh91eb93c2015-03-03 19:56:20 +0000180#if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
drh3b1a9882007-11-02 12:53:03 +0000181#include <sys/time.h>
182#include <sys/resource.h>
183
drh91eb93c2015-03-03 19:56:20 +0000184/* VxWorks does not support getrusage() as far as we can determine */
185#if defined(_WRS_KERNEL) || defined(__RTP__)
186struct rusage {
187 struct timeval ru_utime; /* user CPU time used */
188 struct timeval ru_stime; /* system CPU time used */
189};
190#define getrusage(A,B) memset(B,0,sizeof(*B))
191#endif
192
drhda108222009-02-25 19:07:24 +0000193/* Saved resource information for the beginning of an operation */
drh43408312013-10-30 12:43:36 +0000194static struct rusage sBegin; /* CPU time at start */
195static sqlite3_int64 iBegin; /* Wall-clock time at start */
drhda108222009-02-25 19:07:24 +0000196
drhda108222009-02-25 19:07:24 +0000197/*
198** Begin timing an operation
199*/
200static void beginTimer(void){
201 if( enableTimer ){
202 getrusage(RUSAGE_SELF, &sBegin);
drh43408312013-10-30 12:43:36 +0000203 iBegin = timeOfDay();
drhda108222009-02-25 19:07:24 +0000204 }
205}
206
207/* Return the difference of two time_structs in seconds */
208static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
209 return (pEnd->tv_usec - pStart->tv_usec)*0.000001 +
210 (double)(pEnd->tv_sec - pStart->tv_sec);
211}
212
213/*
214** Print the timing results.
215*/
216static void endTimer(void){
217 if( enableTimer ){
drh43408312013-10-30 12:43:36 +0000218 sqlite3_int64 iEnd = timeOfDay();
drh91eb93c2015-03-03 19:56:20 +0000219 struct rusage sEnd;
drhda108222009-02-25 19:07:24 +0000220 getrusage(RUSAGE_SELF, &sEnd);
drh43408312013-10-30 12:43:36 +0000221 printf("Run Time: real %.3f user %f sys %f\n",
222 (iEnd - iBegin)*0.001,
drhda108222009-02-25 19:07:24 +0000223 timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
224 timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
225 }
226}
shaneb320ccd2009-10-21 03:42:58 +0000227
drhda108222009-02-25 19:07:24 +0000228#define BEGIN_TIMER beginTimer()
229#define END_TIMER endTimer()
230#define HAS_TIMER 1
shaneb320ccd2009-10-21 03:42:58 +0000231
232#elif (defined(_WIN32) || defined(WIN32))
233
234#include <windows.h>
235
236/* Saved resource information for the beginning of an operation */
237static HANDLE hProcess;
238static FILETIME ftKernelBegin;
239static FILETIME ftUserBegin;
drh43408312013-10-30 12:43:36 +0000240static sqlite3_int64 ftWallBegin;
drh4ace5362014-11-10 14:42:28 +0000241typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME,
242 LPFILETIME, LPFILETIME);
shaneb320ccd2009-10-21 03:42:58 +0000243static GETPROCTIMES getProcessTimesAddr = NULL;
244
shaneb320ccd2009-10-21 03:42:58 +0000245/*
246** Check to see if we have timer support. Return 1 if necessary
247** support found (or found previously).
248*/
249static int hasTimer(void){
250 if( getProcessTimesAddr ){
251 return 1;
252 } else {
drh4ace5362014-11-10 14:42:28 +0000253 /* GetProcessTimes() isn't supported in WIN95 and some other Windows
254 ** versions. See if the version we are running on has it, and if it
255 ** does, save off a pointer to it and the current process handle.
shaneb320ccd2009-10-21 03:42:58 +0000256 */
257 hProcess = GetCurrentProcess();
258 if( hProcess ){
259 HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll"));
260 if( NULL != hinstLib ){
drh4ace5362014-11-10 14:42:28 +0000261 getProcessTimesAddr =
262 (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes");
shaneb320ccd2009-10-21 03:42:58 +0000263 if( NULL != getProcessTimesAddr ){
264 return 1;
265 }
266 FreeLibrary(hinstLib);
267 }
268 }
269 }
270 return 0;
271}
272
273/*
274** Begin timing an operation
275*/
276static void beginTimer(void){
277 if( enableTimer && getProcessTimesAddr ){
278 FILETIME ftCreation, ftExit;
drh4ace5362014-11-10 14:42:28 +0000279 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,
280 &ftKernelBegin,&ftUserBegin);
drh43408312013-10-30 12:43:36 +0000281 ftWallBegin = timeOfDay();
shaneb320ccd2009-10-21 03:42:58 +0000282 }
283}
284
285/* Return the difference of two FILETIME structs in seconds */
286static double timeDiff(FILETIME *pStart, FILETIME *pEnd){
287 sqlite_int64 i64Start = *((sqlite_int64 *) pStart);
288 sqlite_int64 i64End = *((sqlite_int64 *) pEnd);
289 return (double) ((i64End - i64Start) / 10000000.0);
290}
291
292/*
293** Print the timing results.
294*/
295static void endTimer(void){
296 if( enableTimer && getProcessTimesAddr){
297 FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
drh43408312013-10-30 12:43:36 +0000298 sqlite3_int64 ftWallEnd = timeOfDay();
drh4ace5362014-11-10 14:42:28 +0000299 getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
drh43408312013-10-30 12:43:36 +0000300 printf("Run Time: real %.3f user %f sys %f\n",
301 (ftWallEnd - ftWallBegin)*0.001,
shaneb320ccd2009-10-21 03:42:58 +0000302 timeDiff(&ftUserBegin, &ftUserEnd),
303 timeDiff(&ftKernelBegin, &ftKernelEnd));
304 }
305}
306
307#define BEGIN_TIMER beginTimer()
308#define END_TIMER endTimer()
309#define HAS_TIMER hasTimer()
310
drhda108222009-02-25 19:07:24 +0000311#else
312#define BEGIN_TIMER
313#define END_TIMER
314#define HAS_TIMER 0
315#endif
316
shanec0688ea2009-03-05 03:48:06 +0000317/*
318** Used to prevent warnings about unused parameters
319*/
320#define UNUSED_PARAMETER(x) (void)(x)
321
drhe91d16b2008-12-08 18:27:31 +0000322/*
drhc49f44e2006-10-26 18:15:42 +0000323** If the following flag is set, then command execution stops
324** at an error if we are not interactive.
325*/
326static int bail_on_error = 0;
327
328/*
drhc28490c2006-10-26 14:25:58 +0000329** Threat stdin as an interactive input if the following variable
330** is true. Otherwise, assume stdin is connected to a file or pipe.
331*/
332static int stdin_is_interactive = 1;
333
334/*
drh4c504392000-10-16 22:06:40 +0000335** The following is the open SQLite database. We make a pointer
336** to this database a static variable so that it can be accessed
337** by the SIGINT handler to interrupt database processing.
338*/
mistachkin8e189222015-04-19 21:43:16 +0000339static sqlite3 *globalDb = 0;
drh4c504392000-10-16 22:06:40 +0000340
341/*
drh67505e72002-04-19 12:34:06 +0000342** True if an interrupt (Control-C) has been received.
343*/
drh43617e92006-03-06 20:55:46 +0000344static volatile int seenInterrupt = 0;
drh67505e72002-04-19 12:34:06 +0000345
346/*
persicom7e2dfdd2002-04-18 02:46:52 +0000347** This is the name of our program. It is set in main(), used
348** in a number of other places, mostly for error messages.
349*/
350static char *Argv0;
351
352/*
353** Prompt strings. Initialized in main. Settable with
354** .prompt main continue
355*/
356static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/
357static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */
358
drhb0603412007-02-28 04:47:26 +0000359/*
360** Write I/O traces to the following stream.
361*/
rsebe0a9092007-07-30 18:24:38 +0000362#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +0000363static FILE *iotrace = 0;
rsebe0a9092007-07-30 18:24:38 +0000364#endif
drhb0603412007-02-28 04:47:26 +0000365
366/*
367** This routine works like printf in that its first argument is a
368** format string and subsequent arguments are values to be substituted
369** in place of % fields. The result of formatting this string
370** is written to iotrace.
371*/
rsebe0a9092007-07-30 18:24:38 +0000372#ifdef SQLITE_ENABLE_IOTRACE
mistachkin9871a932015-03-27 00:21:52 +0000373static void SQLITE_CDECL iotracePrintf(const char *zFormat, ...){
drhb0603412007-02-28 04:47:26 +0000374 va_list ap;
drhf075cd02007-02-28 06:14:25 +0000375 char *z;
drhb0603412007-02-28 04:47:26 +0000376 if( iotrace==0 ) return;
377 va_start(ap, zFormat);
drhf075cd02007-02-28 06:14:25 +0000378 z = sqlite3_vmprintf(zFormat, ap);
drhb0603412007-02-28 04:47:26 +0000379 va_end(ap);
drhf075cd02007-02-28 06:14:25 +0000380 fprintf(iotrace, "%s", z);
381 sqlite3_free(z);
drhb0603412007-02-28 04:47:26 +0000382}
rsebe0a9092007-07-30 18:24:38 +0000383#endif
drhb0603412007-02-28 04:47:26 +0000384
drh44c2eb12003-04-30 11:38:26 +0000385
persicom7e2dfdd2002-04-18 02:46:52 +0000386/*
drh83965662003-04-17 02:54:13 +0000387** Determines if a string is a number of not.
388*/
danielk19772e588c72005-12-09 14:25:08 +0000389static int isNumber(const char *z, int *realnum){
drhc8d74412004-08-31 23:41:26 +0000390 if( *z=='-' || *z=='+' ) z++;
drhf0693c82011-10-11 20:41:54 +0000391 if( !IsDigit(*z) ){
drhc8d74412004-08-31 23:41:26 +0000392 return 0;
393 }
394 z++;
395 if( realnum ) *realnum = 0;
drhf0693c82011-10-11 20:41:54 +0000396 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000397 if( *z=='.' ){
398 z++;
drhf0693c82011-10-11 20:41:54 +0000399 if( !IsDigit(*z) ) return 0;
400 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000401 if( realnum ) *realnum = 1;
402 }
403 if( *z=='e' || *z=='E' ){
404 z++;
405 if( *z=='+' || *z=='-' ) z++;
drhf0693c82011-10-11 20:41:54 +0000406 if( !IsDigit(*z) ) return 0;
407 while( IsDigit(*z) ){ z++; }
drhc8d74412004-08-31 23:41:26 +0000408 if( realnum ) *realnum = 1;
409 }
410 return *z==0;
411}
drh83965662003-04-17 02:54:13 +0000412
413/*
danielk1977bc6ada42004-06-30 08:20:16 +0000414** A global char* and an SQL function to access its current value
415** from within an SQL statement. This program used to use the
416** sqlite_exec_printf() API to substitue a string into an SQL statement.
417** The correct way to do this with sqlite3 is to use the bind API, but
418** since the shell is built around the callback paradigm it would be a lot
419** of work. Instead just use this hack, which is quite harmless.
420*/
421static const char *zShellStatic = 0;
422static void shellstaticFunc(
423 sqlite3_context *context,
424 int argc,
425 sqlite3_value **argv
426){
427 assert( 0==argc );
428 assert( zShellStatic );
shaned87897d2009-01-30 05:40:27 +0000429 UNUSED_PARAMETER(argc);
drh902b9ee2008-12-05 17:17:07 +0000430 UNUSED_PARAMETER(argv);
danielk1977bc6ada42004-06-30 08:20:16 +0000431 sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC);
432}
433
434
435/*
drhfeac5f82004-08-01 00:10:45 +0000436** This routine reads a line of text from FILE in, stores
drh8e7e7a22000-05-30 18:45:23 +0000437** the text in memory obtained from malloc() and returns a pointer
438** to the text. NULL is returned at end of file, or if malloc()
439** fails.
440**
drh9f099fd2013-08-06 14:01:46 +0000441** If zLine is not NULL then it is a malloced buffer returned from
442** a previous call to this routine that may be reused.
drh8e7e7a22000-05-30 18:45:23 +0000443*/
drh9f099fd2013-08-06 14:01:46 +0000444static char *local_getline(char *zLine, FILE *in){
445 int nLine = zLine==0 ? 0 : 100;
446 int n = 0;
drh8e7e7a22000-05-30 18:45:23 +0000447
drhb07028f2011-10-14 21:49:18 +0000448 while( 1 ){
drh8e7e7a22000-05-30 18:45:23 +0000449 if( n+100>nLine ){
450 nLine = nLine*2 + 100;
451 zLine = realloc(zLine, nLine);
452 if( zLine==0 ) return 0;
453 }
drhdaffd0e2001-04-11 14:28:42 +0000454 if( fgets(&zLine[n], nLine - n, in)==0 ){
drh8e7e7a22000-05-30 18:45:23 +0000455 if( n==0 ){
456 free(zLine);
457 return 0;
458 }
459 zLine[n] = 0;
drh8e7e7a22000-05-30 18:45:23 +0000460 break;
461 }
drh9f099fd2013-08-06 14:01:46 +0000462 while( zLine[n] ) n++;
463 if( n>0 && zLine[n-1]=='\n' ){
drh8e7e7a22000-05-30 18:45:23 +0000464 n--;
shaneh13b36022009-12-17 21:07:15 +0000465 if( n>0 && zLine[n-1]=='\r' ) n--;
drh8e7e7a22000-05-30 18:45:23 +0000466 zLine[n] = 0;
drhb07028f2011-10-14 21:49:18 +0000467 break;
drh8e7e7a22000-05-30 18:45:23 +0000468 }
469 }
drh8e7e7a22000-05-30 18:45:23 +0000470 return zLine;
471}
472
473/*
drhc28490c2006-10-26 14:25:58 +0000474** Retrieve a single line of input text.
drh8e7e7a22000-05-30 18:45:23 +0000475**
drh9f099fd2013-08-06 14:01:46 +0000476** If in==0 then read from standard input and prompt before each line.
477** If isContinuation is true, then a continuation prompt is appropriate.
478** If isContinuation is zero, then the main prompt should be used.
479**
480** If zPrior is not NULL then it is a buffer from a prior call to this
481** routine that can be reused.
482**
483** The result is stored in space obtained from malloc() and must either
484** be freed by the caller or else passed back into this routine via the
485** zPrior argument for reuse.
drh8e7e7a22000-05-30 18:45:23 +0000486*/
drh9f099fd2013-08-06 14:01:46 +0000487static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
drh8e7e7a22000-05-30 18:45:23 +0000488 char *zPrompt;
489 char *zResult;
drhdaffd0e2001-04-11 14:28:42 +0000490 if( in!=0 ){
drh9f099fd2013-08-06 14:01:46 +0000491 zResult = local_getline(zPrior, in);
drh8e7e7a22000-05-30 18:45:23 +0000492 }else{
drh9f099fd2013-08-06 14:01:46 +0000493 zPrompt = isContinuation ? continuePrompt : mainPrompt;
danfd34d6d2015-02-25 10:54:53 +0000494#if SHELL_USE_LOCAL_GETLINE
drh9f099fd2013-08-06 14:01:46 +0000495 printf("%s", zPrompt);
496 fflush(stdout);
497 zResult = local_getline(zPrior, stdin);
danfd34d6d2015-02-25 10:54:53 +0000498#else
499 free(zPrior);
500 zResult = shell_readline(zPrompt);
501 if( zResult && *zResult ) shell_add_history(zResult);
danielk19774af00c62005-01-23 23:43:21 +0000502#endif
drh9f099fd2013-08-06 14:01:46 +0000503 }
drh8e7e7a22000-05-30 18:45:23 +0000504 return zResult;
505}
506
drhdcd87a92014-08-18 13:45:42 +0000507/*
508** Shell output mode information from before ".explain on",
509** saved so that it can be restored by ".explain off"
510*/
511typedef struct SavedModeInfo SavedModeInfo;
512struct SavedModeInfo {
513 int valid; /* Is there legit data in here? */
514 int mode; /* Mode prior to ".explain on" */
515 int showHeader; /* The ".header" setting prior to ".explain on" */
516 int colWidth[100]; /* Column widths prior to ".explain on" */
persicom7e2dfdd2002-04-18 02:46:52 +0000517};
drh45e29d82006-11-20 16:21:10 +0000518
drh8e7e7a22000-05-30 18:45:23 +0000519/*
drhdcd87a92014-08-18 13:45:42 +0000520** State information about the database connection is contained in an
521** instance of the following structure.
drh75897232000-05-29 14:26:00 +0000522*/
drhdcd87a92014-08-18 13:45:42 +0000523typedef struct ShellState ShellState;
524struct ShellState {
shane626a6e42009-10-22 17:30:15 +0000525 sqlite3 *db; /* The database */
drhdaffd0e2001-04-11 14:28:42 +0000526 int echoOn; /* True to echo input commands */
drhc2ce0be2014-05-29 12:36:14 +0000527 int autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */
shaneh642d8b82010-07-28 16:05:34 +0000528 int statsOn; /* True to display memory stats before each finalize */
dan8d1edb92014-11-05 09:07:28 +0000529 int scanstatsOn; /* True to display scan stats before each finalize */
drh9569f602015-04-16 15:05:04 +0000530 int backslashOn; /* Resolve C-style \x escapes in SQL input text */
drhc2ce0be2014-05-29 12:36:14 +0000531 int outCount; /* Revert to stdout when reaching zero */
drh28bd4bc2000-06-15 15:57:22 +0000532 int cnt; /* Number of records displayed so far */
533 FILE *out; /* Write results here */
drh42f64e52012-04-04 16:56:23 +0000534 FILE *traceOut; /* Output for sqlite3_trace() */
drh2f464a02011-10-13 00:41:49 +0000535 int nErr; /* Number of errors seen */
drh28bd4bc2000-06-15 15:57:22 +0000536 int mode; /* An output mode setting */
drh45e29d82006-11-20 16:21:10 +0000537 int writableSchema; /* True if PRAGMA writable_schema=ON */
drh28bd4bc2000-06-15 15:57:22 +0000538 int showHeader; /* True to show column names in List or Column mode */
drh44dec872014-08-30 15:49:25 +0000539 unsigned shellFlgs; /* Various flags */
drh33048c02001-10-01 14:29:22 +0000540 char *zDestTable; /* Name of destination table when MODE_Insert */
mistachkin636bf9f2014-07-19 20:15:16 +0000541 char colSeparator[20]; /* Column separator character for several modes */
542 char rowSeparator[20]; /* Row separator character for MODE_Ascii */
drha0c66f52000-07-29 13:20:21 +0000543 int colWidth[100]; /* Requested width of each column when in column mode*/
544 int actualWidth[100]; /* Actual width of each column */
mistachkin44b99f72014-12-11 03:29:14 +0000545 char nullValue[20]; /* The text to print when a NULL comes back from
drh83965662003-04-17 02:54:13 +0000546 ** the database */
drhdcd87a92014-08-18 13:45:42 +0000547 SavedModeInfo normalMode;/* Holds the mode just before .explain ON */
drh44c2eb12003-04-30 11:38:26 +0000548 char outfile[FILENAME_MAX]; /* Filename for *out */
549 const char *zDbFilename; /* name of the database file */
drh05782482013-10-24 15:20:20 +0000550 char *zFreeOnClose; /* Filename to free when closing */
drha7e61d82011-03-12 17:02:57 +0000551 const char *zVfs; /* Name of VFS to use */
shane626a6e42009-10-22 17:30:15 +0000552 sqlite3_stmt *pStmt; /* Current statement if any. */
drh127f9d72010-02-23 01:47:00 +0000553 FILE *pLog; /* Write log output here */
dana98bf362013-11-13 18:35:01 +0000554 int *aiIndent; /* Array of indents used in MODE_Explain */
555 int nIndent; /* Size of array aiIndent[] */
danc4650bb2013-11-18 08:41:06 +0000556 int iIndent; /* Index of current op in aiIndent[] */
drh75897232000-05-29 14:26:00 +0000557};
558
559/*
drh44dec872014-08-30 15:49:25 +0000560** These are the allowed shellFlgs values
561*/
562#define SHFLG_Scratch 0x00001 /* The --scratch option is used */
563#define SHFLG_Pagecache 0x00002 /* The --pagecache option is used */
564#define SHFLG_Lookaside 0x00004 /* Lookaside memory is used */
565
566/*
drh75897232000-05-29 14:26:00 +0000567** These are the allowed modes.
568*/
drh967e8b72000-06-21 13:59:10 +0000569#define MODE_Line 0 /* One column per line. Blank line between records */
drh75897232000-05-29 14:26:00 +0000570#define MODE_Column 1 /* One record per line in neat columns */
571#define MODE_List 2 /* One record per line with a separator */
drhe3710332000-09-29 13:30:53 +0000572#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */
573#define MODE_Html 4 /* Generate an XHTML table */
574#define MODE_Insert 5 /* Generate SQL "insert" statements */
drhfeac5f82004-08-01 00:10:45 +0000575#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */
drh8e64d1c2004-10-07 00:32:39 +0000576#define MODE_Csv 7 /* Quote strings, numbers are plain */
drh66ce4d02008-02-15 17:38:06 +0000577#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */
mistachkin636bf9f2014-07-19 20:15:16 +0000578#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */
persicom7e2dfdd2002-04-18 02:46:52 +0000579
drh66ce4d02008-02-15 17:38:06 +0000580static const char *modeDescr[] = {
persicom7e2dfdd2002-04-18 02:46:52 +0000581 "line",
582 "column",
583 "list",
584 "semi",
585 "html",
drhfeac5f82004-08-01 00:10:45 +0000586 "insert",
587 "tcl",
drh8e64d1c2004-10-07 00:32:39 +0000588 "csv",
drh66ce4d02008-02-15 17:38:06 +0000589 "explain",
mistachkin636bf9f2014-07-19 20:15:16 +0000590 "ascii",
persicom7e2dfdd2002-04-18 02:46:52 +0000591};
drh75897232000-05-29 14:26:00 +0000592
593/*
mistachkinfad42082014-07-24 22:13:12 +0000594** These are the column/row/line separators used by the various
595** import/export modes.
mistachkin636bf9f2014-07-19 20:15:16 +0000596*/
mistachkinfad42082014-07-24 22:13:12 +0000597#define SEP_Column "|"
598#define SEP_Row "\n"
599#define SEP_Tab "\t"
600#define SEP_Space " "
601#define SEP_Comma ","
602#define SEP_CrLf "\r\n"
603#define SEP_Unit "\x1F"
604#define SEP_Record "\x1E"
mistachkin636bf9f2014-07-19 20:15:16 +0000605
606/*
drh75897232000-05-29 14:26:00 +0000607** Number of elements in an array
608*/
drh902b9ee2008-12-05 17:17:07 +0000609#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0]))
drh75897232000-05-29 14:26:00 +0000610
611/*
drhea678832008-12-10 19:26:22 +0000612** Compute a string length that is limited to what can be stored in
613** lower 30 bits of a 32-bit signed integer.
614*/
drh4f21c4a2008-12-10 22:15:00 +0000615static int strlen30(const char *z){
drhea678832008-12-10 19:26:22 +0000616 const char *z2 = z;
617 while( *z2 ){ z2++; }
618 return 0x3fffffff & (int)(z2 - z);
619}
620
621/*
drh127f9d72010-02-23 01:47:00 +0000622** A callback for the sqlite3_log() interface.
623*/
624static void shellLog(void *pArg, int iErrCode, const char *zMsg){
drhdcd87a92014-08-18 13:45:42 +0000625 ShellState *p = (ShellState*)pArg;
drh127f9d72010-02-23 01:47:00 +0000626 if( p->pLog==0 ) return;
627 fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg);
628 fflush(p->pLog);
629}
630
631/*
shane626a6e42009-10-22 17:30:15 +0000632** Output the given string as a hex-encoded blob (eg. X'1234' )
633*/
634static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
635 int i;
636 char *zBlob = (char *)pBlob;
637 fprintf(out,"X'");
drhb202d702012-04-24 12:12:57 +0000638 for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]&0xff); }
shane626a6e42009-10-22 17:30:15 +0000639 fprintf(out,"'");
640}
641
642/*
drh28bd4bc2000-06-15 15:57:22 +0000643** Output the given string as a quoted string using SQL quoting conventions.
644*/
645static void output_quoted_string(FILE *out, const char *z){
646 int i;
647 int nSingle = 0;
drh047d4532015-01-18 20:30:23 +0000648 setBinaryMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000649 for(i=0; z[i]; i++){
650 if( z[i]=='\'' ) nSingle++;
drh28bd4bc2000-06-15 15:57:22 +0000651 }
652 if( nSingle==0 ){
653 fprintf(out,"'%s'",z);
drh28bd4bc2000-06-15 15:57:22 +0000654 }else{
655 fprintf(out,"'");
656 while( *z ){
657 for(i=0; z[i] && z[i]!='\''; i++){}
658 if( i==0 ){
659 fprintf(out,"''");
660 z++;
661 }else if( z[i]=='\'' ){
662 fprintf(out,"%.*s''",i,z);
663 z += i+1;
664 }else{
drhcd7d2732002-02-26 23:24:26 +0000665 fprintf(out,"%s",z);
drh28bd4bc2000-06-15 15:57:22 +0000666 break;
667 }
668 }
drhcd7d2732002-02-26 23:24:26 +0000669 fprintf(out,"'");
drh28bd4bc2000-06-15 15:57:22 +0000670 }
drh047d4532015-01-18 20:30:23 +0000671 setTextMode(out);
drh28bd4bc2000-06-15 15:57:22 +0000672}
673
674/*
drhfeac5f82004-08-01 00:10:45 +0000675** Output the given string as a quoted according to C or TCL quoting rules.
676*/
677static void output_c_string(FILE *out, const char *z){
678 unsigned int c;
679 fputc('"', out);
680 while( (c = *(z++))!=0 ){
681 if( c=='\\' ){
682 fputc(c, out);
683 fputc(c, out);
mistachkin585dcb22012-12-04 00:23:43 +0000684 }else if( c=='"' ){
685 fputc('\\', out);
686 fputc('"', out);
drhfeac5f82004-08-01 00:10:45 +0000687 }else if( c=='\t' ){
688 fputc('\\', out);
689 fputc('t', out);
690 }else if( c=='\n' ){
691 fputc('\\', out);
692 fputc('n', out);
693 }else if( c=='\r' ){
694 fputc('\\', out);
695 fputc('r', out);
mistachkinf6418892013-08-28 01:54:12 +0000696 }else if( !isprint(c&0xff) ){
drh0a8640d2005-08-30 20:12:02 +0000697 fprintf(out, "\\%03o", c&0xff);
drhfeac5f82004-08-01 00:10:45 +0000698 }else{
699 fputc(c, out);
700 }
701 }
702 fputc('"', out);
703}
704
705/*
drhc08a4f12000-06-15 16:49:48 +0000706** Output the given string with characters that are special to
707** HTML escaped.
708*/
709static void output_html_string(FILE *out, const char *z){
710 int i;
drhc3d6ba42014-01-13 20:38:35 +0000711 if( z==0 ) z = "";
drhc08a4f12000-06-15 16:49:48 +0000712 while( *z ){
shane43d9cb22009-10-21 14:11:48 +0000713 for(i=0; z[i]
714 && z[i]!='<'
715 && z[i]!='&'
716 && z[i]!='>'
717 && z[i]!='\"'
718 && z[i]!='\'';
719 i++){}
drhc08a4f12000-06-15 16:49:48 +0000720 if( i>0 ){
721 fprintf(out,"%.*s",i,z);
722 }
723 if( z[i]=='<' ){
724 fprintf(out,"&lt;");
725 }else if( z[i]=='&' ){
726 fprintf(out,"&amp;");
shane43d9cb22009-10-21 14:11:48 +0000727 }else if( z[i]=='>' ){
728 fprintf(out,"&gt;");
729 }else if( z[i]=='\"' ){
730 fprintf(out,"&quot;");
731 }else if( z[i]=='\'' ){
732 fprintf(out,"&#39;");
drhc08a4f12000-06-15 16:49:48 +0000733 }else{
734 break;
735 }
736 z += i + 1;
737 }
738}
739
740/*
drhc49f44e2006-10-26 18:15:42 +0000741** If a field contains any character identified by a 1 in the following
742** array, then the string must be quoted for CSV.
743*/
744static const char needCsvQuote[] = {
745 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
746 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
747 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
748 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
749 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
750 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
751 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
752 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
753 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
754 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
755 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
756 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
757 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
758 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
759 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
760 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
761};
762
763/*
mistachkindd11f2d2014-12-11 04:49:46 +0000764** Output a single term of CSV. Actually, p->colSeparator is used for
mistachkin44b99f72014-12-11 03:29:14 +0000765** the separator, which may or may not be a comma. p->nullValue is
drh6976c212014-07-24 12:09:47 +0000766** the null value. Strings are quoted if necessary. The separator
767** is only issued if bSep is true.
drh8e64d1c2004-10-07 00:32:39 +0000768*/
drhdcd87a92014-08-18 13:45:42 +0000769static void output_csv(ShellState *p, const char *z, int bSep){
drhc49f44e2006-10-26 18:15:42 +0000770 FILE *out = p->out;
drh8e64d1c2004-10-07 00:32:39 +0000771 if( z==0 ){
mistachkin44b99f72014-12-11 03:29:14 +0000772 fprintf(out,"%s",p->nullValue);
drh8e64d1c2004-10-07 00:32:39 +0000773 }else{
drhc49f44e2006-10-26 18:15:42 +0000774 int i;
mistachkin636bf9f2014-07-19 20:15:16 +0000775 int nSep = strlen30(p->colSeparator);
drhc49f44e2006-10-26 18:15:42 +0000776 for(i=0; z[i]; i++){
drhc85375d2007-12-18 15:41:44 +0000777 if( needCsvQuote[((unsigned char*)z)[i]]
mistachkin636bf9f2014-07-19 20:15:16 +0000778 || (z[i]==p->colSeparator[0] &&
779 (nSep==1 || memcmp(z, p->colSeparator, nSep)==0)) ){
drhc49f44e2006-10-26 18:15:42 +0000780 i = 0;
781 break;
782 }
783 }
784 if( i==0 ){
785 putc('"', out);
786 for(i=0; z[i]; i++){
787 if( z[i]=='"' ) putc('"', out);
788 putc(z[i], out);
789 }
790 putc('"', out);
791 }else{
792 fprintf(out, "%s", z);
793 }
drh8e64d1c2004-10-07 00:32:39 +0000794 }
795 if( bSep ){
mistachkin636bf9f2014-07-19 20:15:16 +0000796 fprintf(p->out, "%s", p->colSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000797 }
798}
799
danielk19774af00c62005-01-23 23:43:21 +0000800#ifdef SIGINT
drh8e64d1c2004-10-07 00:32:39 +0000801/*
drh4c504392000-10-16 22:06:40 +0000802** This routine runs when the user presses Ctrl-C
803*/
804static void interrupt_handler(int NotUsed){
drh902b9ee2008-12-05 17:17:07 +0000805 UNUSED_PARAMETER(NotUsed);
drh43ae8f62014-05-23 12:03:47 +0000806 seenInterrupt++;
807 if( seenInterrupt>2 ) exit(1);
mistachkin8e189222015-04-19 21:43:16 +0000808 if( globalDb ) sqlite3_interrupt(globalDb);
drh4c504392000-10-16 22:06:40 +0000809}
danielk19774af00c62005-01-23 23:43:21 +0000810#endif
drh4c504392000-10-16 22:06:40 +0000811
812/*
shane626a6e42009-10-22 17:30:15 +0000813** This is the callback routine that the shell
drh75897232000-05-29 14:26:00 +0000814** invokes for each row of a query result.
815*/
drh4ace5362014-11-10 14:42:28 +0000816static int shell_callback(
817 void *pArg,
818 int nArg, /* Number of result columns */
819 char **azArg, /* Text of each result column */
820 char **azCol, /* Column names */
821 int *aiType /* Column types */
822){
drh75897232000-05-29 14:26:00 +0000823 int i;
drhdcd87a92014-08-18 13:45:42 +0000824 ShellState *p = (ShellState*)pArg;
shaneb9fc17d2009-10-22 21:23:35 +0000825
drh75897232000-05-29 14:26:00 +0000826 switch( p->mode ){
827 case MODE_Line: {
drhe3710332000-09-29 13:30:53 +0000828 int w = 5;
drh6a535342001-10-19 16:44:56 +0000829 if( azArg==0 ) break;
drhe3710332000-09-29 13:30:53 +0000830 for(i=0; i<nArg; i++){
drh4f21c4a2008-12-10 22:15:00 +0000831 int len = strlen30(azCol[i] ? azCol[i] : "");
drhe3710332000-09-29 13:30:53 +0000832 if( len>w ) w = len;
833 }
mistachkin636bf9f2014-07-19 20:15:16 +0000834 if( p->cnt++>0 ) fprintf(p->out, "%s", p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000835 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000836 fprintf(p->out,"%*s = %s%s", w, azCol[i],
mistachkin44b99f72014-12-11 03:29:14 +0000837 azArg[i] ? azArg[i] : p->nullValue, p->rowSeparator);
drh75897232000-05-29 14:26:00 +0000838 }
839 break;
840 }
danielk19770d78bae2008-01-03 07:09:48 +0000841 case MODE_Explain:
drh75897232000-05-29 14:26:00 +0000842 case MODE_Column: {
drha0c66f52000-07-29 13:20:21 +0000843 if( p->cnt++==0 ){
drh75897232000-05-29 14:26:00 +0000844 for(i=0; i<nArg; i++){
drha0c66f52000-07-29 13:20:21 +0000845 int w, n;
846 if( i<ArraySize(p->colWidth) ){
danielk19770d78bae2008-01-03 07:09:48 +0000847 w = p->colWidth[i];
drh75897232000-05-29 14:26:00 +0000848 }else{
danielk19770d78bae2008-01-03 07:09:48 +0000849 w = 0;
drh75897232000-05-29 14:26:00 +0000850 }
drh078b1fd2012-09-21 13:40:02 +0000851 if( w==0 ){
drh4f21c4a2008-12-10 22:15:00 +0000852 w = strlen30(azCol[i] ? azCol[i] : "");
drha0c66f52000-07-29 13:20:21 +0000853 if( w<10 ) w = 10;
mistachkin44b99f72014-12-11 03:29:14 +0000854 n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullValue);
drha0c66f52000-07-29 13:20:21 +0000855 if( w<n ) w = n;
856 }
857 if( i<ArraySize(p->actualWidth) ){
persicom1d0b8722002-04-18 02:53:04 +0000858 p->actualWidth[i] = w;
drha0c66f52000-07-29 13:20:21 +0000859 }
860 if( p->showHeader ){
drh078b1fd2012-09-21 13:40:02 +0000861 if( w<0 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000862 fprintf(p->out,"%*.*s%s",-w,-w,azCol[i],
863 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000864 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000865 fprintf(p->out,"%-*.*s%s",w,w,azCol[i],
866 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000867 }
drha0c66f52000-07-29 13:20:21 +0000868 }
869 }
870 if( p->showHeader ){
871 for(i=0; i<nArg; i++){
872 int w;
873 if( i<ArraySize(p->actualWidth) ){
874 w = p->actualWidth[i];
drh078b1fd2012-09-21 13:40:02 +0000875 if( w<0 ) w = -w;
drha0c66f52000-07-29 13:20:21 +0000876 }else{
877 w = 10;
878 }
879 fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------"
880 "----------------------------------------------------------",
mistachkin636bf9f2014-07-19 20:15:16 +0000881 i==nArg-1 ? p->rowSeparator : " ");
drha0c66f52000-07-29 13:20:21 +0000882 }
drh75897232000-05-29 14:26:00 +0000883 }
884 }
drh6a535342001-10-19 16:44:56 +0000885 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000886 for(i=0; i<nArg; i++){
887 int w;
drha0c66f52000-07-29 13:20:21 +0000888 if( i<ArraySize(p->actualWidth) ){
889 w = p->actualWidth[i];
drh75897232000-05-29 14:26:00 +0000890 }else{
891 w = 10;
892 }
dana98bf362013-11-13 18:35:01 +0000893 if( p->mode==MODE_Explain && azArg[i] && strlen30(azArg[i])>w ){
drh4f21c4a2008-12-10 22:15:00 +0000894 w = strlen30(azArg[i]);
danielk19770d78bae2008-01-03 07:09:48 +0000895 }
dana98bf362013-11-13 18:35:01 +0000896 if( i==1 && p->aiIndent && p->pStmt ){
danc4650bb2013-11-18 08:41:06 +0000897 if( p->iIndent<p->nIndent ){
898 fprintf(p->out, "%*.s", p->aiIndent[p->iIndent], "");
dana98bf362013-11-13 18:35:01 +0000899 }
danc4650bb2013-11-18 08:41:06 +0000900 p->iIndent++;
dana98bf362013-11-13 18:35:01 +0000901 }
drh078b1fd2012-09-21 13:40:02 +0000902 if( w<0 ){
903 fprintf(p->out,"%*.*s%s",-w,-w,
mistachkin44b99f72014-12-11 03:29:14 +0000904 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000905 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000906 }else{
907 fprintf(p->out,"%-*.*s%s",w,w,
mistachkin44b99f72014-12-11 03:29:14 +0000908 azArg[i] ? azArg[i] : p->nullValue,
mistachkin636bf9f2014-07-19 20:15:16 +0000909 i==nArg-1 ? p->rowSeparator : " ");
drh078b1fd2012-09-21 13:40:02 +0000910 }
drh75897232000-05-29 14:26:00 +0000911 }
912 break;
913 }
drhe3710332000-09-29 13:30:53 +0000914 case MODE_Semi:
drh75897232000-05-29 14:26:00 +0000915 case MODE_List: {
916 if( p->cnt++==0 && p->showHeader ){
917 for(i=0; i<nArg; i++){
mistachkin636bf9f2014-07-19 20:15:16 +0000918 fprintf(p->out,"%s%s",azCol[i],
919 i==nArg-1 ? p->rowSeparator : p->colSeparator);
drh75897232000-05-29 14:26:00 +0000920 }
921 }
drh6a535342001-10-19 16:44:56 +0000922 if( azArg==0 ) break;
drh75897232000-05-29 14:26:00 +0000923 for(i=0; i<nArg; i++){
drh4c653a02000-06-07 01:27:47 +0000924 char *z = azArg[i];
mistachkin44b99f72014-12-11 03:29:14 +0000925 if( z==0 ) z = p->nullValue;
drh71172c52002-01-24 00:00:21 +0000926 fprintf(p->out, "%s", z);
drhe3710332000-09-29 13:30:53 +0000927 if( i<nArg-1 ){
mistachkin636bf9f2014-07-19 20:15:16 +0000928 fprintf(p->out, "%s", p->colSeparator);
drhe3710332000-09-29 13:30:53 +0000929 }else if( p->mode==MODE_Semi ){
mistachkin636bf9f2014-07-19 20:15:16 +0000930 fprintf(p->out, ";%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000931 }else{
mistachkin636bf9f2014-07-19 20:15:16 +0000932 fprintf(p->out, "%s", p->rowSeparator);
drhe3710332000-09-29 13:30:53 +0000933 }
drh75897232000-05-29 14:26:00 +0000934 }
935 break;
936 }
drh1e5d0e92000-05-31 23:33:17 +0000937 case MODE_Html: {
938 if( p->cnt++==0 && p->showHeader ){
mihailim57c591a2008-06-23 21:26:05 +0000939 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000940 for(i=0; i<nArg; i++){
shane43d9cb22009-10-21 14:11:48 +0000941 fprintf(p->out,"<TH>");
942 output_html_string(p->out, azCol[i]);
943 fprintf(p->out,"</TH>\n");
drh1e5d0e92000-05-31 23:33:17 +0000944 }
mihailim57c591a2008-06-23 21:26:05 +0000945 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000946 }
drh6a535342001-10-19 16:44:56 +0000947 if( azArg==0 ) break;
mihailim57c591a2008-06-23 21:26:05 +0000948 fprintf(p->out,"<TR>");
drh1e5d0e92000-05-31 23:33:17 +0000949 for(i=0; i<nArg; i++){
mihailim57c591a2008-06-23 21:26:05 +0000950 fprintf(p->out,"<TD>");
mistachkin44b99f72014-12-11 03:29:14 +0000951 output_html_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mihailim57c591a2008-06-23 21:26:05 +0000952 fprintf(p->out,"</TD>\n");
drh1e5d0e92000-05-31 23:33:17 +0000953 }
mihailim57c591a2008-06-23 21:26:05 +0000954 fprintf(p->out,"</TR>\n");
drh1e5d0e92000-05-31 23:33:17 +0000955 break;
956 }
drhfeac5f82004-08-01 00:10:45 +0000957 case MODE_Tcl: {
958 if( p->cnt++==0 && p->showHeader ){
959 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000960 output_c_string(p->out,azCol[i] ? azCol[i] : "");
mistachkin636bf9f2014-07-19 20:15:16 +0000961 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000962 }
mistachkin636bf9f2014-07-19 20:15:16 +0000963 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000964 }
965 if( azArg==0 ) break;
966 for(i=0; i<nArg; i++){
mistachkin44b99f72014-12-11 03:29:14 +0000967 output_c_string(p->out, azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +0000968 if(i<nArg-1) fprintf(p->out, "%s", p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +0000969 }
mistachkin636bf9f2014-07-19 20:15:16 +0000970 fprintf(p->out, "%s", p->rowSeparator);
drhfeac5f82004-08-01 00:10:45 +0000971 break;
972 }
drh8e64d1c2004-10-07 00:32:39 +0000973 case MODE_Csv: {
drh047d4532015-01-18 20:30:23 +0000974 setBinaryMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +0000975 if( p->cnt++==0 && p->showHeader ){
976 for(i=0; i<nArg; i++){
drh2cc55692006-06-27 20:39:04 +0000977 output_csv(p, azCol[i] ? azCol[i] : "", i<nArg-1);
drh8e64d1c2004-10-07 00:32:39 +0000978 }
mistachkine0d68852014-12-11 03:12:33 +0000979 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000980 }
drh40253262014-10-17 21:35:05 +0000981 if( nArg>0 ){
drh6976c212014-07-24 12:09:47 +0000982 for(i=0; i<nArg; i++){
983 output_csv(p, azArg[i], i<nArg-1);
984 }
mistachkine0d68852014-12-11 03:12:33 +0000985 fprintf(p->out, "%s", p->rowSeparator);
drh8e64d1c2004-10-07 00:32:39 +0000986 }
drh047d4532015-01-18 20:30:23 +0000987 setTextMode(p->out);
drh8e64d1c2004-10-07 00:32:39 +0000988 break;
989 }
drh28bd4bc2000-06-15 15:57:22 +0000990 case MODE_Insert: {
shaneb9fc17d2009-10-22 21:23:35 +0000991 p->cnt++;
drh6a535342001-10-19 16:44:56 +0000992 if( azArg==0 ) break;
drh33048c02001-10-01 14:29:22 +0000993 fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable);
drh28bd4bc2000-06-15 15:57:22 +0000994 for(i=0; i<nArg; i++){
995 char *zSep = i>0 ? ",": "";
shanead6b8d02009-10-22 18:12:58 +0000996 if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){
drh28bd4bc2000-06-15 15:57:22 +0000997 fprintf(p->out,"%sNULL",zSep);
shanead6b8d02009-10-22 18:12:58 +0000998 }else if( aiType && aiType[i]==SQLITE_TEXT ){
999 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1000 output_quoted_string(p->out, azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00001001 }else if( aiType && (aiType[i]==SQLITE_INTEGER
1002 || aiType[i]==SQLITE_FLOAT) ){
shanead6b8d02009-10-22 18:12:58 +00001003 fprintf(p->out,"%s%s",zSep, azArg[i]);
shane626a6e42009-10-22 17:30:15 +00001004 }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){
1005 const void *pBlob = sqlite3_column_blob(p->pStmt, i);
1006 int nBlob = sqlite3_column_bytes(p->pStmt, i);
1007 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1008 output_hex_blob(p->out, pBlob, nBlob);
drhc8d74412004-08-31 23:41:26 +00001009 }else if( isNumber(azArg[i], 0) ){
drh28bd4bc2000-06-15 15:57:22 +00001010 fprintf(p->out,"%s%s",zSep, azArg[i]);
1011 }else{
1012 if( zSep[0] ) fprintf(p->out,"%s",zSep);
1013 output_quoted_string(p->out, azArg[i]);
1014 }
1015 }
1016 fprintf(p->out,");\n");
drh6a535342001-10-19 16:44:56 +00001017 break;
drh28bd4bc2000-06-15 15:57:22 +00001018 }
mistachkin636bf9f2014-07-19 20:15:16 +00001019 case MODE_Ascii: {
1020 if( p->cnt++==0 && p->showHeader ){
1021 for(i=0; i<nArg; i++){
1022 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
1023 fprintf(p->out,"%s",azCol[i] ? azCol[i] : "");
1024 }
1025 fprintf(p->out, "%s", p->rowSeparator);
1026 }
1027 if( azArg==0 ) break;
1028 for(i=0; i<nArg; i++){
1029 if( i>0 ) fprintf(p->out, "%s", p->colSeparator);
mistachkin44b99f72014-12-11 03:29:14 +00001030 fprintf(p->out,"%s",azArg[i] ? azArg[i] : p->nullValue);
mistachkin636bf9f2014-07-19 20:15:16 +00001031 }
1032 fprintf(p->out, "%s", p->rowSeparator);
1033 break;
1034 }
persicom1d0b8722002-04-18 02:53:04 +00001035 }
drh75897232000-05-29 14:26:00 +00001036 return 0;
1037}
1038
1039/*
shane626a6e42009-10-22 17:30:15 +00001040** This is the callback routine that the SQLite library
1041** invokes for each row of a query result.
1042*/
1043static int callback(void *pArg, int nArg, char **azArg, char **azCol){
1044 /* since we don't have type info, call the shell_callback with a NULL value */
1045 return shell_callback(pArg, nArg, azArg, azCol, NULL);
1046}
1047
1048/*
drhdcd87a92014-08-18 13:45:42 +00001049** Set the destination table field of the ShellState structure to
drh33048c02001-10-01 14:29:22 +00001050** the name of the table given. Escape any quote characters in the
1051** table name.
1052*/
drhdcd87a92014-08-18 13:45:42 +00001053static void set_table_name(ShellState *p, const char *zName){
drh33048c02001-10-01 14:29:22 +00001054 int i, n;
1055 int needQuote;
1056 char *z;
1057
1058 if( p->zDestTable ){
1059 free(p->zDestTable);
1060 p->zDestTable = 0;
1061 }
1062 if( zName==0 ) return;
drh4c755c02004-08-08 20:22:17 +00001063 needQuote = !isalpha((unsigned char)*zName) && *zName!='_';
drh33048c02001-10-01 14:29:22 +00001064 for(i=n=0; zName[i]; i++, n++){
drh4c755c02004-08-08 20:22:17 +00001065 if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){
drh33048c02001-10-01 14:29:22 +00001066 needQuote = 1;
1067 if( zName[i]=='\'' ) n++;
1068 }
1069 }
1070 if( needQuote ) n += 2;
1071 z = p->zDestTable = malloc( n+1 );
1072 if( z==0 ){
shane86f5bdb2009-10-24 02:00:07 +00001073 fprintf(stderr,"Error: out of memory\n");
drh33048c02001-10-01 14:29:22 +00001074 exit(1);
1075 }
1076 n = 0;
1077 if( needQuote ) z[n++] = '\'';
1078 for(i=0; zName[i]; i++){
1079 z[n++] = zName[i];
1080 if( zName[i]=='\'' ) z[n++] = '\'';
1081 }
1082 if( needQuote ) z[n++] = '\'';
1083 z[n] = 0;
1084}
1085
danielk19772a02e332004-06-05 08:04:36 +00001086/* zIn is either a pointer to a NULL-terminated string in memory obtained
1087** from malloc(), or a NULL pointer. The string pointed to by zAppend is
1088** added to zIn, and the result returned in memory obtained from malloc().
1089** zIn, if it was not NULL, is freed.
1090**
1091** If the third argument, quote, is not '\0', then it is used as a
1092** quote character for zAppend.
1093*/
drhc28490c2006-10-26 14:25:58 +00001094static char *appendText(char *zIn, char const *zAppend, char quote){
danielk19772a02e332004-06-05 08:04:36 +00001095 int len;
1096 int i;
drh4f21c4a2008-12-10 22:15:00 +00001097 int nAppend = strlen30(zAppend);
1098 int nIn = (zIn?strlen30(zIn):0);
danielk19772a02e332004-06-05 08:04:36 +00001099
1100 len = nAppend+nIn+1;
1101 if( quote ){
1102 len += 2;
1103 for(i=0; i<nAppend; i++){
1104 if( zAppend[i]==quote ) len++;
1105 }
1106 }
1107
1108 zIn = (char *)realloc(zIn, len);
1109 if( !zIn ){
1110 return 0;
1111 }
1112
1113 if( quote ){
1114 char *zCsr = &zIn[nIn];
1115 *zCsr++ = quote;
1116 for(i=0; i<nAppend; i++){
1117 *zCsr++ = zAppend[i];
1118 if( zAppend[i]==quote ) *zCsr++ = quote;
1119 }
1120 *zCsr++ = quote;
1121 *zCsr++ = '\0';
1122 assert( (zCsr-zIn)==len );
1123 }else{
1124 memcpy(&zIn[nIn], zAppend, nAppend);
1125 zIn[len-1] = '\0';
1126 }
1127
1128 return zIn;
1129}
1130
drhdd3d4592004-08-30 01:54:05 +00001131
1132/*
drhb21a8e42012-01-28 21:08:51 +00001133** Execute a query statement that will generate SQL output. Print
1134** the result columns, comma-separated, on a line and then add a
1135** semicolon terminator to the end of that line.
drh45e29d82006-11-20 16:21:10 +00001136**
drhb21a8e42012-01-28 21:08:51 +00001137** If the number of columns is 1 and that column contains text "--"
1138** then write the semicolon on a separate line. That way, if a
1139** "--" comment occurs at the end of the statement, the comment
1140** won't consume the semicolon terminator.
drhdd3d4592004-08-30 01:54:05 +00001141*/
drh157e29a2009-05-21 15:15:00 +00001142static int run_table_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001143 ShellState *p, /* Query context */
drh2f464a02011-10-13 00:41:49 +00001144 const char *zSelect, /* SELECT statement to extract content */
1145 const char *zFirstRow /* Print before first row, if not NULL */
drh157e29a2009-05-21 15:15:00 +00001146){
drhdd3d4592004-08-30 01:54:05 +00001147 sqlite3_stmt *pSelect;
1148 int rc;
drhb21a8e42012-01-28 21:08:51 +00001149 int nResult;
1150 int i;
1151 const char *z;
drhc7181902014-02-27 15:04:13 +00001152 rc = sqlite3_prepare_v2(p->db, zSelect, -1, &pSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001153 if( rc!=SQLITE_OK || !pSelect ){
drh2f464a02011-10-13 00:41:49 +00001154 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001155 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drhdd3d4592004-08-30 01:54:05 +00001156 return rc;
1157 }
1158 rc = sqlite3_step(pSelect);
drhb21a8e42012-01-28 21:08:51 +00001159 nResult = sqlite3_column_count(pSelect);
drhdd3d4592004-08-30 01:54:05 +00001160 while( rc==SQLITE_ROW ){
drh157e29a2009-05-21 15:15:00 +00001161 if( zFirstRow ){
drh2f464a02011-10-13 00:41:49 +00001162 fprintf(p->out, "%s", zFirstRow);
drh157e29a2009-05-21 15:15:00 +00001163 zFirstRow = 0;
1164 }
drhb21a8e42012-01-28 21:08:51 +00001165 z = (const char*)sqlite3_column_text(pSelect, 0);
1166 fprintf(p->out, "%s", z);
1167 for(i=1; i<nResult; i++){
1168 fprintf(p->out, ",%s", sqlite3_column_text(pSelect, i));
1169 }
1170 if( z==0 ) z = "";
1171 while( z[0] && (z[0]!='-' || z[1]!='-') ) z++;
1172 if( z[0] ){
1173 fprintf(p->out, "\n;\n");
1174 }else{
1175 fprintf(p->out, ";\n");
1176 }
drhdd3d4592004-08-30 01:54:05 +00001177 rc = sqlite3_step(pSelect);
1178 }
drh2f464a02011-10-13 00:41:49 +00001179 rc = sqlite3_finalize(pSelect);
1180 if( rc!=SQLITE_OK ){
1181 fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db));
drh4384e982013-10-01 15:30:05 +00001182 if( (rc&0xff)!=SQLITE_CORRUPT ) p->nErr++;
drh2f464a02011-10-13 00:41:49 +00001183 }
1184 return rc;
drhdd3d4592004-08-30 01:54:05 +00001185}
1186
shane626a6e42009-10-22 17:30:15 +00001187/*
1188** Allocate space and save off current error string.
1189*/
1190static char *save_err_msg(
1191 sqlite3 *db /* Database to query */
1192){
1193 int nErrMsg = 1+strlen30(sqlite3_errmsg(db));
1194 char *zErrMsg = sqlite3_malloc(nErrMsg);
1195 if( zErrMsg ){
1196 memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg);
1197 }
1198 return zErrMsg;
1199}
1200
1201/*
shaneh642d8b82010-07-28 16:05:34 +00001202** Display memory stats.
1203*/
1204static int display_stats(
1205 sqlite3 *db, /* Database to query */
drhdcd87a92014-08-18 13:45:42 +00001206 ShellState *pArg, /* Pointer to ShellState */
shaneh642d8b82010-07-28 16:05:34 +00001207 int bReset /* True to reset the stats */
1208){
1209 int iCur;
1210 int iHiwtr;
1211
1212 if( pArg && pArg->out ){
1213
1214 iHiwtr = iCur = -1;
1215 sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001216 fprintf(pArg->out,
1217 "Memory Used: %d (max %d) bytes\n",
1218 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001219 iHiwtr = iCur = -1;
1220 sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001221 fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n",
1222 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001223 if( pArg->shellFlgs & SHFLG_Pagecache ){
1224 iHiwtr = iCur = -1;
1225 sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001226 fprintf(pArg->out,
1227 "Number of Pcache Pages Used: %d (max %d) pages\n",
1228 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001229 }
shaneh642d8b82010-07-28 16:05:34 +00001230 iHiwtr = iCur = -1;
1231 sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001232 fprintf(pArg->out,
1233 "Number of Pcache Overflow Bytes: %d (max %d) bytes\n",
1234 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001235 if( pArg->shellFlgs & SHFLG_Scratch ){
1236 iHiwtr = iCur = -1;
1237 sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001238 fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n",
1239 iCur, iHiwtr);
drh44dec872014-08-30 15:49:25 +00001240 }
shaneh642d8b82010-07-28 16:05:34 +00001241 iHiwtr = iCur = -1;
1242 sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001243 fprintf(pArg->out,
1244 "Number of Scratch Overflow Bytes: %d (max %d) bytes\n",
1245 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001246 iHiwtr = iCur = -1;
1247 sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001248 fprintf(pArg->out, "Largest Allocation: %d bytes\n",
1249 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001250 iHiwtr = iCur = -1;
1251 sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001252 fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n",
1253 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001254 iHiwtr = iCur = -1;
1255 sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001256 fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n",
1257 iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001258#ifdef YYTRACKMAXSTACKDEPTH
1259 iHiwtr = iCur = -1;
1260 sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001261 fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n",
1262 iCur, iHiwtr);
shaneh642d8b82010-07-28 16:05:34 +00001263#endif
1264 }
1265
1266 if( pArg && pArg->out && db ){
drh44dec872014-08-30 15:49:25 +00001267 if( pArg->shellFlgs & SHFLG_Lookaside ){
1268 iHiwtr = iCur = -1;
drh4ace5362014-11-10 14:42:28 +00001269 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED,
1270 &iCur, &iHiwtr, bReset);
1271 fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n",
1272 iCur, iHiwtr);
1273 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT,
1274 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001275 fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001276 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE,
1277 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001278 fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr);
drh4ace5362014-11-10 14:42:28 +00001279 sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL,
1280 &iCur, &iHiwtr, bReset);
drh44dec872014-08-30 15:49:25 +00001281 fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr);
1282 }
shaneh642d8b82010-07-28 16:05:34 +00001283 iHiwtr = iCur = -1;
1284 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001285 fprintf(pArg->out, "Pager Heap Usage: %d bytes\n",iCur);
1286 iHiwtr = iCur = -1;
drhc78e6e42011-09-23 18:58:23 +00001287 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1);
1288 fprintf(pArg->out, "Page cache hits: %d\n", iCur);
1289 iHiwtr = iCur = -1;
1290 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1);
1291 fprintf(pArg->out, "Page cache misses: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001292 iHiwtr = iCur = -1;
drhfbbcd5d2012-03-24 20:09:33 +00001293 sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_WRITE, &iCur, &iHiwtr, 1);
1294 fprintf(pArg->out, "Page cache writes: %d\n", iCur);
1295 iHiwtr = iCur = -1;
shaneh642d8b82010-07-28 16:05:34 +00001296 sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001297 fprintf(pArg->out, "Schema Heap Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001298 iHiwtr = iCur = -1;
1299 sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset);
drh4ace5362014-11-10 14:42:28 +00001300 fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n",iCur);
shaneh642d8b82010-07-28 16:05:34 +00001301 }
1302
1303 if( pArg && pArg->out && db && pArg->pStmt ){
drh4ace5362014-11-10 14:42:28 +00001304 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP,
1305 bReset);
shaneh642d8b82010-07-28 16:05:34 +00001306 fprintf(pArg->out, "Fullscan Steps: %d\n", iCur);
1307 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset);
1308 fprintf(pArg->out, "Sort Operations: %d\n", iCur);
drh4ace5362014-11-10 14:42:28 +00001309 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX,bReset);
shaneh642d8b82010-07-28 16:05:34 +00001310 fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur);
drhbf159fa2013-06-25 22:01:22 +00001311 iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset);
1312 fprintf(pArg->out, "Virtual Machine Steps: %d\n", iCur);
shaneh642d8b82010-07-28 16:05:34 +00001313 }
1314
1315 return 0;
1316}
1317
1318/*
dan8d1edb92014-11-05 09:07:28 +00001319** Display scan stats.
1320*/
1321static void display_scanstats(
1322 sqlite3 *db, /* Database to query */
1323 ShellState *pArg /* Pointer to ShellState */
1324){
1325#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
drh15f23c22014-11-06 12:46:16 +00001326 int i, k, n, mx;
dan8d1edb92014-11-05 09:07:28 +00001327 fprintf(pArg->out, "-------- scanstats --------\n");
drh15f23c22014-11-06 12:46:16 +00001328 mx = 0;
1329 for(k=0; k<=mx; k++){
drh42f30bc2014-11-06 12:08:21 +00001330 double rEstLoop = 1.0;
1331 for(i=n=0; 1; i++){
1332 sqlite3_stmt *p = pArg->pStmt;
1333 sqlite3_int64 nLoop, nVisit;
1334 double rEst;
1335 int iSid;
1336 const char *zExplain;
1337 if( sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NLOOP, (void*)&nLoop) ){
1338 break;
1339 }
1340 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_SELECTID, (void*)&iSid);
drh15f23c22014-11-06 12:46:16 +00001341 if( iSid>mx ) mx = iSid;
drh42f30bc2014-11-06 12:08:21 +00001342 if( iSid!=k ) continue;
drh179bac32014-11-06 12:17:24 +00001343 if( n==0 ){
1344 rEstLoop = (double)nLoop;
drh15f23c22014-11-06 12:46:16 +00001345 if( k>0 ) fprintf(pArg->out, "-------- subquery %d -------\n", k);
drh179bac32014-11-06 12:17:24 +00001346 }
drh42f30bc2014-11-06 12:08:21 +00001347 n++;
1348 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_NVISIT, (void*)&nVisit);
1349 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EST, (void*)&rEst);
1350 sqlite3_stmt_scanstatus(p, i, SQLITE_SCANSTAT_EXPLAIN, (void*)&zExplain);
1351 fprintf(pArg->out, "Loop %2d: %s\n", n, zExplain);
1352 rEstLoop *= rEst;
drh4ace5362014-11-10 14:42:28 +00001353 fprintf(pArg->out,
1354 " nLoop=%-8lld nRow=%-8lld estRow=%-8lld estRow/Loop=%-8g\n",
drh9a06d302014-11-07 13:52:44 +00001355 nLoop, nVisit, (sqlite3_int64)(rEstLoop+0.5), rEst
drh42f30bc2014-11-06 12:08:21 +00001356 );
dan8d1edb92014-11-05 09:07:28 +00001357 }
dan8d1edb92014-11-05 09:07:28 +00001358 }
dan8d1edb92014-11-05 09:07:28 +00001359 fprintf(pArg->out, "---------------------------\n");
drh15f23c22014-11-06 12:46:16 +00001360#endif
dan8d1edb92014-11-05 09:07:28 +00001361}
1362
1363/*
dana98bf362013-11-13 18:35:01 +00001364** Parameter azArray points to a zero-terminated array of strings. zStr
1365** points to a single nul-terminated string. Return non-zero if zStr
1366** is equal, according to strcmp(), to any of the strings in the array.
1367** Otherwise, return zero.
1368*/
1369static int str_in_array(const char *zStr, const char **azArray){
1370 int i;
1371 for(i=0; azArray[i]; i++){
1372 if( 0==strcmp(zStr, azArray[i]) ) return 1;
1373 }
1374 return 0;
1375}
1376
1377/*
1378** If compiled statement pSql appears to be an EXPLAIN statement, allocate
drhdcd87a92014-08-18 13:45:42 +00001379** and populate the ShellState.aiIndent[] array with the number of
dana98bf362013-11-13 18:35:01 +00001380** spaces each opcode should be indented before it is output.
1381**
1382** The indenting rules are:
1383**
1384** * For each "Next", "Prev", "VNext" or "VPrev" instruction, indent
1385** all opcodes that occur between the p2 jump destination and the opcode
1386** itself by 2 spaces.
1387**
drh01752bc2013-11-14 23:59:33 +00001388** * For each "Goto", if the jump destination is earlier in the program
1389** and ends on one of:
drhe73f0592014-01-21 22:25:45 +00001390** Yield SeekGt SeekLt RowSetRead Rewind
drhfe705102014-03-06 13:38:37 +00001391** or if the P1 parameter is one instead of zero,
drh01752bc2013-11-14 23:59:33 +00001392** then indent all opcodes between the earlier instruction
drhd2447442013-11-13 19:01:41 +00001393** and "Goto" by 2 spaces.
dana98bf362013-11-13 18:35:01 +00001394*/
drhdcd87a92014-08-18 13:45:42 +00001395static void explain_data_prepare(ShellState *p, sqlite3_stmt *pSql){
dana98bf362013-11-13 18:35:01 +00001396 const char *zSql; /* The text of the SQL statement */
1397 const char *z; /* Used to check if this is an EXPLAIN */
1398 int *abYield = 0; /* True if op is an OP_Yield */
1399 int nAlloc = 0; /* Allocated size of p->aiIndent[], abYield */
danc4650bb2013-11-18 08:41:06 +00001400 int iOp; /* Index of operation in p->aiIndent[] */
dana98bf362013-11-13 18:35:01 +00001401
drh8ad0de32014-03-20 18:45:27 +00001402 const char *azNext[] = { "Next", "Prev", "VPrev", "VNext", "SorterNext",
1403 "NextIfOpen", "PrevIfOpen", 0 };
drh4ace5362014-11-10 14:42:28 +00001404 const char *azYield[] = { "Yield", "SeekLT", "SeekGT", "RowSetRead",
1405 "Rewind", 0 };
dana98bf362013-11-13 18:35:01 +00001406 const char *azGoto[] = { "Goto", 0 };
1407
1408 /* Try to figure out if this is really an EXPLAIN statement. If this
1409 ** cannot be verified, return early. */
1410 zSql = sqlite3_sql(pSql);
1411 if( zSql==0 ) return;
1412 for(z=zSql; *z==' ' || *z=='\t' || *z=='\n' || *z=='\f' || *z=='\r'; z++);
1413 if( sqlite3_strnicmp(z, "explain", 7) ) return;
1414
1415 for(iOp=0; SQLITE_ROW==sqlite3_step(pSql); iOp++){
1416 int i;
danc4650bb2013-11-18 08:41:06 +00001417 int iAddr = sqlite3_column_int(pSql, 0);
dana98bf362013-11-13 18:35:01 +00001418 const char *zOp = (const char*)sqlite3_column_text(pSql, 1);
danc4650bb2013-11-18 08:41:06 +00001419
1420 /* Set p2 to the P2 field of the current opcode. Then, assuming that
1421 ** p2 is an instruction address, set variable p2op to the index of that
1422 ** instruction in the aiIndent[] array. p2 and p2op may be different if
1423 ** the current instruction is part of a sub-program generated by an
1424 ** SQL trigger or foreign key. */
dana98bf362013-11-13 18:35:01 +00001425 int p2 = sqlite3_column_int(pSql, 3);
danc4650bb2013-11-18 08:41:06 +00001426 int p2op = (p2 + (iOp-iAddr));
dana98bf362013-11-13 18:35:01 +00001427
1428 /* Grow the p->aiIndent array as required */
1429 if( iOp>=nAlloc ){
1430 nAlloc += 100;
1431 p->aiIndent = (int*)sqlite3_realloc(p->aiIndent, nAlloc*sizeof(int));
1432 abYield = (int*)sqlite3_realloc(abYield, nAlloc*sizeof(int));
1433 }
1434 abYield[iOp] = str_in_array(zOp, azYield);
1435 p->aiIndent[iOp] = 0;
1436 p->nIndent = iOp+1;
1437
1438 if( str_in_array(zOp, azNext) ){
danc4650bb2013-11-18 08:41:06 +00001439 for(i=p2op; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001440 }
drhfe705102014-03-06 13:38:37 +00001441 if( str_in_array(zOp, azGoto) && p2op<p->nIndent
1442 && (abYield[p2op] || sqlite3_column_int(pSql, 2))
1443 ){
drhe73f0592014-01-21 22:25:45 +00001444 for(i=p2op+1; i<iOp; i++) p->aiIndent[i] += 2;
dana98bf362013-11-13 18:35:01 +00001445 }
1446 }
1447
danc4650bb2013-11-18 08:41:06 +00001448 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001449 sqlite3_free(abYield);
1450 sqlite3_reset(pSql);
1451}
1452
1453/*
1454** Free the array allocated by explain_data_prepare().
1455*/
drhdcd87a92014-08-18 13:45:42 +00001456static void explain_data_delete(ShellState *p){
dana98bf362013-11-13 18:35:01 +00001457 sqlite3_free(p->aiIndent);
1458 p->aiIndent = 0;
1459 p->nIndent = 0;
danc4650bb2013-11-18 08:41:06 +00001460 p->iIndent = 0;
dana98bf362013-11-13 18:35:01 +00001461}
1462
1463/*
shane626a6e42009-10-22 17:30:15 +00001464** Execute a statement or set of statements. Print
1465** any result rows/columns depending on the current mode
1466** set via the supplied callback.
1467**
1468** This is very similar to SQLite's built-in sqlite3_exec()
1469** function except it takes a slightly different callback
1470** and callback data argument.
1471*/
1472static int shell_exec(
drhdcd87a92014-08-18 13:45:42 +00001473 sqlite3 *db, /* An open database */
1474 const char *zSql, /* SQL to be evaluated */
shane626a6e42009-10-22 17:30:15 +00001475 int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */
drhdcd87a92014-08-18 13:45:42 +00001476 /* (not the same as sqlite3_exec) */
1477 ShellState *pArg, /* Pointer to ShellState */
1478 char **pzErrMsg /* Error msg written here */
shane626a6e42009-10-22 17:30:15 +00001479){
dan4564ced2010-01-05 04:59:56 +00001480 sqlite3_stmt *pStmt = NULL; /* Statement to execute. */
1481 int rc = SQLITE_OK; /* Return Code */
drhb07028f2011-10-14 21:49:18 +00001482 int rc2;
dan4564ced2010-01-05 04:59:56 +00001483 const char *zLeftover; /* Tail of unprocessed SQL */
shane626a6e42009-10-22 17:30:15 +00001484
1485 if( pzErrMsg ){
1486 *pzErrMsg = NULL;
1487 }
1488
shaneb9fc17d2009-10-22 21:23:35 +00001489 while( zSql[0] && (SQLITE_OK == rc) ){
1490 rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
1491 if( SQLITE_OK != rc ){
shane626a6e42009-10-22 17:30:15 +00001492 if( pzErrMsg ){
1493 *pzErrMsg = save_err_msg(db);
1494 }
1495 }else{
shaneb9fc17d2009-10-22 21:23:35 +00001496 if( !pStmt ){
1497 /* this happens for a comment or white-space */
1498 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001499 while( IsSpace(zSql[0]) ) zSql++;
shaneb9fc17d2009-10-22 21:23:35 +00001500 continue;
1501 }
shane626a6e42009-10-22 17:30:15 +00001502
shaneh642d8b82010-07-28 16:05:34 +00001503 /* save off the prepared statment handle and reset row count */
1504 if( pArg ){
1505 pArg->pStmt = pStmt;
1506 pArg->cnt = 0;
1507 }
1508
shanehb7977c52010-01-18 18:17:10 +00001509 /* echo the sql statement if echo on */
shaneh642d8b82010-07-28 16:05:34 +00001510 if( pArg && pArg->echoOn ){
drha8c62df2010-02-15 15:47:18 +00001511 const char *zStmtSql = sqlite3_sql(pStmt);
shaneh642d8b82010-07-28 16:05:34 +00001512 fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql);
drha8c62df2010-02-15 15:47:18 +00001513 }
shanehb7977c52010-01-18 18:17:10 +00001514
drhefbf3b12014-02-28 20:47:24 +00001515 /* Show the EXPLAIN QUERY PLAN if .eqp is on */
1516 if( pArg && pArg->autoEQP ){
1517 sqlite3_stmt *pExplain;
drh4ace5362014-11-10 14:42:28 +00001518 char *zEQP = sqlite3_mprintf("EXPLAIN QUERY PLAN %s",
1519 sqlite3_sql(pStmt));
drhefbf3b12014-02-28 20:47:24 +00001520 rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0);
1521 if( rc==SQLITE_OK ){
1522 while( sqlite3_step(pExplain)==SQLITE_ROW ){
1523 fprintf(pArg->out,"--EQP-- %d,", sqlite3_column_int(pExplain, 0));
1524 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 1));
1525 fprintf(pArg->out,"%d,", sqlite3_column_int(pExplain, 2));
1526 fprintf(pArg->out,"%s\n", sqlite3_column_text(pExplain, 3));
1527 }
1528 }
1529 sqlite3_finalize(pExplain);
1530 sqlite3_free(zEQP);
1531 }
1532
dana98bf362013-11-13 18:35:01 +00001533 /* If the shell is currently in ".explain" mode, gather the extra
1534 ** data required to add indents to the output.*/
drh0a305922013-11-21 23:37:02 +00001535 if( pArg && pArg->mode==MODE_Explain ){
dana98bf362013-11-13 18:35:01 +00001536 explain_data_prepare(pArg, pStmt);
1537 }
1538
shaneb9fc17d2009-10-22 21:23:35 +00001539 /* perform the first step. this will tell us if we
1540 ** have a result set or not and how wide it is.
1541 */
1542 rc = sqlite3_step(pStmt);
1543 /* if we have a result set... */
1544 if( SQLITE_ROW == rc ){
1545 /* if we have a callback... */
1546 if( xCallback ){
1547 /* allocate space for col name ptr, value ptr, and type */
1548 int nCol = sqlite3_column_count(pStmt);
1549 void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1);
1550 if( !pData ){
1551 rc = SQLITE_NOMEM;
1552 }else{
1553 char **azCols = (char **)pData; /* Names of result columns */
1554 char **azVals = &azCols[nCol]; /* Results */
1555 int *aiTypes = (int *)&azVals[nCol]; /* Result types */
drh55a1b302013-09-04 16:08:50 +00001556 int i, x;
shaneb9fc17d2009-10-22 21:23:35 +00001557 assert(sizeof(int) <= sizeof(char *));
1558 /* save off ptrs to column names */
1559 for(i=0; i<nCol; i++){
1560 azCols[i] = (char *)sqlite3_column_name(pStmt, i);
1561 }
shaneb9fc17d2009-10-22 21:23:35 +00001562 do{
1563 /* extract the data and data types */
1564 for(i=0; i<nCol; i++){
drh55a1b302013-09-04 16:08:50 +00001565 aiTypes[i] = x = sqlite3_column_type(pStmt, i);
drh3432daa2013-10-11 16:35:49 +00001566 if( x==SQLITE_BLOB && pArg && pArg->mode==MODE_Insert ){
drh55a1b302013-09-04 16:08:50 +00001567 azVals[i] = "";
1568 }else{
1569 azVals[i] = (char*)sqlite3_column_text(pStmt, i);
1570 }
shaneb9fc17d2009-10-22 21:23:35 +00001571 if( !azVals[i] && (aiTypes[i]!=SQLITE_NULL) ){
1572 rc = SQLITE_NOMEM;
1573 break; /* from for */
1574 }
1575 } /* end for */
1576
1577 /* if data and types extracted successfully... */
1578 if( SQLITE_ROW == rc ){
1579 /* call the supplied callback with the result row data */
1580 if( xCallback(pArg, nCol, azVals, azCols, aiTypes) ){
1581 rc = SQLITE_ABORT;
1582 }else{
1583 rc = sqlite3_step(pStmt);
1584 }
1585 }
1586 } while( SQLITE_ROW == rc );
1587 sqlite3_free(pData);
shaneb9fc17d2009-10-22 21:23:35 +00001588 }
1589 }else{
1590 do{
1591 rc = sqlite3_step(pStmt);
1592 } while( rc == SQLITE_ROW );
1593 }
1594 }
1595
dana98bf362013-11-13 18:35:01 +00001596 explain_data_delete(pArg);
1597
shaneh642d8b82010-07-28 16:05:34 +00001598 /* print usage stats if stats on */
1599 if( pArg && pArg->statsOn ){
1600 display_stats(db, pArg, 0);
1601 }
1602
dan8d1edb92014-11-05 09:07:28 +00001603 /* print loop-counters if required */
1604 if( pArg && pArg->scanstatsOn ){
1605 display_scanstats(db, pArg);
1606 }
1607
dan4564ced2010-01-05 04:59:56 +00001608 /* Finalize the statement just executed. If this fails, save a
1609 ** copy of the error message. Otherwise, set zSql to point to the
1610 ** next statement to execute. */
drhb07028f2011-10-14 21:49:18 +00001611 rc2 = sqlite3_finalize(pStmt);
1612 if( rc!=SQLITE_NOMEM ) rc = rc2;
dan4564ced2010-01-05 04:59:56 +00001613 if( rc==SQLITE_OK ){
shaneb9fc17d2009-10-22 21:23:35 +00001614 zSql = zLeftover;
drhf0693c82011-10-11 20:41:54 +00001615 while( IsSpace(zSql[0]) ) zSql++;
dan4564ced2010-01-05 04:59:56 +00001616 }else if( pzErrMsg ){
1617 *pzErrMsg = save_err_msg(db);
shane626a6e42009-10-22 17:30:15 +00001618 }
shaneh642d8b82010-07-28 16:05:34 +00001619
1620 /* clear saved stmt handle */
1621 if( pArg ){
1622 pArg->pStmt = NULL;
1623 }
shane626a6e42009-10-22 17:30:15 +00001624 }
shaneb9fc17d2009-10-22 21:23:35 +00001625 } /* end while */
shane626a6e42009-10-22 17:30:15 +00001626
1627 return rc;
1628}
1629
drhdd3d4592004-08-30 01:54:05 +00001630
drh33048c02001-10-01 14:29:22 +00001631/*
drh4c653a02000-06-07 01:27:47 +00001632** This is a different callback routine used for dumping the database.
1633** Each row received by this callback consists of a table name,
1634** the table type ("index" or "table") and SQL to create the table.
1635** This routine should print text sufficient to recreate the table.
1636*/
1637static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){
danielk19772a02e332004-06-05 08:04:36 +00001638 int rc;
1639 const char *zTable;
1640 const char *zType;
1641 const char *zSql;
drh157e29a2009-05-21 15:15:00 +00001642 const char *zPrepStmt = 0;
drhdcd87a92014-08-18 13:45:42 +00001643 ShellState *p = (ShellState *)pArg;
danielk19772a02e332004-06-05 08:04:36 +00001644
drh902b9ee2008-12-05 17:17:07 +00001645 UNUSED_PARAMETER(azCol);
drh4c653a02000-06-07 01:27:47 +00001646 if( nArg!=3 ) return 1;
danielk19772a02e332004-06-05 08:04:36 +00001647 zTable = azArg[0];
1648 zType = azArg[1];
1649 zSql = azArg[2];
1650
drh00b950d2005-09-11 02:03:03 +00001651 if( strcmp(zTable, "sqlite_sequence")==0 ){
drh157e29a2009-05-21 15:15:00 +00001652 zPrepStmt = "DELETE FROM sqlite_sequence;\n";
drh7ed10322013-08-07 16:04:27 +00001653 }else if( sqlite3_strglob("sqlite_stat?", zTable)==0 ){
drh00b950d2005-09-11 02:03:03 +00001654 fprintf(p->out, "ANALYZE sqlite_master;\n");
1655 }else if( strncmp(zTable, "sqlite_", 7)==0 ){
1656 return 0;
drh45e29d82006-11-20 16:21:10 +00001657 }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){
1658 char *zIns;
1659 if( !p->writableSchema ){
1660 fprintf(p->out, "PRAGMA writable_schema=ON;\n");
1661 p->writableSchema = 1;
1662 }
1663 zIns = sqlite3_mprintf(
1664 "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"
1665 "VALUES('table','%q','%q',0,'%q');",
1666 zTable, zTable, zSql);
1667 fprintf(p->out, "%s\n", zIns);
1668 sqlite3_free(zIns);
1669 return 0;
drh00b950d2005-09-11 02:03:03 +00001670 }else{
1671 fprintf(p->out, "%s;\n", zSql);
drhf8eb96a2005-02-03 00:42:34 +00001672 }
danielk19772a02e332004-06-05 08:04:36 +00001673
1674 if( strcmp(zType, "table")==0 ){
1675 sqlite3_stmt *pTableInfo = 0;
danielk19772a02e332004-06-05 08:04:36 +00001676 char *zSelect = 0;
1677 char *zTableInfo = 0;
1678 char *zTmp = 0;
drh157e29a2009-05-21 15:15:00 +00001679 int nRow = 0;
danielk19772a02e332004-06-05 08:04:36 +00001680
1681 zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0);
1682 zTableInfo = appendText(zTableInfo, zTable, '"');
1683 zTableInfo = appendText(zTableInfo, ");", 0);
1684
drhc7181902014-02-27 15:04:13 +00001685 rc = sqlite3_prepare_v2(p->db, zTableInfo, -1, &pTableInfo, 0);
drh157e29a2009-05-21 15:15:00 +00001686 free(zTableInfo);
danielk19772a02e332004-06-05 08:04:36 +00001687 if( rc!=SQLITE_OK || !pTableInfo ){
1688 return 1;
1689 }
1690
1691 zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0);
drhbf92ec02012-03-22 12:50:34 +00001692 /* Always quote the table name, even if it appears to be pure ascii,
1693 ** in case it is a keyword. Ex: INSERT INTO "table" ... */
1694 zTmp = appendText(zTmp, zTable, '"');
danielk19772a02e332004-06-05 08:04:36 +00001695 if( zTmp ){
1696 zSelect = appendText(zSelect, zTmp, '\'');
drh85e72432012-04-11 11:38:53 +00001697 free(zTmp);
danielk19772a02e332004-06-05 08:04:36 +00001698 }
1699 zSelect = appendText(zSelect, " || ' VALUES(' || ", 0);
1700 rc = sqlite3_step(pTableInfo);
1701 while( rc==SQLITE_ROW ){
danielk19772e588c72005-12-09 14:25:08 +00001702 const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1);
danielk19773f41e972004-06-08 00:39:01 +00001703 zSelect = appendText(zSelect, "quote(", 0);
danielk19772e588c72005-12-09 14:25:08 +00001704 zSelect = appendText(zSelect, zText, '"');
danielk19772a02e332004-06-05 08:04:36 +00001705 rc = sqlite3_step(pTableInfo);
1706 if( rc==SQLITE_ROW ){
drhb21a8e42012-01-28 21:08:51 +00001707 zSelect = appendText(zSelect, "), ", 0);
danielk19772a02e332004-06-05 08:04:36 +00001708 }else{
1709 zSelect = appendText(zSelect, ") ", 0);
1710 }
drh157e29a2009-05-21 15:15:00 +00001711 nRow++;
danielk19772a02e332004-06-05 08:04:36 +00001712 }
1713 rc = sqlite3_finalize(pTableInfo);
drh157e29a2009-05-21 15:15:00 +00001714 if( rc!=SQLITE_OK || nRow==0 ){
1715 free(zSelect);
danielk19772a02e332004-06-05 08:04:36 +00001716 return 1;
1717 }
1718 zSelect = appendText(zSelect, "|| ')' FROM ", 0);
1719 zSelect = appendText(zSelect, zTable, '"');
1720
drh2f464a02011-10-13 00:41:49 +00001721 rc = run_table_dump_query(p, zSelect, zPrepStmt);
drhdd3d4592004-08-30 01:54:05 +00001722 if( rc==SQLITE_CORRUPT ){
1723 zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0);
drh2f464a02011-10-13 00:41:49 +00001724 run_table_dump_query(p, zSelect, 0);
drhdd3d4592004-08-30 01:54:05 +00001725 }
drh85e72432012-04-11 11:38:53 +00001726 free(zSelect);
drh4c653a02000-06-07 01:27:47 +00001727 }
drh4c653a02000-06-07 01:27:47 +00001728 return 0;
1729}
1730
1731/*
drh45e29d82006-11-20 16:21:10 +00001732** Run zQuery. Use dump_callback() as the callback routine so that
1733** the contents of the query are output as SQL statements.
1734**
drhdd3d4592004-08-30 01:54:05 +00001735** If we get a SQLITE_CORRUPT error, rerun the query after appending
1736** "ORDER BY rowid DESC" to the end.
1737*/
1738static int run_schema_dump_query(
drhdcd87a92014-08-18 13:45:42 +00001739 ShellState *p,
drh2f464a02011-10-13 00:41:49 +00001740 const char *zQuery
drhdd3d4592004-08-30 01:54:05 +00001741){
1742 int rc;
drh2f464a02011-10-13 00:41:49 +00001743 char *zErr = 0;
1744 rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr);
drhdd3d4592004-08-30 01:54:05 +00001745 if( rc==SQLITE_CORRUPT ){
1746 char *zQ2;
drh4f21c4a2008-12-10 22:15:00 +00001747 int len = strlen30(zQuery);
drh2f464a02011-10-13 00:41:49 +00001748 fprintf(p->out, "/****** CORRUPTION ERROR *******/\n");
1749 if( zErr ){
1750 fprintf(p->out, "/****** %s ******/\n", zErr);
1751 sqlite3_free(zErr);
1752 zErr = 0;
1753 }
drhdd3d4592004-08-30 01:54:05 +00001754 zQ2 = malloc( len+100 );
1755 if( zQ2==0 ) return rc;
drh8c5058b2012-04-16 17:22:30 +00001756 sqlite3_snprintf(len+100, zQ2, "%s ORDER BY rowid DESC", zQuery);
drh2f464a02011-10-13 00:41:49 +00001757 rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr);
1758 if( rc ){
1759 fprintf(p->out, "/****** ERROR: %s ******/\n", zErr);
1760 }else{
1761 rc = SQLITE_CORRUPT;
1762 }
1763 sqlite3_free(zErr);
drhdd3d4592004-08-30 01:54:05 +00001764 free(zQ2);
1765 }
1766 return rc;
1767}
1768
1769/*
drh75897232000-05-29 14:26:00 +00001770** Text of a help message
1771*/
persicom1d0b8722002-04-18 02:53:04 +00001772static char zHelp[] =
drh9ff849f2009-02-04 20:55:57 +00001773 ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n"
drhc2ce0be2014-05-29 12:36:14 +00001774 ".bail on|off Stop after hitting an error. Default OFF\n"
drh4bbcf102014-02-06 02:46:08 +00001775 ".clone NEWDB Clone data into NEWDB from the existing database\n"
jplyon6a65bb32003-05-04 07:25:57 +00001776 ".databases List names and files of attached databases\n"
drh0e55db12015-02-06 14:51:13 +00001777 ".dbinfo ?DB? Show status information about the database\n"
drhb860bc92004-08-04 15:16:55 +00001778 ".dump ?TABLE? ... Dump the database in an SQL text format\n"
shane86f5bdb2009-10-24 02:00:07 +00001779 " If TABLE specified, only dump tables matching\n"
1780 " LIKE pattern TABLE.\n"
drhc2ce0be2014-05-29 12:36:14 +00001781 ".echo on|off Turn command echo on or off\n"
drh6d36ffe2014-06-16 15:01:37 +00001782 ".eqp on|off Enable or disable automatic EXPLAIN QUERY PLAN\n"
drh75897232000-05-29 14:26:00 +00001783 ".exit Exit this program\n"
drhc2ce0be2014-05-29 12:36:14 +00001784 ".explain ?on|off? Turn output mode suitable for EXPLAIN on or off.\n"
shanehe2aa9d72009-11-06 17:20:17 +00001785 " With no args, it turns EXPLAIN on.\n"
drhc1971542014-06-23 23:28:13 +00001786 ".fullschema Show schema and the content of sqlite_stat tables\n"
drhc2ce0be2014-05-29 12:36:14 +00001787 ".headers on|off Turn display of headers on or off\n"
drh75897232000-05-29 14:26:00 +00001788 ".help Show this message\n"
drhb860bc92004-08-04 15:16:55 +00001789 ".import FILE TABLE Import data from FILE into TABLE\n"
drh0e55db12015-02-06 14:51:13 +00001790 ".indexes ?TABLE? Show names of all indexes\n"
1791 " If TABLE specified, only show indexes for tables\n"
shane86f5bdb2009-10-24 02:00:07 +00001792 " matching LIKE pattern TABLE.\n"
drhae5e4452007-05-03 17:18:36 +00001793#ifdef SQLITE_ENABLE_IOTRACE
1794 ".iotrace FILE Enable I/O diagnostic logging to FILE\n"
1795#endif
drh70df4fe2006-06-13 15:12:21 +00001796#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh1e397f82006-06-08 15:28:43 +00001797 ".load FILE ?ENTRY? Load an extension library\n"
drh70df4fe2006-06-13 15:12:21 +00001798#endif
drh127f9d72010-02-23 01:47:00 +00001799 ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n"
danielk19776b77a362005-01-13 11:10:25 +00001800 ".mode MODE ?TABLE? Set output mode where MODE is one of:\n"
mistachkine0d68852014-12-11 03:12:33 +00001801 " ascii Columns/rows delimited by 0x1F and 0x1E\n"
drh3b584fa2004-09-24 12:50:03 +00001802 " csv Comma-separated values\n"
drhb860bc92004-08-04 15:16:55 +00001803 " column Left-aligned columns. (See .width)\n"
1804 " html HTML <table> code\n"
1805 " insert SQL insert statements for TABLE\n"
1806 " line One value per line\n"
mistachkine0d68852014-12-11 03:12:33 +00001807 " list Values delimited by .separator strings\n"
drhb860bc92004-08-04 15:16:55 +00001808 " tabs Tab-separated values\n"
1809 " tcl TCL list elements\n"
drh078b1fd2012-09-21 13:40:02 +00001810 ".nullvalue STRING Use STRING in place of NULL values\n"
drhc2ce0be2014-05-29 12:36:14 +00001811 ".once FILENAME Output for the next SQL command only to FILENAME\n"
drh05782482013-10-24 15:20:20 +00001812 ".open ?FILENAME? Close existing database and reopen FILENAME\n"
drhc2ce0be2014-05-29 12:36:14 +00001813 ".output ?FILENAME? Send output to FILENAME or stdout\n"
drh078b1fd2012-09-21 13:40:02 +00001814 ".print STRING... Print literal STRING\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001815 ".prompt MAIN CONTINUE Replace the standard prompts\n"
persicom7e2dfdd2002-04-18 02:46:52 +00001816 ".quit Exit this program\n"
drhdaffd0e2001-04-11 14:28:42 +00001817 ".read FILENAME Execute SQL in FILENAME\n"
drh9ff849f2009-02-04 20:55:57 +00001818 ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n"
drh5c7976f2014-02-10 19:59:27 +00001819 ".save FILE Write in-memory database into FILE\n"
drh15f23c22014-11-06 12:46:16 +00001820 ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n"
drh75897232000-05-29 14:26:00 +00001821 ".schema ?TABLE? Show the CREATE statements\n"
shane86f5bdb2009-10-24 02:00:07 +00001822 " If TABLE specified, only show tables matching\n"
1823 " LIKE pattern TABLE.\n"
mistachkine0d68852014-12-11 03:12:33 +00001824 ".separator COL ?ROW? Change the column separator and optionally the row\n"
1825 " separator for both the output mode and .import\n"
drh62cdde52014-05-28 20:22:28 +00001826 ".shell CMD ARGS... Run CMD ARGS... in a system shell\n"
drhdd45df82002-04-18 12:39:03 +00001827 ".show Show the current values for various settings\n"
drhc2ce0be2014-05-29 12:36:14 +00001828 ".stats on|off Turn stats on or off\n"
drh62cdde52014-05-28 20:22:28 +00001829 ".system CMD ARGS... Run CMD ARGS... in a system shell\n"
shane86f5bdb2009-10-24 02:00:07 +00001830 ".tables ?TABLE? List names of tables\n"
1831 " If TABLE specified, only list tables matching\n"
1832 " LIKE pattern TABLE.\n"
drh2dfbbca2000-07-28 14:32:48 +00001833 ".timeout MS Try opening locked tables for MS milliseconds\n"
drhc2ce0be2014-05-29 12:36:14 +00001834 ".timer on|off Turn SQL timer on or off\n"
drh42f64e52012-04-04 16:56:23 +00001835 ".trace FILE|off Output each SQL statement as it is run\n"
drhde60fc22011-12-14 17:53:36 +00001836 ".vfsname ?AUX? Print the name of the VFS stack\n"
shanehe2aa9d72009-11-06 17:20:17 +00001837 ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n"
drh62cdde52014-05-28 20:22:28 +00001838 " Negative values right-justify\n"
drh75897232000-05-29 14:26:00 +00001839;
1840
drhdaffd0e2001-04-11 14:28:42 +00001841/* Forward reference */
drhdcd87a92014-08-18 13:45:42 +00001842static int process_input(ShellState *p, FILE *in);
drhba5b0932014-07-24 12:39:59 +00001843/*
1844** Implementation of the "readfile(X)" SQL function. The entire content
1845** of the file named X is read and returned as a BLOB. NULL is returned
1846** if the file does not exist or is unreadable.
1847*/
1848static void readfileFunc(
1849 sqlite3_context *context,
1850 int argc,
1851 sqlite3_value **argv
1852){
1853 const char *zName;
1854 FILE *in;
1855 long nIn;
1856 void *pBuf;
1857
1858 zName = (const char*)sqlite3_value_text(argv[0]);
1859 if( zName==0 ) return;
1860 in = fopen(zName, "rb");
1861 if( in==0 ) return;
1862 fseek(in, 0, SEEK_END);
1863 nIn = ftell(in);
1864 rewind(in);
1865 pBuf = sqlite3_malloc( nIn );
1866 if( pBuf && 1==fread(pBuf, nIn, 1, in) ){
1867 sqlite3_result_blob(context, pBuf, nIn, sqlite3_free);
1868 }else{
1869 sqlite3_free(pBuf);
1870 }
1871 fclose(in);
1872}
1873
1874/*
1875** Implementation of the "writefile(X,Y)" SQL function. The argument Y
1876** is written into file X. The number of bytes written is returned. Or
1877** NULL is returned if something goes wrong, such as being unable to open
1878** file X for writing.
1879*/
1880static void writefileFunc(
1881 sqlite3_context *context,
1882 int argc,
1883 sqlite3_value **argv
1884){
1885 FILE *out;
1886 const char *z;
drhba5b0932014-07-24 12:39:59 +00001887 sqlite3_int64 rc;
1888 const char *zFile;
1889
1890 zFile = (const char*)sqlite3_value_text(argv[0]);
1891 if( zFile==0 ) return;
1892 out = fopen(zFile, "wb");
1893 if( out==0 ) return;
1894 z = (const char*)sqlite3_value_blob(argv[1]);
1895 if( z==0 ){
drhba5b0932014-07-24 12:39:59 +00001896 rc = 0;
1897 }else{
drh490fe862014-08-11 14:21:32 +00001898 rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out);
drhba5b0932014-07-24 12:39:59 +00001899 }
1900 fclose(out);
1901 sqlite3_result_int64(context, rc);
1902}
drhdaffd0e2001-04-11 14:28:42 +00001903
drh75897232000-05-29 14:26:00 +00001904/*
drh44c2eb12003-04-30 11:38:26 +00001905** Make sure the database is open. If it is not, then open it. If
1906** the database fails to open, print an error message and exit.
1907*/
drhdcd87a92014-08-18 13:45:42 +00001908static void open_db(ShellState *p, int keepAlive){
drh44c2eb12003-04-30 11:38:26 +00001909 if( p->db==0 ){
drhbbb0be82012-06-27 16:12:27 +00001910 sqlite3_initialize();
danielk19774f057f92004-06-08 00:02:33 +00001911 sqlite3_open(p->zDbFilename, &p->db);
drh06d83372015-04-28 12:27:22 +00001912#ifdef SQLITE_ENABLE_STAT_VTAB_EXPERIMENTAL
1913 if( p->db ){
1914 int sqlite3_dbstat_register(sqlite3*);
1915 sqlite3_dbstat_register(p->db);
1916 }
1917#endif
mistachkin8e189222015-04-19 21:43:16 +00001918 globalDb = p->db;
1919 if( p->db && sqlite3_errcode(p->db)==SQLITE_OK ){
1920 sqlite3_create_function(p->db, "shellstatic", 0, SQLITE_UTF8, 0,
drh4cea5ba2008-05-05 16:27:24 +00001921 shellstaticFunc, 0, 0);
1922 }
mistachkin8e189222015-04-19 21:43:16 +00001923 if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
shane86f5bdb2009-10-24 02:00:07 +00001924 fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
mistachkin8e189222015-04-19 21:43:16 +00001925 p->zDbFilename, sqlite3_errmsg(p->db));
drh05782482013-10-24 15:20:20 +00001926 if( keepAlive ) return;
drh22fbcb82004-02-01 01:22:50 +00001927 exit(1);
drh44c2eb12003-04-30 11:38:26 +00001928 }
drhc2e87a32006-06-27 15:16:14 +00001929#ifndef SQLITE_OMIT_LOAD_EXTENSION
1930 sqlite3_enable_load_extension(p->db, 1);
1931#endif
mistachkin8e189222015-04-19 21:43:16 +00001932 sqlite3_create_function(p->db, "readfile", 1, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00001933 readfileFunc, 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00001934 sqlite3_create_function(p->db, "writefile", 2, SQLITE_UTF8, 0,
drhba5b0932014-07-24 12:39:59 +00001935 writefileFunc, 0, 0);
drh44c2eb12003-04-30 11:38:26 +00001936 }
1937}
1938
1939/*
drhfeac5f82004-08-01 00:10:45 +00001940** Do C-language style dequoting.
1941**
1942** \t -> tab
1943** \n -> newline
1944** \r -> carriage return
drh4c56b992013-06-27 13:26:55 +00001945** \" -> "
drhfeac5f82004-08-01 00:10:45 +00001946** \NNN -> ascii character NNN in octal
1947** \\ -> backslash
1948*/
1949static void resolve_backslashes(char *z){
shane7d3846a2008-12-11 02:58:26 +00001950 int i, j;
1951 char c;
drhc2ce0be2014-05-29 12:36:14 +00001952 while( *z && *z!='\\' ) z++;
drhfeac5f82004-08-01 00:10:45 +00001953 for(i=j=0; (c = z[i])!=0; i++, j++){
drh4b608032015-04-15 19:25:25 +00001954 if( c=='\\' && z[i+1]!=0 ){
drhfeac5f82004-08-01 00:10:45 +00001955 c = z[++i];
1956 if( c=='n' ){
1957 c = '\n';
1958 }else if( c=='t' ){
1959 c = '\t';
1960 }else if( c=='r' ){
1961 c = '\r';
drh4c56b992013-06-27 13:26:55 +00001962 }else if( c=='\\' ){
1963 c = '\\';
drhfeac5f82004-08-01 00:10:45 +00001964 }else if( c>='0' && c<='7' ){
drhaa816082005-12-29 12:53:09 +00001965 c -= '0';
drhfeac5f82004-08-01 00:10:45 +00001966 if( z[i+1]>='0' && z[i+1]<='7' ){
1967 i++;
1968 c = (c<<3) + z[i] - '0';
1969 if( z[i+1]>='0' && z[i+1]<='7' ){
1970 i++;
1971 c = (c<<3) + z[i] - '0';
1972 }
1973 }
1974 }
1975 }
1976 z[j] = c;
1977 }
drhc2ce0be2014-05-29 12:36:14 +00001978 if( j<i ) z[j] = 0;
drhfeac5f82004-08-01 00:10:45 +00001979}
1980
1981/*
drh348d19c2013-06-03 12:47:43 +00001982** Return the value of a hexadecimal digit. Return -1 if the input
1983** is not a hex digit.
drhc28490c2006-10-26 14:25:58 +00001984*/
drh348d19c2013-06-03 12:47:43 +00001985static int hexDigitValue(char c){
1986 if( c>='0' && c<='9' ) return c - '0';
1987 if( c>='a' && c<='f' ) return c - 'a' + 10;
1988 if( c>='A' && c<='F' ) return c - 'A' + 10;
1989 return -1;
drhc28490c2006-10-26 14:25:58 +00001990}
1991
1992/*
drh7d9f3942013-04-03 01:26:54 +00001993** Interpret zArg as an integer value, possibly with suffixes.
1994*/
1995static sqlite3_int64 integerValue(const char *zArg){
1996 sqlite3_int64 v = 0;
1997 static const struct { char *zSuffix; int iMult; } aMult[] = {
1998 { "KiB", 1024 },
1999 { "MiB", 1024*1024 },
2000 { "GiB", 1024*1024*1024 },
2001 { "KB", 1000 },
2002 { "MB", 1000000 },
2003 { "GB", 1000000000 },
2004 { "K", 1000 },
2005 { "M", 1000000 },
2006 { "G", 1000000000 },
2007 };
2008 int i;
2009 int isNeg = 0;
2010 if( zArg[0]=='-' ){
2011 isNeg = 1;
2012 zArg++;
2013 }else if( zArg[0]=='+' ){
2014 zArg++;
2015 }
drh348d19c2013-06-03 12:47:43 +00002016 if( zArg[0]=='0' && zArg[1]=='x' ){
2017 int x;
2018 zArg += 2;
2019 while( (x = hexDigitValue(zArg[0]))>=0 ){
2020 v = (v<<4) + x;
2021 zArg++;
2022 }
2023 }else{
2024 while( IsDigit(zArg[0]) ){
2025 v = v*10 + zArg[0] - '0';
2026 zArg++;
2027 }
drh7d9f3942013-04-03 01:26:54 +00002028 }
drhc2bed0a2013-05-24 11:57:50 +00002029 for(i=0; i<ArraySize(aMult); i++){
drh7d9f3942013-04-03 01:26:54 +00002030 if( sqlite3_stricmp(aMult[i].zSuffix, zArg)==0 ){
2031 v *= aMult[i].iMult;
2032 break;
2033 }
2034 }
2035 return isNeg? -v : v;
2036}
2037
2038/*
drh348d19c2013-06-03 12:47:43 +00002039** Interpret zArg as either an integer or a boolean value. Return 1 or 0
2040** for TRUE and FALSE. Return the integer value if appropriate.
2041*/
2042static int booleanValue(char *zArg){
2043 int i;
2044 if( zArg[0]=='0' && zArg[1]=='x' ){
2045 for(i=2; hexDigitValue(zArg[i])>=0; i++){}
2046 }else{
2047 for(i=0; zArg[i]>='0' && zArg[i]<='9'; i++){}
2048 }
2049 if( i>0 && zArg[i]==0 ) return (int)(integerValue(zArg) & 0xffffffff);
2050 if( sqlite3_stricmp(zArg, "on")==0 || sqlite3_stricmp(zArg,"yes")==0 ){
2051 return 1;
2052 }
2053 if( sqlite3_stricmp(zArg, "off")==0 || sqlite3_stricmp(zArg,"no")==0 ){
2054 return 0;
2055 }
2056 fprintf(stderr, "ERROR: Not a boolean value: \"%s\". Assuming \"no\".\n",
2057 zArg);
2058 return 0;
2059}
2060
2061/*
drh42f64e52012-04-04 16:56:23 +00002062** Close an output file, assuming it is not stderr or stdout
2063*/
2064static void output_file_close(FILE *f){
2065 if( f && f!=stdout && f!=stderr ) fclose(f);
2066}
2067
2068/*
2069** Try to open an output file. The names "stdout" and "stderr" are
2070** recognized and do the right thing. NULL is returned if the output
2071** filename is "off".
2072*/
2073static FILE *output_file_open(const char *zFile){
2074 FILE *f;
2075 if( strcmp(zFile,"stdout")==0 ){
2076 f = stdout;
2077 }else if( strcmp(zFile, "stderr")==0 ){
2078 f = stderr;
2079 }else if( strcmp(zFile, "off")==0 ){
2080 f = 0;
2081 }else{
2082 f = fopen(zFile, "wb");
2083 if( f==0 ){
2084 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
2085 }
2086 }
2087 return f;
2088}
2089
2090/*
2091** A routine for handling output from sqlite3_trace().
2092*/
2093static void sql_trace_callback(void *pArg, const char *z){
2094 FILE *f = (FILE*)pArg;
drh4b2590e2014-08-19 19:28:00 +00002095 if( f ){
2096 int i = (int)strlen(z);
2097 while( i>0 && z[i-1]==';' ){ i--; }
2098 fprintf(f, "%.*s;\n", i, z);
2099 }
drh42f64e52012-04-04 16:56:23 +00002100}
2101
2102/*
drhd8621b92012-04-17 09:09:33 +00002103** A no-op routine that runs with the ".breakpoint" doc-command. This is
2104** a useful spot to set a debugger breakpoint.
2105*/
2106static void test_breakpoint(void){
2107 static int nCall = 0;
2108 nCall++;
2109}
2110
2111/*
mistachkin636bf9f2014-07-19 20:15:16 +00002112** An object used to read a CSV and other files for import.
drhdb95f682013-06-26 22:46:00 +00002113*/
mistachkin636bf9f2014-07-19 20:15:16 +00002114typedef struct ImportCtx ImportCtx;
2115struct ImportCtx {
drhdb95f682013-06-26 22:46:00 +00002116 const char *zFile; /* Name of the input file */
2117 FILE *in; /* Read the CSV text from this input stream */
2118 char *z; /* Accumulated text for a field */
2119 int n; /* Number of bytes in z */
2120 int nAlloc; /* Space allocated for z[] */
2121 int nLine; /* Current line number */
2122 int cTerm; /* Character that terminated the most recent field */
mistachkin636bf9f2014-07-19 20:15:16 +00002123 int cColSep; /* The column separator character. (Usually ",") */
2124 int cRowSep; /* The row separator character. (Usually "\n") */
drhdb95f682013-06-26 22:46:00 +00002125};
2126
2127/* Append a single byte to z[] */
mistachkin636bf9f2014-07-19 20:15:16 +00002128static void import_append_char(ImportCtx *p, int c){
drhdb95f682013-06-26 22:46:00 +00002129 if( p->n+1>=p->nAlloc ){
2130 p->nAlloc += p->nAlloc + 100;
2131 p->z = sqlite3_realloc(p->z, p->nAlloc);
2132 if( p->z==0 ){
2133 fprintf(stderr, "out of memory\n");
2134 exit(1);
2135 }
2136 }
2137 p->z[p->n++] = (char)c;
2138}
2139
2140/* Read a single field of CSV text. Compatible with rfc4180 and extended
2141** with the option of having a separator other than ",".
2142**
2143** + Input comes from p->in.
2144** + Store results in p->z of length p->n. Space to hold p->z comes
2145** from sqlite3_malloc().
mistachkin636bf9f2014-07-19 20:15:16 +00002146** + Use p->cSep as the column separator. The default is ",".
2147** + Use p->rSep as the row separator. The default is "\n".
drhdb95f682013-06-26 22:46:00 +00002148** + Keep track of the line number in p->nLine.
2149** + Store the character that terminates the field in p->cTerm. Store
2150** EOF on end-of-file.
2151** + Report syntax errors on stderr
2152*/
mistachkin44723ce2015-03-21 02:22:37 +00002153static char *SQLITE_CDECL csv_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002154 int c;
2155 int cSep = p->cColSep;
2156 int rSep = p->cRowSep;
drhdb95f682013-06-26 22:46:00 +00002157 p->n = 0;
2158 c = fgetc(p->in);
2159 if( c==EOF || seenInterrupt ){
2160 p->cTerm = EOF;
2161 return 0;
2162 }
2163 if( c=='"' ){
mistachkin636bf9f2014-07-19 20:15:16 +00002164 int pc, ppc;
drhdb95f682013-06-26 22:46:00 +00002165 int startLine = p->nLine;
2166 int cQuote = c;
drha81ad172013-12-11 14:00:04 +00002167 pc = ppc = 0;
drhdb95f682013-06-26 22:46:00 +00002168 while( 1 ){
2169 c = fgetc(p->in);
mistachkin636bf9f2014-07-19 20:15:16 +00002170 if( c==rSep ) p->nLine++;
drhdb95f682013-06-26 22:46:00 +00002171 if( c==cQuote ){
2172 if( pc==cQuote ){
2173 pc = 0;
2174 continue;
2175 }
2176 }
2177 if( (c==cSep && pc==cQuote)
mistachkin636bf9f2014-07-19 20:15:16 +00002178 || (c==rSep && pc==cQuote)
2179 || (c==rSep && pc=='\r' && ppc==cQuote)
drhdb95f682013-06-26 22:46:00 +00002180 || (c==EOF && pc==cQuote)
2181 ){
2182 do{ p->n--; }while( p->z[p->n]!=cQuote );
drhdb95f682013-06-26 22:46:00 +00002183 p->cTerm = c;
2184 break;
2185 }
2186 if( pc==cQuote && c!='\r' ){
2187 fprintf(stderr, "%s:%d: unescaped %c character\n",
2188 p->zFile, p->nLine, cQuote);
2189 }
2190 if( c==EOF ){
2191 fprintf(stderr, "%s:%d: unterminated %c-quoted field\n",
2192 p->zFile, startLine, cQuote);
mistachkin636bf9f2014-07-19 20:15:16 +00002193 p->cTerm = c;
drhdb95f682013-06-26 22:46:00 +00002194 break;
2195 }
mistachkin636bf9f2014-07-19 20:15:16 +00002196 import_append_char(p, c);
drha81ad172013-12-11 14:00:04 +00002197 ppc = pc;
drhdb95f682013-06-26 22:46:00 +00002198 pc = c;
drhd0a64dc2013-06-30 20:24:26 +00002199 }
drhdb95f682013-06-26 22:46:00 +00002200 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002201 while( c!=EOF && c!=cSep && c!=rSep ){
2202 import_append_char(p, c);
drhd0a64dc2013-06-30 20:24:26 +00002203 c = fgetc(p->in);
drhdb95f682013-06-26 22:46:00 +00002204 }
mistachkin636bf9f2014-07-19 20:15:16 +00002205 if( c==rSep ){
drhdb95f682013-06-26 22:46:00 +00002206 p->nLine++;
drh3852b682014-02-26 13:53:34 +00002207 if( p->n>0 && p->z[p->n-1]=='\r' ) p->n--;
drhdb95f682013-06-26 22:46:00 +00002208 }
drhdb95f682013-06-26 22:46:00 +00002209 p->cTerm = c;
2210 }
drh8dd675e2013-07-12 21:09:24 +00002211 if( p->z ) p->z[p->n] = 0;
drhdb95f682013-06-26 22:46:00 +00002212 return p->z;
2213}
2214
mistachkin636bf9f2014-07-19 20:15:16 +00002215/* Read a single field of ASCII delimited text.
2216**
2217** + Input comes from p->in.
2218** + Store results in p->z of length p->n. Space to hold p->z comes
2219** from sqlite3_malloc().
2220** + Use p->cSep as the column separator. The default is "\x1F".
2221** + Use p->rSep as the row separator. The default is "\x1E".
2222** + Keep track of the row number in p->nLine.
2223** + Store the character that terminates the field in p->cTerm. Store
2224** EOF on end-of-file.
2225** + Report syntax errors on stderr
2226*/
mistachkin44723ce2015-03-21 02:22:37 +00002227static char *SQLITE_CDECL ascii_read_one_field(ImportCtx *p){
mistachkin636bf9f2014-07-19 20:15:16 +00002228 int c;
2229 int cSep = p->cColSep;
2230 int rSep = p->cRowSep;
2231 p->n = 0;
2232 c = fgetc(p->in);
2233 if( c==EOF || seenInterrupt ){
2234 p->cTerm = EOF;
2235 return 0;
2236 }
2237 while( c!=EOF && c!=cSep && c!=rSep ){
2238 import_append_char(p, c);
2239 c = fgetc(p->in);
2240 }
2241 if( c==rSep ){
2242 p->nLine++;
2243 }
2244 p->cTerm = c;
2245 if( p->z ) p->z[p->n] = 0;
2246 return p->z;
2247}
2248
drhdb95f682013-06-26 22:46:00 +00002249/*
drh4bbcf102014-02-06 02:46:08 +00002250** Try to transfer data for table zTable. If an error is seen while
2251** moving forward, try to go backwards. The backwards movement won't
2252** work for WITHOUT ROWID tables.
drh3350ce92014-02-06 00:49:12 +00002253*/
mistachkine31ae902014-02-06 01:15:29 +00002254static void tryToCloneData(
drhdcd87a92014-08-18 13:45:42 +00002255 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002256 sqlite3 *newDb,
2257 const char *zTable
2258){
2259 sqlite3_stmt *pQuery = 0;
2260 sqlite3_stmt *pInsert = 0;
2261 char *zQuery = 0;
2262 char *zInsert = 0;
2263 int rc;
2264 int i, j, n;
2265 int nTable = (int)strlen(zTable);
2266 int k = 0;
drh4bbcf102014-02-06 02:46:08 +00002267 int cnt = 0;
2268 const int spinRate = 10000;
drh3350ce92014-02-06 00:49:12 +00002269
2270 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\"", zTable);
2271 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2272 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002273 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002274 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2275 zQuery);
2276 goto end_data_xfer;
2277 }
2278 n = sqlite3_column_count(pQuery);
2279 zInsert = sqlite3_malloc(200 + nTable + n*3);
2280 if( zInsert==0 ){
2281 fprintf(stderr, "out of memory\n");
2282 goto end_data_xfer;
2283 }
2284 sqlite3_snprintf(200+nTable,zInsert,
2285 "INSERT OR IGNORE INTO \"%s\" VALUES(?", zTable);
2286 i = (int)strlen(zInsert);
2287 for(j=1; j<n; j++){
2288 memcpy(zInsert+i, ",?", 2);
2289 i += 2;
2290 }
2291 memcpy(zInsert+i, ");", 3);
2292 rc = sqlite3_prepare_v2(newDb, zInsert, -1, &pInsert, 0);
2293 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002294 fprintf(stderr, "Error %d: %s on [%s]\n",
drh3350ce92014-02-06 00:49:12 +00002295 sqlite3_extended_errcode(newDb), sqlite3_errmsg(newDb),
2296 zQuery);
2297 goto end_data_xfer;
2298 }
2299 for(k=0; k<2; k++){
2300 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2301 for(i=0; i<n; i++){
2302 switch( sqlite3_column_type(pQuery, i) ){
2303 case SQLITE_NULL: {
2304 sqlite3_bind_null(pInsert, i+1);
2305 break;
2306 }
2307 case SQLITE_INTEGER: {
2308 sqlite3_bind_int64(pInsert, i+1, sqlite3_column_int64(pQuery,i));
2309 break;
2310 }
2311 case SQLITE_FLOAT: {
2312 sqlite3_bind_double(pInsert, i+1, sqlite3_column_double(pQuery,i));
2313 break;
2314 }
2315 case SQLITE_TEXT: {
2316 sqlite3_bind_text(pInsert, i+1,
2317 (const char*)sqlite3_column_text(pQuery,i),
2318 -1, SQLITE_STATIC);
2319 break;
2320 }
2321 case SQLITE_BLOB: {
2322 sqlite3_bind_blob(pInsert, i+1, sqlite3_column_blob(pQuery,i),
2323 sqlite3_column_bytes(pQuery,i),
2324 SQLITE_STATIC);
2325 break;
2326 }
2327 }
2328 } /* End for */
drh4bbcf102014-02-06 02:46:08 +00002329 rc = sqlite3_step(pInsert);
2330 if( rc!=SQLITE_OK && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
2331 fprintf(stderr, "Error %d: %s\n", sqlite3_extended_errcode(newDb),
2332 sqlite3_errmsg(newDb));
2333 }
drh3350ce92014-02-06 00:49:12 +00002334 sqlite3_reset(pInsert);
drh4bbcf102014-02-06 02:46:08 +00002335 cnt++;
2336 if( (cnt%spinRate)==0 ){
2337 printf("%c\b", "|/-\\"[(cnt/spinRate)%4]);
2338 fflush(stdout);
2339 }
drh3350ce92014-02-06 00:49:12 +00002340 } /* End while */
2341 if( rc==SQLITE_DONE ) break;
2342 sqlite3_finalize(pQuery);
2343 sqlite3_free(zQuery);
2344 zQuery = sqlite3_mprintf("SELECT * FROM \"%w\" ORDER BY rowid DESC;",
2345 zTable);
2346 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2347 if( rc ){
drh4bbcf102014-02-06 02:46:08 +00002348 fprintf(stderr, "Warning: cannot step \"%s\" backwards", zTable);
2349 break;
drh3350ce92014-02-06 00:49:12 +00002350 }
2351 } /* End for(k=0...) */
2352
2353end_data_xfer:
2354 sqlite3_finalize(pQuery);
2355 sqlite3_finalize(pInsert);
2356 sqlite3_free(zQuery);
2357 sqlite3_free(zInsert);
2358}
2359
2360
2361/*
2362** Try to transfer all rows of the schema that match zWhere. For
2363** each row, invoke xForEach() on the object defined by that row.
drh4bbcf102014-02-06 02:46:08 +00002364** If an error is encountered while moving forward through the
2365** sqlite_master table, try again moving backwards.
drh3350ce92014-02-06 00:49:12 +00002366*/
mistachkine31ae902014-02-06 01:15:29 +00002367static void tryToCloneSchema(
drhdcd87a92014-08-18 13:45:42 +00002368 ShellState *p,
drh3350ce92014-02-06 00:49:12 +00002369 sqlite3 *newDb,
2370 const char *zWhere,
drhdcd87a92014-08-18 13:45:42 +00002371 void (*xForEach)(ShellState*,sqlite3*,const char*)
drh3350ce92014-02-06 00:49:12 +00002372){
2373 sqlite3_stmt *pQuery = 0;
2374 char *zQuery = 0;
2375 int rc;
2376 const unsigned char *zName;
2377 const unsigned char *zSql;
drh4bbcf102014-02-06 02:46:08 +00002378 char *zErrMsg = 0;
drh3350ce92014-02-06 00:49:12 +00002379
2380 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2381 " WHERE %s", zWhere);
2382 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2383 if( rc ){
2384 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2385 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2386 zQuery);
2387 goto end_schema_xfer;
2388 }
2389 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2390 zName = sqlite3_column_text(pQuery, 0);
2391 zSql = sqlite3_column_text(pQuery, 1);
2392 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002393 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2394 if( zErrMsg ){
2395 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2396 sqlite3_free(zErrMsg);
2397 zErrMsg = 0;
2398 }
drh3350ce92014-02-06 00:49:12 +00002399 if( xForEach ){
2400 xForEach(p, newDb, (const char*)zName);
2401 }
2402 printf("done\n");
2403 }
2404 if( rc!=SQLITE_DONE ){
2405 sqlite3_finalize(pQuery);
2406 sqlite3_free(zQuery);
2407 zQuery = sqlite3_mprintf("SELECT name, sql FROM sqlite_master"
2408 " WHERE %s ORDER BY rowid DESC", zWhere);
2409 rc = sqlite3_prepare_v2(p->db, zQuery, -1, &pQuery, 0);
2410 if( rc ){
2411 fprintf(stderr, "Error: (%d) %s on [%s]\n",
2412 sqlite3_extended_errcode(p->db), sqlite3_errmsg(p->db),
2413 zQuery);
2414 goto end_schema_xfer;
2415 }
2416 while( (rc = sqlite3_step(pQuery))==SQLITE_ROW ){
2417 zName = sqlite3_column_text(pQuery, 0);
2418 zSql = sqlite3_column_text(pQuery, 1);
2419 printf("%s... ", zName); fflush(stdout);
drh4bbcf102014-02-06 02:46:08 +00002420 sqlite3_exec(newDb, (const char*)zSql, 0, 0, &zErrMsg);
2421 if( zErrMsg ){
2422 fprintf(stderr, "Error: %s\nSQL: [%s]\n", zErrMsg, zSql);
2423 sqlite3_free(zErrMsg);
2424 zErrMsg = 0;
2425 }
drh3350ce92014-02-06 00:49:12 +00002426 if( xForEach ){
2427 xForEach(p, newDb, (const char*)zName);
2428 }
2429 printf("done\n");
2430 }
2431 }
2432end_schema_xfer:
2433 sqlite3_finalize(pQuery);
2434 sqlite3_free(zQuery);
2435}
2436
2437/*
2438** Open a new database file named "zNewDb". Try to recover as much information
2439** as possible out of the main database (which might be corrupt) and write it
2440** into zNewDb.
2441*/
drhdcd87a92014-08-18 13:45:42 +00002442static void tryToClone(ShellState *p, const char *zNewDb){
drh3350ce92014-02-06 00:49:12 +00002443 int rc;
2444 sqlite3 *newDb = 0;
2445 if( access(zNewDb,0)==0 ){
2446 fprintf(stderr, "File \"%s\" already exists.\n", zNewDb);
2447 return;
2448 }
2449 rc = sqlite3_open(zNewDb, &newDb);
2450 if( rc ){
2451 fprintf(stderr, "Cannot create output database: %s\n",
2452 sqlite3_errmsg(newDb));
2453 }else{
drh54d0d2d2014-04-03 00:32:13 +00002454 sqlite3_exec(p->db, "PRAGMA writable_schema=ON;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002455 sqlite3_exec(newDb, "BEGIN EXCLUSIVE;", 0, 0, 0);
mistachkine31ae902014-02-06 01:15:29 +00002456 tryToCloneSchema(p, newDb, "type='table'", tryToCloneData);
2457 tryToCloneSchema(p, newDb, "type!='table'", 0);
drh3350ce92014-02-06 00:49:12 +00002458 sqlite3_exec(newDb, "COMMIT;", 0, 0, 0);
drh54d0d2d2014-04-03 00:32:13 +00002459 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
drh3350ce92014-02-06 00:49:12 +00002460 }
2461 sqlite3_close(newDb);
2462}
2463
2464/*
drhc2ce0be2014-05-29 12:36:14 +00002465** Change the output file back to stdout
2466*/
drhdcd87a92014-08-18 13:45:42 +00002467static void output_reset(ShellState *p){
drhc2ce0be2014-05-29 12:36:14 +00002468 if( p->outfile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002469#ifndef SQLITE_OMIT_POPEN
drhc2ce0be2014-05-29 12:36:14 +00002470 pclose(p->out);
drh8cd5b252015-03-02 22:06:43 +00002471#endif
drhc2ce0be2014-05-29 12:36:14 +00002472 }else{
2473 output_file_close(p->out);
2474 }
2475 p->outfile[0] = 0;
2476 p->out = stdout;
2477}
2478
2479/*
drhf7502f02015-02-06 14:19:44 +00002480** Run an SQL command and return the single integer result.
2481*/
2482static int db_int(ShellState *p, const char *zSql){
2483 sqlite3_stmt *pStmt;
2484 int res = 0;
2485 sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
2486 if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){
2487 res = sqlite3_column_int(pStmt,0);
2488 }
2489 sqlite3_finalize(pStmt);
2490 return res;
2491}
2492
2493/*
2494** Convert a 2-byte or 4-byte big-endian integer into a native integer
2495*/
2496unsigned int get2byteInt(unsigned char *a){
2497 return (a[0]<<8) + a[1];
2498}
2499unsigned int get4byteInt(unsigned char *a){
2500 return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
2501}
2502
2503/*
2504** Implementation of the ".info" command.
2505**
2506** Return 1 on error, 2 to exit, and 0 otherwise.
2507*/
drh0e55db12015-02-06 14:51:13 +00002508static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){
drhf7502f02015-02-06 14:19:44 +00002509 static const struct { const char *zName; int ofst; } aField[] = {
2510 { "file change counter:", 24 },
2511 { "database page count:", 28 },
2512 { "freelist page count:", 36 },
2513 { "schema cookie:", 40 },
2514 { "schema format:", 44 },
2515 { "default cache size:", 48 },
2516 { "autovacuum top root:", 52 },
2517 { "incremental vacuum:", 64 },
2518 { "text encoding:", 56 },
2519 { "user version:", 60 },
2520 { "application id:", 68 },
2521 { "software version:", 96 },
2522 };
drh0e55db12015-02-06 14:51:13 +00002523 static const struct { const char *zName; const char *zSql; } aQuery[] = {
2524 { "number of tables:",
2525 "SELECT count(*) FROM %s WHERE type='table'" },
2526 { "number of indexes:",
2527 "SELECT count(*) FROM %s WHERE type='index'" },
2528 { "number of triggers:",
2529 "SELECT count(*) FROM %s WHERE type='trigger'" },
2530 { "number of views:",
2531 "SELECT count(*) FROM %s WHERE type='view'" },
2532 { "schema size:",
2533 "SELECT total(length(sql)) FROM %s" },
2534 };
2535 sqlite3_file *pFile;
2536 int i;
2537 char *zSchemaTab;
2538 char *zDb = nArg>=2 ? azArg[1] : "main";
2539 unsigned char aHdr[100];
drhf7502f02015-02-06 14:19:44 +00002540 open_db(p, 0);
2541 if( p->db==0 ) return 1;
drh0e55db12015-02-06 14:51:13 +00002542 sqlite3_file_control(p->db, zDb, SQLITE_FCNTL_FILE_POINTER, &pFile);
drhf7502f02015-02-06 14:19:44 +00002543 if( pFile==0 || pFile->pMethods==0 || pFile->pMethods->xRead==0 ){
2544 return 1;
2545 }
2546 i = pFile->pMethods->xRead(pFile, aHdr, 100, 0);
2547 if( i!=SQLITE_OK ){
2548 fprintf(stderr, "unable to read database header\n");
2549 return 1;
2550 }
2551 i = get2byteInt(aHdr+16);
2552 if( i==1 ) i = 65536;
2553 fprintf(p->out, "%-20s %d\n", "database page size:", i);
2554 fprintf(p->out, "%-20s %d\n", "write format:", aHdr[18]);
2555 fprintf(p->out, "%-20s %d\n", "read format:", aHdr[19]);
2556 fprintf(p->out, "%-20s %d\n", "reserved bytes:", aHdr[20]);
2557 for(i=0; i<sizeof(aField)/sizeof(aField[0]); i++){
2558 int ofst = aField[i].ofst;
2559 unsigned int val = get4byteInt(aHdr + ofst);
2560 fprintf(p->out, "%-20s %u", aField[i].zName, val);
2561 switch( ofst ){
2562 case 56: {
2563 if( val==1 ) fprintf(p->out, " (utf8)");
2564 if( val==2 ) fprintf(p->out, " (utf16le)");
2565 if( val==3 ) fprintf(p->out, " (utf16be)");
2566 }
2567 }
2568 fprintf(p->out, "\n");
2569 }
drh0e55db12015-02-06 14:51:13 +00002570 if( zDb==0 ){
2571 zSchemaTab = sqlite3_mprintf("main.sqlite_master");
2572 }else if( strcmp(zDb,"temp")==0 ){
2573 zSchemaTab = sqlite3_mprintf("%s", "sqlite_temp_master");
2574 }else{
2575 zSchemaTab = sqlite3_mprintf("\"%w\".sqlite_master", zDb);
2576 }
2577 for(i=0; i<sizeof(aQuery)/sizeof(aQuery[0]); i++){
2578 char *zSql = sqlite3_mprintf(aQuery[i].zSql, zSchemaTab);
2579 int val = db_int(p, zSql);
2580 sqlite3_free(zSql);
2581 fprintf(p->out, "%-20s %d\n", aQuery[i].zName, val);
2582 }
2583 sqlite3_free(zSchemaTab);
drhf7502f02015-02-06 14:19:44 +00002584 return 0;
2585}
2586
2587
2588/*
drh75897232000-05-29 14:26:00 +00002589** If an input line begins with "." then invoke this routine to
2590** process that line.
drh67505e72002-04-19 12:34:06 +00002591**
drh47ad6842006-11-08 12:25:42 +00002592** Return 1 on error, 2 to exit, and 0 otherwise.
drh75897232000-05-29 14:26:00 +00002593*/
drhdcd87a92014-08-18 13:45:42 +00002594static int do_meta_command(char *zLine, ShellState *p){
mistachkin8e189222015-04-19 21:43:16 +00002595 int h = 1;
drh75897232000-05-29 14:26:00 +00002596 int nArg = 0;
2597 int n, c;
drh67505e72002-04-19 12:34:06 +00002598 int rc = 0;
drh75897232000-05-29 14:26:00 +00002599 char *azArg[50];
2600
2601 /* Parse the input line into tokens.
2602 */
mistachkin8e189222015-04-19 21:43:16 +00002603 while( zLine[h] && nArg<ArraySize(azArg) ){
2604 while( IsSpace(zLine[h]) ){ h++; }
2605 if( zLine[h]==0 ) break;
2606 if( zLine[h]=='\'' || zLine[h]=='"' ){
2607 int delim = zLine[h++];
2608 azArg[nArg++] = &zLine[h];
2609 while( zLine[h] && zLine[h]!=delim ){
2610 if( zLine[h]=='\\' && delim=='"' && zLine[h+1]!=0 ) h++;
2611 h++;
drh4c56b992013-06-27 13:26:55 +00002612 }
mistachkin8e189222015-04-19 21:43:16 +00002613 if( zLine[h]==delim ){
2614 zLine[h++] = 0;
drh75897232000-05-29 14:26:00 +00002615 }
drhfeac5f82004-08-01 00:10:45 +00002616 if( delim=='"' ) resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002617 }else{
mistachkin8e189222015-04-19 21:43:16 +00002618 azArg[nArg++] = &zLine[h];
2619 while( zLine[h] && !IsSpace(zLine[h]) ){ h++; }
2620 if( zLine[h] ) zLine[h++] = 0;
drhfeac5f82004-08-01 00:10:45 +00002621 resolve_backslashes(azArg[nArg-1]);
drh75897232000-05-29 14:26:00 +00002622 }
2623 }
2624
2625 /* Process the input line.
2626 */
shane9bd1b442009-10-23 01:27:39 +00002627 if( nArg==0 ) return 0; /* no tokens, no error */
drh4f21c4a2008-12-10 22:15:00 +00002628 n = strlen30(azArg[0]);
drh75897232000-05-29 14:26:00 +00002629 c = azArg[0][0];
drh5c7976f2014-02-10 19:59:27 +00002630 if( (c=='b' && n>=3 && strncmp(azArg[0], "backup", n)==0)
2631 || (c=='s' && n>=3 && strncmp(azArg[0], "save", n)==0)
2632 ){
drhbc46f022013-01-23 18:53:23 +00002633 const char *zDestFile = 0;
2634 const char *zDb = 0;
drh9ff849f2009-02-04 20:55:57 +00002635 sqlite3 *pDest;
2636 sqlite3_backup *pBackup;
drhbc46f022013-01-23 18:53:23 +00002637 int j;
2638 for(j=1; j<nArg; j++){
2639 const char *z = azArg[j];
2640 if( z[0]=='-' ){
2641 while( z[0]=='-' ) z++;
drhaf664332013-07-18 20:28:29 +00002642 /* No options to process at this time */
drhbc46f022013-01-23 18:53:23 +00002643 {
2644 fprintf(stderr, "unknown option: %s\n", azArg[j]);
2645 return 1;
2646 }
2647 }else if( zDestFile==0 ){
2648 zDestFile = azArg[j];
2649 }else if( zDb==0 ){
2650 zDb = zDestFile;
2651 zDestFile = azArg[j];
2652 }else{
2653 fprintf(stderr, "too many arguments to .backup\n");
2654 return 1;
2655 }
drh9ff849f2009-02-04 20:55:57 +00002656 }
drhbc46f022013-01-23 18:53:23 +00002657 if( zDestFile==0 ){
2658 fprintf(stderr, "missing FILENAME argument on .backup\n");
2659 return 1;
2660 }
2661 if( zDb==0 ) zDb = "main";
drh9ff849f2009-02-04 20:55:57 +00002662 rc = sqlite3_open(zDestFile, &pDest);
2663 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00002664 fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile);
drh9ff849f2009-02-04 20:55:57 +00002665 sqlite3_close(pDest);
2666 return 1;
2667 }
drh05782482013-10-24 15:20:20 +00002668 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00002669 pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
2670 if( pBackup==0 ){
2671 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
2672 sqlite3_close(pDest);
2673 return 1;
2674 }
2675 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){}
2676 sqlite3_backup_finish(pBackup);
2677 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00002678 rc = 0;
drh9ff849f2009-02-04 20:55:57 +00002679 }else{
2680 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
shane9bd1b442009-10-23 01:27:39 +00002681 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00002682 }
2683 sqlite3_close(pDest);
2684 }else
2685
drhc2ce0be2014-05-29 12:36:14 +00002686 if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 ){
2687 if( nArg==2 ){
2688 bail_on_error = booleanValue(azArg[1]);
2689 }else{
2690 fprintf(stderr, "Usage: .bail on|off\n");
2691 rc = 1;
2692 }
drhc49f44e2006-10-26 18:15:42 +00002693 }else
2694
drhd8621b92012-04-17 09:09:33 +00002695 /* The undocumented ".breakpoint" command causes a call to the no-op
2696 ** routine named test_breakpoint().
2697 */
2698 if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){
2699 test_breakpoint();
2700 }else
2701
drhc2ce0be2014-05-29 12:36:14 +00002702 if( c=='c' && strncmp(azArg[0], "clone", n)==0 ){
2703 if( nArg==2 ){
2704 tryToClone(p, azArg[1]);
2705 }else{
2706 fprintf(stderr, "Usage: .clone FILENAME\n");
2707 rc = 1;
2708 }
mistachkine31ae902014-02-06 01:15:29 +00002709 }else
2710
drhc2ce0be2014-05-29 12:36:14 +00002711 if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002712 ShellState data;
jplyon672a1ed2003-05-11 20:07:05 +00002713 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00002714 open_db(p, 0);
jplyon672a1ed2003-05-11 20:07:05 +00002715 memcpy(&data, p, sizeof(data));
drhd8885442004-03-17 23:42:12 +00002716 data.showHeader = 1;
jplyon672a1ed2003-05-11 20:07:05 +00002717 data.mode = MODE_Column;
drhd8885442004-03-17 23:42:12 +00002718 data.colWidth[0] = 3;
2719 data.colWidth[1] = 15;
2720 data.colWidth[2] = 58;
drh0b2110c2004-10-26 00:08:10 +00002721 data.cnt = 0;
danielk19776f8a5032004-05-10 10:34:51 +00002722 sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg);
jplyon672a1ed2003-05-11 20:07:05 +00002723 if( zErrMsg ){
2724 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00002725 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00002726 rc = 1;
jplyon6a65bb32003-05-04 07:25:57 +00002727 }
2728 }else
2729
drh0e55db12015-02-06 14:51:13 +00002730 if( c=='d' && strncmp(azArg[0], "dbinfo", n)==0 ){
2731 rc = shell_dbinfo_command(p, nArg, azArg);
2732 }else
2733
drhc2ce0be2014-05-29 12:36:14 +00002734 if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){
drh05782482013-10-24 15:20:20 +00002735 open_db(p, 0);
drhf1dfc4f2009-09-23 15:51:35 +00002736 /* When playing back a "dump", the content might appear in an order
2737 ** which causes immediate foreign key constraints to be violated.
2738 ** So disable foreign-key constraint enforcement to prevent problems. */
drhc2ce0be2014-05-29 12:36:14 +00002739 if( nArg!=1 && nArg!=2 ){
2740 fprintf(stderr, "Usage: .dump ?LIKE-PATTERN?\n");
2741 rc = 1;
2742 goto meta_command_exit;
2743 }
drhf1dfc4f2009-09-23 15:51:35 +00002744 fprintf(p->out, "PRAGMA foreign_keys=OFF;\n");
drh33048c02001-10-01 14:29:22 +00002745 fprintf(p->out, "BEGIN TRANSACTION;\n");
drh45e29d82006-11-20 16:21:10 +00002746 p->writableSchema = 0;
drh56197952011-10-13 16:30:13 +00002747 sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002748 p->nErr = 0;
drh4c653a02000-06-07 01:27:47 +00002749 if( nArg==1 ){
drhdd3d4592004-08-30 01:54:05 +00002750 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002751 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002752 "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'"
drh4f324762009-05-21 14:51:03 +00002753 );
2754 run_schema_dump_query(p,
2755 "SELECT name, type, sql FROM sqlite_master "
drh2f464a02011-10-13 00:41:49 +00002756 "WHERE name=='sqlite_sequence'"
drh0b9a5942006-09-13 20:22:02 +00002757 );
drh2f464a02011-10-13 00:41:49 +00002758 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002759 "SELECT sql FROM sqlite_master "
drh157e29a2009-05-21 15:15:00 +00002760 "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0
drha18c5682000-10-08 22:20:57 +00002761 );
drh4c653a02000-06-07 01:27:47 +00002762 }else{
2763 int i;
drhdd3d4592004-08-30 01:54:05 +00002764 for(i=1; i<nArg; i++){
danielk1977bc6ada42004-06-30 08:20:16 +00002765 zShellStatic = azArg[i];
drhdd3d4592004-08-30 01:54:05 +00002766 run_schema_dump_query(p,
drha18c5682000-10-08 22:20:57 +00002767 "SELECT name, type, sql FROM sqlite_master "
drhdd3d4592004-08-30 01:54:05 +00002768 "WHERE tbl_name LIKE shellstatic() AND type=='table'"
drh2f464a02011-10-13 00:41:49 +00002769 " AND sql NOT NULL");
2770 run_table_dump_query(p,
drh0b9a5942006-09-13 20:22:02 +00002771 "SELECT sql FROM sqlite_master "
drh45e29d82006-11-20 16:21:10 +00002772 "WHERE sql NOT NULL"
2773 " AND type IN ('index','trigger','view')"
drh157e29a2009-05-21 15:15:00 +00002774 " AND tbl_name LIKE shellstatic()", 0
drh0b9a5942006-09-13 20:22:02 +00002775 );
danielk1977bc6ada42004-06-30 08:20:16 +00002776 zShellStatic = 0;
drh4c653a02000-06-07 01:27:47 +00002777 }
2778 }
drh45e29d82006-11-20 16:21:10 +00002779 if( p->writableSchema ){
drh56197952011-10-13 16:30:13 +00002780 fprintf(p->out, "PRAGMA writable_schema=OFF;\n");
drh45e29d82006-11-20 16:21:10 +00002781 p->writableSchema = 0;
2782 }
drh56197952011-10-13 16:30:13 +00002783 sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0);
2784 sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0);
drh2f464a02011-10-13 00:41:49 +00002785 fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n");
drh4c653a02000-06-07 01:27:47 +00002786 }else
drh75897232000-05-29 14:26:00 +00002787
drhc2ce0be2014-05-29 12:36:14 +00002788 if( c=='e' && strncmp(azArg[0], "echo", n)==0 ){
2789 if( nArg==2 ){
2790 p->echoOn = booleanValue(azArg[1]);
2791 }else{
2792 fprintf(stderr, "Usage: .echo on|off\n");
2793 rc = 1;
2794 }
drhdaffd0e2001-04-11 14:28:42 +00002795 }else
2796
drhc2ce0be2014-05-29 12:36:14 +00002797 if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){
2798 if( nArg==2 ){
2799 p->autoEQP = booleanValue(azArg[1]);
2800 }else{
2801 fprintf(stderr, "Usage: .eqp on|off\n");
2802 rc = 1;
2803 }
drhefbf3b12014-02-28 20:47:24 +00002804 }else
2805
drhd3ac7d92013-01-25 18:33:43 +00002806 if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){
drh348d19c2013-06-03 12:47:43 +00002807 if( nArg>1 && (rc = (int)integerValue(azArg[1]))!=0 ) exit(rc);
drh47ad6842006-11-08 12:25:42 +00002808 rc = 2;
drh75897232000-05-29 14:26:00 +00002809 }else
2810
drhc2ce0be2014-05-29 12:36:14 +00002811 if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){
drhc28490c2006-10-26 14:25:58 +00002812 int val = nArg>=2 ? booleanValue(azArg[1]) : 1;
persicom7e2dfdd2002-04-18 02:46:52 +00002813 if(val == 1) {
drhdcd87a92014-08-18 13:45:42 +00002814 if(!p->normalMode.valid) {
2815 p->normalMode.valid = 1;
2816 p->normalMode.mode = p->mode;
2817 p->normalMode.showHeader = p->showHeader;
2818 memcpy(p->normalMode.colWidth,p->colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002819 }
2820 /* We could put this code under the !p->explainValid
2821 ** condition so that it does not execute if we are already in
2822 ** explain mode. However, always executing it allows us an easy
2823 ** was to reset to explain mode in case the user previously
2824 ** did an .explain followed by a .width, .mode or .header
2825 ** command.
2826 */
danielk19770d78bae2008-01-03 07:09:48 +00002827 p->mode = MODE_Explain;
persicom7e2dfdd2002-04-18 02:46:52 +00002828 p->showHeader = 1;
drhac68ced2013-11-27 13:24:18 +00002829 memset(p->colWidth,0,sizeof(p->colWidth));
danielk19770d78bae2008-01-03 07:09:48 +00002830 p->colWidth[0] = 4; /* addr */
drh60a713c2008-01-21 16:22:45 +00002831 p->colWidth[1] = 13; /* opcode */
2832 p->colWidth[2] = 4; /* P1 */
2833 p->colWidth[3] = 4; /* P2 */
2834 p->colWidth[4] = 4; /* P3 */
2835 p->colWidth[5] = 13; /* P4 */
danielk19770d78bae2008-01-03 07:09:48 +00002836 p->colWidth[6] = 2; /* P5 */
drh60a713c2008-01-21 16:22:45 +00002837 p->colWidth[7] = 13; /* Comment */
drhdcd87a92014-08-18 13:45:42 +00002838 }else if (p->normalMode.valid) {
2839 p->normalMode.valid = 0;
2840 p->mode = p->normalMode.mode;
2841 p->showHeader = p->normalMode.showHeader;
2842 memcpy(p->colWidth,p->normalMode.colWidth,sizeof(p->colWidth));
persicom7e2dfdd2002-04-18 02:46:52 +00002843 }
drh75897232000-05-29 14:26:00 +00002844 }else
2845
drhc1971542014-06-23 23:28:13 +00002846 if( c=='f' && strncmp(azArg[0], "fullschema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00002847 ShellState data;
drhc1971542014-06-23 23:28:13 +00002848 char *zErrMsg = 0;
drh56f674c2014-07-18 14:43:29 +00002849 int doStats = 0;
drhc1971542014-06-23 23:28:13 +00002850 if( nArg!=1 ){
2851 fprintf(stderr, "Usage: .fullschema\n");
2852 rc = 1;
2853 goto meta_command_exit;
2854 }
2855 open_db(p, 0);
2856 memcpy(&data, p, sizeof(data));
2857 data.showHeader = 0;
2858 data.mode = MODE_Semi;
2859 rc = sqlite3_exec(p->db,
2860 "SELECT sql FROM"
2861 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
2862 " FROM sqlite_master UNION ALL"
2863 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00002864 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drhc1971542014-06-23 23:28:13 +00002865 "ORDER BY rowid",
2866 callback, &data, &zErrMsg
2867 );
drh56f674c2014-07-18 14:43:29 +00002868 if( rc==SQLITE_OK ){
2869 sqlite3_stmt *pStmt;
2870 rc = sqlite3_prepare_v2(p->db,
2871 "SELECT rowid FROM sqlite_master"
2872 " WHERE name GLOB 'sqlite_stat[134]'",
2873 -1, &pStmt, 0);
2874 doStats = sqlite3_step(pStmt)==SQLITE_ROW;
2875 sqlite3_finalize(pStmt);
2876 }
2877 if( doStats==0 ){
2878 fprintf(p->out, "/* No STAT tables available */\n");
2879 }else{
2880 fprintf(p->out, "ANALYZE sqlite_master;\n");
2881 sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_master'",
2882 callback, &data, &zErrMsg);
2883 data.mode = MODE_Insert;
2884 data.zDestTable = "sqlite_stat1";
2885 shell_exec(p->db, "SELECT * FROM sqlite_stat1",
2886 shell_callback, &data,&zErrMsg);
2887 data.zDestTable = "sqlite_stat3";
2888 shell_exec(p->db, "SELECT * FROM sqlite_stat3",
2889 shell_callback, &data,&zErrMsg);
2890 data.zDestTable = "sqlite_stat4";
2891 shell_exec(p->db, "SELECT * FROM sqlite_stat4",
2892 shell_callback, &data, &zErrMsg);
2893 fprintf(p->out, "ANALYZE sqlite_master;\n");
2894 }
drhc1971542014-06-23 23:28:13 +00002895 }else
2896
drhc2ce0be2014-05-29 12:36:14 +00002897 if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){
2898 if( nArg==2 ){
2899 p->showHeader = booleanValue(azArg[1]);
2900 }else{
2901 fprintf(stderr, "Usage: .headers on|off\n");
2902 rc = 1;
shaneb320ccd2009-10-21 03:42:58 +00002903 }
drh75897232000-05-29 14:26:00 +00002904 }else
2905
drhc2ce0be2014-05-29 12:36:14 +00002906 if( c=='h' && strncmp(azArg[0], "help", n)==0 ){
2907 fprintf(p->out, "%s", zHelp);
2908 }else
2909
2910 if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
drh01f37542014-05-31 15:43:33 +00002911 char *zTable; /* Insert data into this table */
2912 char *zFile; /* Name of file to extra content from */
shane916f9612009-10-23 00:37:15 +00002913 sqlite3_stmt *pStmt = NULL; /* A statement */
drhfeac5f82004-08-01 00:10:45 +00002914 int nCol; /* Number of columns in the table */
2915 int nByte; /* Number of bytes in an SQL string */
2916 int i, j; /* Loop counters */
drh2d463112013-08-06 14:36:36 +00002917 int needCommit; /* True to COMMIT or ROLLBACK at end */
mistachkin636bf9f2014-07-19 20:15:16 +00002918 int nSep; /* Number of bytes in p->colSeparator[] */
drhfeac5f82004-08-01 00:10:45 +00002919 char *zSql; /* An SQL statement */
mistachkin636bf9f2014-07-19 20:15:16 +00002920 ImportCtx sCtx; /* Reader context */
mistachkin44723ce2015-03-21 02:22:37 +00002921 char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
2922 int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */
drhfeac5f82004-08-01 00:10:45 +00002923
drhc2ce0be2014-05-29 12:36:14 +00002924 if( nArg!=3 ){
2925 fprintf(stderr, "Usage: .import FILE TABLE\n");
2926 goto meta_command_exit;
2927 }
drh01f37542014-05-31 15:43:33 +00002928 zFile = azArg[1];
2929 zTable = azArg[2];
drhdb95f682013-06-26 22:46:00 +00002930 seenInterrupt = 0;
mistachkin636bf9f2014-07-19 20:15:16 +00002931 memset(&sCtx, 0, sizeof(sCtx));
drh05782482013-10-24 15:20:20 +00002932 open_db(p, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002933 nSep = strlen30(p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00002934 if( nSep==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002935 fprintf(stderr, "Error: non-null column separator required for import\n");
shane916f9612009-10-23 00:37:15 +00002936 return 1;
drhfeac5f82004-08-01 00:10:45 +00002937 }
drhdb95f682013-06-26 22:46:00 +00002938 if( nSep>1 ){
mistachkin636bf9f2014-07-19 20:15:16 +00002939 fprintf(stderr, "Error: multi-character column separators not allowed"
drhdb95f682013-06-26 22:46:00 +00002940 " for import\n");
2941 return 1;
2942 }
mistachkin636bf9f2014-07-19 20:15:16 +00002943 nSep = strlen30(p->rowSeparator);
2944 if( nSep==0 ){
2945 fprintf(stderr, "Error: non-null row separator required for import\n");
2946 return 1;
2947 }
mistachkine0d68852014-12-11 03:12:33 +00002948 if( nSep==2 && p->mode==MODE_Csv && strcmp(p->rowSeparator, SEP_CrLf)==0 ){
2949 /* When importing CSV (only), if the row separator is set to the
2950 ** default output row separator, change it to the default input
2951 ** row separator. This avoids having to maintain different input
2952 ** and output row separators. */
2953 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row);
2954 nSep = strlen30(p->rowSeparator);
2955 }
mistachkin636bf9f2014-07-19 20:15:16 +00002956 if( nSep>1 ){
2957 fprintf(stderr, "Error: multi-character row separators not allowed"
2958 " for import\n");
2959 return 1;
2960 }
2961 sCtx.zFile = zFile;
2962 sCtx.nLine = 1;
2963 if( sCtx.zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00002964#ifdef SQLITE_OMIT_POPEN
mistachkinba132c72015-03-19 14:48:38 +00002965 fprintf(stderr, "Error: pipes are not supported in this OS\n");
drh8cd5b252015-03-02 22:06:43 +00002966 return 1;
2967#else
mistachkin636bf9f2014-07-19 20:15:16 +00002968 sCtx.in = popen(sCtx.zFile+1, "r");
2969 sCtx.zFile = "<pipe>";
drh5bde8162013-06-27 14:07:53 +00002970 xCloser = pclose;
drh8cd5b252015-03-02 22:06:43 +00002971#endif
drh5bde8162013-06-27 14:07:53 +00002972 }else{
mistachkin636bf9f2014-07-19 20:15:16 +00002973 sCtx.in = fopen(sCtx.zFile, "rb");
drh5bde8162013-06-27 14:07:53 +00002974 xCloser = fclose;
2975 }
mistachkin636bf9f2014-07-19 20:15:16 +00002976 if( p->mode==MODE_Ascii ){
2977 xRead = ascii_read_one_field;
2978 }else{
2979 xRead = csv_read_one_field;
2980 }
2981 if( sCtx.in==0 ){
drh5bde8162013-06-27 14:07:53 +00002982 fprintf(stderr, "Error: cannot open \"%s\"\n", zFile);
drhdb95f682013-06-26 22:46:00 +00002983 return 1;
2984 }
mistachkin636bf9f2014-07-19 20:15:16 +00002985 sCtx.cColSep = p->colSeparator[0];
2986 sCtx.cRowSep = p->rowSeparator[0];
drh7b075e32011-09-28 01:10:00 +00002987 zSql = sqlite3_mprintf("SELECT * FROM %s", zTable);
shane916f9612009-10-23 00:37:15 +00002988 if( zSql==0 ){
2989 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00002990 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00002991 return 1;
2992 }
drh4f21c4a2008-12-10 22:15:00 +00002993 nByte = strlen30(zSql);
drhc7181902014-02-27 15:04:13 +00002994 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
mistachkin636bf9f2014-07-19 20:15:16 +00002995 import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
mistachkin8e189222015-04-19 21:43:16 +00002996 if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
drhdb95f682013-06-26 22:46:00 +00002997 char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable);
2998 char cSep = '(';
mistachkin636bf9f2014-07-19 20:15:16 +00002999 while( xRead(&sCtx) ){
3000 zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCtx.z);
drhdb95f682013-06-26 22:46:00 +00003001 cSep = ',';
mistachkin636bf9f2014-07-19 20:15:16 +00003002 if( sCtx.cTerm!=sCtx.cColSep ) break;
drhdb95f682013-06-26 22:46:00 +00003003 }
drh5bde8162013-06-27 14:07:53 +00003004 if( cSep=='(' ){
3005 sqlite3_free(zCreate);
mistachkin636bf9f2014-07-19 20:15:16 +00003006 sqlite3_free(sCtx.z);
3007 xCloser(sCtx.in);
3008 fprintf(stderr,"%s: empty file\n", sCtx.zFile);
drh5bde8162013-06-27 14:07:53 +00003009 return 1;
3010 }
drhdb95f682013-06-26 22:46:00 +00003011 zCreate = sqlite3_mprintf("%z\n)", zCreate);
3012 rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
3013 sqlite3_free(zCreate);
3014 if( rc ){
3015 fprintf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable,
mistachkin8e189222015-04-19 21:43:16 +00003016 sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003017 sqlite3_free(sCtx.z);
3018 xCloser(sCtx.in);
drhdb95f682013-06-26 22:46:00 +00003019 return 1;
3020 }
drhc7181902014-02-27 15:04:13 +00003021 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003022 }
drhfeac5f82004-08-01 00:10:45 +00003023 sqlite3_free(zSql);
3024 if( rc ){
shane916f9612009-10-23 00:37:15 +00003025 if (pStmt) sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003026 fprintf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
mistachkin636bf9f2014-07-19 20:15:16 +00003027 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003028 return 1;
drhfeac5f82004-08-01 00:10:45 +00003029 }
shane916f9612009-10-23 00:37:15 +00003030 nCol = sqlite3_column_count(pStmt);
drhfeac5f82004-08-01 00:10:45 +00003031 sqlite3_finalize(pStmt);
shane916f9612009-10-23 00:37:15 +00003032 pStmt = 0;
shane9bd1b442009-10-23 01:27:39 +00003033 if( nCol==0 ) return 0; /* no columns, no error */
drhdb95f682013-06-26 22:46:00 +00003034 zSql = sqlite3_malloc( nByte*2 + 20 + nCol*2 );
shane916f9612009-10-23 00:37:15 +00003035 if( zSql==0 ){
3036 fprintf(stderr, "Error: out of memory\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003037 xCloser(sCtx.in);
shane916f9612009-10-23 00:37:15 +00003038 return 1;
3039 }
drhdb95f682013-06-26 22:46:00 +00003040 sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable);
drh4f21c4a2008-12-10 22:15:00 +00003041 j = strlen30(zSql);
drhfeac5f82004-08-01 00:10:45 +00003042 for(i=1; i<nCol; i++){
3043 zSql[j++] = ',';
3044 zSql[j++] = '?';
3045 }
3046 zSql[j++] = ')';
3047 zSql[j] = 0;
drhc7181902014-02-27 15:04:13 +00003048 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
drhdb95f682013-06-26 22:46:00 +00003049 sqlite3_free(zSql);
drhfeac5f82004-08-01 00:10:45 +00003050 if( rc ){
mistachkin8e189222015-04-19 21:43:16 +00003051 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane916f9612009-10-23 00:37:15 +00003052 if (pStmt) sqlite3_finalize(pStmt);
mistachkin636bf9f2014-07-19 20:15:16 +00003053 xCloser(sCtx.in);
drh47ad6842006-11-08 12:25:42 +00003054 return 1;
drhfeac5f82004-08-01 00:10:45 +00003055 }
mistachkin8e189222015-04-19 21:43:16 +00003056 needCommit = sqlite3_get_autocommit(p->db);
3057 if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
drhdb95f682013-06-26 22:46:00 +00003058 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003059 int startLine = sCtx.nLine;
drhfeac5f82004-08-01 00:10:45 +00003060 for(i=0; i<nCol; i++){
mistachkin636bf9f2014-07-19 20:15:16 +00003061 char *z = xRead(&sCtx);
3062 /*
3063 ** Did we reach end-of-file before finding any columns?
3064 ** If so, stop instead of NULL filling the remaining columns.
3065 */
drhdb95f682013-06-26 22:46:00 +00003066 if( z==0 && i==0 ) break;
mistachkin636bf9f2014-07-19 20:15:16 +00003067 /*
3068 ** Did we reach end-of-file OR end-of-line before finding any
3069 ** columns in ASCII mode? If so, stop instead of NULL filling
3070 ** the remaining columns.
3071 */
3072 if( p->mode==MODE_Ascii && (z==0 || z[0]==0) && i==0 ) break;
drhdb95f682013-06-26 22:46:00 +00003073 sqlite3_bind_text(pStmt, i+1, z, -1, SQLITE_TRANSIENT);
mistachkin636bf9f2014-07-19 20:15:16 +00003074 if( i<nCol-1 && sCtx.cTerm!=sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003075 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3076 "filling the rest with NULL\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003077 sCtx.zFile, startLine, nCol, i+1);
mistachkina0efb1a2015-02-12 22:45:25 +00003078 i += 2;
mistachkin6fe03382014-06-16 22:45:28 +00003079 while( i<=nCol ){ sqlite3_bind_null(pStmt, i); i++; }
drh18f52e02012-01-16 16:56:31 +00003080 }
drhfeac5f82004-08-01 00:10:45 +00003081 }
mistachkin636bf9f2014-07-19 20:15:16 +00003082 if( sCtx.cTerm==sCtx.cColSep ){
drhdb95f682013-06-26 22:46:00 +00003083 do{
mistachkin636bf9f2014-07-19 20:15:16 +00003084 xRead(&sCtx);
drhdb95f682013-06-26 22:46:00 +00003085 i++;
mistachkin636bf9f2014-07-19 20:15:16 +00003086 }while( sCtx.cTerm==sCtx.cColSep );
drhdb95f682013-06-26 22:46:00 +00003087 fprintf(stderr, "%s:%d: expected %d columns but found %d - "
3088 "extras ignored\n",
mistachkin636bf9f2014-07-19 20:15:16 +00003089 sCtx.zFile, startLine, nCol, i);
drhfeac5f82004-08-01 00:10:45 +00003090 }
drhdb95f682013-06-26 22:46:00 +00003091 if( i>=nCol ){
3092 sqlite3_step(pStmt);
3093 rc = sqlite3_reset(pStmt);
3094 if( rc!=SQLITE_OK ){
mistachkin636bf9f2014-07-19 20:15:16 +00003095 fprintf(stderr, "%s:%d: INSERT failed: %s\n", sCtx.zFile, startLine,
mistachkin8e189222015-04-19 21:43:16 +00003096 sqlite3_errmsg(p->db));
drhdb95f682013-06-26 22:46:00 +00003097 }
3098 }
mistachkin636bf9f2014-07-19 20:15:16 +00003099 }while( sCtx.cTerm!=EOF );
drhdb95f682013-06-26 22:46:00 +00003100
mistachkin636bf9f2014-07-19 20:15:16 +00003101 xCloser(sCtx.in);
3102 sqlite3_free(sCtx.z);
drhfeac5f82004-08-01 00:10:45 +00003103 sqlite3_finalize(pStmt);
mistachkin8e189222015-04-19 21:43:16 +00003104 if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0);
drhfeac5f82004-08-01 00:10:45 +00003105 }else
3106
drh0e55db12015-02-06 14:51:13 +00003107 if( c=='i' && (strncmp(azArg[0], "indices", n)==0
3108 || strncmp(azArg[0], "indexes", n)==0) ){
drhdcd87a92014-08-18 13:45:42 +00003109 ShellState data;
drh75897232000-05-29 14:26:00 +00003110 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003111 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003112 memcpy(&data, p, sizeof(data));
3113 data.showHeader = 0;
3114 data.mode = MODE_List;
shane86f5bdb2009-10-24 02:00:07 +00003115 if( nArg==1 ){
3116 rc = sqlite3_exec(p->db,
3117 "SELECT name FROM sqlite_master "
3118 "WHERE type='index' AND name NOT LIKE 'sqlite_%' "
3119 "UNION ALL "
3120 "SELECT name FROM sqlite_temp_master "
3121 "WHERE type='index' "
3122 "ORDER BY 1",
3123 callback, &data, &zErrMsg
3124 );
drhc2ce0be2014-05-29 12:36:14 +00003125 }else if( nArg==2 ){
shane86f5bdb2009-10-24 02:00:07 +00003126 zShellStatic = azArg[1];
3127 rc = sqlite3_exec(p->db,
3128 "SELECT name FROM sqlite_master "
3129 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3130 "UNION ALL "
3131 "SELECT name FROM sqlite_temp_master "
3132 "WHERE type='index' AND tbl_name LIKE shellstatic() "
3133 "ORDER BY 1",
3134 callback, &data, &zErrMsg
3135 );
3136 zShellStatic = 0;
drhc2ce0be2014-05-29 12:36:14 +00003137 }else{
drh0e55db12015-02-06 14:51:13 +00003138 fprintf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n");
drhc2ce0be2014-05-29 12:36:14 +00003139 rc = 1;
3140 goto meta_command_exit;
shane86f5bdb2009-10-24 02:00:07 +00003141 }
drh75897232000-05-29 14:26:00 +00003142 if( zErrMsg ){
3143 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003144 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003145 rc = 1;
shane86f5bdb2009-10-24 02:00:07 +00003146 }else if( rc != SQLITE_OK ){
3147 fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n");
3148 rc = 1;
drh75897232000-05-29 14:26:00 +00003149 }
3150 }else
3151
drhae5e4452007-05-03 17:18:36 +00003152#ifdef SQLITE_ENABLE_IOTRACE
drhb0603412007-02-28 04:47:26 +00003153 if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){
mistachkin9871a932015-03-27 00:21:52 +00003154 SQLITE_API extern void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...);
drhb0603412007-02-28 04:47:26 +00003155 if( iotrace && iotrace!=stdout ) fclose(iotrace);
3156 iotrace = 0;
3157 if( nArg<2 ){
mlcreech3a00f902008-03-04 17:45:01 +00003158 sqlite3IoTrace = 0;
drhb0603412007-02-28 04:47:26 +00003159 }else if( strcmp(azArg[1], "-")==0 ){
mlcreech3a00f902008-03-04 17:45:01 +00003160 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003161 iotrace = stdout;
3162 }else{
3163 iotrace = fopen(azArg[1], "w");
3164 if( iotrace==0 ){
shane9bd1b442009-10-23 01:27:39 +00003165 fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]);
mlcreech3a00f902008-03-04 17:45:01 +00003166 sqlite3IoTrace = 0;
shane9bd1b442009-10-23 01:27:39 +00003167 rc = 1;
drhb0603412007-02-28 04:47:26 +00003168 }else{
mlcreech3a00f902008-03-04 17:45:01 +00003169 sqlite3IoTrace = iotracePrintf;
drhb0603412007-02-28 04:47:26 +00003170 }
3171 }
3172 }else
drhae5e4452007-05-03 17:18:36 +00003173#endif
drhb0603412007-02-28 04:47:26 +00003174
drh70df4fe2006-06-13 15:12:21 +00003175#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhc2ce0be2014-05-29 12:36:14 +00003176 if( c=='l' && strncmp(azArg[0], "load", n)==0 ){
drh1e397f82006-06-08 15:28:43 +00003177 const char *zFile, *zProc;
3178 char *zErrMsg = 0;
drhc2ce0be2014-05-29 12:36:14 +00003179 if( nArg<2 ){
3180 fprintf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
3181 rc = 1;
3182 goto meta_command_exit;
3183 }
drh1e397f82006-06-08 15:28:43 +00003184 zFile = azArg[1];
3185 zProc = nArg>=3 ? azArg[2] : 0;
drh05782482013-10-24 15:20:20 +00003186 open_db(p, 0);
drh1e397f82006-06-08 15:28:43 +00003187 rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
3188 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003189 fprintf(stderr, "Error: %s\n", zErrMsg);
drh1e397f82006-06-08 15:28:43 +00003190 sqlite3_free(zErrMsg);
drh47ad6842006-11-08 12:25:42 +00003191 rc = 1;
drh1e397f82006-06-08 15:28:43 +00003192 }
3193 }else
drh70df4fe2006-06-13 15:12:21 +00003194#endif
drh1e397f82006-06-08 15:28:43 +00003195
drhc2ce0be2014-05-29 12:36:14 +00003196 if( c=='l' && strncmp(azArg[0], "log", n)==0 ){
3197 if( nArg!=2 ){
3198 fprintf(stderr, "Usage: .log FILENAME\n");
3199 rc = 1;
3200 }else{
3201 const char *zFile = azArg[1];
3202 output_file_close(p->pLog);
3203 p->pLog = output_file_open(zFile);
3204 }
drh127f9d72010-02-23 01:47:00 +00003205 }else
3206
drhc2ce0be2014-05-29 12:36:14 +00003207 if( c=='m' && strncmp(azArg[0], "mode", n)==0 ){
3208 const char *zMode = nArg>=2 ? azArg[1] : "";
3209 int n2 = (int)strlen(zMode);
3210 int c2 = zMode[0];
3211 if( c2=='l' && n2>2 && strncmp(azArg[1],"lines",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003212 p->mode = MODE_Line;
drhc2ce0be2014-05-29 12:36:14 +00003213 }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003214 p->mode = MODE_Column;
drhc2ce0be2014-05-29 12:36:14 +00003215 }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){
drh75897232000-05-29 14:26:00 +00003216 p->mode = MODE_List;
drhc2ce0be2014-05-29 12:36:14 +00003217 }else if( c2=='h' && strncmp(azArg[1],"html",n2)==0 ){
drh1e5d0e92000-05-31 23:33:17 +00003218 p->mode = MODE_Html;
drhc2ce0be2014-05-29 12:36:14 +00003219 }else if( c2=='t' && strncmp(azArg[1],"tcl",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003220 p->mode = MODE_Tcl;
mistachkinfad42082014-07-24 22:13:12 +00003221 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Space);
drhc2ce0be2014-05-29 12:36:14 +00003222 }else if( c2=='c' && strncmp(azArg[1],"csv",n2)==0 ){
drh8e64d1c2004-10-07 00:32:39 +00003223 p->mode = MODE_Csv;
mistachkinfad42082014-07-24 22:13:12 +00003224 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma);
mistachkine0d68852014-12-11 03:12:33 +00003225 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_CrLf);
drhc2ce0be2014-05-29 12:36:14 +00003226 }else if( c2=='t' && strncmp(azArg[1],"tabs",n2)==0 ){
drhfeac5f82004-08-01 00:10:45 +00003227 p->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00003228 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Tab);
drhc2ce0be2014-05-29 12:36:14 +00003229 }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){
drh28bd4bc2000-06-15 15:57:22 +00003230 p->mode = MODE_Insert;
drhc2ce0be2014-05-29 12:36:14 +00003231 set_table_name(p, nArg>=3 ? azArg[2] : "table");
mistachkin636bf9f2014-07-19 20:15:16 +00003232 }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){
3233 p->mode = MODE_Ascii;
mistachkinfad42082014-07-24 22:13:12 +00003234 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit);
3235 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record);
drhdaffd0e2001-04-11 14:28:42 +00003236 }else {
shane9bd1b442009-10-23 01:27:39 +00003237 fprintf(stderr,"Error: mode should be one of: "
mistachkin636bf9f2014-07-19 20:15:16 +00003238 "ascii column csv html insert line list tabs tcl\n");
shane9bd1b442009-10-23 01:27:39 +00003239 rc = 1;
drh75897232000-05-29 14:26:00 +00003240 }
3241 }else
3242
drhc2ce0be2014-05-29 12:36:14 +00003243 if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 ){
3244 if( nArg==2 ){
mistachkin44b99f72014-12-11 03:29:14 +00003245 sqlite3_snprintf(sizeof(p->nullValue), p->nullValue,
3246 "%.*s", (int)ArraySize(p->nullValue)-1, azArg[1]);
drhc2ce0be2014-05-29 12:36:14 +00003247 }else{
3248 fprintf(stderr, "Usage: .nullvalue STRING\n");
shanehe2aa9d72009-11-06 17:20:17 +00003249 rc = 1;
3250 }
3251 }else
3252
drh05782482013-10-24 15:20:20 +00003253 if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
3254 sqlite3 *savedDb = p->db;
3255 const char *zSavedFilename = p->zDbFilename;
3256 char *zNewFilename = 0;
3257 p->db = 0;
3258 if( nArg>=2 ){
3259 p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
3260 }
3261 open_db(p, 1);
3262 if( p->db!=0 ){
3263 sqlite3_close(savedDb);
3264 sqlite3_free(p->zFreeOnClose);
3265 p->zFreeOnClose = zNewFilename;
3266 }else{
3267 sqlite3_free(zNewFilename);
3268 p->db = savedDb;
3269 p->zDbFilename = zSavedFilename;
3270 }
3271 }else
3272
drhc2ce0be2014-05-29 12:36:14 +00003273 if( c=='o'
3274 && (strncmp(azArg[0], "output", n)==0 || strncmp(azArg[0], "once", n)==0)
3275 ){
3276 const char *zFile = nArg>=2 ? azArg[1] : "stdout";
3277 if( nArg>2 ){
3278 fprintf(stderr, "Usage: .%s FILE\n", azArg[0]);
3279 rc = 1;
3280 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003281 }
drhc2ce0be2014-05-29 12:36:14 +00003282 if( n>1 && strncmp(azArg[0], "once", n)==0 ){
3283 if( nArg<2 ){
3284 fprintf(stderr, "Usage: .once FILE\n");
3285 rc = 1;
3286 goto meta_command_exit;
3287 }
3288 p->outCount = 2;
3289 }else{
3290 p->outCount = 0;
3291 }
3292 output_reset(p);
3293 if( zFile[0]=='|' ){
drh8cd5b252015-03-02 22:06:43 +00003294#ifdef SQLITE_OMIT_POPEN
3295 fprintf(stderr,"Error: pipes are not supported in this OS\n");
3296 rc = 1;
3297 p->out = stdout;
3298#else
drhc2ce0be2014-05-29 12:36:14 +00003299 p->out = popen(zFile + 1, "w");
drhe1da8fa2012-03-30 00:05:57 +00003300 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003301 fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
drhe1da8fa2012-03-30 00:05:57 +00003302 p->out = stdout;
3303 rc = 1;
3304 }else{
drhc2ce0be2014-05-29 12:36:14 +00003305 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drhe1da8fa2012-03-30 00:05:57 +00003306 }
drh8cd5b252015-03-02 22:06:43 +00003307#endif
drh75897232000-05-29 14:26:00 +00003308 }else{
drhc2ce0be2014-05-29 12:36:14 +00003309 p->out = output_file_open(zFile);
drh75897232000-05-29 14:26:00 +00003310 if( p->out==0 ){
drhc2ce0be2014-05-29 12:36:14 +00003311 if( strcmp(zFile,"off")!=0 ){
3312 fprintf(stderr,"Error: cannot write to \"%s\"\n", zFile);
drh42f64e52012-04-04 16:56:23 +00003313 }
drh75897232000-05-29 14:26:00 +00003314 p->out = stdout;
shane9bd1b442009-10-23 01:27:39 +00003315 rc = 1;
persicom7e2dfdd2002-04-18 02:46:52 +00003316 } else {
drhc2ce0be2014-05-29 12:36:14 +00003317 sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
drh75897232000-05-29 14:26:00 +00003318 }
3319 }
3320 }else
3321
drh078b1fd2012-09-21 13:40:02 +00003322 if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){
3323 int i;
3324 for(i=1; i<nArg; i++){
3325 if( i>1 ) fprintf(p->out, " ");
3326 fprintf(p->out, "%s", azArg[i]);
3327 }
3328 fprintf(p->out, "\n");
3329 }else
3330
drhc2ce0be2014-05-29 12:36:14 +00003331 if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003332 if( nArg >= 2) {
3333 strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1);
3334 }
3335 if( nArg >= 3) {
3336 strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1);
3337 }
3338 }else
3339
drhc2ce0be2014-05-29 12:36:14 +00003340 if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){
drh47ad6842006-11-08 12:25:42 +00003341 rc = 2;
persicom7e2dfdd2002-04-18 02:46:52 +00003342 }else
3343
drhc2ce0be2014-05-29 12:36:14 +00003344 if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){
3345 FILE *alt;
3346 if( nArg!=2 ){
3347 fprintf(stderr, "Usage: .read FILE\n");
3348 rc = 1;
3349 goto meta_command_exit;
3350 }
3351 alt = fopen(azArg[1], "rb");
drhdaffd0e2001-04-11 14:28:42 +00003352 if( alt==0 ){
shane9bd1b442009-10-23 01:27:39 +00003353 fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]);
3354 rc = 1;
drhdaffd0e2001-04-11 14:28:42 +00003355 }else{
shane9bd1b442009-10-23 01:27:39 +00003356 rc = process_input(p, alt);
drhdaffd0e2001-04-11 14:28:42 +00003357 fclose(alt);
3358 }
3359 }else
3360
drhc2ce0be2014-05-29 12:36:14 +00003361 if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){
drh9ff849f2009-02-04 20:55:57 +00003362 const char *zSrcFile;
3363 const char *zDb;
3364 sqlite3 *pSrc;
3365 sqlite3_backup *pBackup;
drhdc2c4912009-02-04 22:46:47 +00003366 int nTimeout = 0;
3367
drh9ff849f2009-02-04 20:55:57 +00003368 if( nArg==2 ){
3369 zSrcFile = azArg[1];
3370 zDb = "main";
drhc2ce0be2014-05-29 12:36:14 +00003371 }else if( nArg==3 ){
drh9ff849f2009-02-04 20:55:57 +00003372 zSrcFile = azArg[2];
3373 zDb = azArg[1];
drhc2ce0be2014-05-29 12:36:14 +00003374 }else{
3375 fprintf(stderr, "Usage: .restore ?DB? FILE\n");
3376 rc = 1;
3377 goto meta_command_exit;
drh9ff849f2009-02-04 20:55:57 +00003378 }
3379 rc = sqlite3_open(zSrcFile, &pSrc);
3380 if( rc!=SQLITE_OK ){
shane9bd1b442009-10-23 01:27:39 +00003381 fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile);
drh9ff849f2009-02-04 20:55:57 +00003382 sqlite3_close(pSrc);
3383 return 1;
3384 }
drh05782482013-10-24 15:20:20 +00003385 open_db(p, 0);
drh9ff849f2009-02-04 20:55:57 +00003386 pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
3387 if( pBackup==0 ){
3388 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
3389 sqlite3_close(pSrc);
3390 return 1;
3391 }
drhdc2c4912009-02-04 22:46:47 +00003392 while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK
3393 || rc==SQLITE_BUSY ){
3394 if( rc==SQLITE_BUSY ){
3395 if( nTimeout++ >= 3 ) break;
3396 sqlite3_sleep(100);
drh9ff849f2009-02-04 20:55:57 +00003397 }
3398 }
3399 sqlite3_backup_finish(pBackup);
3400 if( rc==SQLITE_DONE ){
shane9bd1b442009-10-23 01:27:39 +00003401 rc = 0;
drhdc2c4912009-02-04 22:46:47 +00003402 }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
shane9bd1b442009-10-23 01:27:39 +00003403 fprintf(stderr, "Error: source database is busy\n");
3404 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003405 }else{
3406 fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
shane9bd1b442009-10-23 01:27:39 +00003407 rc = 1;
drh9ff849f2009-02-04 20:55:57 +00003408 }
3409 sqlite3_close(pSrc);
3410 }else
3411
dan8d1edb92014-11-05 09:07:28 +00003412
3413 if( c=='s' && strncmp(azArg[0], "scanstats", n)==0 ){
3414 if( nArg==2 ){
3415 p->scanstatsOn = booleanValue(azArg[1]);
drh15f23c22014-11-06 12:46:16 +00003416#ifndef SQLITE_ENABLE_STMT_SCANSTATUS
3417 fprintf(stderr, "Warning: .scanstats not available in this build.\n");
3418#endif
dan8d1edb92014-11-05 09:07:28 +00003419 }else{
3420 fprintf(stderr, "Usage: .scanstats on|off\n");
3421 rc = 1;
3422 }
3423 }else
3424
drhc2ce0be2014-05-29 12:36:14 +00003425 if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){
drhdcd87a92014-08-18 13:45:42 +00003426 ShellState data;
drh75897232000-05-29 14:26:00 +00003427 char *zErrMsg = 0;
drh05782482013-10-24 15:20:20 +00003428 open_db(p, 0);
drh75897232000-05-29 14:26:00 +00003429 memcpy(&data, p, sizeof(data));
3430 data.showHeader = 0;
drhe3710332000-09-29 13:30:53 +00003431 data.mode = MODE_Semi;
drhc2ce0be2014-05-29 12:36:14 +00003432 if( nArg==2 ){
drhc8d74412004-08-31 23:41:26 +00003433 int i;
drhf0693c82011-10-11 20:41:54 +00003434 for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]);
drhc8d74412004-08-31 23:41:26 +00003435 if( strcmp(azArg[1],"sqlite_master")==0 ){
drha18c5682000-10-08 22:20:57 +00003436 char *new_argv[2], *new_colv[2];
3437 new_argv[0] = "CREATE TABLE sqlite_master (\n"
3438 " type text,\n"
3439 " name text,\n"
3440 " tbl_name text,\n"
drhadbca9c2001-09-27 15:11:53 +00003441 " rootpage integer,\n"
drha18c5682000-10-08 22:20:57 +00003442 " sql text\n"
3443 ")";
3444 new_argv[1] = 0;
3445 new_colv[0] = "sql";
3446 new_colv[1] = 0;
3447 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003448 rc = SQLITE_OK;
drhc8d74412004-08-31 23:41:26 +00003449 }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){
drhe0bc4042002-06-25 01:09:11 +00003450 char *new_argv[2], *new_colv[2];
3451 new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n"
3452 " type text,\n"
3453 " name text,\n"
3454 " tbl_name text,\n"
3455 " rootpage integer,\n"
3456 " sql text\n"
3457 ")";
3458 new_argv[1] = 0;
3459 new_colv[0] = "sql";
3460 new_colv[1] = 0;
3461 callback(&data, 1, new_argv, new_colv);
shane9bd1b442009-10-23 01:27:39 +00003462 rc = SQLITE_OK;
drha18c5682000-10-08 22:20:57 +00003463 }else{
danielk1977bc6ada42004-06-30 08:20:16 +00003464 zShellStatic = azArg[1];
shane9bd1b442009-10-23 01:27:39 +00003465 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003466 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003467 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003468 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003469 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh6ac7a582011-11-04 00:35:56 +00003470 "WHERE lower(tbl_name) LIKE shellstatic()"
3471 " AND type!='meta' AND sql NOTNULL "
drh1ba00292013-05-06 21:01:06 +00003472 "ORDER BY rowid",
danielk1977bc6ada42004-06-30 08:20:16 +00003473 callback, &data, &zErrMsg);
3474 zShellStatic = 0;
drha18c5682000-10-08 22:20:57 +00003475 }
drhc2ce0be2014-05-29 12:36:14 +00003476 }else if( nArg==1 ){
shane9bd1b442009-10-23 01:27:39 +00003477 rc = sqlite3_exec(p->db,
drhe0bc4042002-06-25 01:09:11 +00003478 "SELECT sql FROM "
drhac43e982012-05-21 03:15:06 +00003479 " (SELECT sql sql, type type, tbl_name tbl_name, name name, rowid x"
drh8f800a72009-01-14 23:17:55 +00003480 " FROM sqlite_master UNION ALL"
drhac43e982012-05-21 03:15:06 +00003481 " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_master) "
drh4b2590e2014-08-19 19:28:00 +00003482 "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' "
drh1ba00292013-05-06 21:01:06 +00003483 "ORDER BY rowid",
drha18c5682000-10-08 22:20:57 +00003484 callback, &data, &zErrMsg
3485 );
drhc2ce0be2014-05-29 12:36:14 +00003486 }else{
3487 fprintf(stderr, "Usage: .schema ?LIKE-PATTERN?\n");
3488 rc = 1;
3489 goto meta_command_exit;
drh75897232000-05-29 14:26:00 +00003490 }
drh75897232000-05-29 14:26:00 +00003491 if( zErrMsg ){
3492 fprintf(stderr,"Error: %s\n", zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00003493 sqlite3_free(zErrMsg);
shane9bd1b442009-10-23 01:27:39 +00003494 rc = 1;
3495 }else if( rc != SQLITE_OK ){
3496 fprintf(stderr,"Error: querying schema information\n");
3497 rc = 1;
3498 }else{
3499 rc = 0;
drh75897232000-05-29 14:26:00 +00003500 }
3501 }else
3502
drhabd4c722014-09-20 18:18:33 +00003503
3504#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_SELECTTRACE)
3505 if( c=='s' && n==11 && strncmp(azArg[0], "selecttrace", n)==0 ){
3506 extern int sqlite3SelectTrace;
drh1d9be4f2015-01-22 11:29:25 +00003507 sqlite3SelectTrace = integerValue(azArg[1]);
drhabd4c722014-09-20 18:18:33 +00003508 }else
3509#endif
3510
3511
drh340f5822013-06-27 13:01:21 +00003512#ifdef SQLITE_DEBUG
drh348d19c2013-06-03 12:47:43 +00003513 /* Undocumented commands for internal testing. Subject to change
3514 ** without notice. */
3515 if( c=='s' && n>=10 && strncmp(azArg[0], "selftest-", 9)==0 ){
3516 if( strncmp(azArg[0]+9, "boolean", n-9)==0 ){
3517 int i, v;
3518 for(i=1; i<nArg; i++){
3519 v = booleanValue(azArg[i]);
3520 fprintf(p->out, "%s: %d 0x%x\n", azArg[i], v, v);
3521 }
3522 }
3523 if( strncmp(azArg[0]+9, "integer", n-9)==0 ){
3524 int i; sqlite3_int64 v;
3525 for(i=1; i<nArg; i++){
drh340f5822013-06-27 13:01:21 +00003526 char zBuf[200];
drh348d19c2013-06-03 12:47:43 +00003527 v = integerValue(azArg[i]);
drhc2ce0be2014-05-29 12:36:14 +00003528 sqlite3_snprintf(sizeof(zBuf),zBuf,"%s: %lld 0x%llx\n", azArg[i],v,v);
drh340f5822013-06-27 13:01:21 +00003529 fprintf(p->out, "%s", zBuf);
drh348d19c2013-06-03 12:47:43 +00003530 }
3531 }
3532 }else
drh340f5822013-06-27 13:01:21 +00003533#endif
drh348d19c2013-06-03 12:47:43 +00003534
drhc2ce0be2014-05-29 12:36:14 +00003535 if( c=='s' && strncmp(azArg[0], "separator", n)==0 ){
drh6976c212014-07-24 12:09:47 +00003536 if( nArg<2 || nArg>3 ){
mistachkine0d68852014-12-11 03:12:33 +00003537 fprintf(stderr, "Usage: .separator COL ?ROW?\n");
drhc2ce0be2014-05-29 12:36:14 +00003538 rc = 1;
3539 }
drh6976c212014-07-24 12:09:47 +00003540 if( nArg>=2 ){
mistachkin636bf9f2014-07-19 20:15:16 +00003541 sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator,
mistachkin22c96382014-07-24 22:51:18 +00003542 "%.*s", (int)ArraySize(p->colSeparator)-1, azArg[1]);
drh6976c212014-07-24 12:09:47 +00003543 }
3544 if( nArg>=3 ){
mistachkine0d68852014-12-11 03:12:33 +00003545 sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator,
3546 "%.*s", (int)ArraySize(p->rowSeparator)-1, azArg[2]);
drh5bb3eb92007-05-04 13:15:55 +00003547 }
drh75897232000-05-29 14:26:00 +00003548 }else
3549
drh62cdde52014-05-28 20:22:28 +00003550 if( c=='s'
3551 && (strncmp(azArg[0], "shell", n)==0 || strncmp(azArg[0],"system",n)==0)
drh62cdde52014-05-28 20:22:28 +00003552 ){
3553 char *zCmd;
drh54027102014-08-06 14:36:53 +00003554 int i, x;
drhc2ce0be2014-05-29 12:36:14 +00003555 if( nArg<2 ){
3556 fprintf(stderr, "Usage: .system COMMAND\n");
3557 rc = 1;
3558 goto meta_command_exit;
3559 }
drhdcb3e3d2014-05-29 03:17:29 +00003560 zCmd = sqlite3_mprintf(strchr(azArg[1],' ')==0?"%s":"\"%s\"", azArg[1]);
drh62cdde52014-05-28 20:22:28 +00003561 for(i=2; i<nArg; i++){
drhdcb3e3d2014-05-29 03:17:29 +00003562 zCmd = sqlite3_mprintf(strchr(azArg[i],' ')==0?"%z %s":"%z \"%s\"",
3563 zCmd, azArg[i]);
drh62cdde52014-05-28 20:22:28 +00003564 }
drh54027102014-08-06 14:36:53 +00003565 x = system(zCmd);
drh62cdde52014-05-28 20:22:28 +00003566 sqlite3_free(zCmd);
drh54027102014-08-06 14:36:53 +00003567 if( x ) fprintf(stderr, "System command returns %d\n", x);
drh62cdde52014-05-28 20:22:28 +00003568 }else
3569
drhc2ce0be2014-05-29 12:36:14 +00003570 if( c=='s' && strncmp(azArg[0], "show", n)==0 ){
persicom7e2dfdd2002-04-18 02:46:52 +00003571 int i;
drhc2ce0be2014-05-29 12:36:14 +00003572 if( nArg!=1 ){
3573 fprintf(stderr, "Usage: .show\n");
3574 rc = 1;
3575 goto meta_command_exit;
3576 }
mistachkin636bf9f2014-07-19 20:15:16 +00003577 fprintf(p->out,"%12.12s: %s\n","echo", p->echoOn ? "on" : "off");
3578 fprintf(p->out,"%12.12s: %s\n","eqp", p->autoEQP ? "on" : "off");
drhdcd87a92014-08-18 13:45:42 +00003579 fprintf(p->out,"%9.9s: %s\n","explain", p->normalMode.valid ? "on" :"off");
mistachkin636bf9f2014-07-19 20:15:16 +00003580 fprintf(p->out,"%12.12s: %s\n","headers", p->showHeader ? "on" : "off");
3581 fprintf(p->out,"%12.12s: %s\n","mode", modeDescr[p->mode]);
3582 fprintf(p->out,"%12.12s: ", "nullvalue");
mistachkin44b99f72014-12-11 03:29:14 +00003583 output_c_string(p->out, p->nullValue);
drhfeac5f82004-08-01 00:10:45 +00003584 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003585 fprintf(p->out,"%12.12s: %s\n","output",
drh4f21c4a2008-12-10 22:15:00 +00003586 strlen30(p->outfile) ? p->outfile : "stdout");
mistachkin636bf9f2014-07-19 20:15:16 +00003587 fprintf(p->out,"%12.12s: ", "colseparator");
3588 output_c_string(p->out, p->colSeparator);
drhfeac5f82004-08-01 00:10:45 +00003589 fprintf(p->out, "\n");
mistachkin636bf9f2014-07-19 20:15:16 +00003590 fprintf(p->out,"%12.12s: ", "rowseparator");
3591 output_c_string(p->out, p->rowSeparator);
3592 fprintf(p->out, "\n");
3593 fprintf(p->out,"%12.12s: %s\n","stats", p->statsOn ? "on" : "off");
3594 fprintf(p->out,"%12.12s: ","width");
persicom7e2dfdd2002-04-18 02:46:52 +00003595 for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) {
drhfeac5f82004-08-01 00:10:45 +00003596 fprintf(p->out,"%d ",p->colWidth[i]);
persicom7e2dfdd2002-04-18 02:46:52 +00003597 }
drhfeac5f82004-08-01 00:10:45 +00003598 fprintf(p->out,"\n");
persicom7e2dfdd2002-04-18 02:46:52 +00003599 }else
3600
drhc2ce0be2014-05-29 12:36:14 +00003601 if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){
3602 if( nArg==2 ){
3603 p->statsOn = booleanValue(azArg[1]);
3604 }else{
3605 fprintf(stderr, "Usage: .stats on|off\n");
3606 rc = 1;
3607 }
shaneh642d8b82010-07-28 16:05:34 +00003608 }else
3609
drhc2ce0be2014-05-29 12:36:14 +00003610 if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){
drh98781232012-04-23 12:38:05 +00003611 sqlite3_stmt *pStmt;
drhe3710332000-09-29 13:30:53 +00003612 char **azResult;
drh98781232012-04-23 12:38:05 +00003613 int nRow, nAlloc;
3614 char *zSql = 0;
3615 int ii;
drh05782482013-10-24 15:20:20 +00003616 open_db(p, 0);
drh98781232012-04-23 12:38:05 +00003617 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3618 if( rc ) return rc;
3619 zSql = sqlite3_mprintf(
3620 "SELECT name FROM sqlite_master"
3621 " WHERE type IN ('table','view')"
3622 " AND name NOT LIKE 'sqlite_%%'"
3623 " AND name LIKE ?1");
3624 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3625 const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1);
3626 if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue;
3627 if( strcmp(zDbName,"temp")==0 ){
3628 zSql = sqlite3_mprintf(
3629 "%z UNION ALL "
3630 "SELECT 'temp.' || name FROM sqlite_temp_master"
3631 " WHERE type IN ('table','view')"
3632 " AND name NOT LIKE 'sqlite_%%'"
3633 " AND name LIKE ?1", zSql);
3634 }else{
3635 zSql = sqlite3_mprintf(
3636 "%z UNION ALL "
3637 "SELECT '%q.' || name FROM \"%w\".sqlite_master"
3638 " WHERE type IN ('table','view')"
3639 " AND name NOT LIKE 'sqlite_%%'"
3640 " AND name LIKE ?1", zSql, zDbName, zDbName);
3641 }
drha50da102000-08-08 20:19:09 +00003642 }
drh98781232012-04-23 12:38:05 +00003643 sqlite3_finalize(pStmt);
3644 zSql = sqlite3_mprintf("%z ORDER BY 1", zSql);
3645 rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
3646 sqlite3_free(zSql);
3647 if( rc ) return rc;
3648 nRow = nAlloc = 0;
3649 azResult = 0;
3650 if( nArg>1 ){
3651 sqlite3_bind_text(pStmt, 1, azArg[1], -1, SQLITE_TRANSIENT);
shane9bd1b442009-10-23 01:27:39 +00003652 }else{
drh98781232012-04-23 12:38:05 +00003653 sqlite3_bind_text(pStmt, 1, "%", -1, SQLITE_STATIC);
3654 }
3655 while( sqlite3_step(pStmt)==SQLITE_ROW ){
3656 if( nRow>=nAlloc ){
3657 char **azNew;
mistachkin8e189222015-04-19 21:43:16 +00003658 int n2 = nAlloc*2 + 10;
3659 azNew = sqlite3_realloc(azResult, sizeof(azResult[0])*n2);
drh98781232012-04-23 12:38:05 +00003660 if( azNew==0 ){
3661 fprintf(stderr, "Error: out of memory\n");
3662 break;
3663 }
mistachkin8e189222015-04-19 21:43:16 +00003664 nAlloc = n2;
drh98781232012-04-23 12:38:05 +00003665 azResult = azNew;
3666 }
3667 azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0));
3668 if( azResult[nRow] ) nRow++;
3669 }
3670 sqlite3_finalize(pStmt);
3671 if( nRow>0 ){
drhe3710332000-09-29 13:30:53 +00003672 int len, maxlen = 0;
3673 int i, j;
3674 int nPrintCol, nPrintRow;
drh98781232012-04-23 12:38:05 +00003675 for(i=0; i<nRow; i++){
drh4f21c4a2008-12-10 22:15:00 +00003676 len = strlen30(azResult[i]);
drhe3710332000-09-29 13:30:53 +00003677 if( len>maxlen ) maxlen = len;
3678 }
3679 nPrintCol = 80/(maxlen+2);
3680 if( nPrintCol<1 ) nPrintCol = 1;
3681 nPrintRow = (nRow + nPrintCol - 1)/nPrintCol;
3682 for(i=0; i<nPrintRow; i++){
drh98781232012-04-23 12:38:05 +00003683 for(j=i; j<nRow; j+=nPrintRow){
3684 char *zSp = j<nPrintRow ? "" : " ";
drh4ace5362014-11-10 14:42:28 +00003685 fprintf(p->out, "%s%-*s", zSp, maxlen, azResult[j] ? azResult[j]:"");
drhe3710332000-09-29 13:30:53 +00003686 }
drh151b7d52013-05-06 20:28:54 +00003687 fprintf(p->out, "\n");
drhe3710332000-09-29 13:30:53 +00003688 }
3689 }
drh98781232012-04-23 12:38:05 +00003690 for(ii=0; ii<nRow; ii++) sqlite3_free(azResult[ii]);
3691 sqlite3_free(azResult);
drh75897232000-05-29 14:26:00 +00003692 }else
3693
shaneh96887e12011-02-10 21:08:58 +00003694 if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){
drhd416fe72011-03-17 16:45:50 +00003695 static const struct {
3696 const char *zCtrlName; /* Name of a test-control option */
3697 int ctrlCode; /* Integer code for that option */
3698 } aCtrl[] = {
3699 { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE },
3700 { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE },
3701 { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET },
3702 { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST },
3703 { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL },
3704 { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS },
3705 { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE },
3706 { "assert", SQLITE_TESTCTRL_ASSERT },
3707 { "always", SQLITE_TESTCTRL_ALWAYS },
3708 { "reserve", SQLITE_TESTCTRL_RESERVE },
3709 { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS },
3710 { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD },
drhd416fe72011-03-17 16:45:50 +00003711 { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC },
drh2cf4acb2014-04-18 00:06:02 +00003712 { "byteorder", SQLITE_TESTCTRL_BYTEORDER },
drhe4bb23a2015-01-19 15:05:54 +00003713 { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT },
drh1ffede82015-01-30 20:59:27 +00003714 { "imposter", SQLITE_TESTCTRL_IMPOSTER },
drhd416fe72011-03-17 16:45:50 +00003715 };
shaneh96887e12011-02-10 21:08:58 +00003716 int testctrl = -1;
mistachkin8e189222015-04-19 21:43:16 +00003717 int rc2 = 0;
3718 int i, n2;
drh05782482013-10-24 15:20:20 +00003719 open_db(p, 0);
shaneh96887e12011-02-10 21:08:58 +00003720
drhd416fe72011-03-17 16:45:50 +00003721 /* convert testctrl text option to value. allow any unique prefix
3722 ** of the option name, or a numerical value. */
mistachkin8e189222015-04-19 21:43:16 +00003723 n2 = strlen30(azArg[1]);
drhfcd71b62011-04-05 22:08:24 +00003724 for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){
mistachkin8e189222015-04-19 21:43:16 +00003725 if( strncmp(azArg[1], aCtrl[i].zCtrlName, n2)==0 ){
drhd416fe72011-03-17 16:45:50 +00003726 if( testctrl<0 ){
3727 testctrl = aCtrl[i].ctrlCode;
3728 }else{
drhb07028f2011-10-14 21:49:18 +00003729 fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]);
drhd416fe72011-03-17 16:45:50 +00003730 testctrl = -1;
3731 break;
3732 }
3733 }
3734 }
drh348d19c2013-06-03 12:47:43 +00003735 if( testctrl<0 ) testctrl = (int)integerValue(azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003736 if( (testctrl<SQLITE_TESTCTRL_FIRST) || (testctrl>SQLITE_TESTCTRL_LAST) ){
3737 fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]);
3738 }else{
3739 switch(testctrl){
3740
3741 /* sqlite3_test_control(int, db, int) */
3742 case SQLITE_TESTCTRL_OPTIMIZATIONS:
3743 case SQLITE_TESTCTRL_RESERVE:
3744 if( nArg==3 ){
3745 int opt = (int)strtol(azArg[2], 0, 0);
mistachkin8e189222015-04-19 21:43:16 +00003746 rc2 = sqlite3_test_control(testctrl, p->db, opt);
3747 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003748 } else {
drhd416fe72011-03-17 16:45:50 +00003749 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3750 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003751 }
3752 break;
3753
3754 /* sqlite3_test_control(int) */
drh2cf4acb2014-04-18 00:06:02 +00003755 case SQLITE_TESTCTRL_PRNG_SAVE:
3756 case SQLITE_TESTCTRL_PRNG_RESTORE:
shaneh96887e12011-02-10 21:08:58 +00003757 case SQLITE_TESTCTRL_PRNG_RESET:
drh2cf4acb2014-04-18 00:06:02 +00003758 case SQLITE_TESTCTRL_BYTEORDER:
shaneh96887e12011-02-10 21:08:58 +00003759 if( nArg==2 ){
mistachkin8e189222015-04-19 21:43:16 +00003760 rc2 = sqlite3_test_control(testctrl);
3761 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003762 } else {
3763 fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]);
3764 }
3765 break;
3766
3767 /* sqlite3_test_control(int, uint) */
3768 case SQLITE_TESTCTRL_PENDING_BYTE:
3769 if( nArg==3 ){
drhaf664332013-07-18 20:28:29 +00003770 unsigned int opt = (unsigned int)integerValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00003771 rc2 = sqlite3_test_control(testctrl, opt);
3772 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003773 } else {
drhd416fe72011-03-17 16:45:50 +00003774 fprintf(stderr,"Error: testctrl %s takes a single unsigned"
3775 " int option\n", azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003776 }
3777 break;
3778
3779 /* sqlite3_test_control(int, int) */
3780 case SQLITE_TESTCTRL_ASSERT:
drhe4bb23a2015-01-19 15:05:54 +00003781 case SQLITE_TESTCTRL_ALWAYS:
3782 case SQLITE_TESTCTRL_NEVER_CORRUPT:
shaneh96887e12011-02-10 21:08:58 +00003783 if( nArg==3 ){
drh348d19c2013-06-03 12:47:43 +00003784 int opt = booleanValue(azArg[2]);
mistachkin8e189222015-04-19 21:43:16 +00003785 rc2 = sqlite3_test_control(testctrl, opt);
3786 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003787 } else {
drhd416fe72011-03-17 16:45:50 +00003788 fprintf(stderr,"Error: testctrl %s takes a single int option\n",
3789 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003790 }
3791 break;
3792
3793 /* sqlite3_test_control(int, char *) */
3794#ifdef SQLITE_N_KEYWORD
3795 case SQLITE_TESTCTRL_ISKEYWORD:
3796 if( nArg==3 ){
3797 const char *opt = azArg[2];
mistachkin8e189222015-04-19 21:43:16 +00003798 rc2 = sqlite3_test_control(testctrl, opt);
3799 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
shaneh96887e12011-02-10 21:08:58 +00003800 } else {
drhd416fe72011-03-17 16:45:50 +00003801 fprintf(stderr,"Error: testctrl %s takes a single char * option\n",
3802 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003803 }
3804 break;
3805#endif
3806
drh1ffede82015-01-30 20:59:27 +00003807 case SQLITE_TESTCTRL_IMPOSTER:
drh8964b342015-01-29 17:54:52 +00003808 if( nArg==5 ){
mistachkin8e189222015-04-19 21:43:16 +00003809 rc2 = sqlite3_test_control(testctrl, p->db,
drh1ffede82015-01-30 20:59:27 +00003810 azArg[2],
drh8964b342015-01-29 17:54:52 +00003811 integerValue(azArg[3]),
3812 integerValue(azArg[4]));
mistachkin8e189222015-04-19 21:43:16 +00003813 fprintf(p->out, "%d (0x%08x)\n", rc2, rc2);
drh8964b342015-01-29 17:54:52 +00003814 }else{
drh6f5a37a2015-03-27 02:27:20 +00003815 fprintf(stderr,"Usage: .testctrl imposter dbName onoff tnum\n");
drh8964b342015-01-29 17:54:52 +00003816 }
3817 break;
3818
shaneh96887e12011-02-10 21:08:58 +00003819 case SQLITE_TESTCTRL_BITVEC_TEST:
3820 case SQLITE_TESTCTRL_FAULT_INSTALL:
3821 case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS:
3822 case SQLITE_TESTCTRL_SCRATCHMALLOC:
3823 default:
drhd416fe72011-03-17 16:45:50 +00003824 fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n",
3825 azArg[1]);
shaneh96887e12011-02-10 21:08:58 +00003826 break;
3827 }
3828 }
3829 }else
3830
drhc2ce0be2014-05-29 12:36:14 +00003831 if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 ){
drh05782482013-10-24 15:20:20 +00003832 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003833 sqlite3_busy_timeout(p->db, nArg>=2 ? (int)integerValue(azArg[1]) : 0);
shanehe2aa9d72009-11-06 17:20:17 +00003834 }else
3835
drhc2ce0be2014-05-29 12:36:14 +00003836 if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 ){
3837 if( nArg==2 ){
3838 enableTimer = booleanValue(azArg[1]);
3839 if( enableTimer && !HAS_TIMER ){
3840 fprintf(stderr, "Error: timer not available on this system.\n");
3841 enableTimer = 0;
3842 }
3843 }else{
3844 fprintf(stderr, "Usage: .timer on|off\n");
3845 rc = 1;
3846 }
shanehe2aa9d72009-11-06 17:20:17 +00003847 }else
3848
drhc2ce0be2014-05-29 12:36:14 +00003849 if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){
drh05782482013-10-24 15:20:20 +00003850 open_db(p, 0);
drhc2ce0be2014-05-29 12:36:14 +00003851 if( nArg!=2 ){
3852 fprintf(stderr, "Usage: .trace FILE|off\n");
3853 rc = 1;
3854 goto meta_command_exit;
3855 }
drh657b4a82015-03-19 13:30:41 +00003856 output_file_close(p->traceOut);
drh42f64e52012-04-04 16:56:23 +00003857 p->traceOut = output_file_open(azArg[1]);
drhbbb0be82012-06-27 16:12:27 +00003858#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
drh42f64e52012-04-04 16:56:23 +00003859 if( p->traceOut==0 ){
3860 sqlite3_trace(p->db, 0, 0);
3861 }else{
3862 sqlite3_trace(p->db, sql_trace_callback, p->traceOut);
3863 }
3864#endif
3865 }else
3866
drhf442e332014-09-10 19:01:14 +00003867#if SQLITE_USER_AUTHENTICATION
3868 if( c=='u' && strncmp(azArg[0], "user", n)==0 ){
3869 if( nArg<2 ){
3870 fprintf(stderr, "Usage: .user SUBCOMMAND ...\n");
3871 rc = 1;
3872 goto meta_command_exit;
3873 }
drh7883ecf2014-09-11 16:19:31 +00003874 open_db(p, 0);
drhf442e332014-09-10 19:01:14 +00003875 if( strcmp(azArg[1],"login")==0 ){
3876 if( nArg!=4 ){
3877 fprintf(stderr, "Usage: .user login USER PASSWORD\n");
3878 rc = 1;
3879 goto meta_command_exit;
3880 }
drhd39c40f2014-09-11 00:27:53 +00003881 rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3],
3882 (int)strlen(azArg[3]));
drhf442e332014-09-10 19:01:14 +00003883 if( rc ){
3884 fprintf(stderr, "Authentication failed for user %s\n", azArg[2]);
3885 rc = 1;
3886 }
3887 }else if( strcmp(azArg[1],"add")==0 ){
3888 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003889 fprintf(stderr, "Usage: .user add USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003890 rc = 1;
3891 goto meta_command_exit;
3892 }
drhd39c40f2014-09-11 00:27:53 +00003893 rc = sqlite3_user_add(p->db, azArg[2],
3894 azArg[3], (int)strlen(azArg[3]),
3895 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003896 if( rc ){
3897 fprintf(stderr, "User-Add failed: %d\n", rc);
3898 rc = 1;
3899 }
3900 }else if( strcmp(azArg[1],"edit")==0 ){
3901 if( nArg!=5 ){
drhd39c40f2014-09-11 00:27:53 +00003902 fprintf(stderr, "Usage: .user edit USER PASSWORD ISADMIN\n");
drhf442e332014-09-10 19:01:14 +00003903 rc = 1;
3904 goto meta_command_exit;
3905 }
drhd39c40f2014-09-11 00:27:53 +00003906 rc = sqlite3_user_change(p->db, azArg[2],
3907 azArg[3], (int)strlen(azArg[3]),
3908 booleanValue(azArg[4]));
drhf442e332014-09-10 19:01:14 +00003909 if( rc ){
3910 fprintf(stderr, "User-Edit failed: %d\n", rc);
3911 rc = 1;
3912 }
3913 }else if( strcmp(azArg[1],"delete")==0 ){
3914 if( nArg!=3 ){
3915 fprintf(stderr, "Usage: .user delete USER\n");
3916 rc = 1;
3917 goto meta_command_exit;
3918 }
3919 rc = sqlite3_user_delete(p->db, azArg[2]);
3920 if( rc ){
3921 fprintf(stderr, "User-Delete failed: %d\n", rc);
3922 rc = 1;
3923 }
3924 }else{
3925 fprintf(stderr, "Usage: .user login|add|edit|delete ...\n");
3926 rc = 1;
3927 goto meta_command_exit;
3928 }
3929 }else
3930#endif /* SQLITE_USER_AUTHENTICATION */
3931
drh9fd301b2011-06-03 13:28:22 +00003932 if( c=='v' && strncmp(azArg[0], "version", n)==0 ){
drh151b7d52013-05-06 20:28:54 +00003933 fprintf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
drh9fd301b2011-06-03 13:28:22 +00003934 sqlite3_libversion(), sqlite3_sourceid());
3935 }else
3936
drhde60fc22011-12-14 17:53:36 +00003937 if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){
3938 const char *zDbName = nArg==2 ? azArg[1] : "main";
3939 char *zVfsName = 0;
3940 if( p->db ){
3941 sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName);
3942 if( zVfsName ){
drh151b7d52013-05-06 20:28:54 +00003943 fprintf(p->out, "%s\n", zVfsName);
drhde60fc22011-12-14 17:53:36 +00003944 sqlite3_free(zVfsName);
3945 }
3946 }
3947 }else
3948
drhcef4fc82012-09-21 22:50:45 +00003949#if defined(SQLITE_DEBUG) && defined(SQLITE_ENABLE_WHERETRACE)
3950 if( c=='w' && strncmp(azArg[0], "wheretrace", n)==0 ){
3951 extern int sqlite3WhereTrace;
drhc2ce0be2014-05-29 12:36:14 +00003952 sqlite3WhereTrace = nArg>=2 ? booleanValue(azArg[1]) : 0xff;
drhcef4fc82012-09-21 22:50:45 +00003953 }else
3954#endif
3955
drhc2ce0be2014-05-29 12:36:14 +00003956 if( c=='w' && strncmp(azArg[0], "width", n)==0 ){
drh75897232000-05-29 14:26:00 +00003957 int j;
drh43617e92006-03-06 20:55:46 +00003958 assert( nArg<=ArraySize(azArg) );
drh75897232000-05-29 14:26:00 +00003959 for(j=1; j<nArg && j<ArraySize(p->colWidth); j++){
drh348d19c2013-06-03 12:47:43 +00003960 p->colWidth[j-1] = (int)integerValue(azArg[j]);
drh75897232000-05-29 14:26:00 +00003961 }
3962 }else
3963
3964 {
shane9bd1b442009-10-23 01:27:39 +00003965 fprintf(stderr, "Error: unknown command or invalid arguments: "
drh67505e72002-04-19 12:34:06 +00003966 " \"%s\". Enter \".help\" for help\n", azArg[0]);
shane9bd1b442009-10-23 01:27:39 +00003967 rc = 1;
drh75897232000-05-29 14:26:00 +00003968 }
drh67505e72002-04-19 12:34:06 +00003969
drhc2ce0be2014-05-29 12:36:14 +00003970meta_command_exit:
3971 if( p->outCount ){
3972 p->outCount--;
3973 if( p->outCount==0 ) output_reset(p);
3974 }
drh67505e72002-04-19 12:34:06 +00003975 return rc;
drh75897232000-05-29 14:26:00 +00003976}
3977
drh67505e72002-04-19 12:34:06 +00003978/*
drh91a66392007-09-07 01:12:32 +00003979** Return TRUE if a semicolon occurs anywhere in the first N characters
3980** of string z[].
drh324ccef2003-02-05 14:06:20 +00003981*/
drh9f099fd2013-08-06 14:01:46 +00003982static int line_contains_semicolon(const char *z, int N){
drh91a66392007-09-07 01:12:32 +00003983 int i;
3984 for(i=0; i<N; i++){ if( z[i]==';' ) return 1; }
3985 return 0;
drh324ccef2003-02-05 14:06:20 +00003986}
3987
3988/*
drh70c7a4b2003-04-26 03:03:06 +00003989** Test to see if a line consists entirely of whitespace.
3990*/
3991static int _all_whitespace(const char *z){
3992 for(; *z; z++){
drhf0693c82011-10-11 20:41:54 +00003993 if( IsSpace(z[0]) ) continue;
drh70c7a4b2003-04-26 03:03:06 +00003994 if( *z=='/' && z[1]=='*' ){
3995 z += 2;
3996 while( *z && (*z!='*' || z[1]!='/') ){ z++; }
3997 if( *z==0 ) return 0;
3998 z++;
3999 continue;
4000 }
4001 if( *z=='-' && z[1]=='-' ){
4002 z += 2;
4003 while( *z && *z!='\n' ){ z++; }
4004 if( *z==0 ) return 1;
4005 continue;
4006 }
4007 return 0;
4008 }
4009 return 1;
4010}
4011
4012/*
drha9b17162003-04-29 18:01:28 +00004013** Return TRUE if the line typed in is an SQL command terminator other
4014** than a semi-colon. The SQL Server style "go" command is understood
4015** as is the Oracle "/".
4016*/
drh9f099fd2013-08-06 14:01:46 +00004017static int line_is_command_terminator(const char *zLine){
drhf0693c82011-10-11 20:41:54 +00004018 while( IsSpace(zLine[0]) ){ zLine++; };
drh233a5312008-12-18 22:25:13 +00004019 if( zLine[0]=='/' && _all_whitespace(&zLine[1]) ){
4020 return 1; /* Oracle */
4021 }
drhf0693c82011-10-11 20:41:54 +00004022 if( ToLower(zLine[0])=='g' && ToLower(zLine[1])=='o'
drhc8d74412004-08-31 23:41:26 +00004023 && _all_whitespace(&zLine[2]) ){
drha9b17162003-04-29 18:01:28 +00004024 return 1; /* SQL Server */
4025 }
4026 return 0;
4027}
4028
4029/*
drh233a5312008-12-18 22:25:13 +00004030** Return true if zSql is a complete SQL statement. Return false if it
4031** ends in the middle of a string literal or C-style comment.
4032*/
drh9f099fd2013-08-06 14:01:46 +00004033static int line_is_complete(char *zSql, int nSql){
drh233a5312008-12-18 22:25:13 +00004034 int rc;
4035 if( zSql==0 ) return 1;
4036 zSql[nSql] = ';';
4037 zSql[nSql+1] = 0;
4038 rc = sqlite3_complete(zSql);
4039 zSql[nSql] = 0;
4040 return rc;
4041}
4042
4043/*
drh67505e72002-04-19 12:34:06 +00004044** Read input from *in and process it. If *in==0 then input
4045** is interactive - the user is typing it it. Otherwise, input
4046** is coming from a file or device. A prompt is issued and history
4047** is saved only if input is interactive. An interrupt signal will
4048** cause this routine to exit immediately, unless input is interactive.
drhc28490c2006-10-26 14:25:58 +00004049**
4050** Return the number of errors.
drh67505e72002-04-19 12:34:06 +00004051*/
drhdcd87a92014-08-18 13:45:42 +00004052static int process_input(ShellState *p, FILE *in){
drh9f099fd2013-08-06 14:01:46 +00004053 char *zLine = 0; /* A single input line */
4054 char *zSql = 0; /* Accumulated SQL text */
4055 int nLine; /* Length of current line */
4056 int nSql = 0; /* Bytes of zSql[] used */
4057 int nAlloc = 0; /* Allocated zSql[] space */
4058 int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */
4059 char *zErrMsg; /* Error message returned */
4060 int rc; /* Error code */
4061 int errCnt = 0; /* Number of errors seen */
4062 int lineno = 0; /* Current line number */
4063 int startline = 0; /* Line number for start of current input */
drhc49f44e2006-10-26 18:15:42 +00004064
4065 while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){
4066 fflush(p->out);
drh9f099fd2013-08-06 14:01:46 +00004067 zLine = one_input_line(in, zLine, nSql>0);
drhc49f44e2006-10-26 18:15:42 +00004068 if( zLine==0 ){
drh9b8d3572012-04-21 11:33:39 +00004069 /* End of input */
4070 if( stdin_is_interactive ) printf("\n");
4071 break;
drhc49f44e2006-10-26 18:15:42 +00004072 }
drh67505e72002-04-19 12:34:06 +00004073 if( seenInterrupt ){
4074 if( in!=0 ) break;
4075 seenInterrupt = 0;
4076 }
drhc28490c2006-10-26 14:25:58 +00004077 lineno++;
drh849a9d92013-12-21 15:46:06 +00004078 if( nSql==0 && _all_whitespace(zLine) ){
4079 if( p->echoOn ) printf("%s\n", zLine);
4080 continue;
4081 }
drh2af0b2d2002-02-21 02:25:02 +00004082 if( zLine && zLine[0]=='.' && nSql==0 ){
shaneb9fc17d2009-10-22 21:23:35 +00004083 if( p->echoOn ) printf("%s\n", zLine);
drhc49f44e2006-10-26 18:15:42 +00004084 rc = do_meta_command(zLine, p);
shane916f9612009-10-23 00:37:15 +00004085 if( rc==2 ){ /* exit requested */
drh47ad6842006-11-08 12:25:42 +00004086 break;
4087 }else if( rc ){
drhc49f44e2006-10-26 18:15:42 +00004088 errCnt++;
4089 }
drhdaffd0e2001-04-11 14:28:42 +00004090 continue;
4091 }
drh9f099fd2013-08-06 14:01:46 +00004092 if( line_is_command_terminator(zLine) && line_is_complete(zSql, nSql) ){
drh5bb3eb92007-05-04 13:15:55 +00004093 memcpy(zLine,";",2);
drha9b17162003-04-29 18:01:28 +00004094 }
drh9f099fd2013-08-06 14:01:46 +00004095 nLine = strlen30(zLine);
4096 if( nSql+nLine+2>=nAlloc ){
4097 nAlloc = nSql+nLine+100;
4098 zSql = realloc(zSql, nAlloc);
drhdaffd0e2001-04-11 14:28:42 +00004099 if( zSql==0 ){
drh9f099fd2013-08-06 14:01:46 +00004100 fprintf(stderr, "Error: out of memory\n");
drhdaffd0e2001-04-11 14:28:42 +00004101 exit(1);
4102 }
drhdaffd0e2001-04-11 14:28:42 +00004103 }
drh9f099fd2013-08-06 14:01:46 +00004104 nSqlPrior = nSql;
4105 if( nSql==0 ){
4106 int i;
4107 for(i=0; zLine[i] && IsSpace(zLine[i]); i++){}
drh77dfd5b2013-08-19 11:15:48 +00004108 assert( nAlloc>0 && zSql!=0 );
drh9f099fd2013-08-06 14:01:46 +00004109 memcpy(zSql, zLine+i, nLine+1-i);
4110 startline = lineno;
4111 nSql = nLine-i;
4112 }else{
4113 zSql[nSql++] = '\n';
4114 memcpy(zSql+nSql, zLine, nLine+1);
4115 nSql += nLine;
4116 }
4117 if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
drh91a66392007-09-07 01:12:32 +00004118 && sqlite3_complete(zSql) ){
drhdaffd0e2001-04-11 14:28:42 +00004119 p->cnt = 0;
drh05782482013-10-24 15:20:20 +00004120 open_db(p, 0);
drh9569f602015-04-16 15:05:04 +00004121 if( p->backslashOn ) resolve_backslashes(zSql);
drh3b1a9882007-11-02 12:53:03 +00004122 BEGIN_TIMER;
shane626a6e42009-10-22 17:30:15 +00004123 rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
drh3b1a9882007-11-02 12:53:03 +00004124 END_TIMER;
drh7f953e22002-07-13 17:33:45 +00004125 if( rc || zErrMsg ){
drhc28490c2006-10-26 14:25:58 +00004126 char zPrefix[100];
4127 if( in!=0 || !stdin_is_interactive ){
drh5bb3eb92007-05-04 13:15:55 +00004128 sqlite3_snprintf(sizeof(zPrefix), zPrefix,
shane9bd1b442009-10-23 01:27:39 +00004129 "Error: near line %d:", startline);
drhc28490c2006-10-26 14:25:58 +00004130 }else{
shane9bd1b442009-10-23 01:27:39 +00004131 sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:");
drhc28490c2006-10-26 14:25:58 +00004132 }
drh7f953e22002-07-13 17:33:45 +00004133 if( zErrMsg!=0 ){
shaned2bed1c2009-10-21 03:56:54 +00004134 fprintf(stderr, "%s %s\n", zPrefix, zErrMsg);
drh3f4fedb2004-05-31 19:34:33 +00004135 sqlite3_free(zErrMsg);
drh7f953e22002-07-13 17:33:45 +00004136 zErrMsg = 0;
4137 }else{
shaned2bed1c2009-10-21 03:56:54 +00004138 fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db));
drh7f953e22002-07-13 17:33:45 +00004139 }
drhc49f44e2006-10-26 18:15:42 +00004140 errCnt++;
drhdaffd0e2001-04-11 14:28:42 +00004141 }
drhdaffd0e2001-04-11 14:28:42 +00004142 nSql = 0;
drhc2ce0be2014-05-29 12:36:14 +00004143 if( p->outCount ){
4144 output_reset(p);
4145 p->outCount = 0;
4146 }
drh9f099fd2013-08-06 14:01:46 +00004147 }else if( nSql && _all_whitespace(zSql) ){
drh849a9d92013-12-21 15:46:06 +00004148 if( p->echoOn ) printf("%s\n", zSql);
drh7a411f42013-04-17 17:33:17 +00004149 nSql = 0;
drhdaffd0e2001-04-11 14:28:42 +00004150 }
4151 }
drh9f099fd2013-08-06 14:01:46 +00004152 if( nSql ){
drhd416fe72011-03-17 16:45:50 +00004153 if( !_all_whitespace(zSql) ){
4154 fprintf(stderr, "Error: incomplete SQL: %s\n", zSql);
drhbf59bf92014-10-10 13:08:33 +00004155 errCnt++;
drhd416fe72011-03-17 16:45:50 +00004156 }
drhdaffd0e2001-04-11 14:28:42 +00004157 free(zSql);
4158 }
danielk19772ac27622007-07-03 05:31:16 +00004159 free(zLine);
drh4d15a0d2012-12-01 20:21:22 +00004160 return errCnt>0;
drhdaffd0e2001-04-11 14:28:42 +00004161}
4162
drh67505e72002-04-19 12:34:06 +00004163/*
4164** Return a pathname which is the user's home directory. A
drh85e72432012-04-11 11:38:53 +00004165** 0 return indicates an error of some kind.
drh67505e72002-04-19 12:34:06 +00004166*/
4167static char *find_home_dir(void){
drh85e72432012-04-11 11:38:53 +00004168 static char *home_dir = NULL;
4169 if( home_dir ) return home_dir;
persicom7e2dfdd2002-04-18 02:46:52 +00004170
drh4ace5362014-11-10 14:42:28 +00004171#if !defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) \
4172 && !defined(__RTP__) && !defined(_WRS_KERNEL)
mistachkinc8bde372012-06-18 08:00:56 +00004173 {
4174 struct passwd *pwent;
4175 uid_t uid = getuid();
4176 if( (pwent=getpwuid(uid)) != NULL) {
4177 home_dir = pwent->pw_dir;
4178 }
drh67505e72002-04-19 12:34:06 +00004179 }
4180#endif
4181
chw65d3c132007-11-12 21:09:10 +00004182#if defined(_WIN32_WCE)
4183 /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv()
4184 */
drh85e72432012-04-11 11:38:53 +00004185 home_dir = "/";
chw65d3c132007-11-12 21:09:10 +00004186#else
4187
drh83905c92012-06-21 13:00:37 +00004188#if defined(_WIN32) || defined(WIN32)
drh164a1b62006-08-19 11:15:20 +00004189 if (!home_dir) {
4190 home_dir = getenv("USERPROFILE");
4191 }
4192#endif
4193
drh67505e72002-04-19 12:34:06 +00004194 if (!home_dir) {
4195 home_dir = getenv("HOME");
drh67505e72002-04-19 12:34:06 +00004196 }
4197
drh83905c92012-06-21 13:00:37 +00004198#if defined(_WIN32) || defined(WIN32)
drhe98d4fa2002-04-21 19:06:22 +00004199 if (!home_dir) {
drh164a1b62006-08-19 11:15:20 +00004200 char *zDrive, *zPath;
4201 int n;
4202 zDrive = getenv("HOMEDRIVE");
4203 zPath = getenv("HOMEPATH");
4204 if( zDrive && zPath ){
drh4f21c4a2008-12-10 22:15:00 +00004205 n = strlen30(zDrive) + strlen30(zPath) + 1;
drh164a1b62006-08-19 11:15:20 +00004206 home_dir = malloc( n );
4207 if( home_dir==0 ) return 0;
4208 sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath);
4209 return home_dir;
4210 }
4211 home_dir = "c:\\";
drhe98d4fa2002-04-21 19:06:22 +00004212 }
4213#endif
4214
chw65d3c132007-11-12 21:09:10 +00004215#endif /* !_WIN32_WCE */
4216
drh67505e72002-04-19 12:34:06 +00004217 if( home_dir ){
drh4f21c4a2008-12-10 22:15:00 +00004218 int n = strlen30(home_dir) + 1;
drh5bb3eb92007-05-04 13:15:55 +00004219 char *z = malloc( n );
4220 if( z ) memcpy(z, home_dir, n);
drh67505e72002-04-19 12:34:06 +00004221 home_dir = z;
4222 }
drhe98d4fa2002-04-21 19:06:22 +00004223
drh67505e72002-04-19 12:34:06 +00004224 return home_dir;
4225}
4226
4227/*
4228** Read input from the file given by sqliterc_override. Or if that
4229** parameter is NULL, take input from ~/.sqliterc
shane9bd1b442009-10-23 01:27:39 +00004230**
4231** Returns the number of errors.
drh67505e72002-04-19 12:34:06 +00004232*/
drh534f4df2015-02-28 14:03:35 +00004233static void process_sqliterc(
drhdcd87a92014-08-18 13:45:42 +00004234 ShellState *p, /* Configuration data */
drh22fbcb82004-02-01 01:22:50 +00004235 const char *sqliterc_override /* Name of config file. NULL to use default */
4236){
persicom7e2dfdd2002-04-18 02:46:52 +00004237 char *home_dir = NULL;
drh22fbcb82004-02-01 01:22:50 +00004238 const char *sqliterc = sqliterc_override;
drh43617e92006-03-06 20:55:46 +00004239 char *zBuf = 0;
persicom7e2dfdd2002-04-18 02:46:52 +00004240 FILE *in = NULL;
4241
4242 if (sqliterc == NULL) {
drh67505e72002-04-19 12:34:06 +00004243 home_dir = find_home_dir();
drhe98d4fa2002-04-21 19:06:22 +00004244 if( home_dir==0 ){
drh534f4df2015-02-28 14:03:35 +00004245 fprintf(stderr, "-- warning: cannot find home directory;"
4246 " cannot read ~/.sqliterc\n");
4247 return;
drhe98d4fa2002-04-21 19:06:22 +00004248 }
drh2f3de322012-06-27 16:41:31 +00004249 sqlite3_initialize();
drh85e72432012-04-11 11:38:53 +00004250 zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
4251 sqliterc = zBuf;
persicom7e2dfdd2002-04-18 02:46:52 +00004252 }
drha1f9b5e2004-02-14 16:31:02 +00004253 in = fopen(sqliterc,"rb");
drh22fbcb82004-02-01 01:22:50 +00004254 if( in ){
drhc28490c2006-10-26 14:25:58 +00004255 if( stdin_is_interactive ){
shane86f5bdb2009-10-24 02:00:07 +00004256 fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
drh22fbcb82004-02-01 01:22:50 +00004257 }
drh534f4df2015-02-28 14:03:35 +00004258 process_input(p,in);
drhdd45df82002-04-18 12:39:03 +00004259 fclose(in);
persicom7e2dfdd2002-04-18 02:46:52 +00004260 }
drh85e72432012-04-11 11:38:53 +00004261 sqlite3_free(zBuf);
persicom7e2dfdd2002-04-18 02:46:52 +00004262}
4263
drh67505e72002-04-19 12:34:06 +00004264/*
drhe1e38c42003-05-04 18:30:59 +00004265** Show available command line options
4266*/
4267static const char zOptions[] =
mistachkin636bf9f2014-07-19 20:15:16 +00004268 " -ascii set output mode to 'ascii'\n"
drhc49f44e2006-10-26 18:15:42 +00004269 " -bail stop after hitting an error\n"
drhc49f44e2006-10-26 18:15:42 +00004270 " -batch force batch I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004271 " -column set output mode to 'column'\n"
mistachkin6d81d752012-10-25 15:43:28 +00004272 " -cmd COMMAND run \"COMMAND\" before reading stdin\n"
drhc49f44e2006-10-26 18:15:42 +00004273 " -csv set output mode to 'csv'\n"
drhcc3b4f82012-02-07 14:13:50 +00004274 " -echo print commands before execution\n"
mistachkin6d81d752012-10-25 15:43:28 +00004275 " -init FILENAME read/process named file\n"
drhcc3b4f82012-02-07 14:13:50 +00004276 " -[no]header turn headers on or off\n"
drh98d312f2012-10-25 15:23:14 +00004277#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
4278 " -heap SIZE Size of heap for memsys3 or memsys5\n"
4279#endif
drhcc3b4f82012-02-07 14:13:50 +00004280 " -help show this message\n"
drhe1e38c42003-05-04 18:30:59 +00004281 " -html set output mode to HTML\n"
drhcc3b4f82012-02-07 14:13:50 +00004282 " -interactive force interactive I/O\n"
drhe1e38c42003-05-04 18:30:59 +00004283 " -line set output mode to 'line'\n"
4284 " -list set output mode to 'list'\n"
drh44dec872014-08-30 15:49:25 +00004285 " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n"
drh7d9f3942013-04-03 01:26:54 +00004286 " -mmap N default mmap size set to N\n"
drhcc3b4f82012-02-07 14:13:50 +00004287#ifdef SQLITE_ENABLE_MULTIPLEX
4288 " -multiplex enable the multiplexor VFS\n"
4289#endif
mistachkine0d68852014-12-11 03:12:33 +00004290 " -newline SEP set output row separator. Default: '\\n'\n"
drh98d312f2012-10-25 15:23:14 +00004291 " -nullvalue TEXT set text string for NULL values. Default ''\n"
drh44dec872014-08-30 15:49:25 +00004292 " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
4293 " -scratch SIZE N use N slots of SZ bytes each for scratch memory\n"
mistachkine0d68852014-12-11 03:12:33 +00004294 " -separator SEP set output column separator. Default: '|'\n"
shaneh642d8b82010-07-28 16:05:34 +00004295 " -stats print memory stats before each finalize\n"
drhe1e38c42003-05-04 18:30:59 +00004296 " -version show SQLite version\n"
drha7e61d82011-03-12 17:02:57 +00004297 " -vfs NAME use NAME as the default VFS\n"
drh2b625e22011-03-16 17:05:28 +00004298#ifdef SQLITE_ENABLE_VFSTRACE
4299 " -vfstrace enable tracing of all VFS calls\n"
4300#endif
drhe1e38c42003-05-04 18:30:59 +00004301;
4302static void usage(int showDetail){
drh80e8be92006-08-29 12:04:19 +00004303 fprintf(stderr,
4304 "Usage: %s [OPTIONS] FILENAME [SQL]\n"
4305 "FILENAME is the name of an SQLite database. A new database is created\n"
4306 "if the file does not previously exist.\n", Argv0);
drhe1e38c42003-05-04 18:30:59 +00004307 if( showDetail ){
drh80e8be92006-08-29 12:04:19 +00004308 fprintf(stderr, "OPTIONS include:\n%s", zOptions);
drhe1e38c42003-05-04 18:30:59 +00004309 }else{
4310 fprintf(stderr, "Use the -help option for additional information\n");
4311 }
4312 exit(1);
4313}
4314
4315/*
drh67505e72002-04-19 12:34:06 +00004316** Initialize the state information in data
4317*/
drhdcd87a92014-08-18 13:45:42 +00004318static void main_init(ShellState *data) {
persicom7e2dfdd2002-04-18 02:46:52 +00004319 memset(data, 0, sizeof(*data));
4320 data->mode = MODE_List;
mistachkinfad42082014-07-24 22:13:12 +00004321 memcpy(data->colSeparator,SEP_Column, 2);
4322 memcpy(data->rowSeparator,SEP_Row, 2);
persicom7e2dfdd2002-04-18 02:46:52 +00004323 data->showHeader = 0;
drh44dec872014-08-30 15:49:25 +00004324 data->shellFlgs = SHFLG_Lookaside;
drh52784bd2011-05-18 17:15:06 +00004325 sqlite3_config(SQLITE_CONFIG_URI, 1);
drh127f9d72010-02-23 01:47:00 +00004326 sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data);
drh44dec872014-08-30 15:49:25 +00004327 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
drh5bb3eb92007-05-04 13:15:55 +00004328 sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> ");
4329 sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> ");
persicom7e2dfdd2002-04-18 02:46:52 +00004330}
4331
drh98d312f2012-10-25 15:23:14 +00004332/*
drh5c7976f2014-02-10 19:59:27 +00004333** Output text to the console in a font that attracts extra attention.
drh1247aa42014-02-10 19:27:05 +00004334*/
4335#ifdef _WIN32
drh5c7976f2014-02-10 19:59:27 +00004336static void printBold(const char *zText){
4337 HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
4338 CONSOLE_SCREEN_BUFFER_INFO defaultScreenInfo;
4339 GetConsoleScreenBufferInfo(out, &defaultScreenInfo);
4340 SetConsoleTextAttribute(out,
4341 FOREGROUND_RED|FOREGROUND_INTENSITY
4342 );
4343 printf("%s", zText);
4344 SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
drh1247aa42014-02-10 19:27:05 +00004345}
4346#else
drh5c7976f2014-02-10 19:59:27 +00004347static void printBold(const char *zText){
4348 printf("\033[1m%s\033[0m", zText);
drh1247aa42014-02-10 19:27:05 +00004349}
4350#endif
4351
4352/*
drh98d312f2012-10-25 15:23:14 +00004353** Get the argument to an --option. Throw an error and die if no argument
4354** is available.
4355*/
4356static char *cmdline_option_value(int argc, char **argv, int i){
4357 if( i==argc ){
4358 fprintf(stderr, "%s: Error: missing argument to %s\n",
4359 argv[0], argv[argc-1]);
4360 exit(1);
4361 }
4362 return argv[i];
4363}
4364
mistachkin44723ce2015-03-21 02:22:37 +00004365int SQLITE_CDECL main(int argc, char **argv){
drh75897232000-05-29 14:26:00 +00004366 char *zErrMsg = 0;
drhdcd87a92014-08-18 13:45:42 +00004367 ShellState data;
drh22fbcb82004-02-01 01:22:50 +00004368 const char *zInitFile = 0;
drh44c2eb12003-04-30 11:38:26 +00004369 int i;
drhc28490c2006-10-26 14:25:58 +00004370 int rc = 0;
drhb3735912014-02-10 16:13:42 +00004371 int warnInmemoryDb = 0;
drhac5649a2014-11-28 13:35:03 +00004372 int readStdin = 1;
4373 int nCmd = 0;
4374 char **azCmd = 0;
drh75897232000-05-29 14:26:00 +00004375
drh69b30ab2014-02-27 15:11:52 +00004376#if USE_SYSTEM_SQLITE+0!=1
drh52784bd2011-05-18 17:15:06 +00004377 if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){
4378 fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n",
4379 sqlite3_sourceid(), SQLITE_SOURCE_ID);
4380 exit(1);
4381 }
drhc7181902014-02-27 15:04:13 +00004382#endif
drh047d4532015-01-18 20:30:23 +00004383 setBinaryMode(stdin);
drh81cda642015-01-24 12:12:57 +00004384 setvbuf(stderr, 0, _IONBF, 0); /* Make sure stderr is unbuffered */
drhdaffd0e2001-04-11 14:28:42 +00004385 Argv0 = argv[0];
persicom7e2dfdd2002-04-18 02:46:52 +00004386 main_init(&data);
drhc28490c2006-10-26 14:25:58 +00004387 stdin_is_interactive = isatty(0);
persicom7e2dfdd2002-04-18 02:46:52 +00004388
drh44c2eb12003-04-30 11:38:26 +00004389 /* Make sure we have a valid signal handler early, before anything
4390 ** else is done.
4391 */
drh4c504392000-10-16 22:06:40 +00004392#ifdef SIGINT
4393 signal(SIGINT, interrupt_handler);
4394#endif
drh44c2eb12003-04-30 11:38:26 +00004395
drhac5649a2014-11-28 13:35:03 +00004396#ifdef SQLITE_SHELL_DBNAME_PROC
4397 {
4398 /* If the SQLITE_SHELL_DBNAME_PROC macro is defined, then it is the name
4399 ** of a C-function that will provide the name of the database file. Use
4400 ** this compile-time option to embed this shell program in larger
4401 ** applications. */
4402 extern void SQLITE_SHELL_DBNAME_PROC(const char**);
4403 SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename);
4404 warnInmemoryDb = 0;
4405 }
4406#endif
4407
drh22fbcb82004-02-01 01:22:50 +00004408 /* Do an initial pass through the command-line argument to locate
4409 ** the name of the database file, the name of the initialization file,
drh9c88d682010-12-17 14:03:01 +00004410 ** the size of the alternative malloc heap,
drh22fbcb82004-02-01 01:22:50 +00004411 ** and the first command to execute.
drh44c2eb12003-04-30 11:38:26 +00004412 */
drh98d312f2012-10-25 15:23:14 +00004413 for(i=1; i<argc; i++){
drhc28490c2006-10-26 14:25:58 +00004414 char *z;
drhc28490c2006-10-26 14:25:58 +00004415 z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004416 if( z[0]!='-' ){
4417 if( data.zDbFilename==0 ){
4418 data.zDbFilename = z;
drhac5649a2014-11-28 13:35:03 +00004419 }else{
4420 /* Excesss arguments are interpreted as SQL (or dot-commands) and
4421 ** mean that nothing is read from stdin */
4422 readStdin = 0;
4423 nCmd++;
4424 azCmd = realloc(azCmd, sizeof(azCmd[0])*nCmd);
4425 if( azCmd==0 ){
4426 fprintf(stderr, "out of memory\n");
4427 exit(1);
4428 }
4429 azCmd[nCmd-1] = z;
drh98d312f2012-10-25 15:23:14 +00004430 }
drh98d312f2012-10-25 15:23:14 +00004431 }
drhcc3b4f82012-02-07 14:13:50 +00004432 if( z[1]=='-' ) z++;
4433 if( strcmp(z,"-separator")==0
4434 || strcmp(z,"-nullvalue")==0
drh6976c212014-07-24 12:09:47 +00004435 || strcmp(z,"-newline")==0
drhcc3b4f82012-02-07 14:13:50 +00004436 || strcmp(z,"-cmd")==0
4437 ){
drh98d312f2012-10-25 15:23:14 +00004438 (void)cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004439 }else if( strcmp(z,"-init")==0 ){
drh98d312f2012-10-25 15:23:14 +00004440 zInitFile = cmdline_option_value(argc, argv, ++i);
drhcc3b4f82012-02-07 14:13:50 +00004441 }else if( strcmp(z,"-batch")==0 ){
drh98d312f2012-10-25 15:23:14 +00004442 /* Need to check for batch mode here to so we can avoid printing
4443 ** informational messages (like from process_sqliterc) before
4444 ** we do the actual processing of arguments later in a second pass.
4445 */
shanef69573d2009-10-24 02:06:14 +00004446 stdin_is_interactive = 0;
drhcc3b4f82012-02-07 14:13:50 +00004447 }else if( strcmp(z,"-heap")==0 ){
drhb07028f2011-10-14 21:49:18 +00004448#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
drh9c88d682010-12-17 14:03:01 +00004449 const char *zSize;
4450 sqlite3_int64 szHeap;
4451
drh98d312f2012-10-25 15:23:14 +00004452 zSize = cmdline_option_value(argc, argv, ++i);
drh7d9f3942013-04-03 01:26:54 +00004453 szHeap = integerValue(zSize);
drh9c88d682010-12-17 14:03:01 +00004454 if( szHeap>0x7fff0000 ) szHeap = 0x7fff0000;
drh9c88d682010-12-17 14:03:01 +00004455 sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64);
4456#endif
drh44dec872014-08-30 15:49:25 +00004457 }else if( strcmp(z,"-scratch")==0 ){
4458 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004459 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004460 if( sz>400000 ) sz = 400000;
4461 if( sz<2500 ) sz = 2500;
mistachkin31970cc2014-09-01 01:16:49 +00004462 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004463 if( n>10 ) n = 10;
4464 if( n<1 ) n = 1;
4465 sqlite3_config(SQLITE_CONFIG_SCRATCH, malloc(n*sz+1), sz, n);
4466 data.shellFlgs |= SHFLG_Scratch;
4467 }else if( strcmp(z,"-pagecache")==0 ){
4468 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004469 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004470 if( sz>70000 ) sz = 70000;
4471 if( sz<800 ) sz = 800;
mistachkin31970cc2014-09-01 01:16:49 +00004472 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004473 if( n<10 ) n = 10;
4474 sqlite3_config(SQLITE_CONFIG_PAGECACHE, malloc(n*sz+1), sz, n);
4475 data.shellFlgs |= SHFLG_Pagecache;
4476 }else if( strcmp(z,"-lookaside")==0 ){
4477 int n, sz;
mistachkin31970cc2014-09-01 01:16:49 +00004478 sz = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004479 if( sz<0 ) sz = 0;
mistachkin31970cc2014-09-01 01:16:49 +00004480 n = (int)integerValue(cmdline_option_value(argc,argv,++i));
drh44dec872014-08-30 15:49:25 +00004481 if( n<0 ) n = 0;
4482 sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, n);
4483 if( sz*n==0 ) data.shellFlgs &= ~SHFLG_Lookaside;
drh97ae8ff2011-03-16 16:56:29 +00004484#ifdef SQLITE_ENABLE_VFSTRACE
drhcc3b4f82012-02-07 14:13:50 +00004485 }else if( strcmp(z,"-vfstrace")==0 ){
drh97ae8ff2011-03-16 16:56:29 +00004486 extern int vfstrace_register(
4487 const char *zTraceName,
4488 const char *zOldVfsName,
4489 int (*xOut)(const char*,void*),
4490 void *pOutArg,
4491 int makeDefault
4492 );
drh2b625e22011-03-16 17:05:28 +00004493 vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);
drh97ae8ff2011-03-16 16:56:29 +00004494#endif
drh6f25e892011-07-08 17:02:57 +00004495#ifdef SQLITE_ENABLE_MULTIPLEX
drhcc3b4f82012-02-07 14:13:50 +00004496 }else if( strcmp(z,"-multiplex")==0 ){
drh6f25e892011-07-08 17:02:57 +00004497 extern int sqlite3_multiple_initialize(const char*,int);
4498 sqlite3_multiplex_initialize(0, 1);
4499#endif
drh7d9f3942013-04-03 01:26:54 +00004500 }else if( strcmp(z,"-mmap")==0 ){
drh9b4c59f2013-04-15 17:03:42 +00004501 sqlite3_int64 sz = integerValue(cmdline_option_value(argc,argv,++i));
4502 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE, sz, sz);
drhcc3b4f82012-02-07 14:13:50 +00004503 }else if( strcmp(z,"-vfs")==0 ){
drh98d312f2012-10-25 15:23:14 +00004504 sqlite3_vfs *pVfs = sqlite3_vfs_find(cmdline_option_value(argc,argv,++i));
drha7e61d82011-03-12 17:02:57 +00004505 if( pVfs ){
4506 sqlite3_vfs_register(pVfs, 1);
4507 }else{
4508 fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]);
4509 exit(1);
4510 }
drh44c2eb12003-04-30 11:38:26 +00004511 }
4512 }
drh98d312f2012-10-25 15:23:14 +00004513 if( data.zDbFilename==0 ){
danielk197703aded42004-11-22 05:26:27 +00004514#ifndef SQLITE_OMIT_MEMORYDB
drh22fbcb82004-02-01 01:22:50 +00004515 data.zDbFilename = ":memory:";
drh1247aa42014-02-10 19:27:05 +00004516 warnInmemoryDb = argc==1;
danielk197703aded42004-11-22 05:26:27 +00004517#else
shane86f5bdb2009-10-24 02:00:07 +00004518 fprintf(stderr,"%s: Error: no database filename specified\n", Argv0);
4519 return 1;
drh01b41712005-08-29 23:06:23 +00004520#endif
drh98d312f2012-10-25 15:23:14 +00004521 }
4522 data.out = stdout;
drh01b41712005-08-29 23:06:23 +00004523
drh44c2eb12003-04-30 11:38:26 +00004524 /* Go ahead and open the database file if it already exists. If the
4525 ** file does not exist, delay opening it. This prevents empty database
4526 ** files from being created if a user mistypes the database name argument
4527 ** to the sqlite command-line tool.
4528 */
drhc8d74412004-08-31 23:41:26 +00004529 if( access(data.zDbFilename, 0)==0 ){
drh05782482013-10-24 15:20:20 +00004530 open_db(&data, 0);
drh44c2eb12003-04-30 11:38:26 +00004531 }
4532
drh22fbcb82004-02-01 01:22:50 +00004533 /* Process the initialization file if there is one. If no -init option
4534 ** is given on the command line, look for a file named ~/.sqliterc and
4535 ** try to process it.
drh44c2eb12003-04-30 11:38:26 +00004536 */
drh534f4df2015-02-28 14:03:35 +00004537 process_sqliterc(&data,zInitFile);
drh44c2eb12003-04-30 11:38:26 +00004538
drh22fbcb82004-02-01 01:22:50 +00004539 /* Make a second pass through the command-line argument and set
4540 ** options. This second pass is delayed until after the initialization
4541 ** file is processed so that the command-line arguments will override
4542 ** settings in the initialization file.
drh44c2eb12003-04-30 11:38:26 +00004543 */
drh98d312f2012-10-25 15:23:14 +00004544 for(i=1; i<argc; i++){
drh22fbcb82004-02-01 01:22:50 +00004545 char *z = argv[i];
drh98d312f2012-10-25 15:23:14 +00004546 if( z[0]!='-' ) continue;
drhc28490c2006-10-26 14:25:58 +00004547 if( z[1]=='-' ){ z++; }
drh2e584cd2006-09-25 13:09:22 +00004548 if( strcmp(z,"-init")==0 ){
drh22fbcb82004-02-01 01:22:50 +00004549 i++;
4550 }else if( strcmp(z,"-html")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004551 data.mode = MODE_Html;
drh22fbcb82004-02-01 01:22:50 +00004552 }else if( strcmp(z,"-list")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004553 data.mode = MODE_List;
drh22fbcb82004-02-01 01:22:50 +00004554 }else if( strcmp(z,"-line")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004555 data.mode = MODE_Line;
drh22fbcb82004-02-01 01:22:50 +00004556 }else if( strcmp(z,"-column")==0 ){
drh8b32e172002-04-08 02:42:57 +00004557 data.mode = MODE_Column;
drhc49f44e2006-10-26 18:15:42 +00004558 }else if( strcmp(z,"-csv")==0 ){
4559 data.mode = MODE_Csv;
mistachkin636bf9f2014-07-19 20:15:16 +00004560 memcpy(data.colSeparator,",",2);
4561 }else if( strcmp(z,"-ascii")==0 ){
4562 data.mode = MODE_Ascii;
4563 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004564 SEP_Unit);
mistachkin636bf9f2014-07-19 20:15:16 +00004565 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
mistachkinfad42082014-07-24 22:13:12 +00004566 SEP_Record);
mistachkine0d68852014-12-11 03:12:33 +00004567 }else if( strcmp(z,"-separator")==0 ){
mistachkin636bf9f2014-07-19 20:15:16 +00004568 sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,
4569 "%s",cmdline_option_value(argc,argv,++i));
drh6976c212014-07-24 12:09:47 +00004570 }else if( strcmp(z,"-newline")==0 ){
mistachkine0d68852014-12-11 03:12:33 +00004571 sqlite3_snprintf(sizeof(data.rowSeparator), data.rowSeparator,
drh6976c212014-07-24 12:09:47 +00004572 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004573 }else if( strcmp(z,"-nullvalue")==0 ){
mistachkin44b99f72014-12-11 03:29:14 +00004574 sqlite3_snprintf(sizeof(data.nullValue), data.nullValue,
drh98d312f2012-10-25 15:23:14 +00004575 "%s",cmdline_option_value(argc,argv,++i));
drh22fbcb82004-02-01 01:22:50 +00004576 }else if( strcmp(z,"-header")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004577 data.showHeader = 1;
drh22fbcb82004-02-01 01:22:50 +00004578 }else if( strcmp(z,"-noheader")==0 ){
drh1e5d0e92000-05-31 23:33:17 +00004579 data.showHeader = 0;
drh22fbcb82004-02-01 01:22:50 +00004580 }else if( strcmp(z,"-echo")==0 ){
drhdaffd0e2001-04-11 14:28:42 +00004581 data.echoOn = 1;
drhefbf3b12014-02-28 20:47:24 +00004582 }else if( strcmp(z,"-eqp")==0 ){
4583 data.autoEQP = 1;
shaneh642d8b82010-07-28 16:05:34 +00004584 }else if( strcmp(z,"-stats")==0 ){
4585 data.statsOn = 1;
dan8d1edb92014-11-05 09:07:28 +00004586 }else if( strcmp(z,"-scanstats")==0 ){
4587 data.scanstatsOn = 1;
drh9569f602015-04-16 15:05:04 +00004588 }else if( strcmp(z,"-backslash")==0 ){
4589 /* Undocumented command-line option: -backslash
4590 ** Causes C-style backslash escapes to be evaluated in SQL statements
4591 ** prior to sending the SQL into SQLite. Useful for injecting
4592 ** crazy bytes in the middle of SQL statements for testing and debugging.
4593 */
4594 data.backslashOn = 1;
drhc49f44e2006-10-26 18:15:42 +00004595 }else if( strcmp(z,"-bail")==0 ){
4596 bail_on_error = 1;
drh22fbcb82004-02-01 01:22:50 +00004597 }else if( strcmp(z,"-version")==0 ){
drh9fd301b2011-06-03 13:28:22 +00004598 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
drh151e3e12006-06-06 12:32:21 +00004599 return 0;
drhc28490c2006-10-26 14:25:58 +00004600 }else if( strcmp(z,"-interactive")==0 ){
4601 stdin_is_interactive = 1;
4602 }else if( strcmp(z,"-batch")==0 ){
4603 stdin_is_interactive = 0;
drh9c88d682010-12-17 14:03:01 +00004604 }else if( strcmp(z,"-heap")==0 ){
4605 i++;
drh44dec872014-08-30 15:49:25 +00004606 }else if( strcmp(z,"-scratch")==0 ){
4607 i+=2;
4608 }else if( strcmp(z,"-pagecache")==0 ){
4609 i+=2;
4610 }else if( strcmp(z,"-lookaside")==0 ){
4611 i+=2;
drh7d9f3942013-04-03 01:26:54 +00004612 }else if( strcmp(z,"-mmap")==0 ){
4613 i++;
drha7e61d82011-03-12 17:02:57 +00004614 }else if( strcmp(z,"-vfs")==0 ){
4615 i++;
drh6f25e892011-07-08 17:02:57 +00004616#ifdef SQLITE_ENABLE_VFSTRACE
drh97ae8ff2011-03-16 16:56:29 +00004617 }else if( strcmp(z,"-vfstrace")==0 ){
4618 i++;
drh6f25e892011-07-08 17:02:57 +00004619#endif
4620#ifdef SQLITE_ENABLE_MULTIPLEX
4621 }else if( strcmp(z,"-multiplex")==0 ){
4622 i++;
4623#endif
drhcc3b4f82012-02-07 14:13:50 +00004624 }else if( strcmp(z,"-help")==0 ){
drhe1e38c42003-05-04 18:30:59 +00004625 usage(1);
drhcc3b4f82012-02-07 14:13:50 +00004626 }else if( strcmp(z,"-cmd")==0 ){
drhac5649a2014-11-28 13:35:03 +00004627 /* Run commands that follow -cmd first and separately from commands
4628 ** that simply appear on the command-line. This seems goofy. It would
4629 ** be better if all commands ran in the order that they appear. But
4630 ** we retain the goofy behavior for historical compatibility. */
drhcc3b4f82012-02-07 14:13:50 +00004631 if( i==argc-1 ) break;
drh98d312f2012-10-25 15:23:14 +00004632 z = cmdline_option_value(argc,argv,++i);
drhcc3b4f82012-02-07 14:13:50 +00004633 if( z[0]=='.' ){
4634 rc = do_meta_command(z, &data);
drh99b39082013-04-17 12:19:48 +00004635 if( rc && bail_on_error ) return rc==2 ? 0 : rc;
drhcc3b4f82012-02-07 14:13:50 +00004636 }else{
drh05782482013-10-24 15:20:20 +00004637 open_db(&data, 0);
drhcc3b4f82012-02-07 14:13:50 +00004638 rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
4639 if( zErrMsg!=0 ){
4640 fprintf(stderr,"Error: %s\n", zErrMsg);
4641 if( bail_on_error ) return rc!=0 ? rc : 1;
4642 }else if( rc!=0 ){
4643 fprintf(stderr,"Error: unable to process SQL \"%s\"\n", z);
4644 if( bail_on_error ) return rc;
4645 }
4646 }
drh1e5d0e92000-05-31 23:33:17 +00004647 }else{
shane86f5bdb2009-10-24 02:00:07 +00004648 fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z);
drhe1e38c42003-05-04 18:30:59 +00004649 fprintf(stderr,"Use -help for a list of options.\n");
drh1e5d0e92000-05-31 23:33:17 +00004650 return 1;
4651 }
4652 }
drh44c2eb12003-04-30 11:38:26 +00004653
drhac5649a2014-11-28 13:35:03 +00004654 if( !readStdin ){
4655 /* Run all arguments that do not begin with '-' as if they were separate
4656 ** command-line inputs, except for the argToSkip argument which contains
4657 ** the database filename.
drh44c2eb12003-04-30 11:38:26 +00004658 */
drhac5649a2014-11-28 13:35:03 +00004659 for(i=0; i<nCmd; i++){
4660 if( azCmd[i][0]=='.' ){
4661 rc = do_meta_command(azCmd[i], &data);
4662 if( rc ) return rc==2 ? 0 : rc;
4663 }else{
4664 open_db(&data, 0);
4665 rc = shell_exec(data.db, azCmd[i], shell_callback, &data, &zErrMsg);
4666 if( zErrMsg!=0 ){
4667 fprintf(stderr,"Error: %s\n", zErrMsg);
4668 return rc!=0 ? rc : 1;
4669 }else if( rc!=0 ){
4670 fprintf(stderr,"Error: unable to process SQL: %s\n", azCmd[i]);
4671 return rc;
4672 }
drh6ff13852001-11-25 13:18:23 +00004673 }
drh75897232000-05-29 14:26:00 +00004674 }
drhac5649a2014-11-28 13:35:03 +00004675 free(azCmd);
drh75897232000-05-29 14:26:00 +00004676 }else{
drh44c2eb12003-04-30 11:38:26 +00004677 /* Run commands received from standard input
4678 */
drhc28490c2006-10-26 14:25:58 +00004679 if( stdin_is_interactive ){
drh67505e72002-04-19 12:34:06 +00004680 char *zHome;
4681 char *zHistory = 0;
drh5bb3eb92007-05-04 13:15:55 +00004682 int nHistory;
drh75897232000-05-29 14:26:00 +00004683 printf(
drh743e0032011-12-12 16:51:50 +00004684 "SQLite version %s %.19s\n" /*extra-version-info*/
drh1247aa42014-02-10 19:27:05 +00004685 "Enter \".help\" for usage hints.\n",
drh9fd301b2011-06-03 13:28:22 +00004686 sqlite3_libversion(), sqlite3_sourceid()
drh75897232000-05-29 14:26:00 +00004687 );
drhb3735912014-02-10 16:13:42 +00004688 if( warnInmemoryDb ){
drh1247aa42014-02-10 19:27:05 +00004689 printf("Connected to a ");
mistachkin378d01a2014-03-06 02:15:42 +00004690 printBold("transient in-memory database");
4691 printf(".\nUse \".open FILENAME\" to reopen on a "
drh1247aa42014-02-10 19:27:05 +00004692 "persistent database.\n");
drhb3735912014-02-10 16:13:42 +00004693 }
drh67505e72002-04-19 12:34:06 +00004694 zHome = find_home_dir();
drhea678832008-12-10 19:26:22 +00004695 if( zHome ){
drh4f21c4a2008-12-10 22:15:00 +00004696 nHistory = strlen30(zHome) + 20;
drhea678832008-12-10 19:26:22 +00004697 if( (zHistory = malloc(nHistory))!=0 ){
4698 sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
4699 }
drh67505e72002-04-19 12:34:06 +00004700 }
danfd34d6d2015-02-25 10:54:53 +00004701 if( zHistory ) shell_read_history(zHistory);
drhc28490c2006-10-26 14:25:58 +00004702 rc = process_input(&data, 0);
drh67505e72002-04-19 12:34:06 +00004703 if( zHistory ){
danfd34d6d2015-02-25 10:54:53 +00004704 shell_stifle_history(100);
4705 shell_write_history(zHistory);
adamd0a3daa32006-07-28 20:16:14 +00004706 free(zHistory);
drh67505e72002-04-19 12:34:06 +00004707 }
drhdaffd0e2001-04-11 14:28:42 +00004708 }else{
drhc28490c2006-10-26 14:25:58 +00004709 rc = process_input(&data, stdin);
drh75897232000-05-29 14:26:00 +00004710 }
4711 }
drh33048c02001-10-01 14:29:22 +00004712 set_table_name(&data, 0);
drh72af0772010-05-06 20:19:55 +00004713 if( data.db ){
drhe14cd932010-12-08 03:28:17 +00004714 sqlite3_close(data.db);
adamd0a3daa32006-07-28 20:16:14 +00004715 }
drh05782482013-10-24 15:20:20 +00004716 sqlite3_free(data.zFreeOnClose);
drhc28490c2006-10-26 14:25:58 +00004717 return rc;
drh75897232000-05-29 14:26:00 +00004718}